import httpx import os from dotenv import load_dotenv load_dotenv() OPENROUTER_KEY = os.getenv("ROUTER_KEY") OPENROUTER_URL = "https://openrouter.ai/api/v1/chat/completions" MODEL = "google/gemini-2.5-flash" HEADERS = { "Authorization": f"Bearer {OPENROUTER_KEY}", "Content-Type": "application/json", "HTTP-Referer": "http://localhost:8000", } async def send_message(messages: list) -> str: """Обычный запрос — используем для внутренних нужд""" payload = { "model": MODEL, "messages": messages, } async with httpx.AsyncClient(timeout=60) as client: response = await client.post( OPENROUTER_URL, headers=HEADERS, json=payload ) response.raise_for_status() data = response.json() return data["choices"][0]["message"]["content"] async def send_message_with_model(messages: list, model: str) -> str: payload = { "model": model, "messages": messages, } async with httpx.AsyncClient(timeout=90) as client: response = await client.post( OPENROUTER_URL, headers=HEADERS, json=payload ) response.raise_for_status() data = response.json() return data["choices"][0]["message"]["content"] async def stream_message(messages: list): """Стриминг — отдаём чанки по мере получения""" payload = { "model": MODEL, "messages": messages, "stream": True, } async with httpx.AsyncClient(timeout=60) as client: async with client.stream( "POST", OPENROUTER_URL, headers=HEADERS, json=payload ) as response: response.raise_for_status() async for line in response.aiter_lines(): if not line.startswith("data: "): continue data = line[6:] # убираем "data: " if data == "[DONE]": break try: import json chunk = json.loads(data) delta = chunk["choices"][0]["delta"] content = delta.get("content", "") if content: yield content except Exception: continue