OpenAI API 现在如何区分 429 和 503:中转渠道的限流、过载与重试清单
OpenAI 在 2026 年 9 月更新了 API 错误语义:流量增长过快通常返回 429 slow_down,模型暂时过载则返回 503 server_is_overloaded。本文从中转 API 用户的角度,拆解错误分类、Retry-After、流式请求、备用渠道和成本治理的核验方法。
正文
OpenAI API 现在如何区分 429 和 503:中转渠道的限流、过载与重试清单
如果你在 AI 编程代理、批处理脚本或多步 Agent 里遇到 OpenAI API 请求失败,看到 429 或 503 后直接“再发一次”并不一定是正确做法。
OpenAI 在 2026 年 9 月 2 日更新了 API 错误说明:流量增长过快时,可以返回 429、rate_limit_error、slow_down;请求的模型暂时没有足够容量时,则返回 503、service_unavailable_error、server_is_overloaded。两者都可能携带 Retry-After,但原因、恢复动作和是否应该切换模型并不相同。
这对使用第三方 API 渠道的开发者尤其重要:如果中转站把所有错误都压成一个“请求失败”,你的应用就无法判断是该降速、等待、换模型,还是检查余额和权限。本文不评价某个具体渠道,而是给出一套接入前和故障时都能使用的核验清单。
先看结论:不要只按 HTTP 状态码重试
| 现象 | 更应关注的字段 | 通常意味着什么 | 第一动作 |
|---|---|---|---|
429 + rate_limit_error + slow_down |
Retry-After、限流响应头 |
流量增加太快,哪怕 RPM/TPM 尚未达到表面上限也可能触发 | 至少等待 Retry-After 指定时间,降低并发,再逐步恢复 |
503 + service_unavailable_error + server_is_overloaded |
模型名、Retry-After、状态页 |
当前模型暂时没有足够处理容量 | 等待后有限重试;持续失败时再评估同一渠道的替代模型或备用渠道 |
429 + credit_balance_exhausted |
余额、账单状态 | 预付额度耗尽 | 不要重试,先补余额或核对账单 |
429 + project_spend_limit_exceeded 等 |
项目/组织限制 | 达到支出或用量上限 | 处理配额或限额,重试本身不会恢复访问 |
401、403、404 |
鉴权、地区、模型 ID | Key、权限、地区或模型配置问题 | 修正配置,不要把它当作临时拥塞 |
关键点是:HTTP 状态码只是第一层,error.type 和 error.code 才决定恢复策略。 同样是 429,slow_down 与余额耗尽的处理方式完全不同;同样是服务不可用,也不能把模型过载和请求参数错误混为一谈。
9 月 2 日的变化,为什么会影响中转 API
OpenAI 更新日志将两类情况分开:
- 流量增长过快,返回
429和slow_down; - 模型暂时过载,返回
503和server_is_overloaded; - 两类响应都可能带
Retry-After;没有该字段时,官方建议使用带随机抖动的指数退避。
官方速率限制文档还特别说明,slow_down 不一定代表你已经超过了 RPM 或 TPM。它反映的是流量上升速度,而不是简单的累计请求数量。因此,刚刚扩容、批量任务同时启动、Agent 短时间内并发创建大量子任务,都可能先遇到 slow_down。
模型过载则是另一类问题:请求已经抵达服务,但目标模型暂时缺少处理容量。此时盲目把并发继续加大,只会让重试和原始请求叠加,延长恢复时间,并可能增加实际用量。
对于中转渠道,变化带来三个验收问题:
- 是否原样保留上游 HTTP 状态码?
- 是否保留
error.type、error.code和Retry-After? - 如果渠道做了错误转换,是否在文档中说明转换规则?
如果答案是否定的,客户端就很难区分“渠道没钱了”“模型暂时拥塞”和“自己的流量爬升过快”。这不是接口能返回文本就算兼容的问题,而是故障恢复语义是否完整的问题。
429 slow_down:先控制流量,不要急着换模型
1. 先读取服务端的等待提示
Retry-After 如果存在,应当被视为最短等待时间,而不是建议值。客户端至少等待该时长,再增加少量随机抖动,避免所有请求在同一秒再次冲击服务。
如果没有 Retry-After,可以使用指数退避,但要同时设置:
- 最大重试次数;
- 单次任务的总重试时限;
- 全局并发上限;
- 单个用户或项目的预算上限。
不要在 SDK 已经自动重试的情况下,再在业务层无条件套一层重试。两层重试会把一次失败变成多次请求,尤其容易放大 Agent 的调用量。
2. 稳定流量比短时冲刺更重要
对批处理、代码索引、批量评测和 Agent 子任务,建议把“瞬时并发”改成“有节奏的队列”:
- 先以较低并发启动;
- 观察
429、Retry-After和剩余限流响应头; - 逐步增加,而不是一次性把并发拉满;
- 出现
slow_down后退回最近的稳定档位; - 将请求速率和 token 速率分别记录。
这也解释了为什么只看一个渠道的“理论 RPM/TPM”不足以判断实际可用性。爬升速度、共享项目、模型差异和渠道自身的排队策略,都可能改变结果。
503 server_is_overloaded:把模型容量问题与 Key 问题分开
当错误体明确是 server_is_overloaded 时,优先把它当作模型暂时不可用,而不是 API Key 失效。
推荐顺序如下:
- 尊重
Retry-After; - 没有该字段时,使用递增等待和随机抖动;
- 在有限次数内重试同一个请求;
- 如果任务允许,再切换到已经验证过的替代模型或备用渠道;
- 记录原始模型、渠道、时间和错误码,避免把上游过载误判成渠道长期不稳定。
这里要注意“替代模型”不是随便换一个模型名。对于 AI 编程代理、工具调用和结构化输出,替代模型至少要重新核对:上下文窗口、工具调用格式、推理参数、流式事件、输出结构和账单方式。一个能返回文本的模型,不一定能无损替代原模型。
OpenAI 在 2026 年 9 月 24 日曾记录 GPT-6 Astra Pro 错误率升高事件,之后完成恢复。这类模型级事件说明:即使账号、请求格式和渠道都没有改变,单个模型也可能出现短时异常。因此,可靠性记录应至少按“渠道 + 模型 + 时间段”拆分,而不是只给整个 API 平台贴一个稳定或不稳定的标签。
余额、配额和过载,为什么不能用同一套重试
最容易造成成本失控的做法,是把所有 429 都交给同一个重试装饰器。
slow_down:可以有限重试,但必须降速;server_is_overloaded:可以等待后有限重试,必要时做经过验证的降级;credit_balance_exhausted:先处理余额;organization_spend_limit_exceeded、project_spend_limit_exceeded:先处理限额;organization_usage_limit_exceeded:需要提升获批用量或联系平台;- 鉴权、地区和模型不存在:修正配置。
官方错误码文档明确提醒,账单、支出和配额类错误不会因为不断重试而恢复。对中转 API 来说,还应额外确认渠道是否把余额不足、分组不可用、模型未开通等渠道级错误保留在响应体中。如果这些错误都被包装成 503,自动故障转移可能会把同一错误复制到多个渠道。
流式响应是重试设计的分界线
请求在流开始前失败,与流开始后中断,不是同一个问题。
- 流开始前收到
429或503:可以依据错误码和等待提示决定是否重试; - 流已经开始后连接中断:不要简单地重放原请求,否则可能造成重复输出、重复工具调用或重复扣费;
- 工具调用已经执行后再失败:要根据工具是否具有幂等性决定恢复方式;
- Agent 已经产生部分状态后:优先保存会话和任务状态,再判断是否续跑,而不是重新创建整个任务。
因此,接入中转渠道时,不能只用一个非流式 curl 成功就宣布“兼容”。至少要测试普通请求、流式请求、错误发生在流开始前和工具调用后的行为,并记录是否产生重复计费或重复事件。
多渠道应用的最小故障转移策略
如果你的应用本身接入了多个 API 渠道,可以把恢复动作分成三层,而不是遇到任何失败都立即换渠道:
第一层:请求级恢复
适用于明确的临时错误:
- 读取
Retry-After; - 加入随机抖动;
- 限制尝试次数和总时间;
- 避免 SDK 与业务层重复重试。
第二层:任务级降级
适用于模型暂时过载或任务允许降低规格的情况:
- 切换到已验证的同类模型;
- 缩小上下文或降低并发;
- 将非实时任务放入队列;
- 将可延迟任务改为批处理。
第三层:渠道级替代
适用于经过证据确认的渠道异常:
- 使用另一个已验证模型 ID 和接口协议的渠道;
- 保留原始错误和切换原因;
- 记录切换前后的成本、延迟和成功结果;
- 任务完成后复盘,不把一次切换结果当作长期稳定性证明。
RouterHub 更适合用来查找和比较候选渠道;实际请求是否切换、如何重试,仍应由你的应用或客户端按自己的任务约束实现。不要把“目录中能找到某模型”理解成“该渠道已经验证了所有流式、工具调用和故障恢复行为”。
接入中转 API 前的 8 项核验清单
- 错误体:是否保留
error.type、error.code、消息和请求 ID? - 状态码:
slow_down是否仍是429,server_is_overloaded是否仍是503? - 等待提示:是否透传
Retry-After?单位和格式是否明确? - 限流头:是否能看到剩余请求数、token 数和重置时间?
- 流式行为:流开始前的错误与流中断是否可区分?
- 工具调用:重试是否可能重复执行工具?有没有幂等键或任务状态?
- 账单边界:失败请求、重试请求和部分流输出如何计费?
- 模型维度:能否按模型、渠道、时间段查看错误,而不是只有一个总成功率?
若渠道没有公开这些信息,结论应写成“协议兼容性证据不足”,而不是直接判断它稳定或不稳定。一次成功请求只能证明某个时刻、某个模型和某种请求条件下能返回结果。
给 AI 编程代理用户的实际建议
如果你把 OpenAI API 接到 Codex、代码审查、自动修复或其他编程代理里,优先落实下面四点:
- 为
slow_down和server_is_overloaded分别设置处理路径; - 为工具调用、文件修改和外部写操作设置幂等或人工确认边界;
- 把重试次数、总等待时间和备用模型切换记入任务日志;
- 每次评估渠道时,同时观察成功率、错误类型、恢复时间和实际用量。
这样做的目标不是让每个请求都永不失败,而是让失败可解释、可恢复、可计费核对。对于需要长时间运行的 Agent,“能否在一次故障后继续正确完成任务”通常比“单次请求是否成功”更值得关注。
参考来源
- OpenAI API 更新日志:2026 年 9 月 2 日错误语义更新
- OpenAI API 速率限制:
slow_down、server_is_overloaded与 Retry-After - OpenAI API 错误码:余额、配额、限流和模型过载
- OpenAI API 部署检查清单:重试、后台任务和错误处理
- OpenAI Status:GPT-6 Astra Pro 错误率升高事件(2026 年 9 月 24 日)
资料核验时间:2026 年 9 月 26 日(UTC)。文中的错误语义、状态码和官方恢复建议以该时间点公开文档为准;第三方渠道的错误透传、计费和模型可用性需要在实际接入时单独验证。