openai_service.py 3.2 KB

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