OpenAI 401 与 429 报错排查清单
基于 OpenAI 官方文档,快速定位 Unauthorized 与限流/额度类报错,并给出可落地处理步骤。
1)401:先区分认证问题还是策略问题
OpenAI 错误文档中,401 不止一种原因,包括认证失败与 IP 白名单不匹配等。不要把 401 当成单一问题。如果从头开始,正确获取 OpenAI API Key 可以避免大部分 401 问题。
建议先确认:当前使用的是哪把 Key、归属哪个项目、请求出口 IP 是否符合项目策略。关于正确配置密钥,包括权限范围和项目分配,请参阅我们的设置指南。
- 核对 Authorization 头格式
- 确认 Key 归属组织/项目是否正确
- 检查 IP 白名单配置
2)429:区分速率限制与额度不足
OpenAI 常见的 429 包括“请求频率过快”和“额度/预算已用尽”,两者处理路径不同。
前者要做流量平滑与重试,后者要优先检查计费、limits 和项目预算。了解你的额度和消费限制 有助于区分计费问题和流量突发。
3)按 RPM/RPD/TPM/TPD/IPM 理解限额
OpenAI 限额是多维度的,可能先撞到 RPM,即使 TPM 还没满,因此要同时看请求和 token 两个维度。完整的 OpenAI API 参考指南 记录了每个等级和模型的限额。
官方文档也强调:失败请求同样计入限额,盲目立刻重试会让问题更严重。
4)实现安全重试策略
对可重试错误使用带抖动的指数退避,并结合去重与超时预算,防止形成重试风暴。
同时把 max_tokens 调整到接近真实输出规模,因为限流计算会参考 max_tokens 的估算影响。
5)建立可执行的生产 Runbook
如果 401/429 问题反复出现,建议沉淀 Runbook:责任人、告警阈值、回滚方案、对外沟通模板。
在高峰期,标准化的短流程比临时排查更能保证恢复速度。
真实调试案例:一个不是速率限制的 429
我们曾花了两小时追查一个持续的 429 错误,结果发现原因完全不同。事情是这样的:
我们的应用在一次部署后每个请求都返回 429。我们以为是速率限制,实施了激进退避 —— 但即使零流量 10 分钟后错误仍在继续。这就是线索:真正的速率限制在 60 秒内会重置。
实际原因:我们的新部署有一个 bug,一个容器里的 API Key 环境变量为空。OpenAI 返回了 429(而非 401),因为空 Key 触发了不同的内部路径。修复只需改一行配置。
教训:如果 429 在零流量超过 60 秒后仍然存在,那就不是速率限制。检查你的 Key、请求头和部署配置。
我们生产环境使用的重试代码模式
这是我们经过数月生产使用后打磨出的重试模式。包含带抖动的指数退避和最大重试限制:
import time
import random
from openai import OpenAI
client = OpenAI()
def call_with_retry(model, messages, max_retries=5):
for attempt in range(max_retries):
try:
response = client.chat.completions.create(
model=model,
messages=messages
)
return response
except Exception as e:
if attempt == max_retries - 1:
raise
# Exponential backoff with jitter: 1s, 2s, 4s, 8s + random
wait = (2 ** attempt) + random.uniform(0, 1)
print(f"Attempt {attempt+1} failed, waiting {wait:.1f}s...")
time.sleep(wait)
生产实测 —— 可处理 429 和临时网络错误
常见问题
为什么 token 看起来不高也会出现 429?
可能是 RPM 先触顶,或失败重试过多导致每分钟配额被提前耗尽。
如何区分额度问题和瞬时限流?
看错误文案最直接:'rate limit reached' 多为请求节奏问题,'current quota exceeded' 多与计费或额度上限有关。
出现 429 后要不要高频重试?
不建议。应先做退避重试并降低突发请求强度。
本系列相关
相关供应商
参考来源
- OpenAI API Error CodesOpenAI Developers · 核验日期 2026-03-31
- OpenAI API Rate Limits GuideOpenAI Developers · 核验日期 2026-03-31