Команда инженеров · свой ЦОД в РФ · своё железо · своя панель · CloudStack + Linstor · MCP · база знаний по self-hosted
Искусственный интеллект

Switchyard

Switchyard - открытый LLM-роутер от NVIDIA. Он принимает запросы в формате OpenAI и Anthropic, транслирует их между собой и решает, на какую модель и провайдера отправить каждый запрос: слабую и дешевую или сильную и дорогую. Мы собрали его на своем сервере, прогнали реальные запросы через OpenRouter и замерили, сколько он ест.

Август 2026 ~7 минут чтения Fatmetal Team
LLM-роутер Лицензия: Apache-2.0 Статус: запущен у нас, v0.2.0

Вердикт

Подходит
  • кто гоняет несколько моделей и хочет один вход вместо зоопарка SDK
  • кто режет счет за API: простое - на дешевую модель, сложное - на дорогую
  • кто хочет навести Claude Code, Codex или OpenClaw на любую модель через один прокси
Не подходит
  • кому нужен прод-SLA прямо сейчас: проект pre-alpha, сам NVIDIA не пускает его в прод
  • кто искал биллинг-портал уровня OpenRouter с оплатой картой: это инфраструктурный прокси, а не витрина
  • кто в РФ без исходящего доступа вне страны: OpenRouter и OpenAI отдают 403 с российских IP
Мин. тариф: CPU1-RAM1-DISK20 Рекомендуем: CPU2-RAM4-DISK30 Сложность: medium Отклик прокси: ~15 мс поверх модели Главный риск: pre-alpha, API меняется до v1.0 Прод-готовность: с оговорками (pre-alpha + auth + egress)
Что это

Что это и какую задачу решает

Когда моделей было две, вопрос звучал как «какую LLM выбрать». Когда их десяток от разных провайдеров, вопрос меняется: «какую модель дернуть под конкретный запрос». Швырять весь трафик в топовую модель дорого, а сажать все на дешевую - бьет по качеству. Switchyard встает между вашим приложением и провайдерами и принимает это решение за вас на каждом запросе.

Технически это легкий Rust-прокси. Он говорит на трех протоколах сразу - OpenAI Chat Completions, Anthropic Messages и OpenAI Responses - и переводит между ними. Приложение шлет запрос в привычном формате, а Switchyard по заданному правилу маршрутизации выбирает целевую модель у OpenRouter, vLLM, NVIDIA NIM, Ollama или любого OpenAI-совместимого эндпоинта. По дороге он снимает метрики Prometheus: запросы, ошибки, задержки, токены, накладные расходы на роутинг.

Отдельная приятная деталь: Switchyard умеет запускать через себя кодинг-агенты командой switchyard launch claude, switchyard launch codex или switchyard launch openclaw. Агент продолжает говорить на своем родном API, а обслуживает его та модель, которую вы прописали в маршруте.

RustOpenAI APIAnthropic APIOpenRouter / vLLM / NIM / OllamaPrometheus
Сравнение

Чем отличается от облачных гейтвеев

Рядом стоят OpenRouter как сервис, Portkey, Vercel AI Gateway. Сравниваем по тому, что влияет на выбор.

ПараметрSwitchyard (self-hosted)Облачный гейтвей
Где стоитна вашем серверев чужом облаке
Через кого идут запросытолько через васчерез посредника
Модель ценыбесплатно, платите только провайдерунаценка или подписка сверху
Логика роутингасвоя, в TOML или на Rustчто дали в UI
Протоколы на входеOpenAI + Anthropic + Responsesобычно OpenAI-совместимый
Зрелостьpre-alpha, v0.2.0стабильный сервис
Под капотом

Тех-стек и архитектура

Ядро - один Rust-бинарь switchyard-server весом 23 МБ. Своей базы и внешних сервисов он не требует: конфигурация лежит в одном файле routes.toml, ключ провайдера берется из переменной окружения. Инференс Switchyard не держит - он только маршрутизирует, поэтому сам по себе почти невесом.

Маршрут описывается декларативно. В нашем стенде это алгоритм llm_classifier: перед основным запросом легкая модель-классификатор оценивает, справится ли слабый уровень, и возвращает вероятность p_solve. Если она выше порога - запрос идет на дешевую модель, если ниже - эскалирует на дорогую. Кроме классификатора есть stage-router (решает по сигналам в самом диалоге, без лишнего вызова модели), random для A/B-тестов и возможность написать свой алгоритм на Rust через библиотеку switchyard-libsy.

Конфигурация

Минимальная конфигурация

Роутер легкий, вся тяжесть - у провайдера модели, а не у вас.

RAM роутера в простое~15 MiB RSS
Размер бинаря23 MB
Хватит для работыCPU1-RAM1-DISK20
Рекомендуем тарифCPU2-RAM4-DISK30
i

