三种协议都支持流式输出,响应为 text/event-stream。Anthropic 与 OpenAI 格式在请求体中设置 "stream": true;Gemini 原生格式改用 :streamGenerateContent 端点。
各协议的事件格式
| 协议 | 分片形态 | 结束标志 |
|---|---|---|
Anthropic(/v1/messages) | event: + data: 成对出现,序列为 message_start → content_block_start → 多个 content_block_delta → content_block_stop → message_delta → message_stop | message_stop 事件 |
OpenAI(/v1/chat/completions) | data: {...} 分片,object 为 chat.completion.chunk,文本在 choices[0].delta.content | data: [DONE] |
Gemini(:streamGenerateContent) | data: {...} 分片,文本在 candidates[0].content.parts[].text | 流结束时连接关闭,没有单独的结束标记 |
以 OpenAI 格式为例:
bash
curl https://caapi.top/v1/chat/completions \
-H "Authorization: Bearer sk-xxxxxx" \
-H "content-type: application/json" \
-d '{
"model": "gpt-5.6-sol",
"stream": true,
"messages": [{"role": "user", "content": "写一句话"}]
}'流式用量块
三种协议都会在流中返回本次请求的 token 用量,无需额外参数:
| 协议 | 用量位置 |
|---|---|
| Anthropic | message_delta 事件的 usage(input_tokens、output_tokens、cache_read_input_tokens 等)。该事件还带 x_conv_id(本次请求的会话 ID,排查问题时可提供)和 x_is_final 两个附加字段 |
| OpenAI | [DONE] 之前的最后一个分片:choices 为空数组,带 usage(prompt_tokens、completion_tokens、total_tokens 及 completion_tokens_details) |
| Gemini | 每个分片的 usageMetadata(promptTokenCount、candidatesTokenCount 等) |
取消流
客户端关闭 HTTP 连接即可终止流,服务端随即停止推送。
流式错误处理
流开始之前的错误(鉴权失败、模型不可用等)不会以事件流返回:HTTP 状态码非 200,content-type 为 application/json,错误结构与非流式请求一致。流开始之后 HTTP 状态码已为 200,错误只会出现在事件流中,客户端需按所用协议解析错误事件。