接入教程 · 8 分钟阅读

OpenAI API 报错 429 怎么办?Python 重试与并发控制

遇到 OpenAI API 429,先区分限流、余额与额度问题,再配置 Python SDK 重试、等待间隔和任务队列,避免重复重试放大请求量。

批量调用大模型时,单条请求能够成功,并不意味着把并发开大后仍然稳定。

遇到 429,第一步是查看响应中的错误详情。OpenAI 的 429 可能表示请求过快,也可能与余额、消费上限或使用额度有关。后几种情况,重复发送请求无法恢复访问。官方错误说明

本文根据 OpenAI Cookbook 与当前 SDK 文档编译整理,补充任务队列建议。示例用于说明配置方式,未执行真实 API 请求;第三方服务的错误码和重试规则需按其文档核对。

1. 确认是哪一种 429

先保留错误的 code、message 和请求 ID,再决定处理方式。排查日志不要记录 API Key。

情况处理方向
请求发送过快降低发送速度,等待后重试
短时间流量增长过快降低流量,再逐步增加
余额不足检查账户余额
达到消费或使用上限检查对应限制

如果响应包含 Retry-After,应按它指示的时间等待。通过第三方 API 服务调用时,还需要核对该服务自己的错误定义。官方排查说明

2. 先检查 SDK 已有的重试

OpenAI Python SDK 默认会对部分错误自动重试两次,其中包含 429。可以通过 max_retries 调整,设置为 0 则关闭自动重试。Python SDK 重试说明

因此,加入新的重试库之前,先确认现有配置。SDK 按状态码重试,不意味着余额或额度问题也能通过等待恢复。

下面演示 SDK 参数的配置位置。先安装 openai 包,并在运行环境设置 OPENAI_API_KEY 和 OPENAI_MODEL;模型 ID 需选择账户实际可用、支持 Chat Completions 的模型。

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["OPENAI_API_KEY"],
    max_retries=2,
    timeout=30.0,
)

response = client.chat.completions.create(
    model=os.environ["OPENAI_MODEL"],
    messages=[
        {"role": "user", "content": "用一句话解释什么是 API。"}
    ],
)

print(response.choices[0].message.content)

本例默认连接 OpenAI 官方地址。使用第三方兼容接口,需要额外配置其 base_url,以及该服务的密钥和模型 ID,具体可参考 Python OpenAI SDK 配置第三方 API。

如果外层程序也会重试,需要计算两层重试叠加后的尝试次数。例如,外层尝试三次,每次内部最多发送三次,一个任务就可能触发九次请求。建议明确由哪一层负责重试,避免等待时间和请求数失控。

3. 重试之间留出间隔

OpenAI Cookbook 推荐使用带随机延迟的指数退避:连续失败时,逐渐延长等待时间,并加入随机变化,减少多个任务同时再次发送请求的情况。

同时要设置停止条件。失败请求也可能占用速率额度,立即、无限地重发请求会让恢复更困难。原文:How to handle rate limits

自行编写重试逻辑时,可以把最大尝试次数和总等待时间一起作为预算;如果服务端要求的等待时间超出任务预算,就把任务留待稍后处理,而不是提前重发。

4. 批量任务先控制发送速度

假设你要处理一批文章,可以采用这样的任务流程:

待处理文章
    ↓
进入任务队列
    ↓
按设定速度发送请求
    ↓
成功 → 保存结果
临时限流 → 等待后有限重试
余额或额度问题 → 暂停并处理账户问题
重试耗尽 → 保存失败任务

并发限制和发送速率最好分别管理:限制同时执行的任务数,并不一定能限制每分钟的请求量。请求返回很快时,即使并发很低,也可能持续发出大量请求。

可以从小批量开始,观察失败原因和处理速度,再调整发送节奏。为每个任务保留独立 ID,保存成功结果,失败任务单独重跑,避免一个任务失败后整批重新请求。

5. 记录重试有没有帮助

每批任务至少记录:

  • 原始任务数与成功数。
  • 实际请求次数与重试次数。
  • 最终失败原因。
  • 总耗时。

如果成功率没有改善,请求次数却明显增加,就应该继续降低发送速度或排查限制,而不是继续增加重试次数。

处理 429 的顺序是:看清原因、管理发送速度,再用有限重试处理临时失败。

参考资料与许可

Cookbook 编译参考部分遵循其 MIT 许可;原版权归 OpenAI 所有。本文补充了任务队列建议和 SDK 配置示例,并非原文全文翻译。许可仅对应 Cookbook 材料,不代表上述所有网站采用相同许可。

OpenAI Cookbook 许可声明

MIT License

Copyright (c) 2025 OpenAI

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

查看上游许可文件。

TRY IT YOURSELF

动手试一次。

如果你使用 TokenDance,可以先查看模型与接口支持,再按教程完成配置。

查看 TokenDance 模型 ↗