xrayvision-backend / app /services /openrouter_client.py
zohaibcodez's picture
initial deploy
ce4fddb
Raw
History Blame Contribute Delete
1.82 kB
"""OpenRouter chat-completions client."""
from __future__ import annotations
import httpx
from app.config import get_settings
def complete_text(
prompt: str,
*,
system_prompt: str | None = None,
temperature: float = 0.2,
max_tokens: int = 2048,
) -> str:
"""Send a prompt to OpenRouter and return the assistant text."""
settings = get_settings()
if not settings.openrouter_api_key:
raise RuntimeError("OPENROUTER_API_KEY is not configured.")
messages = []
if system_prompt:
messages.append({"role": "system", "content": system_prompt})
messages.append({"role": "user", "content": prompt})
response = httpx.post(
"https://openrouter.ai/api/v1/chat/completions",
headers={
"Authorization": f"Bearer {settings.openrouter_api_key}",
"Content-Type": "application/json",
"HTTP-Referer": settings.openrouter_site_url,
"X-Title": settings.openrouter_app_name,
},
json={
"model": settings.openrouter_model,
"messages": messages,
"temperature": temperature,
"max_tokens": max_tokens,
},
timeout=settings.openrouter_timeout_seconds,
)
try:
response.raise_for_status()
except httpx.HTTPStatusError as exc:
detail = response.text[:500]
raise RuntimeError(
f"OpenRouter request failed with HTTP {response.status_code}: {detail}"
) from exc
data = response.json()
choices = data.get("choices") or []
if not choices:
raise RuntimeError("OpenRouter returned no choices.")
content = choices[0].get("message", {}).get("content", "")
if not content:
raise RuntimeError("OpenRouter returned an empty response.")
return content