Примечание автора: в этой статье разберём причины ошибок AI API 429, 401 и 500 и способы их устранения: какие запросы стоит повторять, когда нужно исправлять конфигурацию и в каких случаях применять экспоненциальную задержку, переключение на резервную модель и circuit breaker.
Многие разработчики знакомы с такой ситуацией: среди ночи в чате мониторинга появляется череда ошибок 429, 401 и 500 при вызове большой языковой модели. Часто первое решение — добавить повторные попытки для всех неудачных запросов, но это нередко только усугубляет ситуацию. В статье мы разберём как диагностировать ошибки AI API 429, 401 и 500 и проектировать отказоустойчивую систему, чтобы заменить слепые повторы обработкой с учётом типа ошибки.
Это не обзор HTTP-кодов состояния, а практическое руководство для поддержки системы в продакшене. Мы рассмотрим типичные причины каждой ошибки, возможность повторной попытки, логику обработки на уровне приложения и распределение задач по обеспечению отказоустойчивости между шлюзом и приложением.
Главное: после прочтения вы сможете за несколько минут определить, нужно ли повторить запрос, переключиться на резервный вариант или немедленно исправить конфигурацию, а также поймёте, когда применять экспоненциальную задержку, переключение между моделями и circuit breaker.

Главное об ошибках AI API: 429, 401 и 500
При ошибке AI API сначала определите её тип и только потом решайте, стоит ли повторять запрос. Разные коды указывают на разные проблемы: одни исчезают сами через некоторое время, другие не исправить никаким количеством повторных запросов. Таблица ниже поможет сориентироваться.
| Тип ошибки | Типичные коды состояния | Суть проблемы | Можно ли повторить запрос | Что делать |
|---|---|---|---|---|
| Ограничение запросов | 429 | Слишком много запросов или исчерпана квота | Зависит от причины | Проверить Retry-After, использовать экспоненциальную задержку и различать ограничение частоты и нехватку квоты |
| Аутентификация | 401、403 | Недействительный ключ или недостаточно прав | Нет | Сразу прекратить повторы, отправить оповещение и исправить настройки |
| Ошибка сервера | 500、502、503、504 | Сбой или перегрузка вышестоящего сервиса | Да, ограниченное число раз | Повторять с увеличивающейся задержкой; при постоянных сбоях перейти на резервный вариант или разомкнуть цепь |
| Ошибка запроса | 400、404、413、422 | Неверные параметры, название модели или длина запроса | Нет | Записать тело запроса, исправить параметры и отправить его заново |
Как видно, повторять запрос стоит только в том случае, если ошибка временная. При временных проблемах — ограничении частоты или кратковременных сбоях вышестоящего сервиса — повторный запрос имеет смысл. При постоянных ошибках, например неверном ключе или параметрах, повторы лишь расходуют квоту, замедляют ответ и могут привести к ещё более строгим ограничениям.
Таблица решений по кодам ошибок AI API
При поиске неполадок недостаточно смотреть только на код состояния: нужно также учитывать поле с типом ошибки в теле ответа и заголовки. Таблицу ниже можно использовать при проектировании логики приложения.
| Наблюдаемый сигнал | Возможная причина | Рекомендуемое действие | Учитывать в статистике автоматического выключателя |
|---|---|---|---|
429 с заголовком Retry-After |
Превышен лимит частоты запросов | Подождать указанное в заголовке время и повторить запрос | Нет |
| 429, а в теле ошибки указано, что квота или баланс исчерпаны | Квота аккаунта исчерпана | Не повторять запрос; отправить уведомление о необходимости пополнить баланс или сменить аккаунт | Нет |
| 401 | API-ключ неверен, просрочен или имеет неправильный формат | Не повторять запрос; проверить API-ключ и переменные окружения | Нет |
| 403 | У API-ключа нет доступа к этой модели или региону | Не повторять запрос; проверить разрешения и доступность модели для аккаунта | Нет |
| 500 / 502 | Внутренняя ошибка вышестоящего сервиса или сбой передачи запроса через шлюз | Повторить запрос 2–3 раза с увеличивающейся задержкой | Да |
| 503 | Сервис перегружен или находится на обслуживании | Повторить запрос с увеличивающейся задержкой; при неудаче перейти на резервный вариант | Да |
| 504 или тайм-аут клиента | Генерация занимает слишком много времени или вышестоящий сервис медленно отвечает | Решить, повторять ли запрос, с учётом идемпотентности; при необходимости увеличить тайм-аут | Да |
В таблице легко упустить из виду два разных значения кода 429. Некоторые провайдеры возвращают его и при исчерпании квоты, но поле с типом ошибки в теле ответа отличается от того, что приходит при обычном превышении лимита запросов. Если приложение проверяет только код состояния, оно будет бесконечно повторять запрос при недостатке средств, увеличивая задержку. В логах останутся одни ошибки 429, а ситуация так и не разрешится.
Ошибка 429: превышение лимита запросов
Основная причина ошибки 429 — превышение лимита запросов или токенов за определённый период. API больших языковых моделей обычно ограничивают использование сразу по нескольким параметрам: числу запросов и токенов в минуту, а иногда и числу параллельных запросов. Поэтому даже при небольшом количестве запросов слишком длинный контекст может вызвать ошибку 429.
При обработке ошибки 429 на уровне приложения стоит придерживаться трёх принципов. Во-первых, соблюдайте время ожидания из заголовка Retry-After или аналогичного заголовка со временем сброса лимита — не пытайтесь угадать его самостоятельно. Во-вторых, если таких заголовков нет, используйте экспоненциальную задержку со случайным разбросом, чтобы множество клиентов не повторили запрос одновременно и снова не исчерпали лимит. В-третьих, контролируйте поток запросов на входе: ограничение параллельных запросов с помощью алгоритма корзины токенов или очереди эффективнее, чем повторные попытки после ошибки.
Ошибка 401: проблема с аутентификацией
При ошибке 401 повторять запрос почти никогда не стоит. Она почти всегда связана с настройками. Например, при копировании ключа добавился пробел или перенос строки, переменная окружения не попала в контейнер, в продакшене используется ключ тестовой среды, ключ был заменён или отозван либо заголовок авторизации имеет неверный формат.
Для OpenAI-совместимых интерфейсов есть ещё одна частая причина: base_url не соответствует ключу. Например, с ключом платформы A отправляется запрос на адрес платформы B. Поэтому при появлении ошибки 401 приложение должно сразу прекратить повторные попытки, отправить высокоприоритетное оповещение и записать в журнал первые несколько символов ключа и адрес запроса, чтобы быстрее найти причину. Полный ключ в журнал записывать нельзя.
Ошибки сервера 500: подробный разбор
Ошибки серии 500 указывают на проблему на стороне сервера или в цепочке передачи запроса. Например, внутренний сбой или перегрузка сервиса модели либо ошибка при пересылке запроса через промежуточный шлюз. Такие ошибки обычно временны, поэтому запрос можно повторить несколько раз. Но если они возникают постоянно, значит, вышестоящий сервис работает нестабильно. Дальнейшие повторы лишь увеличат очередь запросов и займут все потоки — лучше переключиться на резервную модель или включить механизм размыкания цепи.
Отдельного внимания заслуживают ошибка 504 и тайм-аут на стороне клиента. Большая языковая модель сама по себе генерирует длинный текст небыстро. Если установить слишком короткий тайм-аут, можно принять обычный медленный запрос за неудачный и повторить его. Это приведёт к двойному списанию средств, а при прерывании потокового вывода фронтенд получит обрезанный текст.

