Свой агрегатор нейросетей на VPS: несколько LLM за одним API
Один эндпоинт, за которым живут OpenAI, Anthropic, локальные модели и облачные провайдеры — с единым ключом, логами и лимитами. Разбираем, как собрать такой шлюз на своём сервере за вечер.
Содержание
Зачем нужен агрегатор
Когда в проекте больше одной модели, зоопарк ключей и SDK быстро превращается в боль: разные форматы запросов, разные лимиты, разные счета. Агрегатор (LLM-gateway) прячет всё это за единым OpenAI-совместимым API — код приложения общается с одним адресом, а маршрутизация решается конфигом.
- Один формат — везде вызовы вида
/v1/chat/completions. - Фолбэк — если провайдер лёг, запрос уходит на резервную модель.
- Учёт и лимиты — токены, бюджеты и ключи по командам.
- Приватность — свой шлюз на своём сервере, а не чужое SaaS.
Держать такой шлюз удобно на VPS рядом с приложением: минимальная задержка и полный контроль. На тарифах MAATRIX (AMD EPYC + NVMe) хватает даже базовой конфигурации — сам gateway почти не ест CPU, работа идёт в сеть.
Отдельный плюс — единая точка наблюдаемости. Когда весь трафик к моделям проходит через один шлюз, ты видишь в одном месте, кто и сколько тратит, какие запросы падают и где растёт задержка. Без агрегатора эту телеметрию пришлось бы собирать по каждому SDK отдельно, а при смене провайдера — переписывать интеграцию. Со шлюзом переключение модели — это одна строка в конфиге, а не релиз приложения.
Какой VPS выбрать для шлюза к ИИ-API
Для небольшого проекта шлюза к ИИ-API с обращением к внешним API начните со Старт: 2 vCPU, 4 ГБ памяти и 80 ГБ NVMe. Это конфигурация для приложения и интеграций. Самостоятельный запуск локальной языковой модели требует отдельного расчёта ресурсов.
Для первых рабочих сценариев
Старт · 2 vCPU · 4 ГБ RAM
80 ГБ NVMe
Приложение и небольшая база данных на одном VPS.
Для нескольких сервисов
Стандарт · 4 vCPU · 8 ГБ RAM
160 ГБ NVMe
4 vCPU и 8 ГБ памяти, если параллельных задач становится больше.
Арендуйте VPS для шлюза к ИИ-API, затем переходите к установке и настройке. Подписки и расходы внешних API оплачиваются отдельно от сервера.
В кнопках заказа выбрана локация в Великобритании. Другую страну можно выбрать при оформлении.
Оплата VPS картой РФ или по СБП доступна в личном кабинете. Для безналичной оплаты от юридического лица или ИП запросите счёт у support@maatrix.io, указав тариф и реквизиты.
Готовим сервер
Возьмём Ubuntu 22.04/24.04, обновимся и поставим Docker — это самый быстрый путь.
sudo apt update && sudo apt -y upgrade
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker
Проверяем, что Docker жив.
docker run --rm hello-world
Ставим LiteLLM Proxy
LiteLLM — популярный open-source шлюз: понимает 100+ провайдеров и отдаёт единый OpenAI-формат. Поднимем его в контейнере.
docker run -d --name litellm \
-p 4000:4000 \
-e OPENAI_API_KEY=sk-... \
-e ANTHROPIC_API_KEY=sk-ant-... \
-v $(pwd)/config.yaml:/app/config.yaml \
ghcr.io/berriai/litellm:main-latest \
--config /app/config.yaml --port 4000
Минимальный config.yaml с двумя моделями и мастер-ключом.
model_list:
- model_name: gpt-4o
litellm_params:
model: openai/gpt-4o
- model_name: claude
litellm_params:
model: anthropic/claude-3-5-sonnet-20241022
general_settings:
master_key: sk-my-secret-key
Роутинг, фолбэк и балансировка
Сила агрегатора — в правилах. Можно завести один «виртуальный» model_name, за которым несколько реальных развёртываний, и раздавать запросы по кругу с автоматическим фолбэком при ошибке.
router_settings:
routing_strategy: simple-shuffle
num_retries: 3
fallbacks:
- gpt-4o: ["claude"]
Теперь клиент всегда зовёт gpt-4o, а если OpenAI недоступен — запрос молча уходит на Claude. Тот же приём работает для локальных моделей: добавь в model_list указатель на свой vLLM или Ollama.
Стратегий маршрутизации несколько, и выбор зависит от задачи. simple-shuffle просто раскидывает нагрузку по кругу и хорош, когда за одним именем несколько одинаковых развёртываний. least-busy шлёт запрос туда, где меньше активных соединений — полезно при неравномерной длине ответов. А если важна цена, можно завязать роутинг на дешёвую модель по умолчанию и поднимать «тяжёлую» только для сложных запросов на уровне приложения. Ретраи с экспоненциальной паузой сглаживают кратковременные 429 от провайдеров, не доводя их до пользователя.
Отдельно стоит настроить таймауты: без них зависший апстрим держит соединение и съедает воркеры. Разумный request_timeout в 60–120 секунд плюс num_retries закрывают большинство сетевых сбоев, а фолбэк добавляет второй уровень надёжности поверх ретраев.
Проверяем API
Шлюз говорит на языке OpenAI, поэтому подойдёт любой клиент. Простейшая проверка через curl.
curl http://localhost:4000/v1/chat/completions \
-H "Authorization: Bearer sk-my-secret-key" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"Привет!"}]}'
В коде достаточно поменять base_url — и весь зоопарк моделей доступен через привычный SDK.
from openai import OpenAI
client = OpenAI(base_url="http://SERVER_IP:4000/v1", api_key="sk-my-secret-key")
r = client.chat.completions.create(model="claude",
messages=[{"role":"user","content":"Ping"}])
print(r.choices[0].message.content)
Безопасность и частые ошибки
- Не открывай 4000 в мир голым — прикрой Nginx с TLS и Basic-auth, либо пусти только по приватной сети.
- master_key обязателен — иначе любой сможет тратить твои токены.
- Ключи провайдеров — в env или secrets, а не в git.
- Лимиты на пользователя спасают от разорения при утечке ключа.
Мини-конфиг Nginx для TLS-обёртки.
server {
listen 443 ssl;
server_name api.example.com;
location / { proxy_pass http://127.0.0.1:4000; }
}
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Сколько ресурсов нужно агрегатору?
Сам шлюз почти не грузит CPU и память — хватит базового VPS. Ресурсы понадобятся, только если рядом крутить локальные модели.
Можно ли смешивать облачные и локальные модели?
Да, в этом весь смысл. В model_list добавляешь и OpenAI/Anthropic, и локальный vLLM или Ollama — клиент работает с ними одинаково.
Как считать расход токенов по командам?
LiteLLM ведёт учёт по ключам и умеет отдавать метрики и логи в БД, так что бюджет каждой команды виден отдельно.
Готовы перейти к настройке?
Закажите Старт с конфигурацией, предложенной для старта, или сравните все тарифы. Оплата картой РФ и через СБП — в личном кабинете.
Заказать Старт Все тарифы и цены