文档指南流式响应
流式响应
三种方言的 SSE 事件格式与解析注意事项。
三种方言都支持 Server-Sent Events(SSE)流式返回:模型一边生成一边推送增量,不必等完整响应。各家的事件格式不同,与官方 API 保持一致。
OpenAI 格式(Responses)
请求体加 "stream": true。事件带类型字段,如 response.created、response.output_text.delta、response.completed:
stream = client.responses.create(
model="claude-fable-5",
input="Tell me a story",
stream=True,
)
for event in stream:
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)data: {"type":"response.created", ...}
data: {"type":"response.output_text.delta","delta":"Once"}
data: {"type":"response.output_text.delta","delta":" upon"}
data: {"type":"response.completed","response":{..., "usage":{...}}}Anthropic 格式(Messages)
同样加 "stream": true,但事件用 SSE 的命名事件(event: + data: 两行):message_start → content_block_start → 若干 content_block_delta → content_block_stop → message_delta → message_stop。
event: message_start
data: {"type":"message_start","message":{...}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Once"}}
event: message_stop
data: {"type":"message_stop"}Gemini 格式
改调 :streamGenerateContent 动作并追加 ?alt=sse;每条 data: 行是一个 GenerateContentResponse 片段,增量文本在 candidates[].content.parts[].text 里。不带 alt=sse 时返回完整 JSON 数组(非流式)。
curl "https://api.soleapi.com/v1beta/models/gemini-2.5-pro:streamGenerateContent?alt=sse" \
-H "x-goog-api-key: $SOLEAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"contents": [{"parts": [{"text": "Tell me a story"}]}]}'解析注意事项
- SSE 事件以空行分帧,而 TCP 分段可能把一个事件拆到多个读取里——先缓冲、凑齐完整帧再解析,自己手写解析时这是最常见的坑。
- 长生成请把读超时放宽到 5 分钟以上,避免推理型模型长时间无输出时被客户端掐断。
- 连接中断时的重试要按新请求处理(流没有断点续传),并考虑用非流式响应兜底。
- 渲染 UI 时对增量做节流合帧,避免每个 delta 都触发一次重绘。
- 流式请求的 token 用量在结束事件里给出,计费在流结束后结算。