Написал небольшой минималистичный прокси-сервис обертку для подключения к Gigachat от Сбера https://github.com/mlnavigator/gigachat-proxy. Но в общем-то оно с минимальными усилиями переделывается в прокси с контролем для обращения к любому другому внешнему АПИ, где у вас есть ограничения
Примерно такие ограничения чаще всего у LLM апи.
Сервис подойдет вам как приватный, в котором вы устанавливаете свой ключ подключения.
Я например использую этот сервис у себя на локалке и на серверах своих проектов. Например на сервере у меня есть несколько приложений, которые могут использовать Гигачат в своем режиме каждое. Те на сервере есть одно веб приложение, другое веб приложение, несколько апи сервисов. И в них приходят пользователи не зависимо. И в какой-то момент пользователи могут в разном количестве набегать на разные из этих сервисов, которые ничего друг про друга не знают. И запросов в Гигачат может возникнуть и 50 одновременно и 300 в минуту и т.д. И если каждое приложение начнет обращаться в Гигачат независимо, даже контролируя лимиты на своей стороне - все равно будут возникать ситуации, когда лимиты будут превышены. Но если сделать единую точку, через которую все запросы идут в Гигачат и эта единая точка занимается контролем запросов - как регулировщик на дороге - выстраивает порядок запросов, очередь - то проблема снимается.
Т.к. нагрузка на каждом из потребителей АПИ не под 100%, вы можете все это уместить в целом на одном ключе АПИ. Для того чтобы все уместились - достаточно сделать очередь в которую ставить всех внутренних клиентов и с контролем лимитов передавать все запросы из очереди в Гигачат. Получится что каждый их запросов в пиковое время постоит в очереди 1-5 сек, но в итоге все клипенты отработают с не очень больой задержкой.
Проект gigachat-proxy представляет собой микросервис, который выполняет роль обертки для клиента GigaChat. Основная задача этого микросервиса — управление входящими запросами, их выстраивание в очередь и отправка во внешнее API GigaChat с учетом определенных ограничений. Это позволяет контролировать нагрузку на API и избегать превышения лимитов.
Управление очередью запросов:
Настройка и запуск:
env
- (именно так, без расширения) с переменными окружения в папке assets
. Демо файл env_example.txt с примером переменных окружения находится в папке assets python3 <path_to>/app.py
./bin/bash ./rebuild.sh
Использование:
api_client_example.py
.Проект gigachat-proxy может быть использован как шаблон для создания обертки для любого другого внешнего API. Для этого необходимо:
gigachat_connector
, заменив его на коннектор к вашему API.validate_data(data)
request_api(data)
get_info()
proxy_request
на импорт из вашего нового коннектора..sh
скриптах.Проект gigachat-proxy предоставляет минималистичный и гибкий инструмент для управления запросами к API, обеспечивая контроль над нагрузкой и частотой запросов. Он может быть легко адаптирован для работы с любым другим API, что делает его полезным для разработчиков, работающих с различными внешними сервисами.
Для начала работы с проектом выполните следующие шаги:
Клонируйте репозиторий:
git clone https://github.com/mlnavigator/gigachat-proxy.git
cd gigachat-proxy
Установите зависимости: Проект написан на Python, поэтому убедитесь, что у вас установлен Python 3.8+ и pip.
pip install -r requirements.txt
Настройте переменные окружения:
В файле env
укажите необходимые параметры, такие как токен доступа к GigaChat API и другие:
GIGACHAT_API_KEY=your_api_key_here
PROXY_HOST=0.0.0.0
PROXY_PORT=8078
<еще параметры ...>
Запустите сервер:
python app.py
После запуска сервера вы можете отправлять запросы к прокси-серверу напрямую через 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)
>> Мяу-мяу!