Ошибки API

Формат ошибки, коды ответов и стабильные строковые коды, по которым программа отличает один отказ от другого, и порядок повторных попыток.

Обновлено: 5 мин чтения

Формат ошибки

Любой отказ приходит с кодом HTTP не ниже 400 и телом в формате OpenAI, поэтому библиотеки разбирают его сами.

{
  "error": {
    "message": "Модель «такой-модели-нет» не найдена. Список: GET /v1/models",
    "type": "invalid_request_error",
    "param": "model",
    "code": "model_not_found"
  }
}

Опирайтесь на code. Коды стабильны, а текст в message написан для человека и может меняться. Поле param называет параметр запроса, из-за которого возник отказ, а при остальных ошибках содержит null. В заголовке x-request-id приходит номер запроса. Он нужен в обращении к поддержке.

Ключ и доступ

HTTPcodeПричина и действие
401invalid_api_keyКлюч не передан или неверен. Проверьте заголовок Authorization
401api_key_revokedКлюч отозван. Создайте новый
401api_key_expiredСрок действия ключа истёк. Создайте новый
403api_key_blockedКлюч закрыла администрация. Напишите в поддержку
403ip_not_allowedАдрес отправителя не входит в список ключа. Сообщение называет адрес, который увидел epicai
403account_suspendedАккаунт заблокирован или удалён
403email_not_confirmedПочта аккаунта не подтверждена
403organization_inactiveОрганизация или участие сотрудника не активны, ключ организации не работает
403model_not_allowedМодель не входит в список разрешённых для ключа

Баланс и лимиты

HTTPcodeПричина и действие
402insufficient_fundsНе хватает TOK на резерв. Пополните баланс или уменьшите max_tokens. У задач с картинками, видео и другими медиа резервируется вся цена задачи. Сообщение называет нужную и доступную суммы
402organization_limit_reachedДостигнут лимит расходов организации, сообщение называет какой
429rate_limit_exceededПревышен предел запросов в минуту. Подождите, сколько указано в Retry-After
429too_many_concurrent_requestsСлишком много одновременных запросов ключа. Повторите через 3 секунды или дождитесь ответов
429key_day_cap_reachedИсчерпан суточный потолок расхода ключа. Счётчик обнуляется в полночь по Москве
429key_month_cap_reachedИсчерпан месячный потолок расхода ключа
429too_many_active_tasksНабрано предельное число задач в работе (по умолчанию 20). Дождитесь завершения любой, пауза указана в Retry-After
429too_many_failed_attemptsС вашего адреса пришло слишком много неверных ключей. Подождите, сколько указано в Retry-After
429balance_busyБаланс занят другим запросом. Повторите через секунду

Ошибки запроса

HTTPcodeПричина и действие
400invalid_jsonТело пустое, не JSON или не объект
400missing_required_parameterНет model, либо messages пуст или не массив
400invalid_parameterЗначение поля вне допустимого. В param и тексте названо поле
400unsupported_parameterПараметр не поддерживается (n больше 1, logprobs и другие)
400unknown_parameterВ теле есть поле, которого адрес не принимает. Допустимые названы в сообщении
400unsupported_parametersУ сочетания параметров и файлов нет цены. Допустимые сочетания в GET /v1/models/{id}
400unsupported_modelТекстовые модели запускаются через /v1/chat/completions, остальные через /v1/tasks
400unsupported_toolИнструмент не из семейства function
400unsupported_contentЧасть сообщения неподходящего вида, либо модель не принимает картинки
400invalid_imageКартинка не прошла проверку формата или вендор не смог её получить. Тот же код приходит, если в images картинок больше, чем принимает модель
400invalid_inputВходное видео или аудио не прошло проверку по формату, размеру, длительности или числу файлов
400prompt_too_longТекст запроса длиннее предела модели. Предел назван в сообщении и лежит в поле prompt_max описания модели
400result_too_largeГотовая картинка слишком велика для response_format = b64_json. Запросите url
400content_filterФильтр безопасности вендора отклонил запрос
400context_length_exceededЗапрос не помещается в окно контекста модели. Сократите историю
400invalid_requestВендор не принял параметры запроса, в сообщении его пояснение
400invalid_sourceИсточник операции не подходит, причина в message
404model_not_foundТакой модели нет в списке. Сверьтесь с GET /v1/models
404task_not_foundТакой задачи нет среди задач ваших ключей
404not_foundНеизвестный адрес
405method_not_allowedМетод не подходит адресу, в заголовке Allow перечислены допустимые
409idempotency_conflictIdempotency-Key уже использован с другими параметрами. Для новой задачи нужен новый
413request_too_largeТело запроса больше 12 МБ либо присланный файл больше допустимого размера

