不要把所有失败都当成429,也不要无限重试。记录HTTP状态、error.type、error.code、x-request-id、UTC时间和耗时;503有Retry-After时至少等待该时间,否则使用有上限的指数退避和随机抖动。没有收到HTTP响应时优先排查网络、代理和客户端超时。
官方资料(2026-10-29核对):OpenAI API Error codes · Troubleshooting API Errors and Latency · API debugging与Request ID
先按“有没有HTTP响应”分类
| 现象 | 代表什么 | 第一动作 |
|---|---|---|
| HTTP 500 / InternalServerError | 服务器处理请求时发生内部错误 | 短暂等待,有限重试,检查Status与Service Health |
| HTTP 503 / server_is_overloaded | 请求的模型暂时过载 | 遵守Retry-After;没有时使用退避与抖动 |
| APITimeoutError | 客户端等待超时,可能是网络、负载或请求耗时 | 检查超时设置、输出长度、网络和是否实际到达OpenAI |
| APIConnectionError | 没有正常连接到API服务 | 查DNS、代理、TLS证书、防火墙和出口网络 |
| HTTP 429 | 速率、Token、用量或配额限制 | 读取error.code,转到限流或账单排查 |
| HTTP 401/403 | 密钥、Project或权限问题 | 转到鉴权排查,不应靠重试解决 |
5分钟排查顺序
- 保存证据:记录UTC时间、端点、模型、Project、HTTP状态、错误类型/代码、总耗时和重试次数;隐藏API Key与敏感输入。
- 确认是否收到响应:有500/503说明请求到达服务端;纯ConnectionError或客户端Timeout可能在上游网络阶段失败。
- 检查OpenAI Status:查看当时是否有API事件,但状态页是聚合信息,不代表每个模型、Tier和客户都完全相同。
- 打开Service Health:在HTTP Requests视图按Project、模型和Service tier筛选,看错误率而不是只看错误数量。
- 检查客户端链路:核对代理、DNS、TLS、企业防火墙、容器出口、Vercel/网关最大执行时间和流式响应缓冲。
- 用受控重试验证:少量请求、限制并发、设置总deadline;持续失败再准备支持材料。
500与503应该怎样重试
500通常是OpenAI服务器处理时的内部错误,官方建议短暂等待后重试;503的server_is_overloaded表示模型暂时过载,有Retry-After时必须优先遵守。没有有效服务器等待时间时,使用指数退避并加入随机抖动,同时限制最大尝试次数和总耗时。
async function retryServerError(run, maxAttempts = 4) {
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"]);
if (status !== 500 && status !== 503) throw error;
const serverWait = Number.isFinite(retryAfter) ? retryAfter * 1000 : 0;
const fallback = Math.min(30_000, 750 * (2 ** attempt) + Math.random() * 300);
await new Promise(resolve => setTimeout(resolve, Math.max(serverWait, fallback)));
}
}
throw new Error("server retry budget exhausted");
}示例只演示受限重试。官方SDK可能已经自动重试连接错误、408、409、429和500以上错误;增加应用层重试前先核对当前SDK版本和max_retries,避免一次业务请求被多层重复放大。
超时不等于请求一定没执行
APITimeoutError表示客户端没有在设定时间内收到完整结果。服务器可能仍在处理,或者响应在代理、网关、Serverless平台和客户端之间被中断。对可能产生重复业务效果的任务,应使用自己的Job ID、状态表或去重逻辑;不要看到超时就无条件再次创建同一任务。
超时过短会让请求在到达或完成前被客户端取消。超时过长又会占用连接和Worker。应分别考虑连接、写入、读取和整个业务操作的deadline,并根据输出Token、推理强度、文件大小和流式响应设置基线。
连接错误优先检查网络链路
APIConnectionError通常没有有效HTTP状态。依次检查:
- DNS是否能解析
api.openai.com,系统时间与根证书是否正常。 - 企业代理、VPN或防火墙是否允许HTTPS出口和证书链。
- 容器、Serverless函数和CI环境是否具备发送与接收网络流量的权限。
- 代理是否缓冲或关闭流式响应,网关是否设置了更短的idle timeout。
- 是否只有Production失败而本地成功;这种情况优先对比环境变量、网络策略和部署区域。
如果客户端持续报告连接/超时错误,而Service Health的HTTP Requests没有对应请求,官方建议优先判断请求没有到达OpenAI,问题通常位于上游网络、代理或过于激进的客户端超时。
如何记录x-request-id与客户端Request ID
正常API响应会返回x-request-id,官方SDK也会在顶层响应或错误对象中提供Request ID。生产环境应记录它、模型、Project、端点、UTC时间与耗时,但不要记录完整API Key。
如果超时或网络错误导致拿不到响应头,可以在请求中主动提供唯一的X-Client-Request-Id。官方要求该值只包含ASCII字符、最多512字符并且每次请求唯一;支持团队可用它判断请求是否到达服务端。
const traceId = crypto.randomUUID();
const response = await client.responses.create(
{ model: "YOUR_MODEL", input: "..." },
{ headers: { "X-Client-Request-Id": traceId } }
);
Service Health应该看什么
使用HTTP Requests视图而不是只看Uptime,并按模型、Project和Service tier筛选。重点看错误百分比和分钟级变化,而不是错误总数;高流量系统即使错误率很低,也可能出现较多失败请求。
延迟分析应看P50、P75、P95/P99,而非平均值。Request Time受输出长度和推理影响,TTFT受未缓存输入与推理影响,Token Velocity表示生成速度。把Service Health与同Project、同模型、同Tier的Usage输出Token结合分析。
Vercel、Serverless和代理常见陷阱
- 函数最大执行时间短于API请求时间,平台先结束函数并返回自己的504或连接中断。
- 反向代理或CDN有更短的read/idle timeout,流式响应被缓冲后看似“长时间没数据”。
- 每个实例都开启SDK重试和自定义重试,瞬间形成重试风暴。
- 客户端断开后服务器任务仍运行,再次提交导致重复工作。
- Preview与Production网络策略不同,导致本地成功、线上连接失败。
这些现象需要结合平台日志判断,不能仅凭“超时”认定OpenAI服务故障。
什么时候应该停止重试
达到最大尝试次数或总deadline后停止;取消信号、业务用户离开、账单/权限错误、无效请求都不应继续重试。持续500/503时应降低并发、保存证据并等待事件恢复;持续ConnectionError则先修复网络,不要用更多并发验证。
对于429,请使用OpenAI API速率限制指南;401/403看API鉴权排查;要核对请求和成本是否出现,则查看API Usage。
联系支持前准备什么
- 受影响的Org ID、Project ID、端点、模型与Service tier。
- 错误码、错误消息、失败比例、请求耗时和开始/结束时间(注明时区)。
x-request-id或X-Client-Request-Id示例。- Service Health截图或表格、受影响的P50/P95/P99与正常基线。
- 已经执行的网络、代理、重试和并发检查。
API Key、完整Authorization头、用户敏感输入、未脱敏文件和会话密钥。支持排查通常不需要这些Secret。
如果业务允许异步等待,可参考OpenAI Batch API 使用指南,通过 Batch 状态和输出文件收集结果;它不能替代需要实时响应的接口。
Webhook 由 OpenAI 向你的端点投递,非 2xx 或数秒内未响应会触发平台重试。接收端的验签、幂等与 72 小时投递窗口见 OpenAI Webhooks 指南。
常见问题
OpenAI API 返回 500 应该怎么办?
500 表示服务器处理请求时发生内部错误。短暂等待后进行有限次数重试,并检查 OpenAI Status 和 Service Health;持续出现时记录模型、端点、时间和 x-request-id 后联系支持。
503 server_is_overloaded 和 429 有什么区别?
503 server_is_overloaded 表示请求的模型暂时过载;429通常表示速率、Token、用量或配额限制。两者都可能带 Retry-After,但必须先读取HTTP状态和error.code再决定恢复动作。
APITimeoutError 是否表示请求一定没有执行?
不一定。客户端可能在服务器完成前关闭连接,因此没有收到结果并不等于请求未被处理。为业务任务设置幂等ID或状态检查,并记录 X-Client-Request-Id 以便追踪。
APIConnectionError 应该检查什么?
检查DNS、代理、SSL证书、企业防火墙、出口网络和容器的收发权限。如果客户端报错但Service Health没有对应请求,问题通常发生在请求到达OpenAI之前。
OpenAI SDK 会自动重试500和503吗?
官方Python和JavaScript SDK会对部分连接错误、408、409、429和500以上错误进行有限自动重试。使用的SDK版本和配置可能不同;添加自定义重试前必须确认,避免嵌套重试放大流量。
联系OpenAI支持需要提供哪些信息?
提供受影响的Org ID、Project ID、端点、模型、服务层级、错误码、错误比例、带时区的时间范围、x-request-id或X-Client-Request-Id,并删除API Key、完整请求内容和其他敏感数据。
迁移时分开观测:Responses 的语义化流式事件与 Chat Completions 的 delta 不同。先阅读 端点迁移指南,避免把消费者不兼容误判成服务端超时。