Sortie en streaming

Cette rubrique décrit comment diffuser des réponses en temps réel à partir du SDK Agent Cortex Code.

Par défaut, leSDK rend des objets``AssistantMessage`` complets une fois que le modèle a fini de générer chaque réponse. Pour recevoir des mises à jour incrémentielles à mesure que du texte et des blocs de réflexion sont générés, activez le streaming partiel des messages en définissant includePartialMessages (TypeScript) ou include_partial_messages (Python) sur``true``.

Lorsque des messages partiels sont activés, Cortex Code émet des objets StreamEvent pour le texte partiel et le contenu de la réflexion. Les appels complets des outils arrivent toujours en tant qu’objets AssistantMessage et les résultats des outils arrivent toujours sous la forme d’objets UserMessage.

Activer la sortie en streaming

Lorsqu’il est activé, le SDK rend des messages StreamEvent contenant des événements de streaming partiels, en plus des objets AssistantMessage,``UserMessage``, et ResultMessage habituels. Votre code doit :

  1. Vérifier le type de chaque message pour différencier StreamEvent des autres types.

  2. Pour StreamEvent, extraire le champ event et vérifier son type.

  3. Chercher des événements content_block_delta où``delta.type`` est text_delta.

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

for await (const message of query({
  prompt: "List the files in my project",
  options: {
    cwd: process.cwd(),
    includePartialMessages: true,
    allowedTools: ["Bash", "Read"],
  },
})) {
  if (message.type === "stream_event") {
    const event = message.event;
    if (event.type === "content_block_delta") {
      if (event.delta.type === "text_delta") {
        process.stdout.write(event.delta.text);
      }
    }
  }
}

Référence StreamEvent

Lorsque les messages partiels sont activés, vous recevez des événements de streaming bruts encapsulés dans un objet :

interface SDKPartialAssistantMessage {
  type: "stream_event";
  event: Record<string, unknown>;  // Raw streaming event
  parent_tool_use_id: string | null;
  uuid: string;
  session_id: string;
}

Le champ event contient l’événement de streaming partiel brut émis par Cortex Code. Types d’événements courants :

Type d’événement.

Description

content_block_start

Début d’un nouveau texte ou d’un bloc de réflexion

content_block_delta

Mise à jour du texte incrémentiel ou de la réflexion

content_block_stop

Fin du texte actuel ou du bloc de réflexion

Flux de messages

Lorsque les messages partiels sont activés, vous recevez généralement les messages dans l’ordre suivant :

SystemMessage -- session initialization
StreamEvent (content_block_start) -- text or thinking block
StreamEvent (content_block_delta) -- text_delta or thinking_delta chunks...
StreamEvent (content_block_stop)
AssistantMessage -- complete text/thinking block, or complete tool_use block
UserMessage -- complete tool_result block
... more assistant/user turns ...
ResultMessage -- final result

Si les messages partiels ne sont pas activés, vous recevez toujours les mêmes messages d’assistant, d’utilisateur et de résultat, mais pas StreamEvent. Selon la session, le SDK peut également émettre des événements system tels que l’initialisation, l’état et les notifications de tâches en arrière-plan.

Diffuser des réponses de texte

Pour afficher le texte tel qu’il est généré, recherchez des événements content_block_deltadelta.type est text_delta :

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

for await (const message of query({
  prompt: "Explain how databases work",
  options: { cwd: process.cwd(), includePartialMessages: true },
})) {
  if (message.type === "stream_event") {
    const event = message.event;
    if (event.type === "content_block_delta" && event.delta.type === "text_delta") {
      process.stdout.write(event.delta.text);
    }
  }
}
console.log(); // Final newline

Créer une UI de streaming

L’exemple suivant accumule le texte ave streaming dans un tampon local et rend à nouveau la réponse actuelle chaque fois qu’un nouveau text_delta arrive. Dans une application réelle, remplacez la fonction render par la logique de mise à jour de l’état de votre framework :

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

let currentText = "";

function render(text: string) {
  console.clear();
  console.log("Assistant:\n");
  process.stdout.write(text);
}

for await (const message of query({
  prompt: "Explain how databases work",
  options: {
    cwd: process.cwd(),
    includePartialMessages: true,
  },
})) {
  if (message.type === "stream_event") {
    const event = message.event;
    if (event.type === "content_block_delta" && event.delta.type === "text_delta") {
      currentText += event.delta.text;
      render(currentText);
    }
  } else if (message.type === "result") {
    console.log("\n\n--- Complete ---");
  }
}

Limitations connues

Fonctionnalité

Conséquences sur le streaming

Sortie structurée

Le résultat JSON n’apparaît que dans ResultMessage.structured_output, et non sous forme de deltas de streaming