Dieses Thema beschreibt, wie Sie Echtzeitantworten vom Cortex Code Agent SDK streamen können.
Standardmäßig gibt das SDK vollständige AssistantMessage-Objekte aus, nachdem das Modell die Generierung jeder Antwort abgeschlossen hat. Um inkrementelle Aktualisierungen bei der Generierung von Text- und Denkblöcken zu erhalten, aktivieren Sie teilweises Nachrichten-Streaming, indem Sie includePartialMessages (TypeScript) oder include_partial_messages (Python) auf true einstellen.
Wenn Teilmeldungen aktiviert sind, gibt Cortex Code StreamEvent-Objekte für Teiltexte und Denkinhalte aus. Vollständige Toolaufrufe gehen weiterhin als AssistantMessage-Objekte ein, und Toolergebnisse kommen immer noch als UserMessage-Objekte an.
Wenn diese Option aktiviert ist, gibt die SDK StreamEvent-Meldungen, die teilweise Streaming-Ereignisse enthalten, zusätzlich zu den üblichen AssistantMessage-, UserMessage- und ResultMessage-Objekten aus. Ihr Code muss:
Den Typ jeder Meldung überprüfen, um StreamEvent von anderen Typen zu unterscheiden.
Für StreamEvent das Feld event extrahieren und dessen type überprüfen.
Nach content_block_delta-Ereignissen suchen, bei denen delta.type gleich text_delta ist.
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())
Wenn Teilmeldungen aktiviert sind, erhalten Sie Rohdaten-Streaming-Ereignisse, die in ein Objekt eingeschlossen sind:
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
Das event-Feld enthält den von Cortex Code ausgegebenen Teil des Streaming-Ereignisses. Gängige Ereignistypen:
Wenn Teilmeldungen aktiviert sind, erhalten Sie normalerweise Meldungen in der folgenden Reihenfolge:
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
Ohne aktivierte Teilmeldungen erhalten Sie immer noch dieselben vollständigen Assistenten-, Benutzer- und Ergebnismeldungen, aber nicht StreamEvent. Abhängig von der Sitzung kann das SDK auch system-Ereignisse wie Initialisierungs-, Status- und Hintergrundaufgabenbenachrichtigungen ausgeben.
Um Text sofort anzuzeigen, wenn er generiert wird, suchen Sie nach content_block_delta-Ereignissen, bei denen delta.type gleich text_delta ist:
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())
Das folgende Beispiel sammelt gestreamten Text in einem lokalen Puffer und rendert die aktuelle Antwort jedes Mal neu, wenn ein neues text_delta ankommt. Ersetzen Sie in einer echten Anwendung die render-Funktion mit der Statusaktualisierungslogik des Frameworks:
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())
Wenn Ihre Cortex Code-Konfiguration ein Modell verwendet, das im Rahmen der Modell- und Service-Pass-Through-Bedingungen bereitgestellt wurde, unterliegt Ihre Nutzung dieses Modells zusätzlich den Bedingungen für dieses Modell auf dieser Seite.
Die Datenklassifizierung der Eingaben und Ausgaben ist in der folgenden Tabelle aufgeführt.