Смешанный стек моделей разных производителей: Opus планирует, Qwen / DeepSeek исполняют
Закрепите топовые модели разных производителей за ролями агента — планирование остаётся на Anthropic Opus, исполнение уходит на Qwen3.8-Max / DeepSeek V4.1 Flash, без изменений на клиенте и с автоматической межпротокольной трансляцией.
На что на самом деле жалуется сообщество
Запускать Claude Code на Claude Opus от начала до конца слишком дорого; сплошной переход на Sonnet заметно ухудшает планирование и архитектурные решения, а переделки обходятся дороже. Разработчики хотят смешивать топовые модели других производителей (Qwen, DeepSeek), но клиент говорит только на протоколе Anthropic и именах моделей claude-*, а изменение конфигурации означает правку каждой машины разработчика.
Хуже того, цикл планирования, основной цикл исполнения и пакетные подзадачи действительно имеют разные потребности в возможностях и цене — одно переключение модели на клиенте этого не отражает.
Как это делает GateLLM
GateLLM переписывает имя модели по идентичности после входного шлюза и до маршрутизации — без изменений на клиенте. Планирование и архитектурные решения оставляют claude-opus-5 идущим напрямую в Anthropic; claude-sonnet-* основного цикла исполнения сопоставляется с qwen3.8-max в DashScope; пакетные подзадачи (форматирование, сообщения коммитов, резюме для поиска) сопоставляются с deepseek-flash через OpenAI-compatible upstream. Межпротокольную трансляцию выполняет шлюз, сохраняя SSE-потоки и tool_call_id на обратном пути.
Правила привязываются к ключам доступа или группам ключей и действуют для каждой команды; выходной шлюз проверяет, что цель входит в белый список идентичности — настройка сопоставления не даёт разрешения.
5 рычагов, которые действительно работают
- Сопоставление моделей по идентичности: from → to на ключах доступа / группах ключей, переписывается после входа и до маршрутизации; поддерживает один символ * для захвата среднего сегмента, горячая перезагрузка
- Межпротокольная трансляция: Claude Code на Anthropic, Codex / OpenAI SDK на OpenAI, шлюз транслирует в upstream DashScope / OpenAI / Gemini / Bedrock; :keep-alive при долгом инференсе upstream, _gateway_warning при разрыве потока
- Условная маршрутизация по заголовку запроса: один и тот же from маршрутизируется к разным целям по X-Tenant и т. п. (exact / prefix / regex / exists / absent); сначала условные правила, затем безусловный fallback, побеждает первое совпадение — годится для канареечного выпуска
- Определение режима планирования: режим планирования Claude Code вставляет маркеры Plan mode is active / Exited Plan Mode; скрипт, сравнивающий последнюю позицию, переключает маршрутизацию — планирование на Opus, исполнение на экономичной модели
- Разрешения и наблюдаемость: выходной шлюз проверяет, что цель в белом списке идентичности (сопоставление ≠ разрешение); колонка модели в логе показывает метку MM с исходным → сопоставленным именем при наведении; статистика и биллинг атрибутируются по реальному имени модели после сопоставления, поэтому стоимость смешанного стека сопоставима с первого взгляда