429 不等于余额用完。先读取 HTTP 状态、error.code、错误正文和响应头;临时限流优先降低并发并遵守 Retry-After,没有该响应头时才用带随机抖动的指数退避。credit_balance_exhausted、organization_spend_limit_exceeded 等账单或支出错误不能靠重试解决。
官方参考(2026-10-28 核对):OpenAI API Rate limits · OpenAI Help:API 429 排查 · OpenAI API Error codes
先区分:速率限制、Credits 与支出上限
| 现象 | 优先判断 | 正确动作 |
|---|---|---|
| 429 / rate_limit_error / rate_limit_exceeded | 请求或 Token 速率达到适用限制,可能伴随突发流量 | 降速、降并发,遵守 Retry-After 或指数退避 |
| 429 / credit_balance_exhausted | 组织没有可用预付 Credits | 检查 API Billing 与余额,充值后再验证 |
| 429 / organization_usage_limit_exceeded | 达到 OpenAI 为组织设置的批准用量上限 | 查看 Limits,按组织权限申请提高上限 |
| 429 / project_spend_limit_exceeded | 项目配置的硬性支出上限已到 | 由项目管理员检查 spend limit 或等待周期重置 |
| 503 / server_is_overloaded | 模型暂时过载,不是你的 RPM/TPM 证明 | 遵守 Retry-After,延长退避并限制总耗时 |
同一个 429 外层状态可能对应不同原因,不能看到 “quota” 就反复充值,也不能看到 “rate limit” 就更换 API Key。错误正文和 error.code 是第一证据。
RPM、TPM 和项目/组织限额是什么
RPM 是 requests per minute,每分钟请求数;TPM 是 tokens per minute,每分钟 Token 数。官方还可能按 RPD、TPD、图片/音频用量或批处理队列限制。达到 RPM 或 TPM 中任意一个,都会先触发限制;多个模型还可能共享同一限额。
速率限制按组织和项目定义,并非单个用户的独立额度,且会随模型、使用层级和项目设置变化。不要把网上旧表格中的固定数字当作你的实际额度,应在 API Platform 的 Settings → Organization → Limits 查看当前值。
从响应头确认剩余量和等待时间
当响应提供这些字段时,记录它们而不是猜测:Retry-After 表示临时重试前至少等待的秒数;x-ratelimit-limit-requests、x-ratelimit-remaining-requests、x-ratelimit-reset-requests 说明请求预算;对应的 tokens 字段说明 Token 预算。项目级 Token 头部可能单独出现。
Retry-After 只适用于临时速率限制或模型过载场景。余额、账单、组织用量和项目支出错误需要先处理原因,等待或重试不会自动恢复。
实操排查:5 分钟定位是哪一层
- 保存证据:记录 UTC/本地时间、HTTP 状态、
error.type、error.code、响应头、请求使用的模型和项目;遮盖 API Key。 - 查 Limits:进入 API Platform 的组织 Limits,确认模型、RPM、TPM、项目 Token 以及当前使用层级。
- 查突发:统计最近一分钟的并发、重试数、Prompt Token 和输出 Token 预算,检查是否多个服务共用同一项目。
- 先降载:降低 worker 数、并发 semaphore 和单次输出预算,把大批量任务放进队列。
- 再验证:用少量请求验证恢复;如果错误变为 Credits 或 spend limit,转到对应的账单页,不要继续盲重试。
正确的 Retry-After 与指数退避
若响应带有合法的 Retry-After,至少等待该值,再增加少量随机抖动;若缺失或无效,使用 base × 2attempt + jitter,并设置最大等待、最大尝试次数和总 deadline。失败请求可能计入每分钟限制,多个实例立即重试会把问题放大。
async function callWithBackoff(run, maxAttempts = 5) {
for (let attempt = 0; attempt < maxAttempts; attempt++) {
try { return await run(); }
catch (error) {
const status = error.status ?? error.response?.status;
const retryAfter = Number(error.response?.headers?.['retry-after']);
const serverWait = Number.isFinite(retryAfter) ? retryAfter * 1000 : 0;
const fallback = Math.min(30_000, 500 * (2 ** attempt) + Math.random() * 250);
if (status !== 429 && status !== 503) throw error;
await new Promise(resolve => setTimeout(resolve, Math.max(serverWait, fallback)));
}
}
throw new Error('retry deadline exceeded');
}示例只演示退避逻辑,不包含 API Key。若 SDK 已自动重试,先查看当前版本的重试配置;不要再包一层无限重试,避免请求量翻倍。
生产环境如何避免瞬时 429
队列和并发控制
把请求放进有上限的队列,用共享 semaphore 控制 worker 数;不要让每个 Serverless 请求各自开启一套重试。对长任务使用后台队列或持久化 job 状态,避免客户端刷新后重复提交。
减少 Token 浪费
删除不必要的历史上下文、重复示例和过大的输出上限;Responses 使用 max_output_tokens,Chat Completions 使用 max_completion_tokens。长 Prompt 和过大的输出预算会更快耗尽 TPM。
幂等与可观测性
为业务任务生成幂等 ID,记录模型、项目、请求 ID、重试次数和最终状态,但永远不要记录完整 API Key。这样可以区分真正的新请求与重试,并定位哪个项目或用户制造突发流量。
Vercel、CI/CD 和多实例部署注意事项
在 Vercel Function、容器或 CI/CD 中,限流通常是所有实例共享的组织/项目预算。单个实例看起来不高,不代表总流量没超。集中式队列、分布式限流器或按项目拆分流量比“每台机器都重试”更可靠;同时确认 Preview 不会误打生产 API。
何时升级使用层级或联系支持
先把突发流量、Token 预算、重试和项目共享问题处理好;如果稳定流量仍长期达到当前上限,再查看 Limits 页面提供的使用层级或容量选项。提升批准月度用量、项目 spend limit 和速率限制是不同动作,需由组织或项目管理员处理。无法解决时,准备错误正文、错误码、请求 ID、发生时间和已尝试步骤,联系官方支持时不要提交 API Key。
不要只提高重试频率。评测、分类和离线生成可以评估OpenAI Batch API,它采用独立的批处理限额池,但仍受每批文件、排队 Token 与模型支持范围约束。
常见问题
OpenAI API 报 429 就一定是 Credits 用完了吗?
不一定。429 可能表示请求或 Token 速率达到上限,也可能是余额、组织用量或项目支出限制。先查看 HTTP 状态、error.code、错误正文和 Limits 页面;只有确认是 billing、quota 或 spend limit 时,才处理 Credits 或账单。
RPM 和 TPM 分别是什么意思?
RPM 是每分钟请求数,TPM 是每分钟 Token 数;有些模型或接口还会涉及 RPD、TPD、图片或音频限制。两者独立计算,先达到其中一个就会触发限制,不能只看请求次数。
OpenAI API 有 Retry-After 时应该怎么做?
把 Retry-After 视为最短等待时间,至少等待该秒数后再重试,并加入少量随机抖动。若缺少或无效,再使用指数退避;同时限制重试次数和总耗时,不能无限循环。
连续重试会不会让 429 更严重?
会。失败请求也可能计入每分钟限制,多个实例同时立即重试会形成新的突发流量。应集中控制重试、降低并发、使用队列,并避免 SDK 重试和自定义重试叠加。
提高 API Credits 就能提高速率限制吗?
不一定。Credits、组织批准的月度用量、项目 spend limit 与 RPM/TPM 是不同控制项。付费层级可能影响可用限额,但不能把一次充值当作立即解除所有限流的保证。
为什么平均 RPM 没超,仍然收到限流?
限流可能按更短时间窗口或 Token 预算执行,瞬时并发、长 Prompt、过大的输出 Token 预算、共享项目流量都可能先耗尽限制。把请求摊平并检查项目和组织层级的实际剩余量。
切换端点不是绕过限流:模型与项目限额仍需按实际响应判断;若正在改接口,先对照 Responses API 与 Chat Completions 的请求、事件和状态差异。
先读错误,再决定是降速还是查账单
429 的恢复路径取决于错误码:临时限流用等待和退避,Credits 或支出上限要改账单配置,401/403 则回到鉴权与权限页面。