Hubris
Базовые концепции

Ошибки

Формат ответа об ошибке, таблица всех кодов, что делать в каждом случае.

Ошибки

Все ошибки Hubris API возвращаются в OpenAI-совместимом формате. Это значит — стандартные SDK обрабатывают их без специальной адаптации.

Формат

{
  "error": {
    "message": "Описание ошибки на английском",
    "type": "<категория ошибки>",
    "code": "<машинно-читаемый код>"
  }
}
  • message — человекочитаемое сообщение (на английском, для совместимости с OpenAI-инструментами).
  • type — категория. Возможные значения: invalid_request_error, rate_limit_error, api_error.
  • code — машинный код для программной обработки. Список ниже.

Таблица кодов

HTTPcodeЧто значитЧто делать
400invalid_requestТело запроса не соответствует схеме (пропущенное поле, неверный тип, выход за допустимые границы)Проверить JSON по Быстрому старту
401invalid_api_keyКлюч отсутствует, отозван, или невалиденПроверить заголовок Authorization, создать новый ключ на /keys
402insufficient_balanceНа балансе меньше минимального остатка (100 копеек)Пополнить через /billing
404model_not_foundМодель с таким id не существует или неактивнаПроверить написание, посмотреть /models
429daily_limit_exceededПревышен дневной лимит на конкретном ключе (только для служебных)Дождаться сброса лимита или использовать ключ без лимита
502upstream_errorПровайдер модели вернул ошибку (5xx, контент-фильтр, internal error)Повторить через несколько секунд; если повторяется — попробовать другую модель
503exchange_rate_unavailableКурс ЦБ РФ временно недоступен — каталог не отдаёт ценыПовторить через минуту
504upstream_timeoutПровайдер модели не ответил за 120 секундПовторить; если повторяется — модель перегружена, попробовать другую

Примеры

401 (нет ключа)

Запрос: curl https://api.hubris.pw/v1/models

{
  "error": {
    "message": "Missing API key",
    "type": "invalid_request_error",
    "code": "invalid_api_key"
  }
}

402 (баланс ноль)

{
  "error": {
    "message": "Insufficient balance",
    "type": "invalid_request_error",
    "code": "insufficient_balance"
  }
}

404 (модели не существует)

Запрос с несуществующим идентификатором модели:

{
  "error": {
    "message": "Model not found: fake-provider/nonexistent",
    "type": "invalid_request_error",
    "code": "model_not_found"
  }
}

502 (апстрим лёг)

{
  "error": {
    "message": "Upstream returned an error",
    "type": "api_error",
    "code": "upstream_error"
  }
}

Стратегия обработки

В вашем коде имеет смысл:

  1. На 401, 402, 404 — не повторять. Это ошибки конфигурации, retry не поможет.
  2. На 502, 503, 504 — повторить с экспоненциальным backoff (1с, 2с, 4с, до 3 попыток). Это транзиентные сбои.
  3. На 429 — посмотреть на ключ: если у него дневной лимит, дождаться сброса (наследуется от created_at); если нет — у вашего ключа есть лимит, проверьте /keys.
  4. На 400 — почти всегда баг в коде. Логируйте полный запрос (без ключа) для разбора.

Стриминг

При stream: true и ошибке ДО начала стрима возвращается стандартный JSON-ответ выше.

Если ошибка случается во время стрима (модель упала на середине) — стрим обрывается на серверной стороне. Клиент получает событие [DONE] с пустым delta и finish_reason: "stop". Точное поведение зависит от провайдера. Hubris записывает в логи ваш конкретный сценарий, чтобы вы могли разобраться через /usage.

Что дальше