Лимиты и код 429
Под одним кодом 429 прячутся пять разных ограничений с разным лечением. Как отличить их за один взгляд на ответ.
429 в Lumean API — не одно ограничение, а пять. У них разные причины, разные тела ответа
и, главное, разное лечение: то, что чинит один, бесполезно против остальных четырёх.
Универсальный «подождать и повторить» гарантированно работает ровно в двух случаях из пяти.
Ловушка
У rate-limit'а ключа заголовка Retry-After нет — вопреки вводному тексту в OpenAPI,
который обещает его для всех 429. Именно отсутствие заголовка и reason в теле —
самый быстрый способ отличить лимит частоты от токен-квоты.
Как отличить за один взгляд
Достаточно двух проверок в таком порядке: есть ли в теле поле reason и пришёл ли заголовок
Retry-After. Первая проверка отделяет лимит частоты от четырёх «заказных» ограничений,
вторая — говорит, можно ли просто подождать.
Пять источников
| Источник | reason | Retry-After | Что делать |
|---|---|---|---|
| Частота запросов ключа | нет | нет | Свой backoff по окну ключа |
| Токен-квота ключа | token_quota_exceeded | есть | Ждать retry_after секунд |
| Usage-лимит подписки | limit_exceeded | нет | Сверить GET /usage, докупить или ждать периода |
| Слоты одновременных задач | concurrency_limit_exceeded | нет | Ждать завершения своих заказов |
| Кулдаун контентной политики | policy_cooldown_active | есть | Править текст, не повторять как есть |
Частота запросов ключа
Ограничение по окнам limits.requests.per_minute|per_hour|per_day самого ключа. Тело —
голый конверт { "success": false, "message": "…" }: ни reason, ни Retry-After,
ни X-RateLimit-*. Ориентируйтесь на настроенные окна ключа и делайте экспоненциальный
backoff сами.
Важный нюанс: по умолчанию ключ по частоте не ограничен вообще. Числовой дефолт
включается, только если оператор задал его в окружении. Действующие окна видны в личном
кабинете. Если этот 429 пришёл, а окна пустые, вы почти наверняка смотрите на один
из четырёх ограничителей ниже.
Токен-квота ключа
Считает не запросы, а токены — учётную единицу объёма работы (это не деньги и не LMC).
Окна per_minute, per_hour, per_day, per_month берутся из limits.tokens.* ключа.
Проверка идёт до создания: заказ не создаётся и не тарифицируется.
- Что произошло
- Заказ не создан. Единственный 429 с подробным телом: `window` (первое нарушенное окно), `limit`, `used`, `requested`, `reset_at`, `retry_after`. Вместе с ним приходит заголовок `Retry-After`.
- Что сделать прямо сейчас
- Ждать до `reset_at` — либо `retry_after` секунд, это одно и то же значение. Наличие `Retry-After` и есть способ отличить этот случай от rate-limit ключа, у которого заголовка нет вовсе. Если ждать нельзя — уменьшить `requested`: разбить текст на части, чтобы каждая влезала в остаток окна (`limit − used`).
В теле приходит window (первое нарушенное окно), limit, used, requested, reset_at
и retry_after — этого достаточно, чтобы поставить задачу в очередь до точного момента,
а не опрашивать API вслепую.
Usage-лимит подписки
Не про ключ, а про тарифный план: месячный объём генерации исчерпан. Тело содержит только
message и reason: "limit_exceeded" — ни полей квоты, ни Retry-After. Пауза не поможет:
до конца расчётного периода ответ не изменится.
Get Usage Limits
Слоты одновременных задач
concurrency_limit_exceeded ограничивает не частоту и не объём, а число ваших заказов
в работе одновременно. Пачка из сотен заказов, отправленная залпом, упирается именно
в него. Лечится не паузой между запросами, а ожиданием завершения уже запущенных: повтор
сразу после того, как любой из них перешёл в терминальный статус, пройдёт.
Действующий потолок и текущее число активных — в GET /usage, запись с
limit_type: "concurrent". У неё period_start, period_end и resets_in равны null:
периода у такого лимита нет, ждать «конца месяца» бессмысленно.
Кулдаун контентной политики
Пять подряд заблокированных политикой задач ограничивают создание новых на 5 минут,
при повторных залётах — на 10, затем на 15 (выше не поднимается). Это единственный
«заказной» 429, который несёт Retry-After, а также поля retry_after (секунды)
и retry_at (ISO-8601).
Сбои инфраструктуры счётчик не двигают: считаются только контентные блокировки, а любая успешная задача обнуляет и счётчик, и достигнутую ступень.
Правильно
Дождаться retry_at, а до этого — исправить формулировки в тексте, которые отбивала политика.
Неправильно
Ретраить тот же текст по истечении кулдауна: он снова упрётся в блокировку, поднимет ступень до 10 минут и будет стоить денег на каждой попытке.
Что делать интегратору
- Читайте
reasonраньше, чемRetry-After: он один отвечает на вопрос «это про частоту, объём, план, параллелизм или текст». - Уважайте
Retry-After, когда он есть. Когда его нет, ретрай по таймеру помогает только при лимите частоты — в остальных случаях нуженGET /usageили правка текста. - Не путайте
429с402. Код402payg_topup_required— это не отказ, а развилка оплаты: сервер предлагает доплатить недостающие токены из LMC-баланса. Слепой ретрай здесь бесполезен, нужен повтор сconfirm_payg_topupиquote_token. - Ставьте потолок попыток. Три из пяти источников не рассасываются сами по себе, и бесконечный цикл ретраев не приблизит выполнение заказа ни на секунду.
Совет
Не уверены, какой из пяти пришёл вам? Вставьте тело ответа в диагност на странице
«Ошибки» — он разберёт reason и заголовки и покажет нужную карточку.
Скормить страницу ИИ
Обновлено 04.09.2026 · спека 0.0.1