流式输出
流式模式会在模型生成内容时持续返回片段,首字显示更快,特别适合较长回答和聊天客户端。
如何开启
在聊天请求 JSON 中加入 "stream": true:
json
{
"model": "YOUR_MODEL",
"messages": [
{"role": "user", "content": "请详细解释什么是流式输出。"}
],
"stream": true
}它是如何工作的
服务端通常使用 Server-Sent Events 持续发送以 data: 开头的数据块。客户端应逐块消费,而不是等待整个响应结束再读取。
- 首个数据块不一定包含正文,可能只有角色或元数据。
- 正文被拆成多个片段,客户端应按顺序拼接。
- 流正常结束时通常会收到结束标记或连接自然完成。
- HTTP 200 只说明连接已建立,流中途仍可能返回错误信息。
为什么会中断
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
| 短回答正常,长回答中断 | 客户端读取超时、网络切换或上游生成中断 | 增大客户端读取超时;记录错误并重试 |
| 一直等待,最后一次显示 | 客户端或中间层缓存了数据流 | 确认客户端按流读取,不要把响应转成普通 JSON |
| 出现乱码 | 按字节块错误解码 UTF-8 | 使用流式 UTF-8 解码器,保留跨块字符状态 |
| 重复内容 | 重连时从头发起,却直接追加旧内容 | 重试前清空未完成回复,或明确标注重试 |
九关转发说明
九关 Worker 会直接透传上游的 ReadableStream,不会先把整段回答读入内存,也明确禁用了缓存。这种实现适合流式 API,但最终稳定性仍同时受用户网络、Cloudflare 网络和上游服务影响。
客户端建议
为连接错误设置有限次数的指数退避重试;但不要对已经产生副作用的请求盲目重复。聊天生成重试时,也要避免在界面上重复拼接内容。