同一条报错,在不同环节含义完全不同:429 可能是你的并发太高,也可能是上游在限流,还可能是整台网关挤满了。判断「这口锅归谁」,比记住错误码本身更有用。
先看状态码:谁的问题
| 状态码 | 常见含义 | 多半是谁的问题 | 第一步怎么查 |
|---|---|---|---|
| 400 | 请求格式错、参数越界、上下文超长 | 调用方 | 看返回体的 error.message,常直接写明是哪个参数 |
| 401 | Key 无效 / 过期 / 复制不完整 | 调用方或站点 | 换 Key 重试;仍失败就是这个站在拒绝你 |
| 402 / 403 | 余额不足 / 无权限或地区限制 | 账户或站点 | 看面板余额;确认该分组是否允许调用这个模型 |
| 404 | 模型名不存在 / 路径写错 | 调用方或站点 | 确认 Base URL 的 /v1 与模型名是否来自该站列表 |
| 413 / 422 | 请求体过大 / 字段校验不过 | 调用方 | 减少单次输入,或按文档补齐必填字段 |
| 429 | 触发限流 | 三方都可能 | 见下文「429 的三种来源」 |
| 500 / 502 / 503 / 504 | 上游异常、网关连不上上游 | 站点或上游 | 连续重试仍失败就是对方故障,换站或等恢复 |
| 520 / 524 | Cloudflare 层超时 | 站点链路 | 常见于长请求,缩短单次输出或改用流式 |
429 的三种来源,别急着加钱
- 账户级限流:你自己的 RPM / TPM 配额打满了——降低并发或换更小的模型;
- 上游限流:站点把官方账号池的配额吃满了——与你无关,重试或换时段;
- 共享池拥挤:整台网关都在排队——表现为失败率与 p90 延迟同时上升,等低谷时段再跑。
400 里最常遇到的两个:上下文超长与 max_tokens
上下文超长的报错通常是 context length exceeded / too many tokens,注意它是「输入 + 输出」一起算的:你留的 max_tokens 也算在窗口里。长文档场景建议先本地估算 token 数,或改用检索只带相关片段。
5xx 与「网关无法连接上游」
这类报错几乎都不是你代码的问题。中转站的架构是「你的请求 → 网关 → 上游」,网关连不上上游时会给 502;上游思考太久没返回,会被判成 120 秒超时就断开,前端看到的就是 502 或连接被重置。
- 偶发一次:直接重试,别改代码;
- 固定某个模型必失败:该分组的上游挂了,换模型或换站;
- 高峰期大面积失败:容量问题,属于站点选型时要考虑的风险;
- 长输出任务必失败:把单次输出拆小,或改用流式输出。
返回「成功」但结果是坏的
| 现象 | 可能原因 | 怎么确认 |
|---|---|---|
| 流式输出中途断掉 | 上游超时或网关缓冲策略 | 记录断点位置,重试同一请求看是否稳定复现 |
| 内容为空、只有思考字段 | 客户端没读对字段(reasoning_content 等) | 打印完整 JSON 看内容在哪一层 |
| 模型自称不是你以为的模型 | 掉包或系统提示词覆盖 | 用同题在官方渠道对比;见选站避坑 |
| 答案明显降智 | 上游换了小模型或做了截断 | 同一提示词多次调用的稳定性观察 |
推荐的排查顺序
- ① 单发一条最小请求用 curl 和一个只有两个字回答的提示,排除并发与长上下文因素。
- ② 换 Key / 换模型 / 换站各试一次三个变量只动一个,就能定位是账户、模型还是站点的问题。
- ③ 打开日志记录 request-id多数网关会回传 request id 或 trace id,拿它去问客服比描述现象有效得多。
- ④ 记录时间与频率「每天 22 点必慢」这类规律是共享池拥挤的典型证据,也是换站时的判断依据。
常见问题
为什么同一个 Key 昨天能用今天 401?
常见三种原因:站点更换了上游账号池导致你的分组被调整;Key 被站点判定为异常使用而封禁;或者你复制时把换行也带进去了。先换一个临时 Key 验证是 Key 的问题还是账户的问题。
429 是站点在限我,还是上游在限站点?
用单发小并发测试:仍 429 说明限流来自上游或共享池(不是你的配额);只有并发升高才 429 说明是你的账户配额。两种情况的处理方式完全不同。
客户端一直转圈然后超时,但用 curl 正常?
多半是客户端把上下文塞得过长,或开启了会显著增加耗时的功能(如工具调用、长思考)。对比 curl 与客户端的请求体大小和 max_tokens 设置。