模型 API
流式响应与连接管理
实现 SSE 解析、取消、超时与断流恢复,避免重复生成和错误的完成状态。
更新于
按协议解析 SSE
流式请求在模型生成过程中持续返回事件,通常使用 text/event-stream。TCP 数据块不是一个完整事件:一次 read() 可能只读到半行,也可能读到多个事件。解析器需要缓存未完成的数据,并按 SSE 空行分隔事件。
| 协议 | 正文与结束 |
|---|---|
| Chat Completions | choices[].delta;通常以 data: [DONE] 结束 |
| Responses | 按 type 处理文本增量、完成或失败事件 |
| Anthropic | content_block_delta、message_delta、message_stop 等 |
| Gemini | 候选结果增量与 finishReason |
客户端与代理配置
- 命令行使用 curl -N 关闭输出缓冲;Web 服务转发时避免把上游完整响应读入内存后才返回。
- 为首个响应和整个任务设置合理超时,并让用户可以主动取消。
- 前端只与自己的服务端连接,不在 SSE URL 中携带模型密钥。
- 使用 SDK 的流式迭代器,或在自行实现时处理 UTF-8 跨数据块、空事件与终止事件。
断流不等于完成
收到 HTTP 200 后仍可能发生供应商错误或连接中断。应用应记录请求 ID,将输出标记为未完成,并允许用户决定是否重新生成。连接断开不保证上游已经停止或没有产生费用。
避免 SDK、反向代理、任务执行器各自叠加多层重试。尤其在已经接收到部分内容后,自动重发可能造成重复输出、额外费用或重复工具动作。