Базовые концепции
БАЗОВЫЕ КОНЦЕПЦИИ

Rate limits

Что ограничивает запросы в Hubris — баланс, апстрим, дневные лимиты на служебных ключах.

Hubris не применяет искусственных rate-limit-ов на пользовательские API-ключи. Стандартный тариф даёт неограниченное число запросов в секунду — расход ограничен только балансом.

Что реально ограничивает запросы

1. Баланс

Каждый запрос списывает с баланса фактическую стоимость. При недостаточном балансе (< 100 копеек) запрос отклоняется с 402 insufficient_balance ДО обращения к модели. Подробнее — на странице Биллинг.

2. Лимиты провайдера

Каждая модель имеет собственные ограничения от провайдера: requests-per-minute, tokens-per-minute, concurrent connections. При превышении провайдер возвращает 429, мы транслируем это как 502 upstream_error.

Что делать: добавить retry с экспоненциальным backoff. Hubris агрегирует трафик многих клиентов через свой сервисный ключ — вероятность упереться в лимит провайдера ниже, чем при работе напрямую.

3. Дневной лимит на служебных ключах

Опционально — при создании ключа можно задать daily_limit_kopecks. Например, 5000 копеек = 50 ₽ в сутки. Превышение возвращает 429 daily_limit_exceeded:

{
  "error": {
    "message": "Daily spending limit exceeded for this API key",
    "type": "rate_limit_error",
    "code": "daily_limit_exceeded"
  }
}

Это используется для:

  • CI-runner-ов, чтобы утечка ключа не разорила баланс.
  • Внутренних скриптов с ограниченным бюджетом.
  • Sandbox-аккаунтов для разработчиков.

Окно — скользящее (rolling) 24 часа, а не календарный день. Старые расходы выпадают из счётчика по мере того как проходят сутки с момента списания, поэтому после превышения лимит постепенно «отпускает». Расходы за последние 24ч кешируются в Redis с TTL 60 секунд, то есть UI и middleware могут отставать от точного значения на минуту.

Задать или поменять лимит — на странице API-ключи: поле «Дневной лимит, ₽» в форме создания и кнопка «изменить» рядом с каждым активным ключом. Очистите поле, чтобы снять лимит.

Генерация изображений (modalities: ["image"] / ["image","text"]) учитывается в счётчике 24-часового расхода ключа на общих основаниях: одна сгенерированная картинка добавляется к расходу по итоговой стоимости (см. Генерация изображений).

Стратегия retry

Если получили 429 от Hubris (daily_limit_exceeded) или 502 (от провайдера):

import time

def with_retry(fn, max_attempts=3):
    delay = 1
    for attempt in range(max_attempts):
        try:
            return fn()
        except APIError as e:
            if e.code in ("upstream_error", "upstream_timeout"):
                if attempt < max_attempts - 1:
                    time.sleep(delay)
                    delay *= 2
                    continue
            raise

Не делайте retry на:

  • invalid_api_key (401) — ключ не починится сам.
  • insufficient_balance (402) — пополните баланс сначала.
  • model_not_found (404) — название не изменится.
  • invalid_request (400) — баг в коде.

Concurrent requests

Параллельные запросы на одном ключе — без ограничений. Если ваш сервис делает 100 запросов одновременно, они все пойдут к моделям параллельно. Узкое горлышко — провайдер модели, не Hubris.

Что дальше

Обновлено:

Rate limits · Hubris