Перейти к содержанию
Публикация AiManual

LiteLLM: универсальный прокси-шлюз для управления 100+ LLM-провайдерами

Практическая настройка LiteLLM как self-hosted OpenAI-compatible API proxy: запуск через Docker, LiteLLM config для Groq и Perplexity, Redis cache, fallback-цеп

Коротко

Что будет в материале

  1. 01

    Проблема: зоопарк LLM-провайдеров и привязка кода

  2. 02

    Что такое LiteLLM и как он унифицирует API

  3. 03

    Как запустить LiteLLM через Docker

  4. 04

    Ускорение и экономия: настройка кэширования

Если нужно подключить несколько LLM-провайдеров через единый OpenAI-compatible API, LiteLLM закрывает эту задачу в формате self-hosted прокси-шлюза. Ниже разобраны запуск LiteLLM Docker, конфигурация провайдеров в litellm_config.yaml, кэширование, fallback-механизмы и ограничения бюджета.

  • как запустить LiteLLM через Docker и проверить endpoint;
  • как подключить Groq и Perplexity через LiteLLM config;
  • как включить локальный или Redis cache;
  • как настроить fallback и повторные попытки;
  • как ограничить бюджет пользователей и контролировать расходы.

Проблема: зоопарк LLM-провайдеров и привязка кода

Микросервисы разрастаются. Каждый из них обращается к своей языковой модели: один через Anthropic API, второй через Groq, третий через Perplexity. Форматы запросов и ответов у всех разные. При смене провайдера, например, из-за цены или качества инференса, приходится переписывать интеграционный слой в каждом сервисе. Это прямое следствие vendor lock-in - привязки кода к конкретному API.

LiteLLM решает эту проблему. Он работает как центральный прокси-шлюз: все микросервисы отправляют запросы в формате OpenAI API, а шлюз маршрутизирует их к нужному провайдеру. Ответ приводится к единому формату. Код клиента не меняется при переключении между 100+ провайдерами.

В этом разборе - пошаговое развертывание через Docker, настройка кэширования для снижения затрат, конфигурация fallback-цепочек и мониторинг расходов через встроенный веб-интерфейс. Без маркетинговых обещаний - только конфиги и практические выводы.

Что такое LiteLLM и как он унифицирует API

LiteLLM - это прокси-сервер с открытым исходным кодом. Он принимает входящие запросы в формате OpenAI API и перенаправляет их к выбранному LLM-провайдеру. На выходе клиент получает ответ, структурированный так же, как от оригинального OpenAI - с полями choices, usage, model. Механика проста: вы пишете код один раз, под стандарт /v1/chat/completions, а замена модели или провайдера сводится к изменению параметра model в запросе или конфигурации шлюза.

Практический пример. Python-клиент, написанный под OpenAI, без изменений отправляет запрос к Groq. Достаточно указать в вызове model: "groq/llama-3.1-70b-versatile" и направить запрос на endpoint LiteLLM. Шлюз сам преобразует формат, добавит нужные заголовки и вернет ответ в ожидаемой структуре. Это снимает блокировку на уровне кодовой базы - миграция между провайдерами становится операционной задачей, а не инженерной.

Поддерживаемые провайдеры и модели

На июль 2026 года LiteLLM поддерживает более 100 LLM-провайдеров. Среди них: OpenAI, Anthropic, Cohere, Groq, Perplexity, Together AI, Mistral, DeepSeek, AI21, Replicate, Hugging Face Inference Endpoints и десятки других. Полный список обновляется в репозитории проекта.

Ключевой момент: добавление нового провайдера не требует изменений в клиентском коде. Вы регистрируете его в конфигурационном YAML-файле шлюза, указываете API-ключ и список доступных моделей. Все сервисы, подключенные к шлюзу, автоматически получают доступ к новому провайдеру. Это особенно ценно при тестировании новых моделей: команда может сравнить качество ответов от разных поставщиков, не меняя ни строчки в приложениях. Подход снижает time-to-experiment с дней до минут.

Как запустить LiteLLM через Docker

