import logging from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from db.session import get_session from models.requests import ChatRequest from models.responses import ChatResponse, SourceInfo from services import chat_service logger = logging.getLogger(__name__) router = APIRouter(prefix="/chat", tags=["chat"]) @router.post("", response_model=ChatResponse) async def chat(req: ChatRequest, session: AsyncSession = Depends(get_session)): from main import llm_client, router_client, vectorstore_service if vectorstore_service is None or llm_client is None or router_client is None: raise HTTPException(status_code=503, detail="Service not ready") try: result = await chat_service.send_message( session=session, vectorstore=vectorstore_service, llm=llm_client, router=router_client, text=req.text, thread_id=req.thread_id, top_k=req.top_k, temperature=req.temperature, max_tokens=req.max_tokens, ) except LookupError as e: raise HTTPException(status_code=404, detail=str(e)) except Exception as e: logger.exception("Chat failed") raise HTTPException(status_code=500, detail=f"Chat error [{type(e).__name__}]: {e}") return ChatResponse( thread_id=result["thread_id"], thread_name=result["thread_name"], message_id=result["message_id"], intent_code=result["intent_code"], intent_name=result["intent_name"], config_version=result["config_version"], router_version=result.get("router_version"), answer=result["answer"], sources=[SourceInfo(**s) for s in result["sources"]], model_used=result["model_used"], assembled_prompt=result["assembled_prompt"], )