OSVauco/emma/emma_opax.py
Chris Christiansen 9fcb9c354a
Some checks are pending
Check Python Version Consistency / Check Python Version (push) Waiting to run
feat(core): Fresh initialization - Deploy v3.6.1 Singularity Architecture
2026-09-03 04:03:09 +00:00

53 lines
1.6 KiB
Python

import os
import requests
def _get_identity_token(audience: str) -> str:
"""Hent GCE metadata identity token (LEARNING-013)."""
url = (
"http://metadata.google.internal/computeMetadata/v1/instance/"
f"service-accounts/default/identity?audience={audience}&format=full"
)
try:
r = requests.get(url, headers={"Metadata-Flavor": "Google"}, timeout=5)
r.raise_for_status()
return r.text
except Exception:
return os.environ.get("OPAX_TOKEN", "")
class OpaxClient:
"""
Emma sin tilgang til OPAX-portalen.
Guardrail-sjekk kjøres automatisk før hvert kall.
"""
def __init__(self, base_url: str = "https://opax.vauco.no", guardrails=None):
self.base_url = base_url.rstrip("/")
self.guardrails = guardrails
self._token: str = ""
def _auth_headers(self) -> dict:
if not self._token:
self._token = _get_identity_token(self.base_url)
return {"Authorization": f"Bearer {self._token}", "Content-Type": "application/json"}
def health(self) -> dict:
r = requests.get(f"{self.base_url}/health", headers=self._auth_headers(), timeout=10)
r.raise_for_status()
return r.json()
def query(self, prompt: str) -> dict:
if self.guardrails:
ok, reason = self.guardrails.can_execute(prompt)
if not ok:
return {"error": reason}
r = requests.post(
f"{self.base_url}/api/query",
json={"prompt": prompt},
headers=self._auth_headers(),
timeout=30,
)
r.raise_for_status()
return r.json()