流式用于降低首字延迟、边生成边展示。OpenAI 与 Anthropic 两面的传输格式不同,需分别处理。
OpenAI 兼容对话
请求
| 项 | 值 |
|---|---|
Body stream | true |
Accept | text/event-stream |
curl -sSN "https://51kik.com/v1/chat/completions" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{"model":"YOUR_MODEL_ID","stream":true,"messages":[{"role":"user","content":"你好"}]}'
SSE 格式
每行 data: 后为 JSON,对象类型为 chat.completion.chunk:
data: {"choices":[{"delta":{"content":"你"}}],...}
data: {"choices":[{"delta":{"content":"好"}}],...}
data: [DONE]
delta 可能包含 content、tool_calls 等。Tools 流式需按 OpenAI 规范拼接 partial tool_calls。
用量分片
网关对每次请求设置 stream_options.include_usage: true。上游支持时,流末尾会出现带 usage 的 chunk,便于计费与监控。
流中错误
若某个 data: 行 JSON 含 error 字段,应终止处理并走错误逻辑(SDK 会抛 GatewaySseError)。见 错误响应。
Anthropic 兼容 Messages
POST https://51kik.com/anthropic/v1/messages,stream: true,Accept: text/event-stream。
事件类型对齐 Anthropic(如 message_start、content_block_delta、message_stop)。详见 Messages API。
反向代理 / CDN
| 现象 | 处理 |
|---|---|
| 长时间无输出后一次性显示 | 关闭响应缓冲(nginx:proxy_buffering off) |
| 连接中途断开 | 提高 proxy_read_timeout;客户端支持断线重试策略 |
| HTTP/2 与 SSE | 确认中间层对 SSE 兼容 |
客户端实现清单
- 使用流式 HTTP 客户端,勿把整个 body 读入内存再解析
- 处理
[DONE]与连接关闭 - 区分用户取消与上游错误
- 生产环境代理已关闭 SSE 缓冲