Разделы документации
Изображения
Видео
Голос
Инструменты
Режимы обработки
Документация API
Ошибки
Шесть кодов ответа, формат тела ошибки и правила повторов
Все ошибки API возвращаются с HTTP-кодом и телом в JSON. Заголовок ответа всегда `Content-Type: application/json; charset=utf-8`, тексты сообщений — на русском.
Формат тела ошибки
Тело устроено одинаково для всех ошибок: машинный код лежит в `detail.error.code`, человекочитаемое пояснение — в `detail.error.message`.
Разбирайте только `code`. Тексты `message` предназначены для людей и логов — не стройте на них логику приложения.
Коды ошибок
| HTTP | code | Причина | Что делать |
|---|---|---|---|
| 401 | no_api_key | Заголовок `Authorization` не передан | Добавьте `Authorization: Bearer sk-libra-…` к запросу |
| 401 | invalid_api_key | Ключ не найден или отозван | Проверьте значение ключа; при необходимости создайте новый в кабинете: «Настройки → API» |
| 402 | insufficient_balance | Баланс аккаунта в токенах ≤ 0. Проверка выполняется перед запросом | Пополните баланс (от 1 млн токенов, 450 ₽ за 1 млн). Баланс общий на все ключи аккаунта |
| 409 | too_many_keys | Достигнут предел в 10 активных ключей на аккаунт | Отзовите ненужный ключ и создайте новый |
| 429 | rate_limited | Превышен лимит на ключ: 120 запросов в минуту или 1 000 000 токенов в минуту | Подождите и повторите запрос, снизив темп отправки |
| 502 | upstream_error | Ошибка при получении ответа модели | Повторите запрос; при устойчивом повторении — обратитесь в поддержку |
Что повторять, а что нет
- 429 rate_limited — повторять. Это временное состояние: лимиты считаются поминутно. Делайте паузу с увеличением (1 с, 2 с, 4 с) и добавляйте случайный разброс, чтобы параллельные потоки не били в одну секунду.
- 502 upstream_error — повторять, но ограниченно: 2–3 попытки с паузой. Если ошибка держится, дальнейшие повторы только тратят время.
- 401 no_api_key и 401 invalid_api_key — не повторять. Ключ сам по себе не появится и не восстановится; нужно исправить конфигурацию.
- 402 insufficient_balance — не повторять. Запрос пройдёт только после пополнения баланса. Ставьте задачу в отложенную очередь или уведомляйте ответственного.
- 409 too_many_keys — не повторять. Ошибка возникает при создании ключа и требует действия в кабинете.
Списание происходит после ответа, по факту. Каждый повтор успешного запроса — это ещё один расход токенов, поэтому не повторяйте вслепую то, что уже вернуло ответ.
Обработка в коде
Официальная библиотека `openai` бросает `APIStatusError` на любой не-2xx ответ. Разбирать имеет смысл именно `detail.error.code`.
Проверить ключ и связь можно самым дешёвым способом — запросом к списку моделей. Он тоже требует ключ и вернёт 401 при неверном значении.
Грабли, о которых стоит знать заранее
- Ошибки нет там, где вы её ждёте. Неподдерживаемые параметры не вызывают ошибку, а молча игнорируются: `tools`, `tool_choice`, `top_p`, `n`, `stop`, `seed`, `response_format`, `presence_penalty`, `frequency_penalty`, `logprobs`, `user`. Запрос вернёт 200, но параметр не подействует.
- Картинки в `messages` (части с `image_url`) тоже молча отбрасываются — ошибки не будет, модель просто их не увидит. Не полагайтесь на код ответа при проверке.
- `max_tokens` вне диапазона 1..32 000 некорректен — держите значение в этих границах.
- В стриминге ошибка может прийти до начала потока. Сам поток завершается строкой `data: [DONE]`, а в последнем фрагменте `choices` пустой (там только `usage`). В Python обязательна проверка `if chunk.choices:` — иначе получите `IndexError`, который легко принять за ошибку сервиса.
- Windows PowerShell 5.1 не всегда правильно распознаёт UTF-8 в ответе, и русские тексты ошибок выглядят кракозябрами. Перед запросом выполните `[Console]::OutputEncoding = [Text.Encoding]::UTF8` или разбирайте `detail.error.code`, а не текст.
- Если хранилище лимитов временно недоступно, ограничения пропускаются и 429 не приходит. Это не повод отключать обработку 429 на стороне клиента.