Switchyard
Switchyard - открытый LLM-роутер от NVIDIA. Он принимает запросы в формате OpenAI и Anthropic, транслирует их между собой и решает, на какую модель и провайдера отправить каждый запрос: слабую и дешевую или сильную и дорогую. Мы собрали его на своем сервере, прогнали реальные запросы через OpenRouter и замерили, сколько он ест.
Вердикт
- кто гоняет несколько моделей и хочет один вход вместо зоопарка SDK
- кто режет счет за API: простое - на дешевую модель, сложное - на дорогую
- кто хочет навести Claude Code, Codex или OpenClaw на любую модель через один прокси
- кому нужен прод-SLA прямо сейчас: проект pre-alpha, сам NVIDIA не пускает его в прод
- кто искал биллинг-портал уровня OpenRouter с оплатой картой: это инфраструктурный прокси, а не витрина
- кто в РФ без исходящего доступа вне страны: OpenRouter и OpenAI отдают 403 с российских IP
Что это и какую задачу решает
Когда моделей было две, вопрос звучал как «какую 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, а обслуживает его та модель, которую вы прописали в маршруте.
Чем отличается от облачных гейтвеев
Рядом стоят 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 |
Важно: 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-сервис.
Создать VM
Тариф CPU2-RAM4-DISK30, Ubuntu 24.04. Сервер должен иметь исходящий доступ к вашему провайдеру модели.
Поставить Rust и собрать сервер
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y source "$HOME/.cargo/env" cargo install --locked switchyard-serverСборка занимает несколько минут - это разовая операция.
Описать маршрут в 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.Проверить и запустить
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
Что измерили после запуска
Цифры со свежей сборки на тарифе CPU2-RAM4-DISK30. Только реальные замеры.
| Сборка из исходников | ~6 минут (2 vCPU) |
| RAM роутера в простое | ~15 MiB RSS |
| Размер бинаря | 23 MB |
| Накладные на роутинг | ~15 мс поверх модели |
| Форматы на входе | OpenAI Chat, Anthropic Messages, OpenAI Responses |
Главное: роутер не держит инференс, поэтому ест 15 МБ и раскидывает запросы по разным моделям почти без задержки. Мы отправили один и тот же запрос в формате OpenAI и в формате Anthropic - оба обслужила модель на OpenRouter, а Switchyard перевел протокол на лету. В одном прогоне классификатор выбирал оба уровня: и дешевый gpt-4o-mini, и дорогой gpt-4o. Стоимость и токены каждого запроса сервер отдает прямо в ответе.
/v1/chat/completions и /v1/messages, классификатор выбирает уровень модели, сервер возвращает стоимость и токены. Кликните, чтобы открыть на весь экран.Проверено на версии v0.2.0, август 2026. Проект pre-alpha, на новых версиях API и результаты могут отличаться.
Где может сломаться
Реальные грабли, на которые наткнулись при запуске.
Порог наоборот. Роутер отправляет на слабую модель, когда p_solve не ниже порога, иначе на сильную. То есть чем выше base_threshold, тем больше трафика уходит на дорогую модель, а не наоборот. Если эскалации не видно - поднимайте порог, а не опускайте.
Пустой ответ классификатора. Модель-судья обязана вернуть валидный JSON в обычном поле content. Если провайдер кладет решение в reasoning-поле или обрезает ответ, Switchyard считает вердикт непарсибельным и на всякий случай гонит запрос на сильную модель.
Причина. 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.
Одна модель и один провайдер
Если вы работаете с единственной моделью, прослойка-роутер только добавит звено. Ее ценность - в выборе между несколькими моделями и провайдерами.
Частые вопросы
Это замена 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 ₽/мес.
Этот роутер у нас запущен на тарифе CPU2-RAM4-DISK30. Нашли баг в гайде - напишите, поправим в течение дня.