# レート制限と再試行

アカウントとキーごとの制限、すべての回線が混み合っているときの応答、再試行とタイムアウトの設定方法。

> https://nezhagate.com/ja/docs/guide/rate-limits

## 既定のレート制限はありません

NezhaGate はアカウントごとのリクエスト頻度に既定の制限を設けておらず、処理能力もご利用量に合わせて拡張します。利用量を抑えたい場合は、キーごとに制限を設定してください。

## キーごとの制限

コンソールの「API Keys」ページで、キーごとに設定します。空欄または 0 は無制限です：

| 設定項目 | 内容 | 超えたとき |
| --- | --- | --- |
| **1 分あたりのリクエスト数** | このキーが 1 分間に送れるリクエスト数の上限。 | `429` `rate_limit_exceeded` |
| **1 日の予算** | このキーが 1 日（UTC）に使える金額の上限（米ドル）。 | `402` `insufficient_quota` |
| **合計の利用上限** | このキーが合計で使える金額の上限（米ドル）。暴走させたくない自動化処理に向いています。 | `402` `insufficient_quota` |
| **モデル許可リスト** | このキーは、リストにあるモデルしか呼び出せません。 | `403` `permission_denied` |
| **IP 許可リスト** | リストにある IP またはアドレス範囲からのリクエストだけを受け付けます。 | `403` `permission_denied` |

## すべての回線が混み合っているとき

- 各モデルは複数の回線で提供され、ゲートウェイがリクエストを回線間に振り分けます。あるモデルのすべての回線が同時に上限に達すると 429 が返り、OpenAI 互換のエンドポイントでは待つべき秒数が `Retry-After` ヘッダーで示されます。

- 画像と動画のタスクは、混み合っていても拒否されません。順番待ちに入り（`status` が `queued` になり、順番と予想待ち時間が付きます）、順番が来ると自動で始まります。

- 期間限定の無料モデルには 1 日あたりの呼び出し回数の上限もあり、超えると UTC 0 時にリセットされるまで 429 が返ります。

## 再試行の判断

| HTTP | 対処 |
| --- | --- |
| **429** | `Retry-After` ヘッダーの秒数だけ待ってから再試行します。ヘッダーがなければ 1 秒、2 秒、4 秒と間隔を延ばしながら待ちます。 |
| **500 / 502 / 503 / 504** | 指数バックオフ（1 秒、2 秒、4 秒、8 秒に少しランダムな揺らぎを加える）で再試行します。たいてい 3〜5 回で十分です。この種の失敗は課金されません。 |
| **その他の 4xx** | そのまま再試行しても解決しません。先に `error.code` に従ってリクエスト（パラメータ、モデル、キー、残高）を直してください。 |
| **ネットワークエラー / タイムアウト** | 対話はそのまま再試行できます。画像と動画は、まずコールログでタスクが作成されたかを確認してから、再送信するか決めてください。 |

```
import random
import time
import requests

def post_with_retry(url, headers, payload, tries=5):
    for attempt in range(tries):
        r = requests.post(url, headers=headers, json=payload, timeout=600)
        if r.status_code == 429:
            time.sleep(float(r.headers.get("Retry-After", 2 ** attempt)))
            continue
        if r.status_code >= 500:
            time.sleep(2 ** attempt + random.random())     # 1, 2, 4, 8 s ... plus jitter
            continue
        return r                                           # 2xx, or a 4xx to fix in the request
    return r
```

## タイムアウト

- ストリーミングしない単一のリクエストは、約 10 分でエッジゲートウェイに切断されます（HTTP 524）。長い回答や推論モデルでは `stream: true` を使ってください。

- クライアントのタイムアウトは 10 分以上に設定してください。短いと、長い回答が届く前にクライアント側で接続を切ってしまいます。

- 画像と動画は非同期タスクで、送信リクエストはすぐに返るため、この制限は関係ありません。

## さらに高い同時実行数が必要な場合

高い同時実行数を継続して使う予定があれば、事前に [Telegram グループ](https://t.me/+-erBoH9-AYY4MTM1) またはサポートで利用量をお知らせください。利用量に合わせて容量を増やします。
