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_progressresponse.in_progress:还在生成response.completed:正常结束。带上完整的 response,包括usageresponse.incomplete:截断结束,例如撞上max_output_tokens。也带完整 responseresponse.failed:失败结束。response 里有error
created 在最前。三条结束事件里会出现一条,流在那里停。
条目怎么进出
output 里的一条,和这条里的一块内容,各有开始和结束:
response.output_item.added/response.output_item.done:一条输出开始 / 完成。item可以是reasoning、message、function_call、custom_tool_callresponse.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]
参见
- 上一篇:Responses API
- SSE 字段本身:Streaming
- 官方:Using the Responses API · DeepSeek
- 动手:从 0 实现一个 Agent · 阶段一(聊天机器人)