openai_service.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from typing import List
  2. from fastapi import HTTPException
  3. from openai import OpenAI
  4. from config.settings import OPENAI_API_KEY
  5. from models.chat import Message
  6. from services.data_service import data_bg_loaded
  7. from logging import getLogger
  8. # Initialize OpenAI client
  9. openai_client = OpenAI(api_key=OPENAI_API_KEY)
  10. logger = getLogger(__name__)
  11. async def generate_completion(messages_array: List[Message], session_id: str) -> str:
  12. """Generate OpenAI chat completion"""
  13. if not OPENAI_API_KEY:
  14. logger.error("Error: OpenAI API key is not configured.")
  15. raise HTTPException(status_code=500, detail="OpenAI API key not configured on server.")
  16. logger.info(f"[OpenAI Service Python] Session/Token {session_id} sent: {[msg.model_dump() for msg in messages_array]}")
  17. data_for_prompt = [
  18. f'{{"pregunta": "{item.get("q", "")}", "respuesta": "{item.get("ans", "")}"}}'
  19. for item in data_bg_loaded
  20. ]
  21. data_string = "\n".join(data_for_prompt)
  22. preprompt = f"""
  23. Eres un asistente de el bar klein, tu nombre es camilo klein, usas emojis para responder.
  24. y ser carismatico con el cliente.
  25. tus responsabilidades son:
  26. - Responder preguntas sobre el menu de el bar klein
  27. - Proporcionar información sobre el menú de el bar klein
  28. - Proporcionar recomendaciones sobre el menú de el bar klein
  29. - Proporcionar información sobre la comida de el bar klein
  30. - No puedes tomar pedidos de clientes, solo informar
  31. - Debes evadir cualquier pregunta que no sea relacionada con el bar klein
  32. para esto usaras los siguientes datos:
  33. {data_string}
  34. """
  35. processed_messages: List[dict] = [{"role": "system", "content": preprompt}]
  36. processed_messages.extend([msg.model_dump() for msg in messages_array])
  37. try:
  38. completion = openai_client.chat.completions.create(
  39. model="gpt-4o-mini",
  40. messages=processed_messages, # type: ignore (OpenAI lib expects list of specific dicts)
  41. temperature=0.3,
  42. )
  43. response_content = completion.choices[0].message.content
  44. return response_content if response_content else "-1"
  45. except Exception as e:
  46. logger.error(f"Error calling OpenAI: {e}")
  47. raise HTTPException(status_code=500, detail="Error al procesar tu solicitud con OpenAI.")