Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

feat: add HTTP/2 support for streaming responses #53

Closed
wants to merge 2 commits into from

Conversation

antonko
Copy link

@antonko antonko commented Jan 9, 2025

Этот PR добавляет поддержку HTTP/2 для потоковой передачи данных.

В ходе разработки gigachat-adapter я обнаружил, что потоковая генерация токенов работает не так, как ожидается. GigaChat API отдает весь контент разом через SSE, а не по мере генерации токенов, что связано с отсутствием явной поддержки HTTP/2. Такое поведение можно наблюдать в примерах работы со стримингом.

Решение

Была добавлена поддержка HTTP/2 в клиенте библиотеки httpx. По умолчанию HTTP/2 отключен, чтобы не нарушать текущее поведение. Разработчик может включить HTTP/2, явно указав параметр http2=True в настройках.

В следующих версиях можно рассмотреть возможность включения HTTP/2 по умолчанию, если это не вызовет проблем с обратной совместимостью.

Основные изменения:

  1. Добавлена зависимость httpx[http2]
  2. Новый параметр http2
  3. Обновлен README.md
  4. Добавлен тест

@Rai220
Copy link
Collaborator

Rai220 commented Jan 10, 2025

@antonko можете уточнить на каком сервере проявляется такое поведение? У меня всегда работала потоковая генерация по токенам и сейчас тоже работает, в том числе на примере выше. (Можно в личку, если это непубличные серверы)

@antonko
Copy link
Author

antonko commented Jan 11, 2025

@antonko можете уточнить на каком сервере проявляется такое поведение?

Возможно я не совсем понятно сформулировал суть проблемы. Возвращаются чанки, но они возвращаются все разом. Вот пример, я изменил вывод streaming_asyncio.py что бы было понятнее:

print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), flush=True)

Тестировал на Windows/Linux, Python 3.11/3.12

по времени видно что разом получаем все чанки

python .\examples\streaming_asyncio.py
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33
2025-01-11 22:29:33

Скорее всего исток проблемы в конфигурации веб-сервера API Gigachat, но принудительное включение http2 решает эту поблему.

@antonko
Copy link
Author

antonko commented Jan 11, 2025

Добавлю, это поведение API Gigachat можно наблюдать используя curl с флагом http1.1/http2. В любом случае будет полезным использовать http2 в запросах к GigaChat API, а не http1

curl -k --http1.1 --location 'https://gigachat.devices.sberbank.ru/api/v1/chat/completions' --header 'Content-Type: application/json' --header 'Authorization: Bearer {token}' --data '{
  "model": "GigaChat-Max",
  "stream": true,
  "messages": [
        {
            "role": "user",
            "content": "Версия http1.1 корректно работает с SSE?"
        }
    ]
}'

@antonko
Copy link
Author

antonko commented Jan 20, 2025

Заметил что сервер исправили, теперь в режиме http1.1 он отдает чанки корректно. Закрываю PR.

@antonko antonko closed this Jan 20, 2025
@Rai220 Rai220 reopened this Jan 23, 2025
@Rai220
Copy link
Collaborator

Rai220 commented Jan 23, 2025

Спасибо большое за PR. Мы все проверили, оказалось что проблема была в настройках сервера, исправили.
На HTTP/2 пока не переходим.

@Rai220 Rai220 closed this Jan 23, 2025
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants