三种协议都支持流式输出,响应为 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 格式为例:
本页示例为海外模型,地址用国外通道 https://acapi.top;换成国内通道 https://api.acapi.top 同样可用,两个地址均可用,见 调用地址。
bash
curl https://acapi.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_creation_input_tokens、cache_read_input_tokens 等) |
| OpenAI | [DONE] 之前的最后一个分片:choices 为空数组,带 usage(prompt_tokens、completion_tokens、total_tokens 及 completion_tokens_details)。个别线路把 usage 挂在带 finish_reason 的分片上(choices 不为空),请在任一分片出现 usage 时读取 |
| Gemini | 每个分片的 usageMetadata(promptTokenCount、candidatesTokenCount 等) |
取消流
客户端关闭 HTTP 连接即可终止流,服务端随即停止推送。
流式错误处理
流开始之前的错误(鉴权失败、模型不可用等)不会以事件流返回:HTTP 状态码非 200,content-type 为 application/json,错误结构与非流式请求一致。流开始之后 HTTP 状态码已为 200,错误只会出现在事件流中,客户端需按所用协议解析错误事件。上游在流中返回错误事件时,若平台尚未向你回传任何字节会自动换线路一次;已开始回传则返回 bad_response 并附上游原因,已收到的片段不能视为成功结果。