chat.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. from fastapi import Request, HTTPException, Depends
  2. from fastapi.responses import JSONResponse
  3. from httpx import get
  4. from models.chat import ChatCompletionRequest
  5. from models.user import User
  6. from services.openai_service.openai_service import generate_completion
  7. from services.logging_service import log_llm_response, structured_logger, LogLevel
  8. from auth.security import get_current_user
  9. import logging
  10. from fastapi import APIRouter
  11. from config.messages import SuccessResponse
  12. logger = logging.getLogger(__name__)
  13. chat_router = APIRouter()
  14. @chat_router.post("/completions")
  15. async def chat_completions(request_data: ChatCompletionRequest, request: Request, current_user: User = Depends(get_current_user)):
  16. """Get chat completions from OpenAI"""
  17. # Uses session_token (which is the antiAbuseToken) as an identifier for logging
  18. session_identifier = request.session.get("antiAbuseToken", "unknown_session")
  19. logger.info(f"Chat completion request from user {current_user.email}")
  20. structured_logger.log_chat_event(
  21. f"Chat completion request from user {current_user.email}",
  22. LogLevel.INFO,
  23. {
  24. "user_id": current_user.id,
  25. "user_email": current_user.email,
  26. "session_identifier": session_identifier,
  27. "messages_count": len(request_data.messages),
  28. "user_agent": request.headers.get("user-agent", "unknown"),
  29. "request_user": request_data.user
  30. },
  31. user_id=current_user.id,
  32. user_email=current_user.email
  33. )
  34. try:
  35. openai_response = await generate_completion(
  36. request_data.messages,
  37. session_identifier,
  38. current_user.name,
  39. current_user.email
  40. )
  41. structured_logger.log_chat_event(
  42. f"Chat completion generated successfully",
  43. LogLevel.INFO,
  44. {
  45. "user_id": current_user.id,
  46. "user_email": current_user.email,
  47. "session_identifier": session_identifier,
  48. "response_length": len(openai_response),
  49. "messages_processed": len(request_data.messages)
  50. },
  51. user_id=current_user.id,
  52. user_email=current_user.email
  53. )
  54. # Legacy logging function
  55. log_llm_response(request_data.user, openai_response)
  56. logger.info(f"Chat completion successful for user {current_user.email}")
  57. return JSONResponse({"response": openai_response, "message": SuccessResponse.CHAT_RESPONSE_SUCCESS})
  58. except HTTPException as e:
  59. logger.error(f"HTTP error in chat completion for user {current_user.email}: {e.detail}")
  60. structured_logger.log_chat_event(
  61. f"Chat completion HTTP error",
  62. LogLevel.ERROR,
  63. {
  64. "user_id": current_user.id,
  65. "user_email": current_user.email,
  66. "session_identifier": session_identifier,
  67. "status_code": e.status_code,
  68. "error_detail": e.detail
  69. },
  70. user_id=current_user.id,
  71. user_email=current_user.email
  72. )
  73. raise
  74. except Exception as e:
  75. error_msg = f"Unexpected error in /api/chat/completions for user {current_user.email}: {e}"
  76. logger.error(error_msg)
  77. structured_logger.log_chat_event(
  78. f"Chat completion unexpected error",
  79. LogLevel.ERROR,
  80. {
  81. "user_id": current_user.id,
  82. "user_email": current_user.email,
  83. "session_identifier": session_identifier,
  84. "error": str(e),
  85. "error_type": type(e).__name__,
  86. "messages_count": len(request_data.messages)
  87. },
  88. user_id=current_user.id,
  89. user_email=current_user.email
  90. )
  91. raise HTTPException(status_code=500, detail="Error interno del servidor al procesar el chat.")