import uuid import logging from typing import Optional from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from sqlalchemy.orm import Session from backend.database.db import get_db from backend.services.eval_service import run_full_pipeline, generate_response, evaluate_response router = APIRouter(prefix="/chat", tags=["chat"]) logger = logging.getLogger(__name__) class ChatRequest(BaseModel): query: str session_id: Optional[str] = None prompt_version: Optional[str] = "standard" auto_evaluate: Optional[bool] = True auto_retry: Optional[bool] = True class QuickChatRequest(BaseModel): query: str session_id: Optional[str] = None @router.post("/message") async def send_message( request: ChatRequest, db: Session = Depends(get_db) ): if not request.query.strip(): raise HTTPException( status_code=400, detail="Query cannot be empty" ) session_id = request.session_id or str(uuid.uuid4()) try: if request.auto_evaluate: result = run_full_pipeline( query=request.query, session_id=session_id, db=db ) return result else: gen = generate_response( query=request.query, prompt_version=request.prompt_version or "standard", db=db, session_id=session_id ) return gen except Exception as e: logger.error( f"Chat API error: {e}", exc_info=True ) return { "session_id": session_id, "query": request.query, "response": ( "System is temporarily busy. " "Please try again in a few seconds." ), "evaluation": None, "error": str(e) }