64 lines
1.9 KiB
Python
64 lines
1.9 KiB
Python
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 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
|