レート制限
スロットリングの仕組み、このサービスで429が意味すること、それを発生させないクライアントの実装方法。
制限は、共有の上流処理能力を公平に利用するためのものです。キー単位ではなくアカウント単位で適用されるため、キーを追加しても上限は増えません。
制限の対象
| 比較項目 | 動作 |
|---|---|
| 同時リクエスト数 | アカウントごとの処理中のリクエスト数。429の一般的な原因です。 |
| 毎分のリクエスト数 | 継続的な呼び出しレート。 |
| 毎分のトークン数 | 入力と出力を合わせたスループット。 |
無制限プランでは、クレジット残高の代わりにフェアユース制限が適用されます。トークン単位の課金はなくなりますが、同時実行数の上限はなくなりません。
429への適切な対処
- ジッターを加えた指数バックオフを使用してください。待機時間を1秒、2秒、4秒、8秒と増やし、それぞれにランダムな割合の増減を加えます。
- すべてのリクエストを一斉に送信して拒否されたものを再試行するのではなく、セマフォでクライアント側の同時実行数を制限してください。
- バッチ処理は並列度を最大にするのではなく、キューに入れてください。スループットを制限するのは、開くソケットの数ではなく、毎分のトークン数です。
- 次のものを
529とは異なる方法で対処してください:429。これはユーザー側ではなく上流の処理能力の問題であり、通常は数秒以内に解消します。
import asyncio
sem = asyncio.Semaphore(8) class=class="s">"c"># ceiling on concurrency, tune to your plan
async def ask(client, body):
async with sem:
return await client.post(class="s">"/v1/messages", json=body)
Claude Codeなどのエージェント型ツールは、設計上、多数の処理を積極的に並列実行します。エージェントを集中的に使用しているときに429が発生する場合は、プランをアップグレードする前に、ツールの並列度を下げてください。
再試行ではなく負荷を軽減
- 軽量な処理の振り分け先:
claude-haiku-4-5。小規模なモデルは処理を早く完了し、同時実行枠を占有する時間が短くなります。 - 有効にする プロンプトキャッシュ:キャッシュされたプレフィックスにより入力トークン数が減り、毎分のトークン数への負荷も軽減されます。
- 会話履歴を短くしてください。参照: コンテキスト管理.
- オフライン処理は、利用の少ない時間帯にまとめて実行してください。