深色模式
流式(SSE)
所有协议端点均支持 SSE 流式;事件格式跟随端点协议。
OpenAI 协议(chat / responses)
"stream": true:
text
data: {"id":"chatcmpl-xxx","choices":[{"delta":{"content":"你"}}],...}
data: {"id":"chatcmpl-xxx","choices":[],"usage":{"prompt_tokens":32,"completion_tokens":8,...}}
data: [DONE]- Chat Completions:网关自动向上游注入 usage 统计,最后一个空 choices 块携带 usage,随后
[DONE]; - Responses:分类型事件(
response.created、response.output_text.delta、response.completed…),usage 在response.completed。
Anthropic 协议(messages)
"stream": true,命名事件:
text
event: message_start
data: {"type":"message_start","message":{"id":"msg_xxx","usage":{"input_tokens":32,...}}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"你"}}
event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"},"usage":{"output_tokens":8,...}}
event: message_stop
data: {"type":"message_stop"}message_delta的 usage 为累计值,以最后一个为准;- 长空闲期会收到
event: ping保活; - HTTP 200 之后仍可能收到
event: error(上游中断):客户端必须处理流内错误事件,不能仅凭状态码判定成功。
客户端实践
| 事项 | 建议 |
|---|---|
| 超时 | 首字节超时 ≥ 60s(大上下文预热慢);块间超时 ≥ 30s |
| 中断计费 | 流中断按网关捕获到的 usage 结算;无 usage 不计费 |
| 重试 | 429 读取 Retry-After 并退避;流已输出或已执行工具后不要自动重放。普通文本端点不能仅凭添加幂等键就假定不会重复执行 |
| 代理链 | 中间代理需关闭缓冲(X-Accel-Buffering: no 语义),否则首字节延迟劣化 |
| 连接复用 | 在进程内复用同一个 SDK / HTTP 客户端;每次新建客户端会重复 DNS、TCP 和 TLS 建连 |
| 首输出统计 | ping、message_start、response.created 不代表已有模型文字;分别记录首响应头、首个有效内容和完整结束时间 |
排查“等待很久才出字”时,请记录客户端所在地区和运营商、模型、流式开关、输入长度及请求 ID。大上下文和推理过程可能增加首输出等待;在满足任务要求的前提下,减少重复上下文、保留稳定的提示前缀并使用流式展示。API Key 和客户原文不要附在故障报告中。