37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
|
|
"""HTTP client for the Nous inference chat completions API."""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import os
|
||
|
|
|
||
|
|
import httpx
|
||
|
|
|
||
|
|
_DEFAULT_UA = "osint-dashboard-news-summarizer"
|
||
|
|
_DEFAULT_BASE = "https://inference-api.nousresearch.com/v1"
|
||
|
|
|
||
|
|
|
||
|
|
def chat(prompt, *, api_key, model, base_url, json_mode=False) -> str:
|
||
|
|
resolved = (base_url or os.environ.get("NOUS_BASE_URL", _DEFAULT_BASE)).rstrip("/")
|
||
|
|
url = f"{resolved}/chat/completions"
|
||
|
|
headers = {
|
||
|
|
"Authorization": f"Bearer {api_key}",
|
||
|
|
"User-Agent": os.environ.get("OSINT_USER_AGENT") or _DEFAULT_UA,
|
||
|
|
}
|
||
|
|
payload = {
|
||
|
|
"model": model,
|
||
|
|
"messages": [{"role": "user", "content": prompt}],
|
||
|
|
"temperature": 0.2,
|
||
|
|
"max_tokens": 4096,
|
||
|
|
}
|
||
|
|
if json_mode:
|
||
|
|
payload["response_format"] = {"type": "json_object"}
|
||
|
|
try:
|
||
|
|
with httpx.Client(timeout=60.0) as client:
|
||
|
|
resp = client.post(url, headers=headers, json=payload)
|
||
|
|
if resp.status_code == 401 or resp.status_code >= 500:
|
||
|
|
return ""
|
||
|
|
data = resp.json()
|
||
|
|
return data["choices"][0]["message"]["content"]
|
||
|
|
except Exception:
|
||
|
|
return ""
|