stream: true on POST /v1/responses and the reply arrives as standard OpenAI Responses response.* SSE events — every frame is event: <type> + data: <json>, with a monotonic sequence_number. Official SDK stream loops consume it as-is.
Event table
Items stream strictly one at a time: reasoning first (when the tier emits it), then the message, then any
function_call handoffs — output_index increments per item, and the indexes match the final output array on response.completed.
Server-tool side-channel
Built-in server tools (data search, literature, …) are not output items — official SDKs would mis-parse unknown item types, so their trace rides a dedicated event that standard stream loops safely ignore:output_index. Render it if you want an activity feed (“Searching your records…”); skip it and nothing breaks.
response.mirobody_tool_result is its pair, pushed when that tool’s result lands — the other half of the side-channel, equally ignorable:
id / call_id. The streamed result is truncated to 4096 characters (truncated: true when clipped); the full value is always on the final response object (response.completed) under tool_steps[].result.
Failure events
On an upstream error the stream ends withresponse.failed (not a broken pipe):
chat.completion.chunk streaming, see Answers API → Streaming.
See also
- Agent API (Responses) — the request that produces this stream.
- Answers API (Chat Completions) — the SSE shape on the Answers API.
- Function Calling — the handoff that pauses a stream.