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.
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:
Verificar o tipo de cada mensagem para distinguir StreamEvent de outros tipos.
Para StreamEvent, extrair o campo event e verificar seu type.
Procurar eventos content_block_delta em que delta.type é text_delta.
import{query}from"cortex-code-agent-sdk";forawait(constmessageofquery({prompt:"List the files in my project",options:{cwd:process.cwd(),includePartialMessages:true,allowedTools:["Bash","Read"],},})){if(message.type==="stream_event"){constevent=message.event;if(event.type==="content_block_delta"){if(event.delta.type==="text_delta"){process.stdout.write(event.delta.text);}}}}
importasynciofromcortex_code_agent_sdkimportquery,CortexCodeAgentOptionsfromcortex_code_agent_sdk.typesimportStreamEventasyncdefstream_response():asyncformessageinquery(prompt="List the files in my project",options=CortexCodeAgentOptions(cwd=".",include_partial_messages=True,allowed_tools=["Bash","Read"],),):ifisinstance(message,StreamEvent):event=message.eventifevent.get("type")=="content_block_delta":delta=event.get("delta",{})ifdelta.get("type")=="text_delta":print(delta.get("text",""),end="",flush=True)asyncio.run(stream_response())
Quando as mensagens parciais estão habilitadas, você recebe eventos de streaming brutos encapsulados em um objeto:
interfaceSDKPartialAssistantMessage{type:"stream_event";event:Record<string,unknown>;// Raw streaming eventparent_tool_use_id:string|null;uuid:string;session_id:string;}
@dataclassclassStreamEvent:uuid:str# Unique identifiersession_id:str# Session identifierevent:dict[str,Any]# Raw streaming eventparent_tool_use_id:str|None# Parent tool ID if from a subagent
O campo event contém o evento de streaming parcial bruto emitido pelo Cortex Code. Tipos de eventos comuns:
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.
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";forawait(constmessageofquery({prompt:"Explain how databases work",options:{cwd:process.cwd(),includePartialMessages:true},})){if(message.type==="stream_event"){constevent=message.event;if(event.type==="content_block_delta"&&event.delta.type==="text_delta"){process.stdout.write(event.delta.text);}}}console.log();// Final newline
importasynciofromcortex_code_agent_sdkimportquery,CortexCodeAgentOptionsfromcortex_code_agent_sdk.typesimportStreamEventasyncdefstream_text():asyncformessageinquery(prompt="Explain how databases work",options=CortexCodeAgentOptions(cwd=".",include_partial_messages=True),):ifisinstance(message,StreamEvent):event=message.eventifevent.get("type")=="content_block_delta":delta=event.get("delta",{})ifdelta.get("type")=="text_delta":print(delta.get("text",""),end="",flush=True)print()# Final newlineasyncio.run(stream_text())
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";letcurrentText="";functionrender(text:string){console.clear();console.log("Assistant:\n");process.stdout.write(text);}forawait(constmessageofquery({prompt:"Explain how databases work",options:{cwd:process.cwd(),includePartialMessages:true,},})){if(message.type==="stream_event"){constevent=message.event;if(event.type==="content_block_delta"&&event.delta.type==="text_delta"){currentText+=event.delta.text;render(currentText);}}elseif(message.type==="result"){console.log("\n\n--- Complete ---");}}
importasyncioimportsysfromcortex_code_agent_sdkimportquery,CortexCodeAgentOptions,ResultMessagefromcortex_code_agent_sdk.typesimportStreamEventdefrender(text:str)->None:sys.stdout.write("\033[2J\033[H")sys.stdout.write("Assistant:\n\n")sys.stdout.write(text)sys.stdout.flush()asyncdefstreaming_ui():current_text=""asyncformessageinquery(prompt="Explain how databases work",options=CortexCodeAgentOptions(cwd=".",include_partial_messages=True,),):ifisinstance(message,StreamEvent):event=message.eventifevent.get("type")=="content_block_delta":delta=event.get("delta",{})ifdelta.get("type")=="text_delta":current_text+=delta.get("text","")render(current_text)elifisinstance(message,ResultMessage):print("\n\n--- Complete ---")asyncio.run(streaming_ui())
Quando sua configuração do Cortex Code usa um modelo que consta em Model and Service Pass-Through Terms, seu uso desse modelo está sujeito aos respectivos termos nessa página.
A classificação dos dados de entradas e saídas é definido na tabela a seguir.