Надёжность API
Fallback моделей в AI API: как переключать запросы контролируемо
Fallback — не магическая кнопка «всегда доступно». Это заранее описанное правило: при каком наблюдаемом временном сбое запрос можно повторить, на какую проверенную модель, с какими ограничениями и как показать пользователю изменение результата. Если правило отсутствует, автоматическое переключение легко скрывает ошибку авторизации, создаёт дубликат операции или возвращает ответ с неожиданным качеством и стоимостью. Надёжная стратегия начинается с классификации задач и заканчивается измеримым rollback.
Определите, что именно нужно сохранить
Для чата пользователь может ждать короткий связный ответ. Для извлечения данных важнее JSON-контракт. Для кода критичны тесты и отсутствие опасных команд. Для видео важны очередь, права на контент и конечный статус задачи. Один «резервный список моделей» для всех этих задач не работает. Запишите для каждого маршрута допустимую задержку, минимальное качество, требования к формату, максимальный бюджет и то, имеет ли запрос побочный эффект.
Затем привяжите основной и резервный выбор не к бренду модели, а к проверяемому контракту. Например: «умеет принять сообщения, вернуть текст UTF‑8 не длиннее N, обрабатывает нужный язык, проходит набор из 30 безопасных примеров». Не переносите в правило неподтверждённые заявления о длине контекста, цене или доступности. Перед подключением сверяйте каталог, права ключа и реальные идентификаторы через /v1/models.
Какие ошибки не являются сигналом к fallback
401 и 403 говорят проверить собственный ключ, endpoint, права и конфигурацию; другая модель не исправит эти причины. Не меняйте ключ, регион или URL ради обхода ограничений. Ошибка в пользовательском вводе, превышение установленного размера, неразрешённый инструмент и несоответствие JSON Schema также должны вернуть понятную ошибку приложения. Руководство по 401 и 403 помогает диагностировать их, не выводя секреты в логи.
429 и некоторые 5xx могут быть временными, но сначала уменьшите параллелизм и примените ограниченный backoff с jitter. Лишь после исчерпания небольшого, заранее установленного бюджета допустим маршрут на резервную модель — если операция безопасна для повтора. Для запроса с внешним действием или длительной генерацией повтор без идентификатора операции может создать дубль. Поэтому fallback никогда не должен жить только в HTTP middleware.
Запишите политику в коде
Пример ниже — каркас серверного выбора для простой текстовой операции без побочного эффекта. Он не предполагает, что конкретные модели доступны: идентификаторы приходят из защищённой конфигурации, а доступность проверяют до релиза. В production добавьте аутентификацию пользователя, ограничение входа, timeout и безопасные метрики.
const route = {
primary: process.env.RUSSIAAPI_PRIMARY_MODEL,
fallback: process.env.RUSSIAAPI_FALLBACK_MODEL,
retryable: new Set([429, 500, 502, 503, 504])
};
async function complete(model, messages) {
const r = await fetch('https://russiaapi.com/v1/chat/completions', {
method: 'POST', headers: { 'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.RUSSIAAPI_API_KEY}` },
body: JSON.stringify({ model, messages })
});
if (!r.ok) { const error = new Error(`api_${r.status}`); error.status = r.status; throw error; }
return r.json();
}
export async function answer(messages) {
try { return { source: 'primary', data: await complete(route.primary, messages) }; }
catch (error) {
if (!route.fallback || !route.retryable.has(error.status)) throw error;
return { source: 'fallback', data: await complete(route.fallback, messages) };
}
}Код намеренно не повторяет timeout вслепую и не ловит все исключения. Сетевая ошибка без подтверждения не доказывает, что внешний запрос не выполнился. Добавьте свой request ID, сохраните попытку и покажите пользователю честное состояние. Для структурированного ответа проверяйте схему после обеих моделей; подробнее — в материале о JSON Schema. Не логируйте заголовок Authorization, ключ, cookie и полный текст чувствительного запроса.
Сравните кандидатов до инцидента
Fallback выбирают в спокойный день, а не в момент аварии. Соберите маленький набор безопасных, синтетических запросов: обычный русский текст, короткий код, пустое поле, длинный вход в допустимой границе, JSON-контракт и сценарий отказа. Замерьте успешность, валидность формата, задержку p50/p95, потребление и стоимость завершённой задачи. Для задач с человеком в цикле добавьте ручную оценку полезности. Один красивый demo не подтверждает совместимость.
Проверьте streaming отдельно: способность выдать финальный JSON не означает, что модель и endpoint одинаково поддерживают поток. Проверьте отмену, обрыв соединения, частичные данные и восстановление UI. О различиях клиента и endpoint-а читайте в статье про SSE streaming. Для video API держите отдельный маршрут: там task ID, polling и webhook важнее немедленного переключения.
Наблюдаемость и бюджет
Каждая попытка должна оставлять безопасное событие: маршрут, версия политики, класс ошибки, выбранная модель, latency, число токенов или другой доступный расход, результат валидации и request ID. Эти поля позволяют заметить, что резерв начинает отвечать медленнее или дороже, не записывая секреты и персональные prompts. Покажите в продукте нейтральное сообщение «ответ может быть сформирован другим доступным маршрутом», если это существенно для ожиданий пользователя.
Поставьте лимит fallback на пользователя, команду и период. Иначе краткая проблема основного маршрута незаметно переведёт весь бюджет на резервный. Считайте стоимость успешной пользовательской задачи вместе с retry, а не только цену одного вызова; методика есть в статье о расчёте стоимости LLM API. При росте ошибок или расхождении формата выключайте flag, возвращайтесь к понятному сообщению об ожидании и разбирайте причину.
Особый случай: асинхронные операции
Нельзя автоматически отправить вторую видео-задачу только потому, что первая долго не ответила. Сначала сохраните внутренний operation ID, полученный task ID и статус unknown, затем используйте документированный status endpoint или webhook. Только если продуктовое правило подтверждает, что задача не принята, и есть защита от дублей, можно предлагать повтор. Этот жизненный цикл подробно показан в статье об асинхронной генерации.
Соберите policy на тестовом трафике
Создайте отдельный тестовый ключ RussiaAPI, проверьте текущий каталог и сравните кандидатов на синтетическом наборе. Включайте fallback feature flag-ом, измеряйте валидность и бюджет, а для рискованных операций оставляйте человеку ясный выбор.
Открыть консоль RussiaAPIFAQ
Можно ли переключать любую ошибку на другую модель?
Нет. Авторизация, неверный endpoint, запрещённый ввод и плохая конфигурация не лечатся fallback. Он допустим лишь для заранее определённых временных сбоев безопасной для повтора операции.
Одинаково ли ведут себя модели с совместимым интерфейсом?
Нет. Общая форма запроса не обещает одинаковые параметры, качество, лимиты, задержку, инструменты или streaming. Каждую пару основной и резервной модели проверяют контрактными тестами.
Нужен ли fallback для видео-задачи?
Автоматическое переключение рискованно: первая задача могла быть принята. Сохраните task ID и проверьте статус; создавайте другую задачу только по явному правилу продукта и с защитой от дублей.