Sessions à plusieurs tours et entrée en continu

Cette rubrique décrit les principaux moyens d’envoyer des invites au SDK Cortex Code Agent : requêtes à invite unique quand vous voulez que query() gère le cycle de vie de la session pour vous, entrée diffusée pour la livraison incrémentielle des invites, et les sessions à plusieurs tours pour les conversations interactives qui préservent le contexte à travers les échanges.

Modèles d’entrée

Le SDK fournit trois modèles d’entrée :

Mode

Quand utiliser

API

Saisie d’une invite unique

Envoyez une invite avec query() et laissez le SDK gérer le cycle de vie des sessions pour vous. La sortie continue d’être diffusée jusqu’à ce que l’agent produise un ResultMessage.

query() dans TypeScript et Python

Entrée diffusée

Envoyer des messages utilisateur de manière incrémentielle à partir d’un itérable asynchrone au lieu d’une seule chaîne d’invite

query() dans TypeScript et Python, plus Query.streamInput() dans TypeScript

Session à plusieurs tours

Conversations interactives : envoyer plusieurs invites, conserver le contexte, contrôler le cycle de vie de la session

createCortexCodeSession() (TypeScript) ou``CortexCodeSDKClient`` (Python)

Requêtes à invite unique

La fonction query() est le moyen le plus simple d’utiliser un SDK. Elle peut envoyer soit une chaîne à invite unique, soit un itérable asynchrone des messages utilisateur du SDK, et elle renvoie les événements jusqu’à ce que l’agent produise un ResultMessage. Dans ce mode, « invite unique » fait référence au modèle d’entrée : la sortie continue normalement.

import { query } from "cortex-code-agent-sdk";

for await (const message of query({
  prompt: "Explain how the auth module works",
  options: { cwd: process.cwd() },
})) {
  if (message.type === "assistant") {
    for (const block of message.content) {
      if (block.type === "text") process.stdout.write(block.text);
    }
  }
}

La fonction query() gère le cycle de vie complet de la session pour vous : elle crée une session, envoie l’invite, produit des événements et ferme la session lorsque le résultat arrive ou que l’itérateur est épuisé.

Ceci est différent des maxTurns/max_turns. Une requête à invite unique permet toujours à l’agent de prendre autant de tours internes que nécessaire, sous réserve de la limite de tours configurée. Le paramètre maxTurns: 1 ou max_turns=1 est une contrainte séparée qui limite l’agent à un tour interne et peut produire un résultat error_max_turns.

Sessions à plusieurs tours

Pour les conversations qui nécessitent plusieurs échanges, utilisez une session. L’agent conserve le contexte entre les tours, de sorte que les invites ultérieures puissent faire référence aux fichiers lus, aux analyses effectuées et aux sujets abordés dans les tours précédents.

import { createCortexCodeSession } from "cortex-code-agent-sdk";

const session = await createCortexCodeSession({ cwd: process.cwd() });

// First turn
await session.send("Read the database connection module");
for await (const event of session.stream()) {
  if (event.type === "assistant") {
    for (const b of event.content) {
      if (b.type === "text") process.stdout.write(b.text);
    }
  }
  if (event.type === "result") break;
}

// Second turn -- context from the first turn is preserved
await session.send("What error handling patterns does it use?");
for await (const event of session.stream()) {
  if (event.type === "assistant") {
    for (const b of event.content) {
      if (b.type === "text") process.stdout.write(b.text);
    }
  }
  if (event.type === "result") break;
}

await session.close();

Cycle de vie de la session

  1. Appelez createCortexCodeSession(options) pour démarrer une session. Cela génère le processus CLI.

  2. Appelez session.send(prompt) pour envoyer un message utilisateur.

  3. Itérez session.stream() pour recevoir des réponses. Arrêtez l’itération lorsque vous voyez un événement result.

  4. Répétez les étapes 2-3 pour des tours supplémentaires.

  5. Appelez session.close() pour terminer la session et nettoyer le processus.

Poursuivre une session précédente

Vous pouvez reprendre une conversation à partir d’une session précédente. L’agent charge l’historique de la conversation précédente et reprend là où il s’est arrêté.

import { createCortexCodeSession } from "cortex-code-agent-sdk";

// Continue the most recent conversation
const session = await createCortexCodeSession({
  cwd: process.cwd(),
  continue: true,
});

await session.send("What were we working on?");
for await (const event of session.stream()) {
  if (event.type === "result") break;
}
await session.close();

Vous pouvez également reprendre une session spécifique par ID :

const session = await createCortexCodeSession({
  cwd: process.cwd(),
  resume: "previous-session-id",
});

Faire un fork de session

Le fork crée une nouvelle session qui commence par l’historique complet de la conversation d’une session existante. La session originale n’est pas modifiée. Ceci est utile pour explorer des approches alternatives sans perdre la conversation initiale.

import { createCortexCodeSession } from "cortex-code-agent-sdk";

const forked = await createCortexCodeSession({
  cwd: process.cwd(),
  resume: "previous-session-id",
  forkSession: true,
});

await forked.send("Let's try a different approach");
for await (const event of forked.stream()) {
  if (event.type === "result") break;
}
await forked.close();

Interrompre un tour

Votre application peut demander une interruption pendant que l’agent traite un tour. Cela a le même effet que d’appuyer sur Esc dans la CLI. La session reste active pour d’autres invites.

Appel d’interruption direct

Appelez la méthode interrupt() pour envoyer directement une requête d’interruption :

import { createCortexCodeSession } from "cortex-code-agent-sdk";

const session = await createCortexCodeSession({ cwd: process.cwd() });

await session.send("Analyze every file in this large codebase");

// Interrupt after 10 seconds
setTimeout(() => session.interrupt(), 10_000);

for await (const event of session.stream()) {
  if (event.type === "result") break;
}

// Session is still alive -- send another prompt
await session.send("Just summarize the top-level structure instead");
for await (const event of session.stream()) {
  if (event.type === "result") break;
}

await session.close();

Contrôleur d’annulation/événement d’annulation

Vous pouvez également envoyer un signal d’annulation au moment de la création de la session. Lorsque le signal se déclenche, le SDK envoie automatiquement la même requête d’interruption.

import { createCortexCodeSession } from "cortex-code-agent-sdk";

const controller = new AbortController();

const session = await createCortexCodeSession({
  cwd: process.cwd(),
  abortController: controller,
});

await session.send("Analyze every file in this large codebase");

// Trigger interrupt from anywhere
setTimeout(() => controller.abort(), 10_000);

for await (const event of session.stream()) {
  if (event.type === "result") break;
}
await session.close();

Note

Dans TypeScript, transmettez un``AbortController`` dont la méthode abort() déclenche la requête d’interruption. En Python, transmettez un asyncio.Event dont la méthode set() déclenche la requête d’interruption. Dans les deux cas, la session reste en active après l’interruption.