Для запуска нужен Docker и файл конфигурации. Никаких внешних зависимостей на стороне приложения не требуется: образ содержит компоненты, необходимые для запуска прокси. Разберем по шагам.

Шаг 1. Создайте директорию проекта и файл litellm_config.yaml:

mkdir litellm-proxy && cd litellm-proxy
touch litellm_config.yaml

Шаг 2. Опишите провайдеров в конфигурации.

Шаг 3. Запустите контейнер:

docker run -d \
  --name litellm \
  -p 4000:4000 \
  -v $(pwd)/litellm_config.yaml:/app/config.yaml \
  ghcr.io/berriai/litellm:main-latest

Шаг 4. Проверьте работоспособность через curl:

curl -X POST http://localhost:4000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-litellm-master-key" \
  -d '{
    "model": "perplexity/llama-3.1-sonar-large-128k-online",
    "messages": [{"role": "user", "content": "Привет, как дела?"}]
  }'

Ответ придет в формате OpenAI API. Модель можно заменить на любую из конфигурации - достаточно изменить поле model в теле запроса.

Пример LiteLLM config для Perplexity и Groq

Рабочий YAML с двумя провайдерами. Параметры: model_name - псевдоним для клиентов, litellm_params.model - идентификатор модели у провайдера, api_key - ключ доступа.

model_list:
  - model_name: perplexity-sonar
    litellm_params:
      model: perplexity/llama-3.1-sonar-large-128k-online
      api_key: os.environ/PERPLEXITY_API_KEY
  - model_name: groq-llama
    litellm_params:
      model: groq/llama-3.1-70b-versatile
      api_key: os.environ/GROQ_API_KEY

general_settings:
  master_key: os.environ/LITELLM_MASTER_KEY

Псевдонимы perplexity-sonar и groq-llama скрывают детали провайдера от клиентов. При миграции, например, с Groq на другого поставщика, достаточно изменить litellm_params.model под тем же псевдонимом - клиенты не заметят подмены. API-ключи вынесены в переменные окружения, что соответствует базовым практикам безопасности.

Ускорение и экономия: настройка кэширования

Повторные запросы к LLM с одинаковыми параметрами могут увеличивать расходы и задержку. LiteLLM поддерживает встроенное кэширование, которое позволяет вернуть ранее сохраненный результат без нового обращения к провайдеру.

Механика: шлюз вычисляет хеш от комбинации model + messages + temperature + max_tokens. При совпадении хеша с уже сохраненным ответ возвращается из кэша, минуя обращение к провайдеру. Фактический выигрыш по времени и стоимости зависит от типа кэша, параметров запроса и конкретного провайдера, поэтому его стоит измерять на собственном трафике.

Включение кэширования в конфигурации:

litellm_settings:
  cache: true
  cache_params:
    type: local
    ttl: 3600

Параметр ttl задает время жизни записи в секундах. Для production-сред с несколькими репликами шлюза локальный кэш не подходит - каждый экземпляр хранит свою копию. Решение - Redis.

Локальное кэширование vs Redis

Локальный кэш хранится в памяти процесса. Плюсы: нулевая задержка, отсутствие внешних зависимостей. Минусы: не работает при горизонтальном масштабировании - две реплики шлюза не видят кэш друг друга.

Redis-кэш обеспечивает общее хранилище для всех экземпляров LiteLLM. Конфигурация:

litellm_settings:
  cache: true
  cache_params:
    type: redis
    host: os.environ/REDIS_HOST
    port: os.environ/REDIS_PORT
    ttl: 3600

Выбор между подходами определяется масштабом системы. Для одного сервера и разработки достаточно локального кэша. Для кластера из нескольких реплик нужен Redis. Инвалидация кэша автоматическая по TTL, ручная очистка доступна через API шлюза.

Отказоустойчивость: fallback-механизмы и балансировка

Провайдеры LLM периодически деградируют. API возвращает 5xx, модель зависает на инференсе, квота исчерпана. Без fallback-стратегии это означает отказ сервиса для конечного пользователя. LiteLLM предоставляет декларативный механизм цепочек отказоустойчивости.

