Files
ChatAIBot/services/llm.py
T
2026-05-28 14:29:43 +03:00

80 lines
2.4 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 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