Ошибки и лимиты
MarkdownКоды ответов, их смысл и что делать. Все ошибки — в JSON и с Request ID.
Полное руководство
Формат ошибки
Ошибка приходит в формате того API, который вы вызвали: объект error для OpenAI, {"type": "error", "error": {...}} для Anthropic и error с полями status и details для Gemini. Поэтому SDK распознают их как обычные ошибки API.
error.codeиerror.reason— класс ошибки из таблицы ниже, они совпадают.error.type— стандартное значение формата (например,invalid_request_errorилиserver_error).error.request_id(в Anthropic —request_idна верхнем уровне), заголовокX-Request-IDи конец текста сообщения — идентификатор запроса.- В Gemini класс лежит в
error.details:ErrorInfo.reason— тот же код верхним регистром (например,MODEL_OVERLOADED),domain—ailoot.ai; идентификатор запроса — вRequestInfo.requestId. - В формате Gemini ошибка 5xx, которую нельзя повторять автоматически, и
result_pending_checkприходят со статусом 409 иstatusABORTED: так Gemini SDK и CLI не повторяют их сами. Класс ошибки — вErrorInfo.reason(например,MODEL_TIMEOUTилиRESULT_PENDING_CHECK). - В ответе OpenAI-формата есть ещё поля верхнего уровня
codeиmessage— для старых клиентов.
{
"code": "API_KEY_REQUIRED",
"error": {
"code": "invalid_api_key",
"message": "No API key was sent with the request. Nothing was charged. Please check that the full key is sent in the Authorization header as \"Bearer <key>\". Request ID: 3b28d3de-5b02-4d07-9f3c-4b9a7d0e68d6.",
"param": null,
"reason": "invalid_api_key",
"request_id": "3b28d3de-5b02-4d07-9f3c-4b9a7d0e68d6",
"type": "invalid_request_error"
},
"message": "No API key was sent with the request. Nothing was charged. …"
}{
"type": "error",
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"reason": "invalid_api_key",
"message": "… Nothing was charged. … Request ID: 94ed3e31-4373-41ce-bf8a-0d1ed3f7235e."
},
"request_id": "94ed3e31-4373-41ce-bf8a-0d1ed3f7235e"
}{
"error": {
"code": 401,
"status": "UNAUTHENTICATED",
"message": "The API key is not valid. Nothing was charged. … Request ID: e7aa743b-9d0d-4064-b206-2562609f545b.",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "INVALID_API_KEY",
"domain": "ailoot.ai",
"metadata": {
"code": "invalid_api_key",
"reason": "invalid_api_key",
"request_id": "e7aa743b-9d0d-4064-b206-2562609f545b"
}
},
{
"@type": "type.googleapis.com/google.rpc.RequestInfo",
"requestId": "e7aa743b-9d0d-4064-b206-2562609f545b"
}
]
}
}Коды ошибок
| HTTP | Класс (reason) | Что случилось | Что делать |
|---|---|---|---|
| 400 | invalid_request | Запрос некорректен: неверное тело или параметр; модель не поддерживает поле, вложение или инструмент из запроса; ключ передан в адресе | Исправьте запрос по тексту ошибки: уберите неподдерживаемое поле, вложение или инструмент; ключ передавайте в заголовке. Отказ из-за неподдерживаемого поля, вложения или инструмента приходит до резерва — ничего не списано |
| 400 | context_length_exceeded | Запрос длиннее контекста модели | Сократите историю или возьмите модель с большим контекстом |
| 400 | content_policy_violation | Запрос отклонён правилами модели | Переформулируйте запрос |
| 401 | invalid_api_key | Ключа нет или он неверный | Проверьте, что ключ передан целиком |
| 401 | api_key_disabled | Ключ отключён | Включите или создайте новый ключ |
| 402 | insufficient_balance, insufficient_quota | Не хватает свободного баланса даже на минимальный резерв (insufficient_quota — тот же случай в виде, привычном для OpenAI SDK) | Пополните баланс или уменьшите max_tokens |
| 402 | api_key_quota_exhausted | Исчерпан общий лимит трат ключа | Увеличьте лимит ключа в кабинете |
| 402 | payment_disputed | На аккаунте долг по оспоренному платежу | Новые запросы приостановлены до погашения — напишите в поддержку |
| 403 | api_key_expired | Срок действия ключа истёк | Создайте новый ключ |
| 403 | account_inactive | Ваш аккаунт отключён | Напишите в поддержку |
| 403 | permission_denied | Ключу запрещён этот запрос (например, по IP) | Проверьте ограничения ключа |
| 404 | model_not_found | Нет такой модели | Сверьте ID с /v1/models |
| 404 | unsupported_endpoint | Модель не работает в этом формате | Выберите другой формат или модель |
| 404 | not_found | Нет такого пути или объекта (например, задачи) | Проверьте адрес и идентификатор |
| 409 | duplicate_request | Операция с тем же ключом идемпотентности уже принята и, возможно, завершена | Проверьте результат первой операции, новую не отправляйте |
| 409 | not_ready, video_not_ready | Видео или другая задача ещё не готова | Запросите статус позже |
| 409, 503 | result_pending_check | Уточняем результат запроса. У видеозадачи это флаг result_pending_check: true в ответе статуса, сама задача остаётся in_progress | Не отправляйте запрос повторно — статус появится в истории (GET https://ailoot.ai/api/v1/usage). Видеозадачу не создавайте заново: проверьте её позже через GET /v1/videos/{id} |
| 410 | model_retired | Модель снята с обслуживания | Выберите новую версию в GET /v1/models |
| 413 | request_too_large | Тело запроса слишком большое | Уменьшите файлы или историю |
| 429 | rate_limit_exceeded, gateway_concurrency_limit, gateway_queue_full | Слишком много запросов или одновременных запросов с вашего аккаунта | Подождите (заголовок Retry-After, обычно 10 с) и повторите |
| 429 | usage_limit_reached | Исчерпано окно трат ключа (5 часов, 1 день или 7 дней) | Подождите, пока окно обновится, или поднимите лимит ключа |
| 500 | internal_error | Ошибка Ailoot | Напишите в поддержку с Request ID |
| 502 | invalid_model_response, empty_response, incomplete_response | Модель вернула некорректный, пустой или неполный ответ | Найдите Request ID в истории кабинета. Если там есть результат или списание, повтор создаст второй платный запрос. Отсутствие записи не подтверждает, что запрос не отправлен или не выполнен: не повторяйте неизвестную отправку; обратитесь в поддержку с Request ID. |
| 502 | result_not_delivered | Результат не доставлен по вине Ailoot, резерв или списание возвращены | Запрос можно отправить заново |
| 503 | model_overloaded | Модель временно перегружена | Если X-Should-Retry: true — повторите через Retry-After секунд; если false — сначала проверьте Request ID в истории |
| 503 | model_unavailable | Модель временно недоступна | Выберите другую модель. Если X-Should-Retry: true — повторите через Retry-After секунд; если false — сначала проверьте Request ID в истории |
| 503 | service_unavailable | Временный сбой на стороне Ailoot | Если X-Should-Retry: true — повторите через Retry-After секунд; если false — сначала проверьте Request ID в истории |
| 503 | charge_not_confirmed | Ответ не выдан: не удалось подтвердить списание; резерв возвращён, деньги не списаны | Если X-Should-Retry: true — повторите через Retry-After секунд; если false — сначала проверьте Request ID в истории |
| 504 | model_timeout | Модель не ответила вовремя, результат ещё может появиться | Не отправляйте запрос заново, пока не проверите Request ID в истории |
Коды для ответов модели и проверки результата (502, 503 и 504) теперь называют модель или запрос: model_unavailable, model_timeout, invalid_model_response, incomplete_response, charge_not_confirmed и result_pending_check. Если ваш код сравнивает error.code с прежними значениями, замените их на коды из таблицы; соответствие прежних кодов новым подскажет поддержка.
Когда повторять запрос
- Сначала посмотрите на X-Should-Retry: при
false,result_pending_checkилиmodel_timeoutне повторяйте автоматически. Найдите Request ID в истории кабинета: там видно результат и списание. - Повтор безопасен, когда пришёл X-Should-Retry: true: подождите
Retry-Afterсекунд. Для 5xx одного кода мало: результат мог уже появиться. Сначала проверьте историю в кабинете или напишите в поддержку с Request ID. Это особенно важно для картинок, видео, музыки и длинных агентных шагов. - Не поможет повтор: 400, 401, 402, 403, 404 — сначала исправьте запрос, ключ или баланс.
Лимиты
Частота и число одновременных запросов ограничены для вашего аккаунта в целом, а не для отдельного ключа. При превышении придёт 429 rate_limit_exceeded с заголовком Retry-After: 10. Если перегружена сама модель — 503 model_overloaded с Retry-After: 30. Если нужна большая нагрузка, напишите в поддержку.
Лимиты трат задаются у ключа: общий лимит — 402 api_key_quota_exhausted, окна 5 часов, 1 день и 7 дней — 429 usage_limit_reached. Подробнее — Ключи и адрес API.
Модели NVIDIA: очередь
Список моделей можно запрашивать и при нулевом балансе; для генерации нужен баланс на резерв. Модели NVIDIA (Nemotron и другие) работают через общую очередь: при высокой нагрузке ответ может прийти позже или вернётся ошибка «модель временно перегружена» с заголовком Retry-After — повторите после указанного времени. Цены — в каталоге, списание как у остальных моделей.
Лимиты размера задаёт модель: контекст (сколько токенов можно отправить) и максимальная длина ответа. Они указаны в каталоге.
История и расходы
История и расходы · GET https://ailoot.ai/api/v1/usage · JWT · Authorization: Bearer $TOKEN
JWT ≠ sk-… · Вход и сеансы