Skip to main content
У API не один формат ошибки, а три. Перед тем как писать разбор ответа, определите, к какой группе эндпоинтов обращается запрос: клиент, ожидающий error.code, на части маршрутов получит null или вообще другое поле.

Три формата

Текстовые эндпоинты и медиа-эндпоинты отвечают об ошибке по-разному. Клиент, который разбирает единый формат на всей базе /api/v1, будет неправ на медиа-маршрутах и на хранилище.

Формат OpenAI

Основной формат. Объект error с четырьмя полями:
Исключение из правила про param: GET /api/v1/models и GET /api/v1/media/models при своей ошибке 500 не возвращают поле param вообще — объект там меньше, чем в примере выше.
Разбор ошибки в коде:
Python

Формат Anthropic

Эндпоинт POST /api/v1/messages отвечает в формате Anthropic — без полей param и code:
Единственное поле для ветвления — error.type. Этих значений меньше, чем кодов в формате OpenAI, поэтому в этом формате различать, например, model_not_found и content_too_large, не получится.
Недостаток средств на этом эндпоинте возвращает 400, а не 402. Клиент, который ловит нехватку денег исключительно по 402, на /api/v1/messages её пропустит.

Формат медиа

Медиа-эндпоинты отвечают конвертом. code дублирует HTTP-статус, msg — человекочитаемый текст, data на ошибке всегда null:
Тот же конверт обслуживает и успех: code равен 200, msg — "success". Это верно даже при HTTP-статусе 201 — внутри конверта всё равно будет 200.
msg не машиностабилен. Он читается человеком и меняется; разбирайте ошибку по HTTP-статусу и полю code.
Отказ по аутентификации — единственное исключение: 401 на медиа-эндпоинтах возвращается в формате OpenAI, а не конвертом.

Формат хранилища

У хранилища третий формат — свой, без param и без code:
Здесь type стоит на месте кода: это invalid_request. Разбор по error.code на хранилище вернёт null.

Ошибки в потоке

При потоковой передаче ошибка приходит внутри потока, а не HTTP-статусом: HTTP-ответ к этому моменту уже 200. В середине потока появляется кадр data: с объектом error, после чего поток обрывается — маркера [DONE] не будет:
Проверяйте каждый кадр на наличие error: обрыв соединения без [DONE] означает ровно это.
Python

Коды ошибок OpenAI-формата

Типы в Anthropic-формате

На POST /api/v1/messages значения скромнее:

Коды медиа-эндпоинтов

Что делать с ошибкой

Повторять или нет

Если в ответе есть заголовок Retry-After, следуйте ему — он точнее любого собственного расчёта. Экспоненциальная пауза нужна для случаев, когда такого заголовка нет.

Цикл повторов

Python

Отдельные случаи

499 client_closed_request означает, что отменил клиент, а не платформа. В логах сервера это нормальная запись об оборванном соединении, а не сбой. 404 и «не ваше» неразличимы. Задача, файл или сессия чужого аккаунта отвечают 404, а не 403. Это сделано намеренно, чтобы по коду ответа нельзя было проверить существование чужого объекта. Не стройте логику, которая отличает одно от другого. 422 content_too_large — это ошибка планирования, а не сети. Размер окна известен заранее: возьмите его из GET /api/v1/models и сверьте с суммой входа и резервируемого выхода.
cURL
Выбрать решение можно только из трёх: уменьшить max_completion_tokens, сократить историю диалога или перейти на модель с окном побольше. Повтор с теми же аргументами ничего не изменит. 422 limit_exceeded внутри периода не лечится повтором. Это лимит тарифа, а не частота запросов: до сброса счётчика — только ожидание или смена тарифа. Подробности — в разделе Лимиты. 503 no_providers лечится повтором, но не сразу. Очередь на модель может разойтись через минуты, поэтому увеличьте базовую паузу для этого кода до нескольких секунд.

Безопасный повтор запроса, создающего задачу

Для медиа повторять создание задачи нельзя вслепую: новый запрос — новая задача и новое списание средств. Заголовок Idempotency-Key делает повтор безопасным — тот же ключ возвращает исходную задачу.
cURL
Ключ нужно сгенерировать один раз на логическую операцию и переиспользовать его во всех повторах. Новый ключ на каждый повтор — это новая задача и повторное списание.
Формат заголовка — в разделе Создать задачу.

Что дальше

Запрос чату

Поля запроса и формат ответа

Anthropic Messages

Эндпоинт с форматом ошибок Anthropic

Создать задачу

Медиа-конверт и Idempotency-Key

Загрузить файл

Третий формат ошибок

Лимиты

Таймауты и частота запросов

Модели и цены

Контекстные окна и стоимость

Биллинг

Списания, тарифы и потребление

Быстрый старт

Первый запрос за три шага