Отказы бывают двух родов: легла площадка и легла модель. Первое мы закрываем сами, второе закрыть за вас нельзя — заменять модель на другую можно только с вашего согласия.
Работает по умолчанию и ничего не требует. Если выбранная площадка вернула 5xx, разорвала соединение или не уложилась в таймаут, запрос уходит следующей площадке той же модели. model в ответе при этом не меняется — меняется только provider.
| Что случилось | Переключаемся? |
|---|---|
| Таймаут соединения или ответа | Да |
| 500, 502, 503 от площадки | Да |
| 429 от площадки (её лимит, не ваш) | Да |
| 400 — запрос не разобран | Нет: другая площадка ответит так же |
| Контекст превышен | Нет |
| Отказ модели по содержанию запроса | Нет: это ответ, а не сбой |
code: "stream_interrupted". Отданные токены оплачены, и повторная генерация с нуля списала бы деньги дважды без вашего ведома. Решение о повторе здесь ваше.Когда «перегружены» ответили все площадки модели, вы получаете 429, а не 502: повторить позже — правильное действие, и SDK различают эти коды. 502 остаётся для настоящих отказов.
Поле models — список запасных моделей, который пробуется, когда основная недоступна целиком: снята с публикации, легли все её площадки, или запрос не проходит по её ограничениям.
{
"model": "anthropic/claude-sonnet-5",
"models": ["openai/gpt-5", "deepseek/deepseek-v3"],
"messages": [{"role": "user", "content": "…"}]
}Порядок значим. Ответ вернётся от той модели, что отработала, и её идентификатор будет в поле model — проверяйте его, если логика зависит от модели. Списание идёт по тарифу той модели, которая фактически ответила. Длина цепочки — до пяти моделей вместе с основной: список длиннее это уже не резерв, а перебор каталога за счёт времени вашего запроса.
Переход к запасной модели возможен, только пока вам не ушло ни байта. Отказ по деньгам (402) цепочку не продолжает: у запасной модели тот же баланс и тот же потолок ключа.
400 — резерва из неё не выйдет.tools или json_schema, запасная должна их уметь. Иначе список отработает вхолостую.Неудачная попытка не оплачивается: если площадка не отдала ни одного токена, платить не за что. Оплачивается только тот вызов, который дошёл до ответа. В разделе «Доступ к моделям» такой запрос выглядит одной строкой с пометкой о переключении и перечнем попыток — так видно, что резерв реально срабатывает, а не лежит мёртвым грузом.
{
"model": "anthropic/claude-sonnet-5",
"provider": {
"order": ["openrouter"],
"ignore": ["vsegpt"],
"allow_fallbacks": false
}
}| Поле | Что делает |
|---|---|
| order | Названные площадки идут первыми в указанном порядке; остальные остаются следом |
| ignore | Площадки, к которым не обращаться вовсе |
| allow_fallbacks | false — только первая площадка: либо её ответ, либо ошибка |
С allow_fallbacks: false единственный возможный исход при отказе — ошибка. Это нужный режим для замеров качества и для случаев, когда ответ не от той площадки хуже, чем отказ. Если order и ignore вместе не оставили ни одной площадки, приходит 400 provider_prefs_empty — молча подставлять то, что вы исключили, мы не будем.