Важно: 1 vCPU и 1 ГБ ОЗУ хватает роутеру с запасом. Больший тариф берем не под работу, а под сборку из исходников: компиляция Rust на 1 ядре долгая, на 2 ядрах заметно быстрее. После сборки нагрузку дает только сеть.

В маркетплейсе Fatmetal

Не хотите собирать руками?

Switchyard есть в маркетплейсе Fatmetal - можно не повторять сборку из этого разбора вручную. Заказываете сервер, за пару минут получаете рабочий роутер на своем домене с валидным TLS; остается вписать ключ своего провайдера (BYOM).

Рекомендуемая конфигурация:
2 vCPU · 4 ГБ RAM · 50 ГБ NVMe от 450 ₽/мес

В маркетплейс →
Развертывание

Развертывание на Fatmetal

Базовый путь - Cloud Server + Ubuntu 24.04, сборка из crates.io и запуск как systemd-сервис.

  1. Создать VM

    Тариф CPU2-RAM4-DISK30, Ubuntu 24.04. Сервер должен иметь исходящий доступ к вашему провайдеру модели.

  2. Поставить Rust и собрать сервер

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
    source "$HOME/.cargo/env"
    cargo install --locked switchyard-server

    Сборка занимает несколько минут - это разовая операция.

  3. Описать маршрут в routes.toml

    schema_version = 1
    
    [llm_clients.openrouter]
    format = "openai_chat"
    base_url = "https://openrouter.ai/api/v1"
    api_key_env = "OPENROUTER_API_KEY"
    
    [targets.weak]
    id = "openai/gpt-4o-mini"
    llm_client = "openrouter"
    
    [targets.strong]
    id = "openai/gpt-4o"
    llm_client = "openrouter"
    
    [routes.smart]
    id = "switchyard"
    type = "llm_classifier"
    mode = "capability"
    classifier_target = "weak"
    strong_target = "strong"
    weak_target = "weak"
    base_threshold = 0.8
    threshold_step = 0.1

    Ключ в файл не пишем - сервер читает его из переменной OPENROUTER_API_KEY.

  4. Проверить и запустить

    export OPENROUTER_API_KEY="ваш-ключ"
    switchyard-server --config routes.toml --dry-run
    switchyard-server --config routes.toml --host 127.0.0.1 --port 4000

    Живость: curl 127.0.0.1:4000/health отдает {"status":"ok"}. В прод выносим за systemd и обратный прокси с TLS.

Так выглядит реальный ответ роутера на наш тестовый запрос - и запись в логе, какую модель он выбрал:

$ curl -s 127.0.0.1:4000/v1/chat/completions -d \
  '{"model":"switchyard","messages":[{"role":"user","content":"say hi"}]}'

"model":"openai/gpt-4o-mini"   "provider":"OpenAI"
"usage":{"prompt_tokens":14,"completion_tokens":4,"cost":4.5e-6}

# лог сервера:
INFO switchyard_server::request: LLM request handled
     requested_model="switchyard" selected_model="openai/gpt-4o-mini" status=200
Switchyard: один запрос на входе, роутер выбирает дешевую или сильную модель, оба протокола OpenAI и Anthropic
switchyard-server v0.2.0: один API на входе, роутер сам выбирает модель. Тариф CPU2-RAM4-DISK30.
Замеры

Что измерили после запуска

Цифры со свежей сборки на тарифе CPU2-RAM4-DISK30. Только реальные замеры.

Сборка из исходников~6 минут (2 vCPU)
RAM роутера в простое~15 MiB RSS
Размер бинаря23 MB
Накладные на роутинг~15 мс поверх модели
Форматы на входеOpenAI Chat, Anthropic Messages, OpenAI Responses
i

Главное: роутер не держит инференс, поэтому ест 15 МБ и раскидывает запросы по разным моделям почти без задержки. Мы отправили один и тот же запрос в формате OpenAI и в формате Anthropic - оба обслужила модель на OpenRouter, а Switchyard перевел протокол на лету. В одном прогоне классификатор выбирал оба уровня: и дешевый gpt-4o-mini, и дорогой gpt-4o. Стоимость и токены каждого запроса сервер отдает прямо в ответе.

Switchyard на стенде: один и тот же запрос в форматах OpenAI и Anthropic, классификатор раскидывает по gpt-4o и gpt-4o-mini, стоимость и токены в ответе
Живой роутинг на нашем стенде: запрос через /v1/chat/completions и /v1/messages, классификатор выбирает уровень модели, сервер возвращает стоимость и токены. Кликните, чтобы открыть на весь экран.

Проверено на версии v0.2.0, август 2026. Проект pre-alpha, на новых версиях API и результаты могут отличаться.

Подводные камни

Где может сломаться

Реальные грабли, на которые наткнулись при запуске.

!

Порог наоборот. Роутер отправляет на слабую модель, когда p_solve не ниже порога, иначе на сильную. То есть чем выше base_threshold, тем больше трафика уходит на дорогую модель, а не наоборот. Если эскалации не видно - поднимайте порог, а не опускайте.

