Ошибки, лимиты, биллинг
Формат ошибки
Заголовок раздела «Формат ошибки»Конверт совпадает с OpenAI, поэтому обработчики ошибок в существующем коде менять не нужно:
{ "error": { "message": "Rate limit reached for requests. Limit: 60 requests/min.", "type": "rate_limit_exceeded", "param": null, "code": "rate_limited" }}Коды состояний
Заголовок раздела «Коды состояний»| HTTP | type |
Что произошло и что делать |
|---|---|---|
400 |
invalid_request_error |
Неверный параметр: размер вне списка модели, файл модели, которая не умеет файлы, сочетание параметров, которое модель не принимает (code: "invalid_request", причина от модели — в message). Сверьтесь с каталогом |
400 |
content_filter |
Запрос отклонён фильтром апстрима. Переформулируйте промпт |
401 |
invalid_request_error |
Ключ отсутствует, отозван или неверный |
402 |
insufficient_quota |
Не хватает денег на балансе — или они заняты генерациями, которые ещё идут (см. одновременные генерации). Пополнить в кабинете или дождаться окончания |
403 |
invalid_request_error |
У ключа нет нужной области доступа |
404 |
invalid_request_error |
Модель не найдена (model_not_found) |
413 |
api_error |
Аудиофайл больше 25 MB в /audio/transcriptions. Уменьшить файл |
429 |
rate_limit_exceeded |
Превышен лимит запросов в минуту (code: "rate_limited") или одновременных генераций (code: "concurrency_limit_exceeded") |
500 |
api_error |
Наша ошибка. Повторить с экспоненциальной паузой |
502 |
api_error |
Апстрим не ответил. Повторить или взять другую модель |
Лимит запросов
Заголовок раздела «Лимит запросов»По умолчанию — 60 запросов в минуту на ключ, фиксированное окно в 60 секунд: счётчик сбрасывается раз в минуту. При превышении приходит 429 и два заголовка:
retry-after: 37x-ratelimit-limit-requests: 60retry-after — сколько секунд ждать. Официальные OpenAI SDK читают его сами и делают backoff, самописному клиенту это стоит реализовать.
Лимит считается по ключу, а не по аккаунту: если нужно больше параллелизма, разложите нагрузку на несколько ключей.
Одновременные генерации
Заголовок раздела «Одновременные генерации»Видео, музыка и картинки идут параллельно, но не без предела. На аккаунт одновременно выполняется не больше:
| Что | Сколько задач разом |
|---|---|
Видео (/videos) |
10 |
Музыка (/music) |
10 |
Картинки (/images/*) |
20 |
Сверх лимита приходит 429 с code: "concurrency_limit_exceeded" и заголовком X-Mixen-Concurrent-Limit — дождитесь, пока одна из задач перейдёт в completed или failed, и повторите. Если интеграции нужно больше — напишите в поддержку, лимит поднимается на конкретный ключ.
Пока задача выполняется, её стоимость отложена на балансе. Новая задача проверяется по свободному остатку: если на балансе 100 ₽, а идёт видео за 67 ₽, второе такое же получит 402 — денег хватает только на уже запущенное.
Биллинг
Заголовок раздела «Биллинг»- Деньги списываются с единого баланса Mixen — того же, что у бота и кабинета.
- Списание происходит по факту выполнения. Неудачная генерация (
failed,502, зависшая видеозадача) не оплачивается. - Цена берётся из каталога на момент запроса. Единицы тарификации — в разделе Модели и цены.
- Расход по чату виден в поле
usageответа; в стриминге он приходит финальным чанком приstream_options: {"include_usage": true}.
Разумная стратегия для продакшена:
429— ждатьretry-after, потом повторить.500и502— до трёх попыток с паузой 1, 2, 4 секунды.400,401,402,403,404— не повторять, это ошибка запроса или счёта; повтор даст тот же ответ и потратит лимит.
Таймауты
Заголовок раздела «Таймауты»Ставьте таймаут HTTP-клиента не меньше 120 секунд для картинок и длинных чатов: обрыв на стороне клиента не отменяет уже начатую генерацию, и деньги за неё спишутся. Для видео и музыки таймаут не нужен вовсе — они асинхронные.