import gradio as gr from openai import OpenAI import time import os from dotenv import load_dotenv import json load_dotenv() api_key = os.getenv("OPENAI_API_KEY") if not api_key: raise ValueError("No se encontró la API key de OpenAI. Asegúrate de configurar la variable de entorno OPENAI_API_KEY.") client = OpenAI(api_key=api_key) print("Cliente OpenAI inicializado") assistant_id = "asst_0hq3iRy6LX0YLZP0QVzg17fT" def add_message(history, message): if message.strip() != "": history.append((message, None)) return history, gr.Textbox(value="", interactive=True) def bot(history): print("Iniciando función bot") try: last_message = history[-1][0] if history else "Hola" print(f"Último mensaje: {last_message}") thread = client.beta.threads.create() print(f"Hilo creado: {thread.id}") client.beta.threads.messages.create( thread_id=thread.id, role="user", content=last_message ) print("Mensaje del usuario añadido al hilo") run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant_id ) print(f"Ejecución iniciada: {run.id}") timeout = 120 start_time = time.time() while run.status not in ["completed", "failed", "cancelled"]: if time.time() - start_time > timeout: print("Tiempo de espera agotado") client.beta.threads.runs.cancel(thread_id=thread.id, run_id=run.id) return history + [("Lo siento, la respuesta está tardando demasiado. Por favor, intenta reformular tu pregunta.", None)] time.sleep(2) run = client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=run.id) print(f"Estado de la ejecución: {run.status}") if run.status == "requires_action": print("La ejecución requiere una acción") required_actions = run.required_action.submit_tool_outputs.tool_calls tool_outputs = [] for action in required_actions: function_name = action.function.name function_args = json.loads(action.function.arguments) # Aquí simplemente pasamos la llamada a la función al asistente result = json.dumps({ "function_called": function_name, "arguments": function_args }) tool_outputs.append({ "tool_call_id": action.id, "output": result }) client.beta.threads.runs.submit_tool_outputs( thread_id=thread.id, run_id=run.id, tool_outputs=tool_outputs ) continue if run.status != "completed": print(f"La ejecución terminó con estado: {run.status}") return history + [("Lo siento, hubo un problema al procesar tu mensaje. Por favor, intenta de nuevo o reformula tu pregunta.", None)] messages = client.beta.threads.messages.list(thread_id=thread.id) print("Mensajes recuperados del hilo") bot_response = "" for message in messages.data: if message.role == "assistant": for content in message.content: if content.type == 'text': bot_response += content.text.value + "\n" if not bot_response: print("No se encontró respuesta del asistente") bot_response = "Lo siento, no pude generar una respuesta. Por favor, intenta reformular tu pregunta." print(f"Respuesta del bot: {bot_response}") history[-1] = (history[-1][0], bot_response.strip()) return history except Exception as e: print(f"Error en la función bot: {e}") return history + [("Lo siento, ocurrió un error inesperado. Por favor, intenta de nuevo.", None)] with gr.Blocks(fill_height=True) as demo: chatbot = gr.Chatbot( elem_id="chatbot", bubble_full_width=False, scale=1, ) chat_input = gr.Textbox( interactive=True, placeholder="Escribe tu mensaje aquí...", show_label=False ) chat_msg = chat_input.submit(add_message, [chatbot, chat_input], [chatbot, chat_input]) bot_msg = chat_msg.then(bot, chatbot, chatbot, api_name="bot_response") bot_msg.then(lambda: gr.Textbox(interactive=True), None, [chat_input]) print("Iniciando la aplicación Gradio") demo.queue() demo.launch()