Saída de streaming

Este tópico descreve como transmitir respostas em tempo real do SDK do Cortex Code Agent.

Por padrão, o SDK produz objetos AssistantMessage completos depois que o modelo termina de gerar cada resposta. Para receber atualizações incrementais à medida que o texto e os blocos inteligentes são gerados, habilite o streaming de mensagens parciais definindo includePartialMessages (TypeScript) ou include_partial_messages (Python) como true.

Quando as mensagens parciais estão habilitadas, o Cortex Code emite objetos StreamEvent para texto e conteúdo de raciocínio parciais. Chamadas de ferramentas completas ainda chegam como objetos AssistantMessage, e resultados de ferramentas ainda chegam como objetos UserMessage.

Habilitar a saída de streaming

Quando habilitada, o SDK produz mensagens StreamEvent contendo eventos de streaming parciais, além do objetos habituais AssistantMessage, UserMessage e ResultMessage. Seu código precisa:

  1. Verificar o tipo de cada mensagem para distinguir StreamEvent de outros tipos.

  2. Para StreamEvent, extrair o campo event e verificar seu type.

  3. Procurar eventos content_block_delta em que delta.type é 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);
      }
    }
  }
}

Referência de StreamEvent

Quando as mensagens parciais estão habilitadas, você recebe eventos de streaming brutos encapsulados em um objeto:

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

O campo event contém o evento de streaming parcial bruto emitido pelo Cortex Code. Tipos de eventos comuns:

Tipo de evento

Descrição

content_block_start

Início de um novo bloco de texto ou raciocínio

content_block_delta

Atualização incremental de texto ou raciocínio

content_block_stop

Fim do bloco de texto ou raciocínio atual

Fluxo de mensagens

Com as mensagens parciais habilitadas, normalmente você recebe as mensagens na seguinte ordem:

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

Sem as mensagens parciais habilitadas, você ainda recebe as mesmas mensagens completas de assistente, usuário e resultado, mas não StreamEvent. Dependendo da sessão, o SDK também pode emitir eventos system, como notificações de inicialização, status e tarefas em segundo plano.

Transmitir respostas de texto

Para exibir o texto conforme ele é gerado, procure eventos content_block_delta em que delta.type é 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

Criar UI de streaming

O exemplo a seguir acumula texto transmitido em um buffer local e renderiza a resposta atual sempre que um novo text_delta chega. Em um aplicativo real, substitua a função render pela lógica de atualização de estado da sua estrutura:

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 ---");
  }
}

Limitações conhecidas

Recurso

Impacto no streaming

Saída estruturada

O resultado JSON aparece somente em ResultMessage.structured_output, não como deltas de streaming