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 レート制限エラーを処理する方法
- まず
error.codeを確認してください。credit_balance_exhaustedのような課金コードの場合は、再試行を停止してユーザーに伝えてください。 課金エラーが発生した場合、再試行してもアクセスは復元されません。 -
Retry-Afterが存在する場合は、Retry-Afterに従ってください。 存在しない場合は、ジッターを加えた指数バックオフを使用し、再試行回数を制限します。 -
slow_downの後で減速してください。 リクエスト率を下げた後、徐々に増やしてください。 入力TPMが100万を超える場合のOpenAIの経験則は、15分ごとにトラフィックの増加を50%以内に抑えることです。 - TPM エラー後は、送信するトークンを少なくします。 プロンプトと応答が短いほど、1分あたりにより多くのリクエストを処理できます。
-
503の後でさらに後退します。 再試行の間隔を長くし、OpenAI のステータスページを確認してください。 - ユーザーに何が起こっているのかを伝えます。 「処理中です。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 分あたりのトークンが不足したときにアプリがどのように動作するかをテストするには、「 テスト言語モデルトークンの制限」を参照してください。
次のステップ
参照
Dev Proxy