Aasher/Flexx_Your_Homework_Assistant
0
1from fastapi import APIRouter, HTTPException, Depends2from fastapi.responses import StreamingResponse3import json4from typing import AsyncGenerator5 6from models.chat import ChatRequest, ChatResponse, StreamResponse7from services.chat_service import ChatService8 9chat_router = APIRouter(prefix="/chat", tags=["chat"])10 11def get_chat_service():12 return ChatService()13 14@chat_router.post("/", response_model=ChatResponse)15async def chat_completion(16 request: ChatRequest,17 chat_service: ChatService = Depends(get_chat_service)18):19 """20 Process chat completion request21 """22 try:23 response = await chat_service.process_chat(request)24 return response25 except Exception as e:26 raise HTTPException(status_code=500, detail=str(e))27 28@chat_router.post("/stream")29async def chat_stream(30 request: ChatRequest,31 chat_service: ChatService = Depends(get_chat_service)32):33 """34 Stream chat completion response35 """36 try:37 async def generate_stream() -> AsyncGenerator[str, None]:38 async for chunk in chat_service.stream_chat(request):39 yield f"data: {json.dumps(chunk.model_dump())}\n\n"40 41 # Send final message42 final_chunk = StreamResponse(finished=True)43 yield f"data: {json.dumps(final_chunk.model_dump())}\n\n"44 45 return StreamingResponse(46 generate_stream(),47 media_type="text/plain",48 headers={"Cache-Control": "no-cache", "Connection": "keep-alive"}49 )50 except Exception as e:51 error_chunk = StreamResponse(error=str(e), finished=True)52 async def error_stream():53 yield f"data: {json.dumps(error_chunk.model_dump())}\n\n"54 55 return StreamingResponse(56 error_stream(),57 media_type="text/plain",58 status_code=50059 )