!

Пустой ответ классификатора. Модель-судья обязана вернуть валидный JSON в обычном поле content. Если провайдер кладет решение в reasoning-поле или обрезает ответ, Switchyard считает вердикт непарсибельным и на всякий случай гонит запрос на сильную модель.

invalid server config routes.toml: llm_classifier route smart: base_threshold + 2 * threshold_step must be at most 1, got 1.05

Причина. Switchyard добавляет шаг к порогу для более сложных классов задач, поэтому сумма base_threshold + 2 * threshold_step не должна превышать 1. При 0.85 + 2 * 0.1 = 1.05 сервер отказывается стартовать и под systemd уходит в бесконечный рестарт.

Решение. Держите сумму в пределах единицы, например base_threshold = 0.8 и threshold_step = 0.1. Проверяйте конфиг флагом --dry-run до запуска.

Безопасность

Безопасность и обновления

Switchyard слушает 127.0.0.1 и своей авторизации не навязывает. Наружу его выставляем только за обратным прокси с TLS и с проверкой ключа на входе - иначе любой, кто достучится до порта, получит доступ к вашим моделям и вашему счету у провайдера. Ключ провайдера держим в переменной окружения или в защищенном EnvironmentFile systemd, а не в routes.toml.

Обновление - переустановка бинаря из crates.io:

cargo install --locked switchyard-server
systemctl restart switchyard

Так как проект pre-alpha, перед каждым апдейтом смотрите список изменений: формат routes.toml и алгоритмы могут поменяться до релиза v1.0.

Рядом

Связь с другими стеками

  • Обратный прокси - Caddy или Nginx для TLS и проверки ключа перед роутером.
  • Локальные модели - vLLM, Ollama или NVIDIA NIM как целевой бэкенд вместо облака.
  • Мониторинг - Prometheus снимает метрики роутинга с эндпоинта /metrics, Grafana рисует.
  • Кодинг-агенты - Claude Code, Codex и OpenClaw запускаются прямо через Switchyard.
Пределы

Когда это НЕ ваш выбор

Нужна прод-стабильность сегодня

NVIDIA прямо помечает Switchyard как экспериментальный и не для продакшена. Если вам нужен предсказуемый сервис под нагрузкой прямо сейчас - берите зрелый гейтвей, а Switchyard держите на радаре до v1.0.

Одна модель и один провайдер

Если вы работаете с единственной моделью, прослойка-роутер только добавит звено. Ее ценность - в выборе между несколькими моделями и провайдерами.

FAQ

Частые вопросы

Это замена OpenRouter?

Частично. OpenRouter как сервис дает еще и биллинг с оплатой картой - Switchyard этого не делает. Он берет на себя роутинг и трансляцию протоколов на вашей стороне, а модели по-прежнему может дергать через тот же OpenRouter.

Нужен ли GPU?

Нет. Сам роутер инференс не считает, ему хватает 1 vCPU и 1 ГБ. GPU нужен только если целевой моделью будет локальный vLLM или NIM на этом же сервере.

Можно навести на него Claude Code или OpenClaw?

Да, это штатный сценарий: switchyard launch claude, switchyard launch codex или switchyard launch openclaw. Агент говорит на своем API, а обслуживает его выбранная в маршруте модель.

Как он экономит деньги?

Классификатор оценивает сложность запроса и отправляет простое на дешевую модель, а сложное на дорогую. Стоимость каждого запроса виден в ответе, так что экономию можно считать по факту.

Работает ли из России?

Роутер - да, но OpenRouter и OpenAI отвечают 403 с российских IP. Нужен исходящий доступ к провайдеру вне РФ, либо локальная модель как бэкенд.

Можно ли в продакшен?

С оговорками. До прода закройте три вещи: proxy с TLS и авторизацией, стабильную версию (проект pre-alpha), исходящий доступ к провайдеру. Ставьте под systemd с автоперезапуском.

Какая лицензия?

Apache-2.0, коммерческое использование разрешено.

Итог

Switchyard - легкий Rust-роутер, который дает один вход на все ваши модели, переводит между OpenAI и Anthropic API и режет счет за инференс, отправляя простые запросы на дешевые модели. Ест 15 МБ, ставится в один бинарь, нативно дружит с Claude Code и OpenClaw. Главная оговорка - pre-alpha: для экспериментов и внутренних стендов отлично, в прод - после стабилизации и за прокси с TLS.

Рекомендуемая конфигурация для установки:
2 vCPU · 4 ГБ RAM · 50 ГБ NVMe

Не хотите устанавливать вручную?

Запустите Switchyard на этой конфигурации автоматически - от 450 ₽/мес.

Запустить Switchyard →
Анонсы новых разборов в Telegram-канале Новые гайды и карточки в маркетплейсе первыми @fatmetal_channel →

Этот роутер у нас запущен на тарифе CPU2-RAM4-DISK30. Нашли баг в гайде - напишите, поправим в течение дня.