Прочитайте сырой ответ поставщика
В JSON ошибки кроме message есть блок с именем поставщика и его исходным ответом. Там написано: перегрузка, таймаут, контекст или параметр.
Ваш запрос дошёл до OpenRouter, а сломалось дальше — у поставщика модели. Разбираем, что лежит внутри ответа и как переключить маршрут.
Provider returned error — ответ OpenRouter с кодом 502: агрегатор принял ваш запрос, передал его поставщику модели, а тот вернул ошибку. Ключ, баланс и формат запроса здесь обычно ни при чём — сбой на следующем звене. В теле ответа рядом с текстом лежит сырой ответ поставщика и его имя, и именно там написано, что случилось на самом деле.
Чаще всего внутри перегрузка или таймаут у поставщика, его модерация, превышение его лимита контекста или параметр, который этот конкретный поставщик не поддерживает. У одной модели на OpenRouter бывает несколько поставщиков, и ошибка может касаться только одного из них — остальные в этот момент работают.
Поэтому лечится двумя способами. Первый — повтор через несколько секунд: если сбой временный, следующий запрос уйдёт другому поставщику. Второй — управление маршрутом: поле provider с order и allow_fallbacks задаёт, кого пробовать первым и разрешено ли переключаться. Если ошибка повторяется на одной модели у всех поставщиков, меняйте модель, а не настройки.
| Текст ошибки | Причина | Что делать |
|---|---|---|
| 502 Provider returned error, внутри overloaded | Перегрузка у поставщика модели | Повтор с паузой 2–5 секунд, allow_fallbacks: true |
| 502 Provider returned error, внутри timeout | Поставщик не ответил в свой лимит времени | Включить стриминг, сократить запрос, другой поставщик через provider.order |
| 502 Provider returned error, внутри context length | Контекст больше лимита этого поставщика | Сократить историю или выбрать поставщика с большим контекстом |
| 502 Provider returned error, внутри unsupported | Параметр не поддержан у этого поставщика | Убрать параметр или задать order с поставщиком, который его умеет |
| 408 Request timeout | Ответ не пришёл в отведённое OpenRouter время | Стриминг, повтор, увеличить timeout в клиенте |
Имя поставщика и его сырой ответ есть в теле ошибки. Смотрите их, прежде чем менять код: половина случаев лечится повтором.
В JSON ошибки кроме message есть блок с именем поставщика и его исходным ответом. Там написано: перегрузка, таймаут, контекст или параметр.
Для перегрузки и таймаута хватает повтора через 2–5 секунд. В SDK OpenAI это max_retries: 502 повторяется автоматически, пауза растёт сама.
from openai import OpenAI
client = OpenAI(
api_key="sk-or-...",
base_url="адрес OpenRouter из документации",
max_retries=5,
timeout=120,
)allow_fallbacks: true переключает запрос на другого поставщика той же модели, если первый вернул ошибку. Это поведение по умолчанию, но проверьте, что вы его не отключили.
response = client.chat.completions.create(
model="deepseek/deepseek-chat",
messages=[{"role": "user", "content": "ping"}],
extra_body={"provider": {"allow_fallbacks": True}},
)Если ошибка стабильно у одного поставщика, поставьте другого первым через order. Имена поставщиков видны на странице модели у OpenRouter.
extra_body={"provider": {
"order": ["Anthropic"],
"allow_fallbacks": True,
}}Если 502 идёт у всех поставщиков одной модели, дело в модели: у неё сегодня плохой день. Возьмите соседнюю из того же семейства и вернитесь позже.
Нет. Запрос не выполнен, кредиты за него не снимаются.
У каждой модели свой набор поставщиков. Если сбоит единственный поставщик модели, переключаться некуда, и помогает только повтор или другая модель.
Ни то ни другое: сломалось у поставщика модели. Ваша сторона — только повтор и выбор маршрута.
У нас модели идут через один шлюз, и выбора поставщика в запросе нет: поле provider не используется, маршрут задаём мы сами. Если сбой случился на нашей стороне или у поставщика, ответ приходит как 502 или 503 с телом ошибки, повторы в SDK работают штатно, а за неудачный запрос списания нет. Баланс и расход по ключу видны в кабинете.
OpenAI-совместимый адрес, оплата в рублях, ключ сразу после регистрации. Пополнение картой от 50 ₽.