Fase 0 complete: extract all business logic, auth, database, and 176 endpoints from monolithic app.py into dedicated modules. Structure: - app.py: FastAPI hub (CORS, routers, startup/shutdown) - models.py: 13 Pydantic request models - utils.py: shared utilities (embed status, upload validation, process registries) - config.py: constants, env vars, model catalogs - auth/: crypto, jwt_auth, oidc, rate_limit - database/: db(), init_db(), schema DDL - services/: genai, compliance, chat, terraform, embeddings, cis_reports, mcp - routes/: 13 APIRouter modules (auth, users, oci_config, oci_explorer, genai, mcp, adb, embeddings, reports, chat, terraform, settings, cis_engine) Also: README updated with OCIR auth instructions for manual docker run. 86 tests passing.
92 lines
5.0 KiB
Python
92 lines
5.0 KiB
Python
"""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}
|