Технологии

Ошибка 429 и лимиты запросов: что делать

Один и тот же код 429 приходит от трёх разных лимитов — по запросам, по токенам и по суточной квоте. Разбираем, как определить сработавший и что делать с каждым.

Симптом: ассистент отвечал нормально, потом на очередной вопрос вернул ошибку 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 → ошибка → сдаться и сообщить пользователю

Три правила, без которых схема не работает:

  1. Заголовок с рекомендованной паузой важнее вашей формулы. Если провайдер назвал срок — ждите его.
  2. Случайная добавка обязательна. Без неё все клиенты повторяют синхронно и создают новый всплеск.
  3. Повторять имеет смысл только 429 и временные ошибки сервера. Ошибку авторизации повтор не исправит никогда — её разбор в справочнике по ошибке 401 и другим проблемам с ключом.

#Если ничего не помогло

Проверьте по порядку:

  • Не делите ли вы лимит с кем-то ещё. Один ключ в нескольких приложениях расходует общую квоту, и виновником может быть не то приложение, которое падает.
  • Не привязан ли лимит к организации, а не к ключу. У части провайдеров квота общая на аккаунт, и новый ключ ситуацию не меняет.
  • Не изменил ли провайдер квоты. Это происходит и без уведомления; страница лимитов в документации — источник истины.
  • Не упёрлись ли вы в лимит конкретной модели. У флагманских моделей квоты нередко уже, чем у компактных, и переключение модели решает вопрос быстрее любых настроек.

Если ошибка воспроизводится при нулевой активности с вашей стороны, дело не в вашем расходе. В этом случае разумнее иметь второй ключ у другого провайдера, чем добиваться объяснений — обзор вариантов в статье о том, где взять ключ к языковой модели.

#Частые вопросы

#Чем 429 отличается от ошибки о недостатке средств?

Код 429 говорит о превышении частоты или квоты — он снимается временем. Ошибка о балансе или квоте аккаунта снимается только пополнением. Различить их можно по телу ответа: в нём почти всегда указан тип ограничения, даже если код одинаковый.

#Помогает ли перейти на платный уровень?

Часто помогает: платные лимиты обычно шире. Но если причина — залп запросов от агента, платный уровень лишь отодвигает границу, а проблему решает ограничение числа шагов и пауза между вызовами.

#Почему ошибка приходит, хотя я задал всего один вопрос?

Вероятнее всего, сработал лимит токенов в минуту: один запрос с большим подмешанным контекстом может исчерпать минутную квоту целиком. Проверяется тем же запросом с урезанным контекстом.

#Можно ли обойти лимит несколькими аккаунтами?

Это прямое нарушение условий использования у большинства провайдеров, и заканчивается блокировкой всех связанных аккаунтов вместе с балансом. Легальный путь — второй ключ у другого провайдера, а не второй аккаунт у того же.

#Сколько ждать перед повторной попыткой?

Если провайдер прислал рекомендованную паузу — ровно столько. Если нет — начинайте с секунды и удваивайте, добавляя случайную задержку, и останавливайтесь после нескольких неудач. Бесконечный повтор превращает временный сбой в постоянный.

Хотите ИИ, который помнит вас?

Persona держит контекст между чатами и работает на вашем железе — если развернуть её у себя и подключить локальную модель.

Создать аккаунт