OpenAI の "レート制限に達しました" エラー: その意味と処理方法

OpenAI API は、組織が 1 分あたりの要求数またはトークン数の上限を超えて送信した場合に、「レート制限に達しました」というエラー 429 を返します。 制限は、各ユーザーではなく組織に適用されます。 これらのエラーは一時的なものです。 しばらく待ってから再度リクエストを送信すると、通常は成功します。 OpenAI からのその他の 429 エラーは課金に関するもので、待つと消えません。 詳細については、エラー コードをご覧ください。

OpenAI のレート制限エラーの表示例

Status Error 意味 再試行しますか?
429 rate_limit_exceeded、1 分あたりの要求数 (RPM) 1分間に送信したリクエストが多すぎます。 はい、Retry-After の後です。
429 rate_limit_exceeded、1 分あたりのトークン数 (TPM) 要求が 1 分間で使用したトークン数が多すぎます。 メッセージには、制限、使用したトークンの数、リクエストで要求されたトークンの数が表示されます。 はい、Retry-After の後です。 要求数が少ないほうが効果的です。
429 slow_down ( rate_limit_error型) RPM と 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 の後で減速してください。 リクエスト率を下げた後、徐々に増やしてください。 入力TPMが100万を超える場合のOpenAIの経験則は、15分ごとにトラフィックの増加を50%以内に抑えることです。
  4. TPM エラー後は、送信するトークンを減らします。 プロンプトと応答が短いほど、1分あたりにより多くのリクエストを処理できます。
  5. 503 の後でさらに後退します。 再試行の間隔を長くし、OpenAI のステータスページを確認してください。
  6. ユーザーに何が起こっているのかを伝えます。 「処理中です。5秒後に再試行します」のほうが、いつまでも終わらないスピナーよりましです。

OpenAI Python SDK は、接続エラーと 408、409、429、および 5xx の応答を既定で 2 回再試行します。短い指数バックオフを伴います。 max_retriesでそれを変更できます。 再試行回数を使い切ると、SDK はRateLimitErrorに対して429を発生させ、InternalServerErrorに対して503を発生させます。そのため、コードにはプランが必要です。

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 エラーを返す 実際の URL、実際の SDK と再試行ポリシー、OpenAI 独自のエラー形式 アプリ自体には何の変化もないため、コードを単独でテストすることにはなりません。 それ用に単体テストを取っておいてください。

アプリで試す

Dev Proxy は、アプリの api.openai.com への要求をインターセプトし、OpenAI エラーを返し、アプリは実際の URL を呼び出し続けます。 openai-throttling プリセットでは、ほとんどの要求が失敗し、TPM と RPM の rate_limit_exceeded、slow_down、credit_balance_exhausted、503server_is_overloaded のエラーが OpenAI の独自形式でランダムに選択されます。 429 レート制限の応答には Retry-After ヘッダーが含まれており、その時間が終わる前にアプリが再試行すると、Dev Proxy によって報告されます。

プリセットをダウンロードし、それを使用して開発プロキシを起動します。

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

その後、通常どおりにアプリを実行し、どのように動作するかを確認します。 Dev Proxy をインストールするには、「Dev Proxy のセットアップ」を参照してください。

要求で使用するプロンプトトークンと完了トークンに基づいて、1 分あたりのトークンが不足したときにアプリがどのように動作するかをテストするには、「 テスト言語モデルトークンの制限」を参照してください。

次のステップ

参照