通过 SSE 实时订阅会话事件流:助手输出消息、工具调用、状态变更。连接建立后服务端立即下发 : connected 注释行。
前提
已创建会话,详见创建 Session。{session_id} 形如 sesn_xxx...。
接口
GET /sessions/{session_id}/events/stream
请求需带 Accept: text/event-stream。连接建立后服务端立即下发 : connected 注释行,随后实时推送会话事件。
事件信封
data 字段是 Message 对象,公共字段如下:
| 字段 | 类型 | 说明 |
|---|---|---|
object | string | 恒为 message |
id | string | 事件 ID(前缀 msg_ 或 out_)。客户端用此 ID 在业务层去重 |
created_at | string | ISO 8601 时间戳 |
role | string | user / assistant / tool |
type | string | 事件类型,见下表 |
status | string | 固定为 completed |
content | array | ContentBlock 数组,结构同发送侧 |
is_error | bool | 仅工具输出事件(tool_call_output / mcp_call_output)出现,写在 Message 顶层:true 表示该次工具执行失败或被中断 / 拒绝 |
metadata | object | 事件附加信息(如 thread_id、call_id 等) |
服务端推送事件类型
| type | 含义 |
|---|---|
message | 助手输出消息,可流式分块 |
tool_call | 内置工具调用请求 |
tool_call_output | 内置工具执行结果 |
tool_approval_request | 工具审批请求,当工具需要审批时单独发送一次,data 携带 batch_id、call_id、name、arguments、tool_type。是否需要审批以本事件为准 |
tool_approval_response | 工具审批裁决。客户端上行提交裁决,服务端也会下行补发 |
function_call | 自托管函数调用请求,需客户端回填 function_call_output |
function_call_output | 服务端确认收到的函数结果回显 |
mcp_call | MCP 工具调用请求 |
mcp_call_output | MCP 工具执行结果 |
session_status | 会话状态变更(含 stop_reason,见下文) |
error | 运行期错误事件。错误详情位于 Message 顶层的 error 对象(error.code / error.message),不在 content[].data 中 |
session_status 与 stop_reason
data.content[0].data 携带具体状态:
-
session_status:running/idle/terminated -
stop_reason仅在状态切到idle时出现,三种取值:{"type": "end_turn"}:本轮正常结束{"type": "requires_action", "pending_batch_id": "...", "pending_call_ids": [...]}:等待客户端响应(如审批工具调用、回填函数结果),pending_call_ids列出待裁决的工具调用{"type": "retries_exhausted"}:重试已耗尽,本轮失败
订阅示例
Delta 增量流
默认情况下,每个事件仅在生成完成后下发一帧完整 Message(status: "completed")。若希望文本类事件(如 message、reasoning)在生成过程中流式逐块推送,可在请求时用 event_deltas[] 查询参数为指定事件类型开启增量流。该参数可重复传入以声明多个类型;未声明的事件类型仍按单帧完整 Message 下发。
event_id 归并到同一事件:
帧 type | 说明 |
|---|---|
event_start | 事件开始帧,event.id 即该事件最终完整 Message 的 id,event.type 为事件类型(message / reasoning);该帧自身不含 object / content |
event_delta | 增量帧,event_id 对应 event_start 的 event.id;delta.content 为本次新增的 ContentBlock 片段,delta.index 为内容块序号 |
message / reasoning | 事件结束时下发的完整 Message(object: "message"、status: "completed"),content 为聚合后的完整内容,与未开启增量时一致 |
event_delta 帧字段:
| 字段 | 说明 |
|---|---|
type | 恒为 event_delta |
event_id | 所属事件 ID,等于 event_start 的 event.id,也等于最终完整 Message 的 id;用于将增量帧归并到对应事件 |
delta.type | 恒为 content_delta |
delta.index | 内容块在 content 数组中的序号 |
delta.content | 本次新增的 ContentBlock 片段,如 {"type":"text","text":"…"} |
reasoning 与 message 均开启增量):
拼接文本时按
event_id + delta.index 顺序累加各 event_delta 的 delta.content;事件结束时下发的完整 Message 携带聚合后的完整内容,可用于校验。reasoning 事件可能只有 event_start 与完整 Message、不含 event_delta(思考预览不携带思考文本)。