| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- from typing import Dict, List, Optional
- from uuid import UUID
- from fastapi import APIRouter, Depends, HTTPException, status
- from fastapi.responses import StreamingResponse
- from flowsint_core.core.models import Profile
- from flowsint_core.core.postgre_db import get_db
- from flowsint_core.core.services import (
- NotFoundError,
- create_chat_service,
- )
- from pydantic import BaseModel
- from sqlalchemy.orm import Session
- from app.api.deps import get_current_user
- from app.api.schemas.chat import ChatCreate, ChatRead
- router = APIRouter()
- class ChatRequest(BaseModel):
- prompt: str
- context: Optional[List[str]] = None
- @router.get("", response_model=List[ChatRead])
- def get_chats(
- db: Session = Depends(get_db), current_user: Profile = Depends(get_current_user)
- ):
- service = create_chat_service(db)
- return service.get_chats_for_user(current_user.id)
- @router.get("/investigation/{investigation_id}", response_model=List[ChatRead])
- def get_chats_by_investigation(
- investigation_id: UUID,
- db: Session = Depends(get_db),
- current_user: Profile = Depends(get_current_user),
- ):
- service = create_chat_service(db)
- return service.get_by_investigation(investigation_id, current_user.id)
- @router.post("/stream/{chat_id}")
- async def stream_chat(
- chat_id: UUID,
- payload: ChatRequest,
- db: Session = Depends(get_db),
- current_user: Profile = Depends(get_current_user),
- ):
- service = create_chat_service(db)
- try:
- chat = service.get_by_id(chat_id, current_user.id)
- except NotFoundError:
- raise HTTPException(status_code=404, detail="Chat not found")
- service.add_user_message(chat_id, current_user.id, payload.prompt, payload.context)
- ai_context = service.prepare_ai_context(chat, payload.prompt, payload.context)
- llm_messages = service.build_llm_messages(ai_context)
- try:
- provider = service.get_llm_provider(current_user.id)
- except ValueError as e:
- raise HTTPException(status_code=500, detail=str(e))
- return StreamingResponse(
- service.stream_response(chat_id, llm_messages, provider),
- media_type="text/event-stream",
- headers={"x-vercel-ai-ui-message-stream": "v1"},
- )
- @router.post("/create", response_model=ChatRead, status_code=status.HTTP_201_CREATED)
- def create_chat(
- payload: ChatCreate,
- db: Session = Depends(get_db),
- current_user: Profile = Depends(get_current_user),
- ):
- service = create_chat_service(db)
- return service.create(
- title=payload.title,
- description=payload.description,
- investigation_id=payload.investigation_id,
- owner_id=current_user.id,
- )
- @router.get("/{chat_id}", response_model=ChatRead)
- def get_chat_by_id(
- chat_id: UUID,
- db: Session = Depends(get_db),
- current_user: Profile = Depends(get_current_user),
- ):
- service = create_chat_service(db)
- try:
- return service.get_by_id(chat_id, current_user.id)
- except NotFoundError:
- raise HTTPException(status_code=404, detail="Chat not found")
- @router.delete("/{chat_id}", status_code=status.HTTP_204_NO_CONTENT)
- def delete_chat(
- chat_id: UUID,
- db: Session = Depends(get_db),
- current_user: Profile = Depends(get_current_user),
- ):
- service = create_chat_service(db)
- try:
- service.delete(chat_id, current_user.id)
- return None
- except NotFoundError:
- raise HTTPException(status_code=404, detail="Chat not found")
|