LLM proxy с контролем лимитов по потокам и нагрузке

Написал небольшой минималистичный прокси-сервис обертку для подключения к Gigachat от Сбера https://github.com/mlnavigator/gigachat-proxy. Но в общем-то оно с минимальными усилиями переделывается в прокси с контролем для обращения к любому другому внешнему АПИ, где у вас есть ограничения

  • например, не больше чем 300 запросов в час
  • не более 10 запросов на выполнение одновременно.

Примерно такие ограничения чаще всего у LLM апи.

Сервис подойдет вам как приватный, в котором вы устанавливаете свой ключ подключения.

Я например использую этот сервис у себя на локалке и на серверах своих проектов. Например на сервере у меня есть несколько приложений, которые могут использовать Гигачат в своем режиме каждое. Те на сервере есть одно веб приложение, другое веб приложение, несколько апи сервисов. И в них приходят пользователи не зависимо. И в какой-то момент пользователи могут в разном количестве набегать на разные из этих сервисов, которые ничего друг про друга не знают. И запросов в Гигачат может возникнуть и 50 одновременно и 300 в минуту и т.д. И если каждое приложение начнет обращаться в Гигачат независимо, даже контролируя лимиты на своей стороне - все равно будут возникать ситуации, когда лимиты будут превышены. Но если сделать единую точку, через которую все запросы идут в Гигачат и эта единая точка занимается контролем запросов - как регулировщик на дороге - выстраивает порядок запросов, очередь - то проблема снимается.

Т.к. нагрузка на каждом из потребителей АПИ не под 100%, вы можете все это уместить в целом на одном ключе АПИ. Для того чтобы все уместились - достаточно сделать очередь в которую ставить всех внутренних клиентов и с контролем лимитов передавать все запросы из очереди в Гигачат. Получится что каждый их запросов в пиковое время постоит в очереди 1-5 сек, но в итоге все клипенты отработают с не очень больой задержкой.

Обзор проекта gigachat-proxy

Проект gigachat-proxy представляет собой микросервис, который выполняет роль обертки для клиента GigaChat. Основная задача этого микросервиса — управление входящими запросами, их выстраивание в очередь и отправка во внешнее API GigaChat с учетом определенных ограничений. Это позволяет контролировать нагрузку на API и избегать превышения лимитов.

Основные функции и возможности

  1. Управление очередью запросов:

    • EXT_API_RPM: Ограничение на максимальное количество запросов в минуту.
    • EXT_MAX_REQUESTS: Ограничение на количество одновременных запросов.
    • EXP_RESP_TIMEOUT: Время ожидания ответа от внешнего API.
  2. Настройка и запуск:

    • Создание файла env - (именно так, без расширения) с переменными окружения в папке assets. Демо файл env_example.txt с примером переменных окружения находится в папке assets
    • В файле с переменным окружения удалите все комментарии. Если оставить комментарии, питон ругнется на неверный формат файла.
    • Запуск приложения через python3 <path_to>/app.py.
    • Возможность запуска через Docker. Для Linux это проще всего сделать с помощью скрипта /bin/bash ./rebuild.sh
  3. Использование:

    • Пример данных для отправки в proxy-сервис включает сообщения и параметры генерации, которые будут переданы в GigaChat.
    • Пример использования API представлен в файле api_client_example.py.

Использование в качестве шаблона для других API

Проект gigachat-proxy может быть использован как шаблон для создания обертки для любого другого внешнего API. Для этого необходимо:

  1. Переписать модуль gigachat_connector, заменив его на коннектор к вашему API.
  2. Реализовать три метода в новом коннекторе:
    • validate_data(data)
    • request_api(data)
    • get_info()
  3. Заменить импорт в модуле proxy_request на импорт из вашего нового коннектора.
  4. При сборке через Docker изменить имя контейнера в .sh скриптах.

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

Как использовать Gigachat-proxy?

1. Установка и запуск

Для начала работы с проектом выполните следующие шаги:

  1. Клонируйте репозиторий:

    git clone https://github.com/mlnavigator/gigachat-proxy.git
    cd gigachat-proxy
  2. Установите зависимости: Проект написан на Python, поэтому убедитесь, что у вас установлен Python 3.8+ и pip.

    pip install -r requirements.txt
  3. Настройте переменные окружения: В файле env укажите необходимые параметры, такие как токен доступа к GigaChat API и другие:

    GIGACHAT_API_KEY=your_api_key_here
    PROXY_HOST=0.0.0.0
    PROXY_PORT=8078
    <еще параметры ...>
  4. Запустите сервер:

    python app.py

2. Отправка запросов

После запуска сервера вы можете отправлять запросы к прокси-серверу напрямую через HTTP. Например, чтобы получить ответ от GigaChat, выполните следующий HTTP-запрос:

curl -X POST http://localhost:8078/ \
     -H "Content-Type: application/json" \
     -d '{"messages": [["system", "Ты робот киска, на все вопросы отвечай мяу-мяу"], ["user", "Привет, как дела?"]], "generate_parameters": {"temperature": 1, "top_p": 0, "repetition_penalty": 1, "max_tokens": 100, "model": "GigaChat-Max", "profanity_check": false}}'

И в ответ вам придет json

{"app": "GigaChat-Proxy-API", "status": "ok", "data": {"x_headers": {"x-request-id": "<...>", "x-session-id": "<...>", "x-client-id": "<...>"}, "choices": [{"message": {"role": "assistant", "content": "Мяу-мяу!", "function_call": null, "name": null, "attachments": null, "data_for_context": null, "functions_state_id": null, "id_": null}, "index": 0, "finish_reason": "stop"}], "created": 1739957789, "model": "GigaChat-Max:latest", "usage": {"prompt_tokens": 35, "completion_tokens": 8, "total_tokens": 43}, "object_": "chat.completion"}}

Никакой авторизации для обращения к вашему прокси не предусмотрено. Можете настроить basic auth на стороне веб сервера. Или используйте этот сервис только локально - развернув его на PROXY_HOST=127.0.0.1

Также в файле api_client_example.py реализован класс обертка, который напоминает по интерфейсу официальный класс библиотеки Gigachat. Вы можете использовтаь его в python проектах вместо официальной билиотеки, напрямую подключающейся к Гигачату. Для работы требуется переменная окружения GIGACHAT_CONNECT_WEB_PROXY - с полной ссылкой, можно опционально установить также переменные окружения GIGACHAT_CONNECT_WEB_PROXY_TIMEOUT и GIGACHAT_MODEL_NAME

# код на python3
import os

os.environ['GIGACHAT_CONNECT_WEB_PROXY'] = 'http://localhost:8078/'

from api_client_example import GigaChatWebConnector

gigachat = GigaChatWebConnector()
messages = [('system', 'Ты робот киска, на все вопросы отвечай мяу-мяу'),
        ('user', 'Привет, как дела?')]
res = gigachat.chat(messages, retry_cnt=3)
text_answer = res['choices'][0]['message']['content'] if res != {} else 'Подключение к GigaChat не удалось'
print(text_answer)
>> Мяу-мяу!