error.code, на части маршрутов получит null или вообще другое поле.
Три формата
Формат 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, не получится.
Формат медиа
Медиа-эндпоинты отвечают конвертом.code дублирует HTTP-статус, msg — человекочитаемый текст, data на ошибке всегда null:
code равен 200, msg — "success". Это верно даже при HTTP-статусе 201 — внутри конверта всё равно будет 200.
Отказ по аутентификации — единственное исключение: 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Загрузить файл
Третий формат ошибок
Лимиты
Таймауты и частота запросов
Модели и цены
Контекстные окна и стоимость
Биллинг
Списания, тарифы и потребление
Быстрый старт
Первый запрос за три шага
