chat.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. from fastapi import APIRouter, HTTPException, UploadFile, File, Query
  2. from app.services.qa import get_answer, ask_rag
  3. from app.schemas.chat import ChatRequest, ChatResponse
  4. import time
  5. router = APIRouter()
  6. @router.post("/chat/")
  7. async def chat(request: ChatRequest, session_id: str = "default_session"):
  8. start_time = time.time()
  9. try:
  10. answer = get_answer(session_id, request.message)
  11. latency_ms = int((time.time() - start_time) * 1000)
  12. return ChatResponse(answer=answer, latency_ms=latency_ms)
  13. except Exception as e:
  14. raise HTTPException(status_code=500, detail=f"Ollama call failed with error: {str(e)}")
  15. @router.post("/ask/")
  16. async def ask(session_id: str = Query("default_session"), question: str = Query(...), file: UploadFile = File(None)):
  17. start_time = time.time()
  18. try:
  19. file_content = None
  20. file_name = None
  21. if file:
  22. file_content = await file.read()
  23. file_name = file.filename
  24. if not file_name.endswith(('.txt', '.md')):
  25. raise HTTPException(status_code=400, detail="Only .txt or .md files are supported")
  26. result = ask_rag(session_id, question, file_content, file_name)
  27. latency_ms = int((time.time() - start_time) * 1000)
  28. return {"answer": result["answer"], "sources": result["sources"], "latency_ms": latency_ms}
  29. except Exception as e:
  30. raise HTTPException(status_code=500, detail=f"Ollama call failed with error: {str(e)}")
  31. @router.get("/health")
  32. async def health():
  33. return {"status": "healthy"}