OpenAI「速率上限已達」錯誤:其意義及處理方法

當你的組織發送的請求數量或每分鐘代幣數量超過其限制時,OpenAI API 會回傳 429「Rate limit reached」。 限制適用於你的組織,而非針對每個使用者。 這些錯誤都是暫時性的。 如果你等著再再發送請求,通常會成功。 OpenAI 還有些 429 錯誤是關於帳單的,等著也不會消失。 欲了解更多資訊,請參閱 錯誤代碼。

OpenAI 的速率限制錯誤長什麼樣

Status 錯誤 這是什麼意思? 重試?
429 rate_limit_exceeded,每分鐘請求次數(RPM) 你一分鐘內寄了太多請求。 是的,在 Retry-After 之後
429 rate_limit_exceeded,每分鐘代幣數(TPM) 你的請求一分鐘內用了太多代幣。 訊息會顯示你的上限、使用了多少代幣,以及該請求要求了多少代幣。 是的,在 Retry-After之後。 小請求會有幫助。
429 slow_down (類型 rate_limit_error) 你的流量增長太快,儘管你都在轉速和TPM的限制內。 是的,但利率較低
503 server_is_overloaded (類型 service_unavailable_error) OpenAI 的伺服器很忙。 是的,每次延遲都比較長
429 credit_balance_exhausted、支出上限或使用上限錯誤(類型 insufficient_quota) 你的點數用完了或超過了額度。 No. 請參考 OpenAI insufficient_quota 和 credit_balance_exhausted。

大多數這些錯誤都具有相同的 429 狀態,所以你無法僅憑狀態分辨它們。 請閱讀 error.code 回應正文。

如何處理 OpenAI 速率限制錯誤

  1. 先檢查 error.code 一下。 如果是像 credit_balance_exhausted 這樣的帳務代碼,請停止重試並告知使用者。 重新嘗試處理帳單錯誤也無法恢復存取權限。
  2. 當它出現時就依照 Retry-After。 如果缺少,使用帶有抖動的指數退縮,並限制重試次數。
  3. 在 slow_down 之後放慢速度。 先降低請求速率,然後逐步增加。 OpenAI 的經驗法則是:當輸入 TPM 超過 100 萬時,每 15 分鐘增加的流量不應超過 50%。
  4. 發生 TPM 錯誤後,請傳送較少的權杖。 較短的提示詞和回應可讓每分鐘容納更多請求。
  5. 在 503 之後再退後一些。 增加重試間隔,並查看 OpenAI 狀態頁面。
  6. 告訴使用者發生了什麼事。 「系統忙碌中,5 秒後重試」勝過一個永遠轉個不停的轉圈圈。

OpenAI Python SDK 預設會重試連線錯誤和 408、409、429 和 5xx 回應兩次,並採用短暫的指數退避。 你可以使用 max_retries 更改它。 當重試次數用盡時,SDK 會針對 429 引發 RateLimitError,並針對 503 引發 InternalServerError,因此你的程式碼仍需有所因應:

import openai
from openai import OpenAI

client = OpenAI(max_retries=3)

BILLING_CODES = {
    "credit_balance_exhausted",
    "organization_spend_limit_exceeded",
    "project_spend_limit_exceeded",
    "organization_usage_limit_exceeded",
}


def summarize(text: str) -> str | None:
    try:
        response = client.responses.create(model="gpt-4.1", input=text)
        return response.output_text
    except openai.RateLimitError as error:
        if error.code in BILLING_CODES:
            raise  # Retrying won't help: alert and tell the user
        return None  # Still throttled after retries: show "busy, try again"
    except openai.InternalServerError:
        return None

如何測試你的應用程式是否能處理 OpenAI 速率限制

開發過程中很少會達到 OpenAI 的速率上限。 你是唯一的使用者,提示也很短。 所以你測試速率限制處理的方式,決定了你是否比使用者先發現錯誤。

Approach 你發現的 你錯過了什麼
等待正式環境 實際失敗 在使用者點擊它之前的一切
在測試中模擬 API,或讓你的程式設計代理寫出模擬 不管你的重試分支是否執行 OpenAI 的真實錯誤主體和程式碼,以及你 SDK 的重試政策。 你的應用程式也需要一個只供測試使用的開關來連到模擬服務。
呼叫實際 API,直到它對你進行限流 實際行為 你無法按需觸發特定錯誤,且每個請求都需要代幣
攔截應用程式的實際流量,並依需求回傳 OpenAI 錯誤 真實網址、真實的 SDK 與重試政策,以及 OpenAI 自有的錯誤格式 你的應用程式裡沒有任何變化,因此無法以隔離方式測試你的程式碼。 那個就留給單元測試吧。

在你的應用程式上試試看

Dev Proxy 會攔截你應用程式對 api.openai.com 的請求並回傳 OpenAI 錯誤,而你的應用程式則持續呼叫真實的 URL。 openai-throttling 預設在大多數請求中都會失敗,並以 OpenAI 自身的格式隨機出現 TPM 和 RPM rate_limit_exceeded、slow_down、credit_balance_exhausted 與 503server_is_overloaded 錯誤。 429 速率限制回應包含 Retry-After 標頭,如果你的應用程式在該時間到期前重試,Dev Proxy 會回報。

下載預設集,並用它啟動 Dev Proxy:

devproxy config get openai-throttling
devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json"

然後照常執行你的應用程式,觀察它的表現。 要安裝 Dev Proxy,請參見 設定 Dev Proxy。

要測試應用程式在每分鐘代幣用盡時的行為,根據請求使用的提示詞和完成代幣,請參考 測試語言模型代幣限制。

下一步

也請參閱