レート制限
レート制限は組織単位で適用されます。現在のデフォルト値は次のとおりです。
- リクエスト: デフォルトで組織あたり 60 RPM(毎分リクエスト数)です。超過すると 429 が返されます。
- トークン: TPM(毎分トークン数)はデフォルトで無制限ですが、運用チームが組織ごとに上限を設定できます。超過すると 429 が返されます。
- 同時実行: 組織あたり同時 8 リクエストです。8 件が処理中のときに届いたリクエストは、モデルに到達する前に即座に 429 で拒否されます。
メモ
組織の現在の上限はコンソールの組織 → 概要で確認できます。上記のデフォルト値はサービスの改善に伴って変わる可能性があります。負荷テストなどでより高い上限が必要な場合は、実行前にお問い合わせください。
上限を超えた場合
上限を超えると 429 Too Many Requests が返されます。毎分リクエストまたは毎分トークンの 429 には x-ratelimit-reset (現在の 1 分ウィンドウがリセットされるまでの秒数)が含まれます。その他のヘッダーは上限の種類によって異なります。毎分リクエストの 429 には x-ratelimit-limit と x-ratelimit-remaining が、毎分トークンの 429 には x-ratelimit-limit-tokens と x-ratelimit-remaining-tokens が含まれます。同時実行の 429 は後段で返され、これらのヘッダーを一切含まないため、指数バックオフでリトライしてください。
リトライガイド
- 429 と 5xx のレスポンスはリトライしてください。400/401/403 などの 4xx はリトライしないでください。
- ジッター付きの指数バックオフを使用してください(例:1 秒、2 秒、4 秒…と延ばし、上限を設ける)。
- 毎分リクエストまたは毎分トークンの 429 では遅延を推測せず、x-ratelimit-reset の秒数だけ待ってください。同時実行の 429 にはこのヘッダーがないため、指数バックオフを使用してください。
- リトライの総回数を制限し(例:5 回)、超えた場合はユーザーにわかりやすいエラーを表示してください。
ステータスコードで分岐し、レスポンスに x-ratelimit-reset があればその値を読むリトライループです。同時実行の 429 と 5xx にはリセットヘッダーがないため、指数バックオフを使用します。
Python
import random
import time
def post_with_retry(client, path, payload, max_attempts=5):
for attempt in range(max_attempts):
r = client.post(path, json=payload)
if r.status_code < 400:
return r
# 400, 401, 402, 403, 404 and 405 describe the request. Fix it instead.
if r.status_code != 429 and r.status_code < 500:
r.raise_for_status()
reset = r.headers.get("x-ratelimit-reset")
if reset is not None:
delay = float(reset) # requests/min or tokens/min limit
else:
delay = min(2 ** attempt, 30) # concurrency 429 and 5xx: no reset header
time.sleep(delay + random.uniform(0, 1))
r.raise_for_status()