Симптом: ассистент отвечал нормально, потом на очередной вопрос вернул ошибку 429 Too Many Requests, а через несколько минут снова заработал. Или не заработал до следующего дня. Или заработал, но только на короткие вопросы.
Разное поведение — не случайность. За кодом 429 стоят как минимум три независимых ограничения, и по внешнему виду ошибки они не различаются. Пока вы не знаете, какое из них сработало, лечение выбирается наугад: пауза между запросами не помогает при исчерпанной суточной квоте, а переход на другую модель не помогает при минутном лимите.
#Быстрая проверка
Первое, что нужно сделать, — посмотреть на заголовки ответа, а не только на его тело. У OpenAI-совместимых провайдеров вместе с ошибкой обычно приходят служебные заголовки с остатками квот и рекомендованной паузой:
curl -i -s -o /dev/null -D - https://АДРЕС_ЭНДПОИНТА \
-H "Authorization: Bearer ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"model":"ИМЯ_МОДЕЛИ","messages":[{"role":"user","content":"ping"}],"max_tokens":8}'
В Windows PowerShell:
$r = Invoke-WebRequest -Uri https://АДРЕС_ЭНДПОИНТА -Method Post -SkipHttpErrorCheck `
-Headers @{ "Authorization" = "Bearer ВАШ_КЛЮЧ"; "Content-Type" = "application/json" } `
-Body '{"model":"ИМЯ_МОДЕЛИ","messages":[{"role":"user","content":"ping"}],"max_tokens":8}'
$r.Headers
Смотрите на две вещи: заголовок с рекомендованной паузой (обычно retry-after) и заголовки остатков — по запросам и по токенам отдельно. Точные имена различаются у провайдеров, их список есть в разделе документации про лимиты. Если остаток по запросам ненулевой, а по токенам — ноль, вы упёрлись в объём, а не в частоту, и это меняет всё дальнейшее лечение.
Эта одна команда отсекает половину случаев.
#Причина 1. Лимит запросов в минуту
Признак. Ошибка приходит сразу после серии быстрых обращений. Через минуту всё работает. Одиночные вопросы проходят, а агент или пакетная обработка падают.
Проверка. Отправьте один запрос после минутной паузы. Прошёл — это он.
Решение. Растянуть обращения во времени: очередь с интервалом вместо параллельного залпа. Для агента — уменьшить число шагов и добавить паузу между вызовами. Увеличивать лимит переходом на платный уровень имеет смысл только после того, как вы убедились, что залп действительно нужен.
#Причина 2. Лимит токенов в минуту
Признак. Короткие вопросы проходят, длинные — нет. Ошибка приходит на первом же обращении, если контекст большой.
Проверка. Отправьте тот же запрос с урезанным контекстом. Прошёл — это лимит объёма.
Решение. Сократить входные токены: меньше подмешиваемых фрагментов памяти, короче история диалога, жёстче ограничение длины ответа. Это же лечение снижает счёт — механику разбирает материал про то, как не слить бюджет на API.
#Причина 3. Суточная квота
Признак. Ошибка не проходит ни через минуту, ни через десять. Утром следующего дня всё работает.
Проверка. Посмотрите раздел использования в кабинете провайдера: суточный расход упёрся в потолок.
Решение. Ждать сброса, перейти на другого провайдера или на платный уровень. Если такое происходит регулярно, бесплатный уровень просто не рассчитан на ваш профиль нагрузки — как это оценить заранее, показано в разборе бесплатных API языковых моделей.
#Причина 4. Перегрузка провайдера, замаскированная под 429
Признак. Ошибка приходит нерегулярно, при небольшой нагрузке, у разных пользователей одновременно. Остатки квот в заголовках при этом ненулевые.
Проверка. Страница состояния сервиса и повтор через несколько минут.
Решение. Это не ваш лимит, а его нагрузка. Лечится запасным провайдером и корректной деградацией — схема разобрана в материале про то, как ассистент должен переживать сбой провайдера.
#Таблица: симптом → причина → проверка
| Симптом | Вероятная причина | Проверка |
|---|---|---|
| Проходит через минуту | лимит запросов в минуту | одиночный запрос после паузы |
| Падают только длинные запросы | лимит токенов в минуту | тот же запрос с коротким контекстом |
| Не проходит весь день | суточная квота | раздел использования в кабинете |
| Падает при малой нагрузке | перегрузка провайдера | страница состояния сервиса |
| Падает сразу после сбоя | лавина повторных попыток | лог собственного клиента |
Последняя строка встречается чаще, чем кажется: клиент, повторяющий запрос мгновенно и без ограничения числа попыток, сам создаёт себе 429 после любого временного сбоя.
#Схема повторных попыток
Правильный повтор выглядит так:
попытка 1 → ошибка 429
есть заголовок retry-after? → ждать ровно столько
нет → ждать 1 с + случайная добавка до 0,5 с
попытка 2 → ошибка → ждать 2 с + добавка
попытка 3 → ошибка → ждать 4 с + добавка
попытка 4 → ошибка → ждать 8 с + добавка
попытка 5 → ошибка → сдаться и сообщить пользователю
Три правила, без которых схема не работает:
- Заголовок с рекомендованной паузой важнее вашей формулы. Если провайдер назвал срок — ждите его.
- Случайная добавка обязательна. Без неё все клиенты повторяют синхронно и создают новый всплеск.
- Повторять имеет смысл только 429 и временные ошибки сервера. Ошибку авторизации повтор не исправит никогда — её разбор в справочнике по ошибке 401 и другим проблемам с ключом.
#Если ничего не помогло
Проверьте по порядку:
- Не делите ли вы лимит с кем-то ещё. Один ключ в нескольких приложениях расходует общую квоту, и виновником может быть не то приложение, которое падает.
- Не привязан ли лимит к организации, а не к ключу. У части провайдеров квота общая на аккаунт, и новый ключ ситуацию не меняет.
- Не изменил ли провайдер квоты. Это происходит и без уведомления; страница лимитов в документации — источник истины.
- Не упёрлись ли вы в лимит конкретной модели. У флагманских моделей квоты нередко уже, чем у компактных, и переключение модели решает вопрос быстрее любых настроек.
Если ошибка воспроизводится при нулевой активности с вашей стороны, дело не в вашем расходе. В этом случае разумнее иметь второй ключ у другого провайдера, чем добиваться объяснений — обзор вариантов в статье о том, где взять ключ к языковой модели.
#Частые вопросы
#Чем 429 отличается от ошибки о недостатке средств?
Код 429 говорит о превышении частоты или квоты — он снимается временем. Ошибка о балансе или квоте аккаунта снимается только пополнением. Различить их можно по телу ответа: в нём почти всегда указан тип ограничения, даже если код одинаковый.
#Помогает ли перейти на платный уровень?
Часто помогает: платные лимиты обычно шире. Но если причина — залп запросов от агента, платный уровень лишь отодвигает границу, а проблему решает ограничение числа шагов и пауза между вызовами.
#Почему ошибка приходит, хотя я задал всего один вопрос?
Вероятнее всего, сработал лимит токенов в минуту: один запрос с большим подмешанным контекстом может исчерпать минутную квоту целиком. Проверяется тем же запросом с урезанным контекстом.
#Можно ли обойти лимит несколькими аккаунтами?
Это прямое нарушение условий использования у большинства провайдеров, и заканчивается блокировкой всех связанных аккаунтов вместе с балансом. Легальный путь — второй ключ у другого провайдера, а не второй аккаунт у того же.
#Сколько ждать перед повторной попыткой?
Если провайдер прислал рекомендованную паузу — ровно столько. Если нет — начинайте с секунды и удваивайте, добавляя случайную задержку, и останавливайтесь после нескольких неудач. Бесконечный повтор превращает временный сбой в постоянный.