Files
contracts/history/llm-http2-answer.md
T

3.2 KiB

Ответ: 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.

# requirements.txt
httpx
h2

2. Код клиента (llm_client.py)

Для работы по HTTP/2 в httpx нужно явно передать параметр http2=True при создании клиента.

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