Когда одной модели мало, а ставить пять разных — лень
Каждый, кто собирал локальный AI-асcистента, знает эту боль: для текста нужен Llama 4, для картинок — Stable Diffusion 3.5 или Flux, для аудио — Whisper v3 и какой-нибудь TTS. В итоге на компе три разных сервера, четыре порта, пять токенов авторизации и головная боль при каждом запуске.
Lemonade OmniRouter — это прослойка, которая превращает этот зоопарк в единый API. Вы кидаете запрос с картинкой или голосом, а роутер сам решает, какой модели его скормить.
Инструмент появился не на пустом месте. Он развивает идеи, заложенные в Lemonade v9.2 — том самом API, который умел запускать Stable Diffusion, Whisper и LLM одной командой. Но OmniRouter идёт дальше: он не просто агрегирует, а маршрутизирует, причём делает это на лету, без перезапуска.
Как это работает (без магии, но с изяществом)
Внутри OmniRouter — простой YAML-файл конфигурации. Вы описываете доступные модели, их тип (текст, изображение, аудио) и условия выбора. Роутер смотрит на запрос: если есть изображение — отправляет его в Flux, если просит транскрибировать — в Whisper, если нужен диалог — в Qwen3 или Llama 4. Можно задать Fallback: например, если текстовую модель загрузили подчистую, отдать запрос второй по списку.
models:
- name: llama4
type: text
endpoint: http://localhost:8080/v1/chat/completions
priority: 1
- name: flux
type: image
endpoint: http://localhost:4321/generate
priority: 1
- name: whisper
type: audio
endpoint: http://localhost:9000/asr
priority: 1
routing:
image_extensions: ['.png', '.jpg', '.jpeg', '.webp']
audio_extensions: ['.wav', '.mp3', '.ogg']
max_image_size_mb: 10Всё. Запускается одной командой:
lemonade omni-router --config router.yamlТеперь любой клиент может дергать единый эндпоинт http://localhost:3000/api/process и получать мультимодальный ответ.
Важный нюанс: OmniRouter не запускает сами модели. Он только проксирует запросы. Модели нужно поднимать отдельно. Но для этого отлично подходят родные инструменты Lemonade или сторонние вроде Ollama с текстовыми моделями или ComfyUI для генерации изображений.
Сравнение с альтернативами (кто кого)
| Инструмент | Мультимодальность | Автомаршрутизация | Простота настройки |
|---|---|---|---|
| Lemonade OmniRouter | ✓ (текст + картинки + аудио) | ✓ (по типу данных) | Высокая (один YAML) |
| Open WebUI + Ace Step 1.5 | ✓ (текст + картинки) | ✗ (ручной выбор модели) | Средняя (нужен WebUI) |
| Aventura | ✓ (текст + изображения) | ✗ (заточка под ролевые игры) | Средняя |
| vLLM-Omni | ✓ (текст + TTS + ASR) | ✓ (через один API) | Низкая (требует Python и сборки) |
Как видите, OmniRouter выигрывает в простоте, но проигрывает в интеграции TTS (пока нет встроенного синтеза речи, хотя в планах). Зато легко цепляет любой внешний движок через HTTP. Хотите Qwen3 TTS — пожалуйста, только добавьте в конфиг.
Живой пример: говорим картинку голосом
Допустим, вы хотите показать AI картинку, попросить описать её, а потом зачитать описание вслух. Без роутера пришлось бы писать скрипт с тремя вызовами. С OmniRouter — один POST:
import requests
response = requests.post(
"http://localhost:3000/api/process",
files={"image": open("cat.jpg", "rb")},
data={"instruction": "Опиши эту картинку подробно, а потом прочитай описание вслух"}
)
print(response.text)Роутер сам догадается: сначала картинку отправит в vision-модель (Qwen3-VL или Llama 4), получит описание, затем передаст его в TTS-движок (например, XTTS) и вернёт аудиофайл. Всё за пару секунд, если модели шустрые.
Подводные камни (да, они есть)
Первое — память. OmniRouter сам не тормозит, но если вы «скормите» ему пять моделей по 8 ГБ каждая, 40 ГБ ОЗУ улетят мгновенно. Не советую так делать, если не хотите, чтобы компьютер начал торговать свопом. Лучше выставить лимиты в конфиге:
resources:
max_concurrent: 2
max_models_per_request: 3Второе — латентность. При первом запросе к модели (холодный старт) может быть задержка в десятки секунд. Решение — держать модели в памяти постоянно, но это опять же про память. Здесь можно подглядеть, как Whisper запускают в режиме демона.
Третье — нет нативной поддержки эмбеддингов (пока). Если нужно сравнивать векторы, придётся оборачивать ручками. Зато MLX Omni Engine на Mac отлично это компенсирует.
Кому это вообще нужно?
- Разработчикам умных домов: голосовые команды, распознавание лиц (через картинки), ответы голосом — всё в одном API.
- Энтузиастам-самохостингерам: вместо того чтобы городить костыли с nginx и несколькими микросервисами, ставите один YAML и радуетесь.
- Тем, кто устал от облачных провайдеров: «Чемодан без ручки» — это про локальный AI вообще. OmniRouter делает его удобным.
И да, PHP-разработчикам тоже не придётся переучиваться: HTTP API говорят на понятном всем языке.
Если бы я знал это месяц назад
Самая большая ошибка новичков — пытаться впихнуть все модели в один процесс. OmniRouter как раз и создан, чтобы этого избежать. Но есть фишка, о которой молчат документации: роутер можно подключать как промежуточный слой к Open WebUI. Просто укажите в настройках Open WebUI один эндпоинт OmniRouter, и веб-интерфейс сам не будет знать, что за ним целый зоопарк. Получается связка, как собранный локальный хаб, только ещё мощнее.
Альтернативный вариант — использовать Aventura, если вам нужна ролевая игра с генерацией картинок по ходу сюжета. Но для универсального «швейцарского ножа» OmniRouter удобнее.
Совет под занавес: начните с двух моделей — текстовой LLM и Whisper для диктовки. Когда поймёте логику, подключайте генератор изображений. И никогда не ставьте TTS рядом с LLM на одну видеокарту — оба жрут VRAM, и картинки начнут сыпаться.
Инструмент развивается прямо сейчас: на GitHub уже есть road map с поддержкой видео и встроенным эмбеддинг-сервером. Стоит следить.