← Все статьи
2026-09-12 14:03 · 🤖 AI World

OpenRouter роутит к разным провайдерам — и это ломает vision и reasoning

OpenRouter обещает прозрачный роутинг к лучшему провайдеру — но за одним эндпоинтом скрываются десятки разных реализаций. Иногда vision молча не работает. Иногда reasoning effort просто игнорируется.

OpenRouter роутит к разным провайдерам — и это ломает vision и reasoning

OpenRouter обещает удобство: один API-эндпоинт, система сама выбирает самого дешёвого или доступного провайдера. Mohamed Moustafa собрал систематический разбор того, что именно может пойти не так — и там несколько неочевидных категорий проблем, каждая из которых способна сломать продакшн-продукт без очевидных симптомов.

Контекст

OpenRouter — прокси-слой поверх десятков LLM-провайдеров: Together AI, Fireworks, AWS Bedrock, DeepInfra и других. Идея проста: вызываешь один эндпоинт для модели и OpenRouter сам решает, кто её обслужит — исходя из цены, задержки, доступности прямо сейчас. Компания явно заявляет, что «обрабатывает fallback автоматически и выбирает наиболее экономичный вариант для каждого запроса».

На практике разные провайдеры запускают одну и ту же модель на разном serving-стеке: vLLM, TGI, SGLang, кастомные форки с разными настройками и оптимизациями. У каждого — свои параметры sampling, своя реализация tool use, свои ограничения контекста. «Одна модель» превращается в зоопарк немного разных вариантов, замаскированных под единый интерфейс.

До недавнего времени это воспринималось как «незначительные расхождения». Разбор Мустафы показывает: расхождения бывают вполне материальными и затрагивают ключевые функции.

Аналитика

Первый и самый острый кейс — vision. Некоторые провайдеры обслуживают vision-модели без реальной поддержки изображений. Ты отправляешь картинку, OpenRouter роутит к «дешёвому» провайдеру — и получаешь либо ошибку, либо ответ, будто изображения не существовало. Молча, без предупреждения в момент выбора провайдера. Это особенно опасно в продуктах, где пользователь загружает документы или фото: система отвечает что-то, просто игнорируя визуальный контент.

Второй — reasoning effort. Флаг, управляющий глубиной рассуждений у моделей с явным thinking-процессом, обрабатывается по-разному. Один провайдер применяет его корректно, другой игнорирует, третий маппирует в нестандартные параметры. Одинаковый промпт с одинаковыми настройками выдаёт разное качество рассуждений — в зависимости от того, кому досталось обслуживать запрос в этот раз.

Для продуктовых команд это означает нестабильность, которую сложно воспроизвести: сегодня запрос ушёл к провайдеру A, завтра — к B, ты ничего не менял, а поведение изменилось. Хорошая новость — решение есть. Параметр provider.only позволяет явно зафиксировать провайдера, а метод /endpoints возвращает список доступных провайдеров для конкретной модели вместе с поддерживаемыми возможностями. Инструменты существуют — просто мало кто о них знает.

Кейсы применения в бизнесе

B2B-SaaS стартап с мультимодальным продуктом: если приложение принимает изображения от пользователей и передаёт их в LLM через OpenRouter — нужно немедленно зафиксировать провайдера через provider.only. Без этого часть пользователей будет получать деградированный опыт без какого-либо сигнала об ошибке. Проверить список провайдеров с поддержкой vision можно через /endpoints прежде, чем выбрать модель.

Корпорация с legacy, тестирующая LLM-пилоты: при сравнении качества ответов в A/B-тестах непредсказуемый роутинг делает результаты несравнимыми. Сегодня запрос к «модели X» обслуживает один провайдер, завтра — другой. По факту сравниваются не модели, а лотерея провайдеров. Фикс: при любом бенчмаркинге явно пиннить провайдера — это обязательное условие валидности эксперимента.

SMB и локальный бизнес в КР/СНГ, строящий AI-ассистента: если продукт использует reasoning-модели для анализа документов или сложных запросов — непредсказуемость обработки reasoning effort напрямую бьёт по качеству ответов. Решение: выбрать одного проверенного провайдера и зафиксировать его явно, принимая стабильность в ущерб автоматической оптимизации цены.

Кейсы в личной жизни

Разработчик, строящий инструмент на базе OpenRouter: добавь provider.only с самого начала — не откладывай до первого инцидента. Час отладки «почему vision перестало работать вчера» стоит дороже пяти минут на настройку. Это одна строка в теле запроса, которая убирает целый класс плавающих багов.

Контент-мейкер или фрилансер, использующий OpenRouter через сторонние UI-клиенты: если работаешь с изображениями или сложными рассуждениями через клиент на базе OpenRouter — проверь, позволяет ли он задать конкретного провайдера. Если нет, учти, что результат может меняться день ото дня без очевидной причины с твоей стороны.

Студент или исследователь, сравнивающий модели: если строишь таблицу сравнения на одних и тех же промптах через OpenRouter — обязательно фиксируй провайдера для каждой модели. Иначе сравниваешь яблоки с апельсинами, даже не подозревая об этом: два прогона к «одной модели» могут быть технически разными реализациями.

Как применить сегодня

  • Используй метод /endpoints в OpenRouter API — он возвращает список доступных провайдеров для конкретной модели с их capabilities. Смотри на это как на обязательный due diligence перед выбором модели.
  • Добавь в тело запроса "provider": {"only": ["ProviderName"]} для всех запросов, где используешь vision или параметры reasoning effort.
  • Проведи аудит production-продукта: какие запросы задействуют vision или tool use? Все они — кандидаты на фиксацию провайдера.
  • При бенчмаркинге или A/B-тестировании всегда пиннить провайдера явно — иначе результаты между сессиями технически несравнимы.
  • Если видишь нестабильное поведение модели без изменений с твоей стороны — первое, что проверяй: к какому провайдеру ушёл запрос. Это теперь часть стандартного дебаггинга LLM-продуктов.
← Все статьи