"""GenAI configuration routes — model catalog, CRUD, test.""" import uuid from fastapi import APIRouter, HTTPException, Depends from fastapi.responses import JSONResponse from database import db from auth.jwt_auth import current_user, require, _audit, _config_log, _verify_config_access from config import GENAI_MODELS, GENAI_REGIONS, EMBEDDING_MODELS, OCI_REGIONS from models import GenAIConfigReq from services.genai import _call_genai router = APIRouter() @router.get("/api/genai/models") async def list_genai_models(u=Depends(current_user)): return JSONResponse( content={"models": GENAI_MODELS, "regions": GENAI_REGIONS, "embedding_models": EMBEDDING_MODELS, "oci_regions": OCI_REGIONS}, headers={"Cache-Control": "max-age=3600"}, ) @router.post("/api/genai/config") async def save_genai(req: GenAIConfigReq, u=Depends(require("admin","user"))): gid = str(uuid.uuid4()) ep = req.endpoint or f"https://inference.generativeai.{req.genai_region}.oci.oraclecloud.com" with db() as c: if req.is_default: c.execute("UPDATE genai_configs SET is_default=0 WHERE user_id=?", (u["id"],)) c.execute( """INSERT INTO genai_configs (id,user_id,name,oci_config_id,model_id,model_ocid,compartment_id, genai_region,endpoint,serving_type,dedicated_endpoint_id,temperature,max_tokens,top_p,top_k, frequency_penalty,presence_penalty,reasoning_effort,is_default) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)""", (gid, u["id"], req.name, req.oci_config_id, req.model_id, req.model_ocid, req.compartment_id, req.genai_region, ep, req.serving_type, req.dedicated_endpoint_id, req.temperature, req.max_tokens, req.top_p, req.top_k, req.frequency_penalty, req.presence_penalty, req.reasoning_effort, int(req.is_default))) _audit(u["id"], u["username"], "save_genai_config", gid, req.model_id) _config_log("genai", gid, req.name, "success", "save", f"Modelo salvo: {req.model_id} ({req.genai_region})", u["id"], u["username"]) return {"id": gid, "model_id": req.model_id, "endpoint": ep} @router.get("/api/genai/configs") async def list_genai(u=Depends(current_user)): with db() as c: if u["role"]=="admin": rows=c.execute("SELECT * FROM genai_configs").fetchall() else: rows=c.execute("SELECT * FROM genai_configs WHERE user_id=?",(u["id"],)).fetchall() return [dict(r) for r in rows] @router.delete("/api/genai/configs/{gid}") async def del_genai(gid: str, u=Depends(require("admin","user"))): _verify_config_access("genai", gid, u, require_owner=True) with db() as c: c.execute("DELETE FROM genai_configs WHERE id=?", (gid,)) return {"ok": True} @router.put("/api/genai/configs/{gid}") async def update_genai(gid: str, req: GenAIConfigReq, u=Depends(require("admin","user"))): with db() as c: existing = c.execute("SELECT * FROM genai_configs WHERE id=?", (gid,)).fetchone() if not existing: raise HTTPException(404) if u["role"] != "admin" and existing["user_id"] != u["id"]: raise HTTPException(403) ep = req.endpoint or f"https://inference.generativeai.{req.genai_region}.oci.oraclecloud.com" with db() as c: if req.is_default: c.execute("UPDATE genai_configs SET is_default=0 WHERE user_id=?", (u["id"],)) c.execute( """UPDATE genai_configs SET name=?,oci_config_id=?,model_id=?,model_ocid=?,compartment_id=?, genai_region=?,endpoint=?,serving_type=?,dedicated_endpoint_id=?,temperature=?,max_tokens=?, top_p=?,top_k=?,frequency_penalty=?,presence_penalty=?,reasoning_effort=?,is_default=? WHERE id=?""", (req.name, req.oci_config_id, req.model_id, req.model_ocid, req.compartment_id, req.genai_region, ep, req.serving_type, req.dedicated_endpoint_id, req.temperature, req.max_tokens, req.top_p, req.top_k, req.frequency_penalty, req.presence_penalty, req.reasoning_effort, int(req.is_default), gid)) _audit(u["id"], u["username"], "update_genai_config", gid, req.model_id) _config_log("genai", gid, req.name, "success", "save", f"Modelo atualizado: {req.model_id} ({req.genai_region})", u["id"], u["username"]) return {"id": gid, "model_id": req.model_id, "endpoint": ep} @router.post("/api/genai/test/{gid}") async def test_genai(gid: str, u=Depends(require("admin","user"))): _verify_config_access("genai", gid, u) with db() as c: gc = c.execute("SELECT * FROM genai_configs WHERE id=?",(gid,)).fetchone() if not gc: raise HTTPException(404) gname = gc["name"] try: resp, _, _ = _call_genai(dict(gc), "Say 'connection successful' in one short sentence.") _config_log("genai", gid, gname, "success", "test", f"GenAI OK: {resp[:200]}", u["id"], u["username"]) return {"status":"success","message":"GenAI OK","response":resp[:300]} except Exception as e: msg = str(e)[:500] _config_log("genai", gid, gname, "error", "test", msg, u["id"], u["username"]) return {"status":"error","message":msg}