当帐户余额耗尽或超出支出或使用限制时,OpenAI API 会返回带有错误类型 insufficient_quota 的 429。 它的状态代码与速率限制相同,但等待几秒钟也无法解决这个问题。 只有在有人添加额度、提高限制或月度周期重置后,访问才会恢复。 OpenAI 表示,重试计费、支出或配额错误不会还原 API 访问权限,应检查 error.code 以查找特定原因。 有关详细信息,请参阅错误代码。
OpenAI 的配额错误如下所示
这些错误中的每一个都会返回429。
error.type仍可能是insufficient_quota,因此请检查error.code以确认你遇到的是哪种错误。
error.code |
含义 | 访问如何恢复 |
|---|---|---|
credit_balance_exhausted |
你的组织没有剩余预付费额度。 | 添加额度。 |
organization_spend_limit_exceeded |
你的组织在所有项目中达到了其每月支出限制。 | 提高或移除限制,或等待月度重置。 |
project_spend_limit_exceeded |
该项目达到了每月支出限制。 其他项目仍可正常运行。 | 提高或移除项目的限制,或等待月度重置。 |
organization_usage_limit_exceeded |
你的组织达到了 OpenAI 分配给它的每月使用限制。 它独立于你设置的支出限制。 | 请求更高的批准限制,或联系 OpenAI 支持人员。 |
将这些错误与“达到速率限制”错误进行比较,例如 rate_limit_exceeded 和 slow_down。 这些是临时的,在短暂等待后重试通常有效。 有关详细信息,请参阅 OpenAI“已达到速率限制”错误。
如何处理 OpenAI 配额错误
- 查看
error.code,不要只看状态。 单独一个429不会告诉你是否重试。 将表中的 4 个代码视为“停止”,速率限制代码视为“等待和重试”。 - 停止重试。 不要再次发送请求,不要让重试循环继续调用 API。 在有人修复计费问题之前,每个请求都会以相同方式失败。
- 暂停将失败的调用。 一个配额错误意味着来自同一组织或项目的下一个请求也会失败。 跳过这些请求,而不是逐一发送并等待错误。
- 告诉用户。 说明 AI 功能目前不可用,并让其余应用正常工作。
- 提醒自己。 以高严重性级别记录该错误代码,或向负责计费的人员发送警报。 该问题需要在代码之外解决,因此需要通知相关人员。
OpenAI Python SDK默认会对返回429响应的请求重试 2 次。 无论它重试哪些请求,你的代码最终都会收到带有计费错误代码的RateLimitError,此时应停止重试:
import logging
import openai
from openai import OpenAI
client = OpenAI()
logger = logging.getLogger(__name__)
BILLING_CODES = {
"credit_balance_exhausted",
"organization_spend_limit_exceeded",
"project_spend_limit_exceeded",
"organization_usage_limit_exceeded",
}
billing_error: str | None = None
def ask(prompt: str) -> str:
global billing_error
if billing_error:
raise RuntimeError("AI features are paused until billing is fixed.")
try:
response = client.responses.create(model="gpt-4.1", input=prompt)
return response.output_text
except openai.RateLimitError as error:
if error.code in BILLING_CODES:
billing_error = error.code
logger.critical("OpenAI billing error: %s", error.code)
raise
该标志在你的应用重启前保持设置状态。 如果你的应用长时间运行,请通过其他方式清除它,例如在有人修复计费问题后通过管理员操作清除。
如何测试你的应用是否能处理 OpenAI 配额错误
开发时很少看到配额错误。 您的测试帐户有点数,且使用量较低。 因此,测试配额处理的方式决定了你是否在用户之前发现了 bug。
| Approach | 你找到的内容 | 您错过的内容 |
|---|---|---|
| 等到投入生产后 | 真实故障 | 所有内容,直到用户遇到故障,而 AI 功能会一直不可用,直到有人注意到 |
| 在测试中模拟 API,或让编码代理编写模拟代码 | 停止分支是否运行 | OpenAI 的真实错误正文和代码,以及 SDK 的重试策略。 你的应用还需要一个仅用于测试的开关来访问该模拟对象。 |
| 用尽你的真实额度或设置极小的支出限制 | 实际行为 | 它花费资金,并阻塞共享该组织或项目的所有其他应用 |
| 截获应用的实际流量并按需返回配额错误 | 实际 URL、实际 SDK 和重试策略,以及 OpenAI 自己的错误格式 | 你的应用中没有任何更改,因此它不会对你的代码进行隔离测试。 保留你的单元测试以验证这一点。 |
在你的应用中试用
Dev Proxy拦截你的应用发往api.openai.com的请求并返回 OpenAI 错误,同时你的应用继续调用真实 URL。
openai-throttling预设将 credit_balance_exhausted 错误与速率限制错误混合在一起。 它返回类型为insufficient_quota的429且不带Retry-After标头,因此你可以检查你的应用是否停止发送请求而不是重试。
下载预设,并使用它启动 Dev Proxy:
devproxy config get openai-throttling
devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json"
若要仅测试配额错误,请编辑预设的 openai-errors.json 文件,并且只保留 credit_balance_exhausted 响应。 若要测试支出和使用量限制的错误代码,请添加具有相同结构但code不同的响应。
然后像往常一样运行应用并观察其运行情况。 若要安装 Dev Proxy,请参阅 “设置 Dev Proxy”。