Сбои на стороне модели

HTTPcodeПричина и действие
502upstream_unreachableepicai не достучался до вендора
502upstream_errorВендор вернул ошибку
502empty_responseМодель вернула пустой ответ
502empty_resultНейросеть завершила задачу без результата
503upstream_unavailableМодель временно недоступна или перегружена
503model_unavailableМодель сейчас недоступна, повторите позже
503billing_unavailableНе удалось поставить резерв токенов
503api_disabledAPI временно выключено
503media_disabledЗадачи с медиа временно выключены, чат работает
503task_unavailableНе удалось создать задачу, резерв не поставлен. Повторите позже
503storage_unavailableНе удалось сохранить входной файл или результат. Повторите запрос
504upstream_timeoutМодель не ответила вовремя
500internal_errorСбой на стороне epicai. Сообщите номер из x-request-id в поддержку

Запрос с ошибкой бесплатен, пока модель ничего не отдала. Поток, который успел отдать часть ответа, оплачивается за эту часть, подробности есть в статье Потоковый ответ.

Ошибка внутри задачи

Принятая сервером задача может закончиться отказом уже у вендора. Создание тогда отвечало 201, а ошибка приходит в самой задаче, со статусом failed и объектом error из полей code и message. Токены за такую задачу не списаны, резерв снят. Адреса в форме OpenAI (/v1/images/generations, /v1/audio/speech, /v1/audio/transcriptions) отвечают той же ошибкой с кодом HTTP из таблицы.

HTTP в адресах OpenAIerror.codeПричина и действие
400content_filterФильтр безопасности отклонил описание или входной файл
400prompt_too_longТекст длиннее предела модели
400input_unavailableВендор не смог скачать файл по ссылке. Откройте ссылку без входа или передайте файл в base64
400input_unsupportedФормат или вид входного файла не подходит модели
400input_invalidРазмер, разрешение или длительность вне допустимого
400invalid_prompt_flagsMidjourney отклонил флаги -- в тексте запроса
413input_too_largeВходные файлы слишком велики для нейросети
504upstream_timeoutНейросеть не ответила вовремя
504task_timeoutЗадача не завершилась за 100 минут и остановлена
502upstream_errorСбой на стороне нейросети
502generation_failedНейросеть не выполнила запрос, причина не распознана. Измените параметры или повторите

Что повторять

Ошибки 4xx, кроме 429, повторять бессмысленно, сначала исправьте запрос, ключ или баланс. Ответы 429 и 5xx стоит повторить, соблюдая паузу из заголовка Retry-After, а без него с нарастающей задержкой. Создание задачи повторяйте с тем же Idempotency-Key: двойного запуска и двойной оплаты не будет. Библиотеки OpenAI делают это сами и по умолчанию повторяют запрос до двух раз.

import os
import openai
from openai import OpenAI

client = OpenAI(
    base_url="https://epicai.ru/v1",
    api_key=os.environ["EPICAI_API_KEY"],
    max_retries=2,
)

try:
    client.chat.completions.create(
        model="такой-модели-нет",
        messages=[{"role": "user", "content": "Привет"}],
    )
except openai.APIStatusError as e:
    print("HTTP:", e.status_code)
    print("code:", e.code)
    print("message:", e.message)
    print("request:", e.response.headers.get("x-request-id"))
except openai.APIConnectionError as e:
    print("Нет связи с API:", e)

Не нашли ответ?

Посмотрите частые вопросы или напишите в поддержку.

Войти или создать аккаунт

20 000 токенов в подарок новым пользователям. Без карты и без VPN.

или через сервис

Продолжая, вы получаете сервисные письма.

Для защиты от роботов используется Yandex SmartCaptcha. Условия обработки данных.