Лимиты запросов
Провайдер может ответить HTTP 429, если сработали ограничения аккаунта или канала. Через API ключей личного кабинета RPM, TPM, параллелизм и бюджет для ключа не задаются. Ниже описано, чего в настройках ключа нет, и как обрабатывать 429 в клиенте.
Настройки квот ключа
API ключей не публикует численные значения квот по умолчанию и не даёт эти настройки:
| Метрика | Поддержка в API ключей |
|---|---|
| Запросов в минуту | Не задаётся через API ключей |
| Токенов в минуту | Не задаётся через API ключей |
| Параллельных запросов | Не задаётся через API ключей |
Настройка для каждого ключа
У ключа можно задать название, канал Premium или Cheap, резервный Premium для Cheap и срок действия, а расход по нему отображается в статистике. RPM/TPM, параллелизм, бюджеты, списки моделей, IP-фильтры и ограничения IDE через API ключей личного кабинета не настраиваются.
Доступные настройки:
- Название и канал Premium или Cheap
- Резервный Premium для ключа Cheap
- Необязательный срок действия с будущей датой
Заголовки лимитов
Если провайдер присылает эти заголовки, опирайтесь на них при повторных попытках. Их наличие API ключей не гарантирует:
| Заголовок | Описание |
|---|---|
X-RateLimit-Limit | Максимум запросов в текущем окне |
X-RateLimit-Remaining | Оставшиеся запросы в текущем окне |
X-RateLimit-Reset | Время сброса окна лимита (Unix timestamp) |
Обработка ошибок 429
Когда лимит достигнут, API отвечает HTTP 429. Повторяйте запрос с экспоненциально растущей задержкой:
import time
import requests
def request_with_backoff(url, headers, data, max_retries=5):
for attempt in range(max_retries):
response = requests.post(url, headers=headers, json=data)
if response.status_code == 429:
wait = 2 ** attempt # 1, 2, 4, 8, 16 seconds
print(f"Rate limited. Retrying in {wait}s...")
time.sleep(wait)
continue
return response
raise Exception("Max retries exceeded")async function requestWithBackoff(
url: string, options: RequestInit, maxRetries = 5
) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const res = await fetch(url, options);
if (res.status === 429) {
const wait = 2 ** attempt * 1000;
console.log(`Rate limited. Retrying in ${wait}ms...`);
await new Promise(r => setTimeout(r, wait));
continue;
}
return res;
}
throw new Error("Max retries exceeded");
}Лучшие практики
- Если заголовки пришли, перед повтором сверьтесь с X-RateLimit-Remaining и Retry-After.
- Именованные ключи помогают учитывать нагрузки по отдельности, но отдельных квот не создают.
- Делайте повторные попытки с экспоненциальной задержкой и джиттером.
- Автоматические нагрузки ограничивайте на стороне клиента и следите за клиентскими расходами. Бюджеты ключа через этот API не задаются.