61 lines
3.2 KiB
Markdown
61 lines
3.2 KiB
Markdown
# Ответ: HTTP/2 из Python к aillm.ru
|
|
|
|
_Дата: 2026-06-14_
|
|
|
|
---
|
|
|
|
## Проблема
|
|
`api.aillm.ru` защищен ddos-guard, который требует наличия HTTP/2 в TLS-хендшейке от облачных IP. Библиотека `requests` работает только по HTTP/1.1, что приводит к ложным ошибкам 401/403.
|
|
|
|
## Решение
|
|
Использование библиотеки **`httpx`** с установленной поддержкой HTTP/2 через чистый Python-пакет **`h2`**.
|
|
|
|
### 1. Подготовка зависимостей (requirements.txt)
|
|
Так как облачная платформа не всегда корректно обрабатывает синтаксис `httpx[http2]`, необходимо прописать зависимости **явно отдельными строками**. Это гарантирует установку `h2` — pure Python реализации протокола, которая не требует системных библиотек или `apt`.
|
|
|
|
```text
|
|
# requirements.txt
|
|
httpx
|
|
h2
|
|
```
|
|
|
|
### 2. Код клиента (llm_client.py)
|
|
Для работы по HTTP/2 в `httpx` нужно явно передать параметр `http2=True` при создании клиента.
|
|
|
|
```python
|
|
import os
|
|
import httpx
|
|
|
|
def ask_llm(prompt: str):
|
|
api_url = "https://api.aillm.ru/v1/chat/completions"
|
|
api_key = os.getenv("LLM_API_KEY", "sk-ucI5YvOticoOQ9Kuj5K9mQ")
|
|
|
|
payload = {
|
|
"model": "gpt-oss-120b",
|
|
"messages": [{"role": "user", "content": prompt}],
|
|
"max_tokens": 8000,
|
|
"temperature": 0.1
|
|
}
|
|
|
|
headers = {
|
|
"Authorization": f"Bearer {api_key}",
|
|
"Content-Type": "application/json"
|
|
}
|
|
|
|
# ВАЖНО: http2=True включает поддержку нужного протокола
|
|
with httpx.Client(http2=True, timeout=120) as client:
|
|
resp = client.post(api_url, json=payload, headers=headers)
|
|
resp.raise_for_status()
|
|
return resp.json()
|
|
```
|
|
|
|
## Почему это работает в slim-контейнере
|
|
1. **`httpx`** — современный клиент, поддерживающий HTTP/2.
|
|
2. **`h2`** — это замена системным библиотекам `nghttp2`. Она написана на чистом Python, поэтому корректно устанавливается через `pip` даже в максимально «обрезанных» образах (\*-slim, alpine) без компиляторов и `apt`.
|
|
3. **HTTP/2 Fingerprint** — ddos-guard видит поддержку HTTP/2 в TLS Client Hello, что является для него признаком «легального» клиента (браузера или современного SDK), а не простого скрипта на `requests` или старого бота.
|
|
|
|
## Резюме для реализации
|
|
- Используйте `httpx.Client(http2=True)`.
|
|
- Убедитесь, что `h2` есть в `requirements.txt` отдельной строкой.
|
|
- Не используйте `httpx[http2]` в конфигах, если платформа капризная.
|