Повторные попытки, переключение на резервный вариант и автоматический выключатель для AI API
Когда ошибки распределены по категориям, пора реализовать логику их обработки. В этом разделе вместо блоков кода приведены параметры и пошаговые инструкции: их можно использовать для реализации на любом языке.
Как реализовать повторные попытки с экспоненциальной задержкой
Принцип экспоненциальной задержки прост: перед каждой следующей попыткой время ожидания увеличивается в несколько раз, а к нему добавляется случайное отклонение. Логику можно организовать так:
- Определите набор ошибок, при которых запрос можно повторить: например,
429(кроме случаев исчерпания квоты),500,502,503,504, а также тайм-ауты сети. - После каждой ошибки сначала проверяйте заголовок ответа
Retry-After. Если он есть, ждите указанное время, иначе рассчитывайте задержку по формуле. - Обычно формула выглядит так: «базовый интервал × 2 в степени номера повторной попытки». К результату добавляется случайное отклонение; также нужно установить верхний предел ожидания.
- Установите максимальное число повторных попыток и общий лимит времени. При превышении любого из них сразу прекращайте попытки и передавайте ошибку механизму переключения на резервный вариант.
- Записывайте в журнал каждую повторную попытку: код ошибки, номер попытки, время ожидания и название модели. Это поможет при последующем анализе.
Если вы используете официальный SDK, проверьте его параметры: во многих SDK уже есть max_retries, timeout и другие подобные настройки. Не стоит добавлять снаружи ещё один такой же механизм повторных попыток: их количество перемножится, и при сбое нагрузка от запросов многократно вырастет.
Ниже приведены типичные стартовые значения. Это ориентиры, которые следует скорректировать с учётом допустимой задержки в вашем приложении и ограничений поставщика.
| Параметр | Значение | Типичное стартовое значение | Как корректировать |
|---|---|---|---|
max_retries |
Максимальное число повторных попыток | 2–5 | Меньше для диалога в реальном времени, больше для пакетной обработки |
| Базовый интервал | Ожидание перед первой повторной попыткой | Около 1 секунды | Можно увеличить для сервисов со строгими ограничениями частоты запросов |
| Максимальная задержка | Верхний предел времени ожидания | Десятки секунд | Помогает избежать слишком долгого ожидания при обработке запроса |
| Случайное отклонение | Распределяет повторные попытки по времени | Случайная величина, составляющая часть времени ожидания | Чем больше параллельных клиентов, тем важнее этот параметр |
| Общий лимит времени | Максимальная длительность одного вызова | Задаётся по SLA приложения | После истечения лимита сразу переключайтесь на резервный вариант |
🚀 Быстрый старт: чтобы на этапе тестирования проверить повторные попытки при разных кодах ошибок, можно подключить несколько моделей через APIYI apiyi.com с помощью единого OpenAI-совместимого интерфейса. Так вы сможете наблюдать ответы и ошибки разных моделей при одинаковой логике повторных попыток, не создавая отдельную интеграцию для каждого поставщика.
Как спроектировать переключение между моделями
Повторная попытка помогает, когда модель временно недоступна. Переключение на резервную модель нужно, когда основная вряд ли восстановится в ближайшее время. Для этого заранее настраивают цепочку: если основная модель несколько раз подряд выдаёт ошибку, запрос последовательно передаётся резервным моделям. Так сервис продолжает отвечать, хотя качество может снизиться, а расходы — вырасти.
При проектировании такой цепочки важно учитывать возможности моделей. Если основной модели нужны вызов функций, структурированный вывод или длинный контекст, резервная тоже должна их поддерживать. Иначе после переключения могут появиться новые ошибки 400 или сбои при разборе ответа. В таблице ниже показано, как можно выстроить цепочку для разных сценариев.
| Сценарий | Основная модель | Первый резерв | Последний вариант | Доступные платформы |
|---|---|---|---|---|
| Диалоги с клиентами | Качественная универсальная модель | Модель другого поставщика того же уровня | Быстрая лёгкая модель + упрощённый ответ | APIYI apiyi.com, официальные API поставщиков |
| Генерация и проверка кода | Флагманская модель с сильными навыками программирования | Флагманская модель другого поставщика | Сообщение «Попробуйте позже» | APIYI apiyi.com, официальные API поставщиков |
| Пакетная обработка контента | Модель с хорошим соотношением цены и качества | Другая модель в той же ценовой категории | Поместить в очередь для последующей обработки | APIYI apiyi.com, официальные API поставщиков |
| Извлечение структурированной информации | Модель с поддержкой вывода в JSON | Другая модель с поддержкой структурированного вывода | Движок правил | APIYI apiyi.com, официальные API поставщиков |
При переключении на резервную модель стоит учесть несколько деталей:
- Адаптация промптов: модели по-разному реагируют на системные промпты, поэтому для резервной модели лучше подготовить и проверить отдельную версию.
- Длина контекста: перед переключением проверьте, не превышает ли длина сообщений контекстное окно резервной модели. При необходимости сначала сократите историю.
- Маркировка результатов: отмечайте в логах и системе мониторинга, что ответ получен от резервной модели. Это поможет оценить влияние переключения на качество.
- Не переключайтесь при ошибках аутентификации: ошибка 401 указывает на проблему с настройкой. Переключение на другую модель лишь скроет её — нужно сразу отправить оповещение.
Как работает circuit breaker и когда его применять
Circuit breaker, или прерыватель цепи, не даёт постоянно отказывающей зависимости вывести из строя всю систему. Обычно у него три состояния: в закрытом состоянии запросы проходят как обычно, а доля ошибок отслеживается. Если доля ошибок или количество последовательных сбоев превышает порог, прерыватель переходит в открытое состояние: запросы сразу отклоняются или обрабатываются по резервному сценарию, без обращения к неисправному вышестоящему сервису. После периода ожидания наступает полуоткрытое состояние: пропускается небольшое число пробных запросов. Если они успешны, прерыватель закрывается; если нет — снова открывается.
Главное правило: учитывать только ошибки, которые отражают состояние вышестоящего сервиса. Ошибки 5xx и тайм-ауты должны входить в расчёт доли ошибок, а клиентские ошибки вроде 401 и 400 — нет. Иначе ошибка конфигурации приведёт к открытию прерывателя, и все корректные запросы будут отклоняться. Ответ 429 из-за исчерпания квоты тоже не следует учитывать: он отражает состояние аккаунта, а не работоспособность сервиса.
Но чем больше прерывателей, тем не обязательно лучше. Для внутренних инструментов с небольшим числом вызовов выборка слишком мала, и прерыватель легко может сработать по ошибке. В таких случаях достаточно простых повторных попыток и резервного сценария. Прерыватель лучше подходит для высоконагруженных сервисов: при массовых сбоях вышестоящего сервиса он быстро ограничивает последствия и не даёт медленным запросам занять все потоки и соединения в пулах.

Разделение отказоустойчивости между шлюзом и приложением
Всё больше команд вызывают большие языковые модели через API-шлюзы или платформы-агрегаторы. Возникает вопрос: если шлюз уже автоматически переключается на резервные варианты, нужны ли приложению повторные попытки и механизм circuit breaker? Да, нужны, но задачи у них разные. Шлюз лучше справляется с проблемами на уровне каналов к провайдерам, а приложение понимает, как ошибки влияют на бизнес-логику. Каждый отвечает за свой участок.
| Задачи отказоустойчивости | Лучше решать на уровне шлюза | Лучше решать на уровне приложения |
|---|---|---|
| Переключение при сбое канала | Переключение между каналами для одной модели, балансировка нагрузки | Не нужно дублировать реализацию |
| Переключение на другую модель | Может предоставлять маршрутизацию между моделями | Решать, допустимо ли снижение качества и нужно ли менять промпт |
| Повторные попытки | Быстрые повторные попытки на уровне канала | Лимит повторных попыток на уровне бизнес-логики с учётом тайм-аута пользователя |
| Circuit breaker | Проверка работоспособности каналов к провайдерам | Circuit breaker и резервный сценарий на случай недоступности всего шлюза |
| Ошибки авторизации и квот | Возврат понятного типа ошибки | Оповещение, блокировка повторных попыток, уведомление ответственных |
| Мониторинг | Доля успешных запросов и задержки на уровне каналов | Доля успешных операций, доля переключений на резервные варианты и влияние на пользователей |
Возьмём APIYI: в описании сервиса упоминаются такие возможности для повышения стабильности, как автоматическое переключение на резервные варианты, балансировка нагрузки и мониторинг в реальном времени. Они подходят для переключения при сбоях на уровне каналов, а приложение может сосредоточиться на резервных бизнес-сценариях. Однако условия переключения, а также коды и форматы возвращаемых ошибок не обязательно полностью совпадают с официальными — это нужно уточнять по документации платформы и проверять на практике. Упоминание «неограниченной параллельности» в описании сервиса тоже не означает, что ошибка 429 никогда не возникнет: ограничения самих провайдеров моделей по-прежнему действуют. Надёжнее всего всегда сохранять на уровне приложения обработку ошибок 429 и 5xx, а также иметь собственный резервный сценарий на случай недоступности шлюза целиком.
🎯 Технический совет: после подключения шлюза намеренно вызовите в тестовой среде несколько типов ошибок. Например, используйте неверный ключ, запросите модель с несуществующим именем или отправьте слишком длинный контекст. Запишите коды состояния и поля тела ошибки, которые фактически возвращает APIYI apiyi.com, и на их основе настройте правила классификации ошибок в приложении, вместо того чтобы просто копировать формат ошибок из официальной документации.
Частые вопросы FAQ
Q1: В чём принципиальная разница между ошибками 429 и 500 при работе с AI API?
Ошибка 429 означает, что запрос превысил лимит: дело в частоте запросов или доступной квоте аккаунта. Ошибка 500 означает сбой на стороне сервиса. В первом случае нужно снизить частоту запросов и соблюдать время ожидания, во втором — повторить запрос ограниченное число раз и перейти на резервный вариант, если ошибки продолжаются. В обоих случаях проблема может решиться сама через некоторое время, но подход к обработке разный.
Q2: Почему ошибку 401 ни в коем случае не стоит автоматически повторять?
401 — детерминированная ошибка: если ключ неверный, результат не изменится и после десяти тысяч попыток. Автоматические повторы не только тратят ресурсы, но и маскируют проблему, задерживая оповещение. Правильный подход — сразу прервать запрос и проверить ключ, передачу переменных окружения и соответствие адреса запроса.
Q3: Почему ошибка 429 не исчезает даже после повторных попыток?
Чаще всего причина в исчерпанной квоте или нулевом балансе. Некоторые провайдеры в таком случае тоже возвращают 429, но поле типа ошибки в теле ответа отличается от обычного ограничения частоты запросов. Другая возможная причина — повторы без случайной задержки: множество запросов отправляется одновременно и снова исчерпывает лимит. Сначала изучите тело ошибки, затем проверьте распределение повторных запросов по времени.
Q4: Влияет ли переключение на резервные модели на качество результатов?
Может влиять. По сути, при переходе на резервную модель приходится выбирать доступность ценой качества, поэтому важно заранее определить, в каких сценариях это допустимо. Для резервной модели стоит подготовить отдельно проверенный промпт и отслеживать долю переключений в системе мониторинга. Если она долго остаётся высокой, пора проверить квоты и стабильность основной модели.
Q5: Как с небольшими затратами протестировать цепочку переключения между моделями?
Можно создать тестовую среду на платформе с единым интерфейсом для нескольких моделей. Например, APIYI apiyi.com позволяет переключаться между моделями разных провайдеров через один и тот же OpenAI-совместимый интерфейс вызовов. Достаточно изменить название модели, чтобы сравнить результаты основной и резервной моделей на одном промпте и посмотреть, как они обрабатывают ошибки. Это удобно для проверки сценария переключения перед запуском.
Q6: Нужен ли на уровне приложения автоматический выключатель, если шлюз уже поддерживает автоматическое переключение на резервный вариант?
Да. Переключение на уровне шлюза решает проблемы с вышестоящими каналами, но сам шлюз тоже может оказаться недоступен из-за сетевого сбоя или других проблем. Автоматический выключатель и резервный сценарий на уровне приложения нужны именно на такой случай. При использовании шлюза вроде APIYI можно настроить автоматический выключатель на сбор статистики по шлюзу в целом, а не по отдельным каналам моделей. Так задачи двух уровней не будут дублироваться.
Q7: Какие известные побочные эффекты есть у повторных попыток, переключения на резервный вариант и автоматического выключателя?
Повторные запросы могут привести к двойному списанию средств, а в неидемпотентных сценариях — например, при операциях записи через вызовы инструментов — к повторному выполнению действий. Переход на резервную модель может привести к колебаниям качества и изменению формата ответа. Слишком чувствительные настройки автоматического размыкателя могут приводить к ошибочному отклонению нормальных запросов. Поэтому все три механизма нужно постоянно настраивать с учётом метрик мониторинга: настроить их один раз и забыть не получится.
Обработка ошибок AI API: главное
- Сначала классификация, потом обработка: детерминированные ошибки нужно сразу исправлять, а повторять запросы — только при временных ошибках.
- При ошибке 429 проверяйте тело ответа: различайте ограничение частоты запросов и исчерпание квоты. Во втором случае повторять запрос бессмысленно.
- При ошибке 401 никогда не повторяйте запрос: сразу отправляйте уведомление и проверяйте, соответствуют ли друг другу ключ, переменные окружения и адрес API.
- Ограничивайте повторные попытки: используйте экспоненциальную задержку со случайным разбросом и задавайте ограничения как на число попыток, так и на общее время.
- Согласуйте возможности при переходе на резервную модель: она должна поддерживать те же функции, для неё также нужен отдельный промпт.
- Автоматический размыкатель должен учитывать только ошибки сервера: включайте в долю ошибок ответы 5xx и тайм-ауты, но не ошибки клиента.
- Разделяйте обязанности шлюза и приложения: для отказоустойчивости на уровне каналов можно использовать APIYI apiyi.com, а резервную обработку бизнес-операций оставить приложению.
Итоги
Когда AI API возвращает ошибки 429, 401 или 500, главное — отказаться от привычки «повторять все запросы одинаково» и обрабатывать ошибки в зависимости от их причины:
- Ошибки ограничения частоты запросов: учитывайте
Retry-After, повторяйте запросы с экспоненциальной задержкой и случайным разбросом, а также контролируйте число параллельных запросов и расход токенов. - Ошибки аутентификации и запроса: сразу прерывайте выполнение, отправляйте оповещение и исправляйте конфигурацию. Не повторяйте запросы автоматически и не маскируйте проблему переключением на запасной вариант.
- Ошибки сервера: ограничьте число повторных попыток, а если ошибка сохраняется, переключайтесь на резервную модель. При высокой нагрузке используйте автоматический выключатель (circuit breaker), чтобы быстро ограничить последствия сбоя.
- Разделение ответственности между шлюзом и приложением: шлюз управляет переключением каналов и нагрузкой, а приложение — бизнес-логикой, лимитом повторных попыток и последним запасным вариантом.
Для начала составьте на основе таблицы решений из этой статьи внутренний стандарт обработки ошибок. Затем проведите учения по реагированию на сбои и убедитесь, что каждый тип ошибки обрабатывается по ожидаемому сценарию.
Если вы планируете цепочку переключения между несколькими моделями, APIYI apiyi.com поможет сравнить их поведение и ошибки через единый интерфейс. Сначала проверьте стратегию отказоустойчивости в тестовой среде, а затем запускайте её в продакшене.
📚 Полезные материалы
- Блог Ofox.ai — статьи об обработке ошибок AI API: подходы к обработке ошибок 429 при ограничении частоты запросов, 401 при аутентификации и 500 на стороне сервера, а также экспоненциальная задержка между повторами, переключение на резервные модели и автоматический выключатель
- Ссылка:
ofox.ai/blog/page/41/ -
Примечание: источник для выбора темы этой статьи; подойдёт для сравнения с англоязычными материалами
-
Блог Ofox.ai — статьи об LLM API Gateway: выбор шлюза для LLM и проблемы со сбоями у разных провайдеров
- Ссылка:
ofox.ai/blog/page/40/ -
Примечание: помогает понять роль отказоустойчивости на уровне шлюза в архитектуре с несколькими моделями
-
Центр документации APIYI: инструкции по подключению и использованию платформы
- Ссылка:
docs.apiyi.com - Примечание: формат кодов ошибок, поведение при переключении на резервные варианты и другие детали уточняйте в документации платформы и проверяйте на практике
Автор: техническая команда APIYI
Техническое общение: свяжитесь с нами через главную страницу сайта APIYI, чтобы обсудить практики повышения стабильности AI API. Дополнительные материалы по подключению доступны в центре документации docs.apiyi.com
