# Ответ: 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]` в конфигах, если платформа капризная.