# Лимиты и повторы

Лимиты аккаунта и отдельных ключей, что вы получите, когда заняты все линии, и как правильно повторять запросы и настраивать таймауты.

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

## По умолчанию лимита частоты нет

По умолчанию NezhaGate не ограничивает частоту запросов аккаунта, а мощности растут вместе с вашей нагрузкой. Чтобы ограничить расход, задайте каждому ключу собственные лимиты.

## Лимиты отдельного ключа

Задаются для каждого ключа на странице API Keys в консоли; пустое значение или 0 означает «без ограничений»:

| Настройка | Что делает | При превышении |
| --- | --- | --- |
| **Запросов в минуту** | Максимальное число запросов, которые ключ может отправить за минуту. | `429` `rate_limit_exceeded` |
| **Дневной бюджет** | Максимальная сумма, которую ключ может потратить за сутки (по UTC), в долларах США. | `402` `insufficient_quota` |
| **Общий лимит** | Максимальная сумма, которую ключ может потратить за всё время, в долларах США; удобно для автоматизации, которая не должна выйти из-под контроля. | `402` `insufficient_quota` |
| **Список разрешённых моделей** | Ключ может вызывать только перечисленные модели. | `403` `permission_denied` |
| **Список разрешённых IP** | Принимаются только запросы с перечисленных IP или диапазонов адресов. | `403` `permission_denied` |

## Когда заняты все линии

- Каждую модель обслуживают несколько линий, и шлюз распределяет запросы между ними. Если все линии модели одновременно загружены до предела, вы получите 429; OpenAI-совместимые эндпоинты добавляют заголовок `Retry-After` с числом секунд, которое нужно подождать.

- Задачи изображений и видео при нагрузке не отклоняются: они ждут в очереди (`status` — `queued`, с позицией в очереди и ожидаемым временем ожидания) и запускаются сами.

- У моделей, бесплатных по акции, есть ещё дневная квота вызовов; когда она исчерпана, вы получаете 429, пока квота не обнулится в 00:00 UTC.

## Когда повторять запрос

| 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) или через поддержку — мы расширим мощности под него.
