from fastapi import APIRouter, HTTPException, Depends from sqlalchemy.orm import Session from app.api.dependencies import ServiceContainer, get_db from app.api import schemas from typing import AsyncGenerator def create_sessions_router(services: ServiceContainer) -> APIRouter: router = APIRouter(prefix="/sessions", tags=["Sessions"]) @router.post("/", response_model=schemas.Session, summary="Create a New Chat Session") def create_session( request: schemas.SessionCreate, db: Session = Depends(get_db) ): try: new_session = services.rag_service.create_session( db=db, user_id=request.user_id, model=request.model ) return new_session except Exception as e: raise HTTPException(status_code=500, detail=f"Failed to create session: {e}") @router.post("/{session_id}/chat", response_model=schemas.ChatResponse, summary="Send a Message in a Session") async def chat_in_session( session_id: int, request: schemas.ChatRequest, db: Session = Depends(get_db) ): try: response_text, model_used = await services.rag_service.chat_with_rag( db=db, session_id=session_id, prompt=request.prompt, model=request.model, load_faiss_retriever=request.load_faiss_retriever ) return schemas.ChatResponse(answer=response_text, model_used=model_used) except Exception as e: raise HTTPException(status_code=500, detail=f"An error occurred during chat: {e}") @router.get("/{session_id}/messages", response_model=schemas.MessageHistoryResponse, summary="Get Session Chat History") def get_session_messages(session_id: int, db: Session = Depends(get_db)): try: messages = services.rag_service.get_message_history(db=db, session_id=session_id) if messages is None: raise HTTPException(status_code=404, detail=f"Session with ID {session_id} not found.") return schemas.MessageHistoryResponse(session_id=session_id, messages=messages) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500, detail=f"An error occurred: {e}") return router