Лимиты запросов
Провайдер может вернуть HTTP 429 при ограничениях аккаунта или канала. API ключей личного кабинета не позволяет задавать RPM, TPM, параллелизм или бюджет для ключа. Здесь описаны эти ограничения настроек и обработка 429 в клиенте.
Настройки квот ключа
API ключей не публикует численные значения этих квот по умолчанию и не предоставляет такие настройки:
| Метрика | Поддержка в API ключей |
|---|---|
| Запросов в минуту | Не задаётся через API ключей |
| Токенов в минуту | Не задаётся через API ключей |
| Параллельных запросов | Не задаётся через API ключей |
Настройка для каждого ключа
Для ключа доступны название, канал Premium или Cheap, резервный Premium для Cheap, срок действия и статистика расхода. API ключей личного кабинета не позволяет задавать RPM/TPM, параллелизм, бюджеты, списки моделей, IP-фильтры или ограничения IDE для ключа.
Доступные настройки:
- Название и канал 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 не настраиваются.