agent.message 事件之前,提前收到 assistant 输出片段。创建 Session 时开启:
接口
接口路径不变:| API | 增量行为 |
|---|---|
GET /api/v1/cloud/sessions/{session_id}/events/stream | Session 级实时 SSE 流 |
GET /api/v1/cloud/sessions/{session_id}/threads/{thread_id}/stream | thread 级实时 SSE 流 |
GET /api/v1/cloud/sessions/{session_id}/events | Session 级历史事件回放 |
GET /api/v1/cloud/sessions/{session_id}/threads/{thread_id}/events | thread 级历史事件回放 |
incremental_streaming_enabled 为 false 或省略时,这些接口保持原有行为,不返回增量事件。
事件模型
公开事件与 qodercli/Anthropic raw stream event 对齐:CAW 侧产生的 raw stream event 类型为message_start、content_block_start 等;CAS 对外暴露时给事件 type 加上 agent. 前缀,并补充 id、session_id、session_thread_id、turn_id、message_id、parent_tool_use_id、processed_at 等 CAS 元字段。
顶层增量事件类型:
agent.content_block_delta.delta.type,不是顶层事件类型。
当前实现中,agent.content_block_start.content_block.type 可能为:
content_block.type | 说明 |
|---|---|
thinking | thinking block,初始 thinking 为空字符串 |
text | text block,初始 text 为空字符串 |
tool_use | 工具调用 block,包含 id、name 和初始空 input |
delta.type | 含义 |
|---|---|
text_delta | 文本输出片段 |
thinking_delta | 模型/provider 输出 thinking 时的思考片段 |
signature_delta | thinking block 的签名片段,存在时透出 |
input_json_delta | 工具入参 JSON 片段。产品语义里的 tool_input_delta 对外使用这个 wire shape,字段为 partial_json |
tool_output_delta | 预留给未来的工具输出流式;当前实现不会产生该 delta,工具结果仍通过完整 agent.tool_result 事件返回 |
agent.message 仍会在增量序列之后返回,作为最终权威结果。对于同一个 text block,按顺序拼接 text_delta.text 应等于最终 agent.message.content[index].text;如果 provider 漏发了最后一小段文本,CAW 会在 agent.content_block_stop 前补发尾部 text_delta。
快速验证
前置条件:- 有效 PAT,写入
QODER_PAT - 已存在的 Agent ID,写入
AGENT_ID - 已存在的 Environment ID,写入
ENVIRONMENT_ID - 本地已安装
jq
api.qoder.com;验证预发部署时可切到 Global Test base。
关闭开关对照
再创建一个不传incremental_streaming_enabled 或显式传 false 的 Session。响应中应包含:
user.message 后,stream 和 history 应包含 agent.message、session.status_idle 等完整事件,但不应包含上面的增量事件类型。
解析检查项
- 将 SSE
event:和 JSONdata.type当作公开事件类型。 - 对于
delta.type == "text_delta"的agent.content_block_delta,追加delta.text来重建文本。 - 对于
delta.type == "thinking_delta"的agent.content_block_delta,追加delta.thinking来重建 thinking;后续仍可能收到完整兼容事件agent.thinking。 - 对于工具入参增量,判断
delta.type == "input_json_delta"并追加delta.partial_json;不要期待顶层tool_input_delta事件。 - 当前不会收到
tool_output_delta;工具执行结果以完整agent.tool_result返回。 - 使用
index区分多个 content block。 processed_at在 agent 生成事件上可能缺失,解析时按可选字段处理。- 如果客户端支持同一连接多轮对话,收到
session.status_idle后继续保持连接。 - 网络中断后用
Last-Event-ID携带最后收到的事件 ID 重连。