Newer
Older
navi-1 / debug / eval / api.py
"""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)}