Документация API Hop
Коды ошибок и устранение неполадок
Полный справочник кодов ошибок платформы, распознавание ошибок разных протоколов, безопасные повторные попытки и сбор диагностики для пользователей и ИИ.
Определите, что именно завершилось ошибкой
- Запишите фактический статус HTTP, метод и путь запроса. Статус HTTP и код ошибки приложения описывают разные уровни; не подменяйте одно другим.
- Читайте поля ошибки в соответствии с протоколом вызова. Ответы нативного API, OpenAI, Claude и Gemini имеют разную структуру.
- При потоковой передаче проверяйте также события ошибок и состояние завершения, а для асинхронных заданий —
status. HTTP200не гарантирует успешную генерацию. - Используйте таблицу ниже, чтобы исправить запрос или оценить необходимость повтора.
message— поясняющий текст, а не стабильное значение перечисления; не стройте ветвление по формулировке сообщения.
Перечисление кодов ошибок платформы
Это полное перечисление кодов ошибок приложения платформы. Имена служат справочными метками; значения code в ответах являются числами. Распространённый статус HTTP приведён для диагностики, а не как фиксированное соответствие для каждого эндпоинта. Используйте фактический статус HTTP и тело ответа. Переданный без преобразования code вышестоящего провайдера может не входить в это перечисление.
Числовой code | Имя | Распространённый статус HTTP | Значение и действия |
|---|---|---|---|
10000 | BAD_REQUEST | 400 | Некорректный формат запроса, путь или основные параметры. Проверьте метод, путь, синтаксис JSON и имена параметров. |
10001 | VALIDATION_ERROR | 400 / 422 | Ошибка проверки параметров. Проверьте обязательные поля, типы, диапазоны и сочетания параметров. |
20000 | AUTH_ERROR | 401 | Ошибка аутентификации. Проверьте действительность и срок действия API-ключа, а также формат заголовка аутентификации. |
20001 | FORBIDDEN | 403 | Доступ запрещён или учётная запись ограничена. Проверьте разрешения учётной записи и принадлежность ресурса. |
30000 | NOT_FOUND | 404 | Путь, модель или ресурс не существует. Сверьте путь эндпоинта, model и идентификатор задания с ресурсами, доступными текущему API-ключу. |
30001 | CONFLICT | 409 | Операция конфликтует с текущим состоянием ресурса. Перед изменением прочитайте это состояние; избегайте повторной отправки. |
40000 | INSUFFICIENT_CREDIT | 402 | Недостаточный баланс. Проверьте и пополните его перед следующим вызовом. |
40001 | RATE_LIMIT | 429 | Слишком высокая частота запросов. Снизьте частоту и отложите повторные попытки. |
40002 | CONCURRENCY_LIMIT | 429 | Слишком много одновременных запросов. Снизьте параллелизм и дождитесь завершения выполняющихся запросов. |
50000 | PROVIDER_ERROR | 502 | Вызов вышестоящего провайдера не удался или не вернул допустимый результат. Прежде чем рассматривать ограниченные повторы, проверьте, был ли создан результат. |
50001 | SERVICE_UNAVAILABLE | 503 | Сервис временно недоступен. Повторите позже с ограничением числа попыток; если ошибка сохраняется, соберите диагностику. |
50002 | GATEWAY_TIMEOUT | 504 | Превышено время обработки. Результат может быть неопределённым; перед повтором проверьте, выполнялся ли запрос. |
50003 | INTERNAL_ERROR | 500 | Произошла неклассифицированная ошибка сервера. Используйте ограниченные повторы и соберите диагностику, если ошибка сохраняется. |
Один лишь HTTP 429 не позволяет надёжно различить ограничение частоты и параллелизма. Различайте их только при наличии явного числового кода ошибки. Проверяйте идентификаторы моделей в списке моделей; не изменяйте значения model самостоятельно.
Чтение ошибок по протоколам
Примеры ниже показывают распространённые структуры, формируемые платформой, а не единый формат, гарантированный для любой ошибки. Ошибки аутентификации могут возникать на разных уровнях обработки; передаваемые ответы вышестоящего провайдера могут сохранять собственную структуру, строковые коды или типы. Перед разбором определите фактическую структуру. Если она неизвестна, сохраните исходные поля и статус HTTP вместо принудительного преобразования.
Нативные API платформы
Обычно следует читать error.code и error.message. Поле requestId может отсутствовать.
{
"success": false,
"error": {
"code": 10000,
"message": "Bad request"
},
"requestId": "req_example"
}Некоторые ошибки используют поля верхнего уровня code и message. Клиенты должны допускать это и не считать отсутствие объекта error доказательством успеха. Ответы проверки параметров также могут не содержать числового кода ошибки. Считайте отсутствующий код неизвестным, а не придумывайте его.
API, совместимые с OpenAI
Распространённые ошибки платформы используют поля верхнего уровня code, message и type; они не обязательно вложены в error.
{
"code": 40000,
"message": "Insufficient credit",
"type": "api_error"
}type — категория протокола, а code в этой структуре — числовой код ошибки платформы. Одного api_error недостаточно для решения о повторной попытке. Переданные ошибки провайдера и ошибки потока могут содержать вложенный error; обрабатывайте фактический ответ протокола. См. Chat Completions и Responses.
API, совместимые с Claude
В распространённой структуре верхний type равен error, конкретная категория находится в error.type, а описание — в error.message. Эта структура не содержит числового code платформы. Не придумывайте его.
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "max_tokens must be a positive safe integer"
}
}Платформа локально формирует следующие типы ошибок Claude. Это не полный перечень типов ошибок вышестоящего провайдера.
error.type | Локальное соответствие HTTP | Что проверить |
|---|---|---|
invalid_request_error | 400 | Проверьте формат запроса и параметры. |
authentication_error | 401 | Проверьте учётные данные аутентификации. |
api_error | Другие статусы HTTP | Общая ошибка API; проверьте фактический статус HTTP и описание. Повтор не обязательно уместен. |
См. сообщения Claude.
Ошибки в формате Gemini
В ответе формата Gemini читайте error.code, error.message и error.status. Здесь status — строковая категория, а не статус HTTP или состояние асинхронного задания.
{
"error": {
"code": 10000,
"message": "Bad request",
"status": "INVALID_ARGUMENT"
}
}Ошибки, сформированные платформой в этой структуре, используют числовые значения платформы в code. Локальное соответствие строкового status приведено ниже; оно не перечисляет все статусы вышестоящего провайдера.
error.status | Локальное соответствие HTTP | Что проверить |
|---|---|---|
UNAUTHENTICATED | 401 | Проверьте учётные данные аутентификации. |
RESOURCE_EXHAUSTED | 402 / 429 | Проверьте баланс или ограничения использования; одна строка не позволяет различить их. |
PERMISSION_DENIED | 403 | Проверьте разрешения и принадлежность ресурса. |
NOT_FOUND | 404 | Проверьте путь, модель или ресурс. |
UNAVAILABLE | 503 | Сервис временно недоступен. |
INTERNAL | >= 500, кроме 503 | Ошибка сервера; 504 также использует это значение. |
INVALID_ARGUMENT | Другие статусы HTTP | Проверьте фактический статус HTTP и запрос; 409 также использует это значение. |
503 имеет приоритет и использует UNAVAILABLE, а не INTERNAL. Ответы вышестоящего провайдера могут придавать code и status другой смысл. Не применяйте таблицу ошибок платформы к каждому числовому коду Gemini.
Безопасные повторные попытки
| Ситуация | Рекомендуемое действие |
|---|---|
400 / 401 / 402 / 403 / 404 / 409 / 422 | Сначала исправьте запрос, учётные данные, баланс, разрешения или состояние ресурса. Не отправляйте неизменённый запрос многократно. API-ключи должны находиться только в заголовках, никогда в параметрах строки запроса URL. |
429 | Снизьте частоту и параллелизм и подождите перед повтором. Простое увеличение числа попыток обычно усиливает ограничение. |
500 / 502 / 503 / 504 | Сначала оцените риск повторного выполнения. Затем применяйте ограниченную экспоненциальную задержку со случайным разбросом, например не более 3 повторов с ограничением общего времени ожидания. |
| Обрыв сети или тайм-аут клиента | Отсутствие полученного результата не означает, что сервер не выполнил запрос. Отметьте исход как неизвестный, а не объявляйте ошибку и не создавайте сразу новый запрос. |
Если присутствует корректный заголовок Retry-After, соблюдайте его. Не предполагайте, что он есть у каждой ошибки. Автоматический повтор неидемпотентного запроса генерации может выполнить его ещё раз и привести к дополнительной оплате. Эта страница не обещает общей поддержки ключей идемпотентности; самостоятельно добавленный Idempotency-Key не гарантирует устранение дублей.
Если вы уже получили jobId, запросите это задание, прежде чем создавать новое. Если jobId отсутствует, а результат неизвестен, сохраните идентификатор запроса и временную метку для расследования.
Потоки и асинхронные задания
Запросы SSE
После начала SSE статус HTTP может оставаться 200, а более поздняя ошибка может передаваться событием или полезной нагрузкой внутри потока. Разбирайте события и данные выбранного протокола и проверяйте нормальное завершение. При ошибке или неожиданном обрыве не считайте частичный текст или изображение полностью успешным результатом. Имена событий и полезная нагрузка различаются по эндпоинтам. Не проверяйте только одно фиксированное поле error и не считайте получение какого-либо текста признаком успеха.
Асинхронные задания
Ответ создания с data.jobId означает принятие, а не завершение генерации. Успешный HTTP-ответ при опросе задания означает успешный запрос состояния. Всё равно необходимо проверить data.status задания:
PENDING,CONNECT,PROCESSING: продолжайте опрос согласно документации Jobs.COMPLETED: прочитайтеoutputResult.FAILED,CANCELLED: прекратите опрос и сохраните идентификатор задания и очищенные от конфиденциальных данных сведения ответа для расследования.
Подробности ошибки могут находиться в data.outputResult.error. Поле необязательно и не гарантировано для каждого неудачного задания. Используйте Jobs только тогда, когда ответ создания явно возвращает jobId. Не применяйте опрос заданий к эндпоинтам, возвращающим результат напрямую через JSON или SSE.
Диагностика для пользователей и ИИ-ассистентов
Передавайте поддержке или ИИ-ассистенту следующие сведения, очищенные от конфиденциальных данных. Для отсутствующих полей используйте unknown; если HTTP-ответ не получен, статус HTTP также укажите как unknown. Сохраняйте пути полей и исходные типы значений, например error.code: 10000 (number) или error.code: "invalid_api_key" (string). Не преобразуйте строковый code автоматически в числовой код платформы и не придумывайте отсутствующие поля на основе message, статуса HTTP или имён моделей.
time_with_timezone: unknown
method: unknown
path_without_query: unknown
model: unknown
stream: unknown
http_status: unknown
error_code_path_value_and_type: unknown
error_type_path_and_value: unknown
protocol_status_path_and_value: unknown
sanitized_message: unknown
request_id_from_body_or_X-Request-ID: unknown
job_id: unknown
job_status: unknown
retry_after: unknown
retry_count_and_delays: unknown
received_partial_output: unknownЧитайте requestId из тела ответа или заголовка ответа X-Request-ID, если они доступны. Храните jobId как строку, чтобы не потерять точность длинных чисел. Передавайте лишь минимальные параметры запроса, очищенные от конфиденциальных данных. Удаляйте API-ключи, токены, cookies, полные заголовки аутентификации, личные данные, закрытые промпты и содержимое входных файлов. Удаляйте параметры строки запроса URL и входные или выходные URL с подписями либо учётными данными. Не вставляйте полные журналы запросов без проверки.
ИИ-ассистенты должны отличать наблюдаемые поля от возможных причин и указывать недостающие сведения. Недостаток доказательств не должен считаться подтверждением успешности запроса, отсутствия выполнения или отсутствия списания.