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