"""FastAPI router for the eval system. Mounted from navi/main.py."""
from __future__ import annotations
from typing import Literal
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel, Field
from navi.config import settings
from .db import EvalDB
router = APIRouter(prefix="/eval", tags=["eval"])
_db: EvalDB | None = None
def _get_db() -> EvalDB:
global _db
if _db is None:
if not settings.database_url:
raise HTTPException(
status_code=503,
detail="DATABASE_URL is not set; eval system requires postgres",
)
_db = EvalDB(settings.database_url)
return _db
class FeedbackIn(BaseModel):
session_id: str
message_index: int = Field(ge=0)
# 0 = clear (delete row); -1 / +1 = thumbs down / up.
rating: Literal[-1, 0, 1]
@router.post("/feedback")
async def set_feedback(payload: FeedbackIn) -> dict:
db = _get_db()
if payload.rating == 0:
await db.clear_feedback(payload.session_id, payload.message_index)
else:
await db.set_feedback(
payload.session_id, payload.message_index, payload.rating
)
return {"ok": True}
@router.get("/feedback/{session_id}")
async def list_feedback(session_id: str) -> dict:
db = _get_db()
return {"feedback": await db.list_feedback(session_id)}