文档指南流式响应

流式响应

三种方言的 SSE 事件格式与解析注意事项。

三种方言都支持 Server-Sent Events(SSE)流式返回:模型一边生成一边推送增量,不必等完整响应。各家的事件格式不同,与官方 API 保持一致。

OpenAI 格式(Responses)

请求体加 "stream": true。事件带类型字段,如 response.createdresponse.output_text.deltaresponse.completed

python
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)

Anthropic 格式(Messages)

同样加 "stream": true,但事件用 SSE 的命名事件event: + data: 两行):message_startcontent_block_start → 若干 content_block_deltacontent_block_stopmessage_deltamessage_stop

SSE
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 数组(非流式)。

stream.sh
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 用量在结束事件里给出,计费在流结束后结算。