chat.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from fastapi import APIRouter, HTTPException, UploadFile, File, Form
  2. from app.services.qa import get_answer, ask_rag
  3. from app.schemas.chat import ChatRequest, AskRequest, ChatResponse, AskResponse
  4. import time
  5. from datetime import datetime
  6. router = APIRouter()
  7. @router.post("/chat/")
  8. async def chat(request: ChatRequest, session_id: str = "default_session"):
  9. start_time = time.time()
  10. try:
  11. answer = get_answer(session_id, request.message)
  12. latency_ms = int((time.time() - start_time) * 1000)
  13. return ChatResponse(answer=answer, latency_ms=latency_ms)
  14. except Exception as e:
  15. raise HTTPException(status_code=500, detail=f"Ollama call failed with error: {str(e)}")
  16. @router.post("/ask/")
  17. async def ask(session_id: str = Form("default_session"), question: str = Form(...), file: UploadFile = File(None)):
  18. start_time = time.time()
  19. try:
  20. file_content = None
  21. file_name = None
  22. if file:
  23. file_content = await file.read()
  24. file_name = file.filename
  25. if not file_name.endswith(('.txt', '.md')):
  26. raise HTTPException(status_code=400, detail="Only .txt or .md files are supported")
  27. result = ask_rag(session_id, question, file_content, file_name)
  28. latency_ms = int((time.time() - start_time) * 1000)
  29. return AskResponse(answer=result["answer"], sources=result["sources"], latency_ms=latency_ms)
  30. except Exception as e:
  31. raise HTTPException(status_code=500, detail=f"Ollama call failed with error: {str(e)}")
  32. @router.get("/health")
  33. async def health():
  34. current_time = datetime.utcnow().isoformat() + "Z" # UTC time with 'Z' suffix
  35. log_entry = {
  36. "timestamp": current_time,
  37. "level": "INFO",
  38. "message": "Health check successful",
  39. "status": "healthy",
  40. "service": "chat-api",
  41. "version": "1.0.0", # Example version, adjust as needed
  42. }
  43. return log_entry