Пример конфигурации с fallback-цепочкой: основная модель - Groq, резервная - Perplexity.

model_list:
  - model_name: my-llm
    litellm_params:
      model: groq/llama-3.1-70b-versatile
      api_key: os.environ/GROQ_API_KEY
    model_info:
      mode: chat
  - model_name: my-llm-fallback
    litellm_params:
      model: perplexity/llama-3.1-sonar-large-128k-online
      api_key: os.environ/PERPLEXITY_API_KEY

router_settings:
  routing_strategy: usage-based
  allowed_fails: 3
  num_retries: 2
  fallbacks:
    - my-llm: [my-llm-fallback]

После заданного числа ошибок от Groq шлюз может переключиться на Perplexity. Точное поведение зависит от типа ошибки, параметров маршрутизатора и доступности резервной модели, поэтому fallback следует проверять на сценариях, которые важны для вашего сервиса. Параметр num_retries задает количество повторных попыток перед активацией fallback-модели.

Балансировка нагрузки между провайдерами настраивается через routing_strategy. Стратегия usage-based распределяет запросы по наименее загруженному провайдеру из группы. Это полезно при работе с несколькими поставщиками одной модели - снижается зависимость от квот конкретного провайдера.

Мониторинг расходов и управление пользователями

LiteLLM включает веб-интерфейс для административного контроля. Он доступен по адресу http://localhost:4000/ui после запуска контейнера. Дашборд показывает расходы с разбивкой по моделям и пользователям, количество запросов за период и среднюю задержку ответа.

Интерфейс позволяет генерировать API-ключи для клиентов с индивидуальными лимитами. Каждый ключ привязывается к бюджету - дневному или месячному. При превышении лимита шлюз возвращает ошибку 429, не пропуская запрос к провайдеру. Это предотвращает неконтролируемый рост расходов при багах в клиентском коде или неожиданных всплесках трафика.

Как настроить budget limits

Лимиты задаются через конфигурационный файл или API. Пример для пользователя с месячным бюджетом 50 долларов:

litellm_settings:
  max_budget: 50
  budget_duration: 1mo

user_config:
  - user_id: dev-team
    max_budget: 50
    budget_duration: 1mo
    models:
      - groq-llama
      - perplexity-sonar

Параметр budget_duration принимает значения 1d, 1mo. При достижении лимита запросы блокируются до окончания периода. Оповещения о приближении к лимиту настраиваются через webhook - шлюз отправляет POST-запрос на указанный URL при расходе 80% и 100% бюджета.

LiteLLM: частые сценарии и проверки после установки

Как подключить нового провайдера?

Добавьте модель в model_list, укажите идентификатор модели в litellm_params.model, а API-ключ вынесите в переменную окружения. Затем отправьте тестовый запрос с соответствующим значением model. Если запрос не проходит, проверьте имя модели у провайдера и наличие ключа внутри контейнера.

Как включить Redis cache?

Укажите type: redis, адрес в host и порт в port. LiteLLM и Redis должны быть доступны друг другу по сети Docker. После запуска проверьте логи контейнера и повторите одинаковый запрос: при проблемах с Redis запросы не должны молча считаться успешно закэшированными.

Почему не работает fallback?

Проверьте совпадение имен в fallbacks и model_list, значения allowed_fails и num_retries, а также наличие API-ключа резервного провайдера. Отдельно учитывайте, что не каждая ошибка клиента или неверный запрос должен приводить к переключению модели.

Почему контейнер запущен, но API не отвечает?

Проверьте проброс порта, путь монтирования /app/config.yaml, содержимое конфигурации и логи через Docker. Затем повторите запрос к http://localhost:4000/v1/chat/completions с корректными заголовками Content-Type и Authorization.

LiteLLM в архитектуре микросервисов

Типовая production-схема: три микросервиса (чат-бот, аналитический пайплайн, генератор отчетов) обращаются к единому экземпляру LiteLLM. Шлюз маршрутизирует запросы к разным провайдерам в зависимости от модели, указанной в запросе. Все API-ключи провайдеров хранятся только в конфигурации шлюза - микросервисы не имеют к ним доступа.

