Когда вы одновременно подключаете OpenAI, Claude, DeepSeek и Gemini, сложнее всего обычно не выбрать модель, а разобраться с форматами запросов, ключами и правилами биллинга у каждого SDK. LiteLLM — открытый проект, созданный именно для этой задачи: он приводит модели разных поставщиков к OpenAI-совместимому интерфейсу и даёт шлюз, который можно развернуть самостоятельно.
Ниже — что такое LiteLLM, минимальная рабочая конфигурация, маршрутизация и управление ключами, способы развёртывания и критерии выбора между собственным и управляемым шлюзом.
Примечание: LiteLLM — открытый проект его правообладателя; OpenAI, Anthropic, DeepSeek и другие названия — товарные знаки соответствующих правообладателей. Примеры отражают распространённые версии на октябрь 2026 года; конкретные параметры сверяйте с официальной документацией.
1. Что представляет собой LiteLLM
У LiteLLM две формы:
- Python SDK: единая функция
completionв коде для вызова моделей разных поставщиков. - Прокси-шлюз: отдельный сервис, публикующий OpenAI-совместимый
/v1/chat/completions; к нему подключается любой клиент с поддержкой собственного Base URL.
Проект решает три задачи — адаптацию протокола, маршрутизацию и учёт расходов — но не делает сами модели лучше. Иными словами, это трубопровод, а не модель.
Основные возможности:
| Возможность | Назначение |
|---|---|
| Единый протокол | Модели разных поставщиков через формат OpenAI |
| Маршрутизация и балансировка | Одно имя модели распределяется между несколькими развёртываниями |
| Переключение при сбое | При отказе основной модели запрос уходит на резервную |
| Виртуальные ключи | Отдельные ключи и бюджеты для команд или проектов |
| Расход и стоимость | Учёт запросов, токенов и затрат |
| Колбэки журналов | Интеграция с Langfuse, OpenTelemetry и другими системами |
2. Минимальный запуск через pip
Сначала создайте виртуальное окружение и установите пакет с прокси:
python3 -m venv .venv
source .venv/bin/activate
pip install "litellm[proxy]"
Минимальный config.yaml:
model_list:
- model_name: claude-sonnet
litellm_params:
model: anthropic/claude-sonnet-4-5
api_key: os.environ/ANTHROPIC_API_KEY
- model_name: deepseek-chat
litellm_params:
model: deepseek/deepseek-chat
api_key: os.environ/DEEPSEEK_API_KEY
litellm_settings:
drop_params: true
general_settings:
master_key: os.environ/LITELLM_MASTER_KEY
Запуск:
export ANTHROPIC_API_KEY="sk-ant-ваш-ключ"
export DEEPSEEK_API_KEY="sk-ваш-ключ"
export LITELLM_MASTER_KEY="sk-litellm-локальный-ключ"
litellm --config config.yaml --port 4000
model_name — имя, которое видит клиент, а litellm_params.model — реальная вышестоящая модель, обычно в формате «поставщик/модель». Запись os.environ/XXX означает чтение из переменной окружения; не вписывайте ключи прямо в yaml и не коммитьте файл в репозиторий.
После запуска направьте OpenAI SDK на локальный шлюз:
from openai import OpenAI
client = OpenAI(
api_key="sk-litellm-локальный-ключ",
base_url="http://127.0.0.1:4000",
)
resp = client.chat.completions.create(
model="claude-sonnet",
messages=[{"role": "user", "content": "Ответь только OK"}],
)
print(resp.choices[0].message.content)
3. Маршрутизация моделей и отказоустойчивость
В производстве редко обходятся одним вышестоящим поставщиком. Типичная конфигурация:
router_settings:
routing_strategy: simple-shuffle
num_retries: 2
timeout: 600
fallbacks:
- claude-sonnet: ["deepseek-chat"]
Значение параметров:
routing_strategy— как выбирать между несколькими развёртываниями одной модели;simple-shuffle— распространённый вариант для старта.num_retries— число повторов при сбое; помните, что каждый повтор создаёт реальные расходы.timeout— тайм-аут одного запроса; задавайте по самому медленному участку бизнес-процесса.fallbacks— переход на резервную модель, когда основная недоступна.
Переключение при сбое не бесплатно. У резервной модели могут отличаться стиль вывода, длина контекста и поддержка вызова инструментов, и бизнес-логика должна это выдерживать. Там, где формат ответа критичен, лучше явно вернуть ошибку, чем молча деградировать.
4. Виртуальные ключи и бюджеты
Общий master key на всю команду — начало эксплуатационной аварии. Правильный подход: выдавать каждому проекту виртуальный ключ с ограничением моделей и бюджета:
curl -X POST "http://127.0.0.1:4000/key/generate" \
-H "Authorization: Bearer $LITELLM_MASTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"models": ["claude-sonnet"],
"max_budget": 20,
"duration": "30d",
"metadata": {"project": "demo"}
}'
Полученный ключ передаётся бизнес-подразделению, master key остаётся только у эксплуатации. Единицы и валюта бюджета определяются документацией LiteLLM; здесь показана лишь структура полей, а не какая-либо цена.
5. Развёртывание в Docker и проверка перед запуском
Для одиночного теста можно запустить контейнер:
docker run -d --name litellm \
-p 4000:4000 \
-v "$(pwd)/config.yaml:/app/config.yaml" \
-e ANTHROPIC_API_KEY \
-e DEEPSEEK_API_KEY \
-e LITELLM_MASTER_KEY \
ghcr.io/berriai/litellm:main-latest \
--config /app/config.yaml
Перед вводом в эксплуатацию проверьте как минимум следующее:
- Шлюз не должен быть напрямую доступен из интернета; поставьте перед ним Nginx или Caddy для TLS и контроля доступа.
- Master key должен быть длинным случайным значением и не храниться в репозитории.
- Если нужен учёт расходов в базе, подключите PostgreSQL, иначе часть статистики потеряется после перезапуска.
- Настройте ротацию журналов и оповещения о заполнении диска: журналы запросов растут быстро.
- Оставьте проверку работоспособности:
curl http://127.0.0.1:4000/health. - Перед обновлением читайте changelog и фиксируйте тег образа; не используйте
latestпостоянно.
Ещё один часто упускаемый момент: шлюз становится новой единой точкой отказа. Если он упал, недоступны все модели. Нужны как минимум супервизор процесса, автоперезапуск и отдельный канал оповещений.
6. Журналы и стоимость: не ждите счёта
Скрытая ценность шлюза — запись вызовов. LiteLLM фиксирует модель, токены, задержку и стоимость каждого запроса и агрегирует их по ключу, команде и меткам. Чтобы это работало полностью, нужны три шага:
- Настроить базу данных, чтобы записи о расходах сохранялись, а не жили только в памяти.
- Помечать запросы, например указывать имя проекта в metadata, иначе в конце месяца расходы не разделить по проектам.
- Подключить систему наблюдаемости и собрать трассировку и журналы в одном месте.
Пример конфигурации:
litellm_settings:
success_callback: ["langfuse"]
failure_callback: ["langfuse"]
general_settings:
database_url: os.environ/DATABASE_URL
Два замечания. Во-первых, сервис колбэков сам должен быть отказоустойчивым: блокировка колбэка может замедлить основной запрос. Во-вторых, журналы могут содержать исходный текст пользователя, поэтому сроки хранения и права доступа нужно определить заранее и не хранить производственные журналы бессрочно.
Что касается стоимости, шлюз позволяет её увидеть, но не уменьшить. Реальная экономия достигается выбором подходящей модели, сокращением контекста и контролем числа повторов.
7. Свой шлюз или управляемый сервис
| Критерий | Собственный LiteLLM | Управляемый AI-шлюз |
|---|---|---|
| Путь данных | Полностью под вашим контролем | Проходит через поставщика услуг |
| Начальные затраты | Низкие, установили и запустили | Регистрация и сразу работа |
| Долгосрочная эксплуатация | Обновления, резервные копии и мониторинг на вас | Отвечает поставщик |
| Биллинг и счета | Самостоятельно к вышестоящим поставщикам | Единый счёт в юанях |
| Гибкость | Высокая, можно менять код и маршруты | Ограничена возможностями платформы |
| Ответственность за сбои | Полностью на вас | По условиям обслуживания |
Практический критерий:
- Если есть эксплуатационная команда, требования комплаенса и потребность в глубокой настройке маршрутов — выбирайте собственный шлюз.
- Если команда небольшая, нужно лишь объединить ключи и счета и не хочется ночью чинить контейнеры — выбирайте управляемый сервис.
- Можно начать с управляемого варианта, а собственный шлюз оценить после стабилизации объёма вызовов.
Командам в Китае стоит отдельно учитывать сеть. Собственный шлюз сам по себе не решает проблему доступности вышестоящих поставщиков: при нестабильном доступе он лишь усилит сбои. В такой ситуации реалистичнее «свой шлюз плюс доступный вышестоящий поставщик» либо управляемый шлюз.
Если менять исходный код не нужно и требуется лишь OpenAI-совместимый вход, единые ключи и счёт в юанях, управляемый шлюз обычно запускается в день регистрации; LiteLLM больше подходит как инфраструктура, которую команда готова долго обслуживать. Оба варианта могут сосуществовать: внутри — маршрутизация LiteLLM, снаружи — единый управляемый вход.
8. Частые вопросы
LiteLLM бесплатен?
Открытую часть можно развернуть самостоятельно, но вызовы вышестоящих моделей по-прежнему тарифицируются; цены корпоративных функций и управляемого сервиса смотрите у правообладателя.
Чем он отличается от One API и New API?
One API и New API больше ориентированы на распределение квот между пользователями, LiteLLM — на маршрутизацию между моделями и унификацию SDK. Оба варианта дают OpenAI-совместимый вход; выбор зависит от того, нужен ли вам биллинг с распределением или маршрутизация.
Поддерживается ли нативный вызов инструментов Claude?
Степень поддержки зависит от версии и адаптера вышестоящего поставщика. Сложный вызов инструментов и кэширование лучше проверять реальными запросами, а не только по документации.
Экономит ли собственный шлюз деньги?
Не обязательно. Вы экономите на плате за платформу, но платите сервером, эксплуатацией и временем простоев. При небольших объёмах управляемый вариант обычно выгоднее.
Что минимально нужно настроить в производстве?
TLS, master key, виртуальные ключи, лимиты бюджета, журналы, резервное копирование базы и проверку работоспособности — без любого из этих пунктов конфигурация неполна.
Что дальше
Если сначала нужно проверить вызовы нескольких моделей и не хочется обслуживать контейнеры, зарегистрируйтесь в ZSQH AI Gateway и отправьте первый запрос через OpenAI-совместимый вход. Модели и цены смотрите на странице цены на модели. Когда объём и требования комплаенса станут ясны, решите, нужен ли собственный LiteLLM.
Похожие материалы:
