mirror of
https://github.com/reconurge/flowsint.git
synced 2026-03-08 23:04:17 -05:00
115 lines
3.4 KiB
Python
115 lines
3.4 KiB
Python
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")
|