Claude 流式请求遇到 529 怎么处理:SSE 错误与续传验收
Claude Messages API 可能在 HTTP 200 流中发送 error 事件。本文用官方事件规范说明 529、累计用量、分块恢复及 4.6 之后的续写边界。
Claude Messages API 设置 stream: true 后返回 SSE 事件流。客户端不能只看初始 HTTP 200 就判定成功:Anthropic 文档指出,服务过载时可能在流中发送 event: error,其 error.type 为 overloaded_error;同类错误在非流式请求中通常对应 HTTP 529。若前端已展示部分回答,简单重试整个请求可能造成重复文字、重复工具动作和账单误判。
先按事件状态判断
正常事件流从 message_start 开始,内容块按 content_block_start、content_block_delta、content_block_stop 推进,随后有 message_delta 和最终 message_stop。中间还可能出现 ping。只有收到终止事件并检查停止原因,才应把响应记为完整。message_delta 中的 usage 是累计值,不能把每次事件的 token 数相加。直接来源:Anthropic Streaming messages 官方指南、Claude Sonnet 5.5 模型卡。
可复现的最小验证
在已具备 Claude API 权限的隔离测试环境,用脱敏请求和官方 SDK 或 curl 开启流式;示例模型 claude-sonnet-5-5 以账号实际权限为准。API Key 从本机环境变量读取,不写进脚本或日志。记录每条 SSE 的 event 与 JSON type,保存请求 ID、最后一个完整文本块和最终 usage;不要记录真实用户原文。
curl -N https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"claude-sonnet-5-5","max_tokens":128,"stream":true,"messages":[{"role":"user","content":"请用两句话解释幂等性。"}]}'
分别测试正常结束、客户端主动断开、代理超时,以及模拟流中 event: error。模拟错误要在本地测试层注入,不能把真实生产请求作为故障演练。
接入与排障顺序
- 确认代理未缓冲 SSE,客户端能逐条接收事件;首个 HTTP 状态和流内事件分别记录。
- 按内容块索引累积文本,仅在完整块结束后提交可恢复进度;
ping不作为正文。 - 遇到
overloaded_error或中断时,标记请求未完成,保留已显示内容和请求 ID;重试采用退避及次数上限。 - 若需要续写,按模型代际使用官方恢复策略:Claude 4.5 及以前可把已收到的 assistant 文本作为下一轮前缀;Claude 4.6 及以后改用 user 消息提供已收到文本并要求从断点继续。
- 工具调用和 thinking 块不能按半截文本恢复,出现部分工具参数时停止自动执行并转人工或重新规划。
中转站尤其要检查的边界
上游可能已生成部分 token,即使用户只看到失败,也不能凭 HTTP 200 或本地断线假定费用为零。是否扣费必须依据实际 usage、平台计费规则及失败处理链路对账。本文只说明 Anthropic 官方协议与客户端排障方法,没有更改 LondAI 网关、重试或余额逻辑,也未用本站 Key 做真实扣费测试。若中转渠道改写 SSE 事件,应先确认其与官方事件流的差异。
验收表
正常流必须收到 message_stop、文本不重复且 usage 与请求记录一致;故障流必须显示未完成状态、不会误执行半截工具调用、重试有上限,并能解释是否产生费用。对 Claude 4.5 与 4.6 之后分别演练续写,比较重复句、遗漏句和成本,再决定是否向用户提供“继续生成”按钮。通用接入参数可参考 LondAI API 文档。