Responses SSE

百科 · 模型与对话 · 带名字的事件

Streaming 那篇的 /chat/completions 几乎只写 data:,事件类型是默认的 message,结束靠 data: [DONE]。Responses API 把 stream 设为 true 时仍是 SSE,但每种动作都有规定的事件名。event 行和 data 里的 type 是同一个名字,另外有一个递增的 sequence_number。

下面这些是 DeepSeek 文档列出的。OpenAI 的 Responses 还有网页搜索、代码解释器等内置工具的事件;那些工具在 DeepSeek 上会被忽略,对应事件这里不列。

一条流长什么样

curl https://api.deepseek.com/responses \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $DEEPSEEK_API_KEY" \
  -N \
  -d '{
    "model": "deepseek-flash",
    "input": "你是谁",
    "stream": true
  }'

正文长这样:

event: response.created
data: {"type":"response.created","sequence_number":0,"response":{"id":"resp_8f2a","status":"in_progress"}}

event: response.output_text.delta
data: {"type":"response.output_text.delta","sequence_number":3,"output_index":0,"content_index":0,"delta":"我"}

event: response.output_text.delta
data: {"type":"response.output_text.delta","sequence_number":4,"output_index":0,"content_index":0,"delta":"是"}

event: response.completed
data: {"type":"response.completed","sequence_number":8,"response":{"id":"resp_8f2a","status":"completed"}}

翻译成人话:

  • 先看 event,再解析 data。只读 data 会把生命周期、正文、工具参数混在一堆 JSON 里
  • 拼正文只收 response.output_text.delta 的 delta。按 sequence_number 排,同一块内容用 output_index 和 content_index 分开
  • 结束看 response.completed、response.incomplete 或 response.failed。没有 data: [DONE]

Streaming 里用标准库扫 data: 的那段,这里不够。resty 的 ev.Name 就是这个事件名,ev.Data 仍是 JSON 正文。

生命周期

一次响应的头尾:

  • response.created:第一条。响应已建立,status 为 in_progress
  • response.in_progress:还在生成
  • response.completed:正常结束。带上完整的 response,包括 usage
  • response.incomplete:截断结束,例如撞上 max_output_tokens。也带完整 response
  • response.failed:失败结束。response 里有 error

created 在最前。三条结束事件里会出现一条,流在那里停。

条目怎么进出

output 里的一条,和这条里的一块内容,各有开始和结束:

  • response.output_item.added / response.output_item.done:一条输出开始 / 完成。item 可以是 reasoning、message、function_call、custom_tool_call
  • response.content_part.added / response.content_part.done:这条输出里的一块内容开始 / 完成

普通一句回答的顺序是:output_item.added(一条 message)→ content_part.added → 许多 output_text.delta → output_text.done → content_part.done → output_item.done → completed。

正文、思考、参数

增量事件成对出现。delta 是刚到的一小段,done 带上这一块的全文。

  • response.output_text.delta / response.output_text.done:给用户看的正文
  • response.reasoning_text.delta / response.reasoning_text.done:思考文本
  • response.function_call_arguments.delta / response.function_call_arguments.done:工具参数。拼完仍是一段 JSON 字符串,和 Tool 里的 arguments 一样
  • response.custom_tool_call_input.delta / response.custom_tool_call_input.done:Codex 的 apply_patch

参数还在 delta 里时不要执行工具。等 response.function_call_arguments.done,或这条 function_call 的 output_item.done。

总结

  • Responses 的流仍是 SSE。event 用协议规定的名字,不再是默认的 message
  • 拼正文看 response.output_text.delta;拼参数看 response.function_call_arguments.delta
  • sequence_number 给这一次响应里的事件排序
  • 结束看 completed / incomplete / failed,没有 [DONE]

参见