Это решает проблему безопасности: ключи не размазываются по кодовой базе и не попадают в логи разработчиков. При компрометации ключа его замена происходит в одной точке - конфигурационном файле шлюза.

Масштабирование достигается запуском нескольких реплик LiteLLM за балансировщиком. Общий Redis-кэш и единая конфигурация обеспечивают согласованное поведение. Мониторинг всех реплик централизован через административный дашборд. Для Kubernetes-окружений сообщество предоставляет готовые Helm-чарты.

При проектировании AI-агентов на базе LLM шлюз становится критическим элементом архитектуры. Он обеспечивает единую точку контроля над расходами и отказоустойчивостью для всех агентов в системе. Подробнее об архитектуре агентов и интеграции LiteLLM - в материале о создании AI-агента с нуля, где разобраны метрики latency, cost и reliability.

Сравнение с коммерческими ИИ-роутерами и издержки самостоятельного хостинга

Рынок предлагает коммерческие аналоги: OpenRouter, Martian, Portkey. Они решают ту же задачу унификации API, но с другой экономикой и уровнем контроля.

КритерийLiteLLM (self-hosted)OpenRouterMartian
СтоимостьБесплатно (только инфраструктура)Наценка 5-15% к токенамФиксированная плата + наценка
Контроль над даннымиПолный, запросы не покидают контурЗапросы проходят через серверы OpenRouterЗапросы проходят через серверы Martian
Поддержка провайдеров100+, расширяется конфигурацией200+50+
КастомизацияПолный доступ к кодовой базеОграничена APIОграничена API
Операционные затратыDevOps-поддержка, мониторинг, обновленияОтсутствуютОтсутствуют

Операционные издержки самостоятельного хостинга - главный скрытый фактор. Поддержка в production требует мониторинга доступности шлюза, обновления образа при выходе новых версий, настройки резервного копирования конфигурации и реагирования на инциденты. Для команды без DevOps это риск деградации сервиса при отсутствии мониторинга.

Когда стоит выбрать LiteLLM, а когда - коммерческий роутер

LiteLLM - ваш выбор, если:

  • Данные не должны покидать ваш контур (fintech, healthcare, enterprise).
  • Нужна глубокая кастомизация маршрутизации и fallback-логики.
  • Есть DevOps-ресурс для поддержки инфраструктуры.
  • Бюджет на инструментарий ограничен, а стоимость токенов уже высока.

Коммерческий роутер - ваш выбор, если:

  • Нет возможности выделить инженера на поддержку шлюза.
  • Важнее скорость внедрения, чем экономия на наценке.
  • Нужен доступ к провайдерам, отсутствующим в LiteLLM.

Для enterprise-внедрений, где критичен контроль над данными и расходами, LiteLLM часто используют как компонент более широкой стратегии LLM gateway. Детальный разбор архитектуры с guardrails и compliance - в статье об управляемых AI-агентах в enterprise.

Заключение: кому и зачем нужен LiteLLM

LiteLLM решает конкретную инженерную задачу: унификация доступа к LLM-провайдерам через единый endpoint с форматом OpenAI API. Развертывание через Docker занимает несколько шагов. Кэширование может ускорить повторные запросы и снизить расходы, а результат зависит от выбранного хранилища и характера трафика. Fallback-механизмы помогают сохранить доступность при деградации провайдеров. Встроенный дашборд дает прозрачность расходов.

Инструмент снижает порог входа в мультипровайдерную стратегию. Команда может тестировать новые модели без изменения кода, переключаться между поставщиками при изменении цен и контролировать бюджет через лимиты на пользователей. Для тех, кто уже работает с LLM в production, LiteLLM - способ вернуть контроль над зависимостью от API-провайдеров.

Если вы рассматриваете оптимизацию расходов на LLM, обратите внимание на кейс миграции с Claude Sonnet на Qwen 3.5 Flash - там разобрана методология выбора модели и скрытые проблемы дешевых LLM.

Подписаться на канал