chat.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. from typing import Dict, List, Optional
  2. from uuid import UUID
  3. from fastapi import APIRouter, Depends, HTTPException, status
  4. from fastapi.responses import StreamingResponse
  5. from flowsint_core.core.models import Profile
  6. from flowsint_core.core.postgre_db import get_db
  7. from flowsint_core.core.services import (
  8. NotFoundError,
  9. create_chat_service,
  10. )
  11. from pydantic import BaseModel
  12. from sqlalchemy.orm import Session
  13. from app.api.deps import get_current_user
  14. from app.api.schemas.chat import ChatCreate, ChatRead
  15. router = APIRouter()
  16. class ChatRequest(BaseModel):
  17. prompt: str
  18. context: Optional[List[str]] = None
  19. @router.get("", response_model=List[ChatRead])
  20. def get_chats(
  21. db: Session = Depends(get_db), current_user: Profile = Depends(get_current_user)
  22. ):
  23. service = create_chat_service(db)
  24. return service.get_chats_for_user(current_user.id)
  25. @router.get("/investigation/{investigation_id}", response_model=List[ChatRead])
  26. def get_chats_by_investigation(
  27. investigation_id: UUID,
  28. db: Session = Depends(get_db),
  29. current_user: Profile = Depends(get_current_user),
  30. ):
  31. service = create_chat_service(db)
  32. return service.get_by_investigation(investigation_id, current_user.id)
  33. @router.post("/stream/{chat_id}")
  34. async def stream_chat(
  35. chat_id: UUID,
  36. payload: ChatRequest,
  37. db: Session = Depends(get_db),
  38. current_user: Profile = Depends(get_current_user),
  39. ):
  40. service = create_chat_service(db)
  41. try:
  42. chat = service.get_by_id(chat_id, current_user.id)
  43. except NotFoundError:
  44. raise HTTPException(status_code=404, detail="Chat not found")
  45. service.add_user_message(chat_id, current_user.id, payload.prompt, payload.context)
  46. ai_context = service.prepare_ai_context(chat, payload.prompt, payload.context)
  47. llm_messages = service.build_llm_messages(ai_context)
  48. try:
  49. provider = service.get_llm_provider(current_user.id)
  50. except ValueError as e:
  51. raise HTTPException(status_code=500, detail=str(e))
  52. return StreamingResponse(
  53. service.stream_response(chat_id, llm_messages, provider),
  54. media_type="text/event-stream",
  55. headers={"x-vercel-ai-ui-message-stream": "v1"},
  56. )
  57. @router.post("/create", response_model=ChatRead, status_code=status.HTTP_201_CREATED)
  58. def create_chat(
  59. payload: ChatCreate,
  60. db: Session = Depends(get_db),
  61. current_user: Profile = Depends(get_current_user),
  62. ):
  63. service = create_chat_service(db)
  64. return service.create(
  65. title=payload.title,
  66. description=payload.description,
  67. investigation_id=payload.investigation_id,
  68. owner_id=current_user.id,
  69. )
  70. @router.get("/{chat_id}", response_model=ChatRead)
  71. def get_chat_by_id(
  72. chat_id: UUID,
  73. db: Session = Depends(get_db),
  74. current_user: Profile = Depends(get_current_user),
  75. ):
  76. service = create_chat_service(db)
  77. try:
  78. return service.get_by_id(chat_id, current_user.id)
  79. except NotFoundError:
  80. raise HTTPException(status_code=404, detail="Chat not found")
  81. @router.delete("/{chat_id}", status_code=status.HTTP_204_NO_CONTENT)
  82. def delete_chat(
  83. chat_id: UUID,
  84. db: Session = Depends(get_db),
  85. current_user: Profile = Depends(get_current_user),
  86. ):
  87. service = create_chat_service(db)
  88. try:
  89. service.delete(chat_id, current_user.id)
  90. return None
  91. except NotFoundError:
  92. raise HTTPException(status_code=404, detail="Chat not found")