LLM gateway
Поймал себя на том, что в третьем по счету проекте копирую один и тот же кусок прокси для OpenAI - и понял, что пора это выносить
Сейчас сложно найти продукт, в котором нет хотя бы одного обращения к LLM (или БЯМ - большая языковая модель, как же мне нравится эта аббревитура), и вместе с этим остро встает вопрос работы с ключами
Понятно, что секреты мы держим в переменных среды или в централизованном хранилище, но когда проектов становится много, этого уже мало - нет единого подсчета токенов, нет централизованного управления, и в каждом сервисе болтается свой кусок логики для общения с провайдером
Решается это через AI gateway - по сути как nginx, только стоит не перед бекендом, а перед LLM-провайдером и проксирует все запросы через себя
Litellm - open source решение, которое умеет говорить со 100+ провайдерами (OpenAI, Anthropic, Gemini, Bedrock и тд) в едином OpenAI-формате, так что менять провайдера можно прямо в конфиге, не переписывая интеграцию в коде
Через конфиги настраиваешь, какие есть провайдеры и их fallback-и на случай, если какой-то ляжет, а заодно получаешь:
- retry с настраиваемым числом попыток
- load balancing между несколькими ключами или деплойментами одной модели
- virtual keys - выдаешь команде или проекту отдельный ключ, не светя реальные ключи провайдеров
- лимиты по бюджету и токенам в разрезе проекта или пользователя
- кеширование ответов и rate limiting
- callbacks для логирования и observability - Langfuse, MLflow и прочие
Но что зашло больше всего - можно настроить пред и постобработку запроса, то есть написать кастомные middleware сразу на все запросы - например, вырезать персональные данные перед отправкой в модель и это заработает для всех сервисов разом, а не копипастой в каждом
Поймал себя на том, что в третьем по счету проекте копирую один и тот же кусок прокси для OpenAI - и понял, что пора это выносить
Сейчас сложно найти продукт, в котором нет хотя бы одного обращения к LLM (или БЯМ - большая языковая модель, как же мне нравится эта аббревитура), и вместе с этим остро встает вопрос работы с ключами
Понятно, что секреты мы держим в переменных среды или в централизованном хранилище, но когда проектов становится много, этого уже мало - нет единого подсчета токенов, нет централизованного управления, и в каждом сервисе болтается свой кусок логики для общения с провайдером
Решается это через AI gateway - по сути как nginx, только стоит не перед бекендом, а перед LLM-провайдером и проксирует все запросы через себя
Litellm - open source решение, которое умеет говорить со 100+ провайдерами (OpenAI, Anthropic, Gemini, Bedrock и тд) в едином OpenAI-формате, так что менять провайдера можно прямо в конфиге, не переписывая интеграцию в коде
Через конфиги настраиваешь, какие есть провайдеры и их fallback-и на случай, если какой-то ляжет, а заодно получаешь:
- retry с настраиваемым числом попыток
- load balancing между несколькими ключами или деплойментами одной модели
- virtual keys - выдаешь команде или проекту отдельный ключ, не светя реальные ключи провайдеров
- лимиты по бюджету и токенам в разрезе проекта или пользователя
- кеширование ответов и rate limiting
- callbacks для логирования и observability - Langfuse, MLflow и прочие
Но что зашло больше всего - можно настроить пред и постобработку запроса, то есть написать кастомные middleware сразу на все запросы - например, вырезать персональные данные перед отправкой в модель и это заработает для всех сервисов разом, а не копипастой в каждом