from fastapi import Request, HTTPException, Depends from fastapi.responses import JSONResponse from httpx import get from models.chat import ChatCompletionRequest from models.user import User from services.openai_service.openai_service import generate_completion from services.logging_service import log_llm_response, structured_logger, LogLevel from auth.security import get_current_user import logging from fastapi import APIRouter from config.messages import SuccessResponse logger = logging.getLogger(__name__) chat_router = APIRouter() @chat_router.post("/completions") async def chat_completions(request_data: ChatCompletionRequest, request: Request, current_user: User = Depends(get_current_user)): """Get chat completions from OpenAI""" # Uses session_token (which is the antiAbuseToken) as an identifier for logging session_identifier = request.session.get("antiAbuseToken", "unknown_session") logger.info(f"Chat completion request from user {current_user.email}") structured_logger.log_chat_event( f"Chat completion request from user {current_user.email}", LogLevel.INFO, { "user_id": current_user.id, "user_email": current_user.email, "session_identifier": session_identifier, "messages_count": len(request_data.messages), "user_agent": request.headers.get("user-agent", "unknown"), "request_user": request_data.user }, user_id=current_user.id, user_email=current_user.email ) try: openai_response = await generate_completion( request_data.messages, session_identifier, current_user.name, current_user.email ) structured_logger.log_chat_event( f"Chat completion generated successfully", LogLevel.INFO, { "user_id": current_user.id, "user_email": current_user.email, "session_identifier": session_identifier, "response_length": len(openai_response), "messages_processed": len(request_data.messages) }, user_id=current_user.id, user_email=current_user.email ) # Legacy logging function log_llm_response(request_data.user, openai_response) logger.info(f"Chat completion successful for user {current_user.email}") return JSONResponse({"response": openai_response, "message": SuccessResponse.CHAT_RESPONSE_SUCCESS}) except HTTPException as e: logger.error(f"HTTP error in chat completion for user {current_user.email}: {e.detail}") structured_logger.log_chat_event( f"Chat completion HTTP error", LogLevel.ERROR, { "user_id": current_user.id, "user_email": current_user.email, "session_identifier": session_identifier, "status_code": e.status_code, "error_detail": e.detail }, user_id=current_user.id, user_email=current_user.email ) raise except Exception as e: error_msg = f"Unexpected error in /api/chat/completions for user {current_user.email}: {e}" logger.error(error_msg) structured_logger.log_chat_event( f"Chat completion unexpected error", LogLevel.ERROR, { "user_id": current_user.id, "user_email": current_user.email, "session_identifier": session_identifier, "error": str(e), "error_type": type(e).__name__, "messages_count": len(request_data.messages) }, user_id=current_user.id, user_email=current_user.email ) raise HTTPException(status_code=500, detail="Error interno del servidor al procesar el chat.")