OpenAI insufficient_quota和credit_balance_exhausted:为什么重试不起作用

当帐户余额耗尽或超出支出或使用限制时,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 配额错误

  1. 查看error.code,不要只看状态。 单独一个 429 不会告诉你是否重试。 将表中的 4 个代码视为“停止”,速率限制代码视为“等待和重试”。
  2. 停止重试。 不要再次发送请求,不要让重试循环继续调用 API。 在有人修复计费问题之前,每个请求都会以相同方式失败。
  3. 暂停将失败的调用。 一个配额错误意味着来自同一组织或项目的下一个请求也会失败。 跳过这些请求,而不是逐一发送并等待错误。
  4. 告诉用户。 说明 AI 功能目前不可用,并让其余应用正常工作。
  5. 提醒自己。 以高严重性级别记录该错误代码,或向负责计费的人员发送警报。 该问题需要在代码之外解决,因此需要通知相关人员。

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”。

后续步骤

另请参阅