import json import re import gradio as gr import time from openai import OpenAI import os from dotenv import load_dotenv # Cargar las variables de entorno y configurar el cliente de OpenAI load_dotenv() client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) my_assistant = client.beta.assistants.retrieve("asst_m1mvLz5rtxcROa4DWYWcuRDr") def submit_message(assistant_id, thread, user_message): client.beta.threads.messages.create( thread_id=thread.id, role="user", content=user_message ) return client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant_id, ) def get_response(thread): return client.beta.threads.messages.list(thread_id=thread.id, order="asc") def submit_to_openai(nombre,demografia, ingresos, situacion_laboral, intereses, accesibilidad_tecnologia, complejidad): send_message = f"""Nombre del Curso: {nombre} Demografía Local: {demografia} Nivel de Ingresos: {ingresos} Situación Laboral: {situacion_laboral} Intereses Específicos de la Población: {intereses} Accesibilidad a la Tecnología: {accesibilidad_tecnologia} Complejidad del Curso: {complejidad}""" empty_thread = client.beta.threads.create() submit_message(my_assistant.id, empty_thread, send_message) time.sleep(19) # Esperar a que la respuesta esté disponible response = get_response(empty_thread) return response def curso_info(nombre, demografia, ingresos, situacion_laboral, intereses, accesibilidad_tecnologia, complejidad): print(nombre, demografia, ingresos, situacion_laboral, intereses, accesibilidad_tecnologia, complejidad) #sumar + 1 a cada variable para que coincida con el diccionario demografia += 1 ingresos += 1 situacion_laboral += 1 intereses += 1 accesibilidad_tecnologia += 1 complejidad += 1 respuesta_api = submit_to_openai(nombre, demografia, ingresos, situacion_laboral, intereses, accesibilidad_tecnologia, complejidad) # Extraer el contenido del segundo mensaje (índice 1) en la lista de respuestas # Asumiendo que el segundo mensaje contiene la respuesta en formato markdown (```json ...) contenido_respuesta = respuesta_api.data[1].content[0].text.value # Procesar el contenido para extraer el JSON # Eliminar los backticks triples y cualquier otro formato markdown si es necesario match = re.search(r'\{.*\}', contenido_respuesta, re.DOTALL) if match: json_str = match.group(0) print("JSON string extracted:", json_str) # Para depuración try: respuesta_json = json.loads(json_str) nombre_curso = respuesta_json.get("nombrecurso", "Nombre no disponible") calificacion = respuesta_json.get("calificacionfinal", "Calificación no disponible") if calificacion >= 4.5: emoji = "🌟🌟🌟🌟🌟" descripcion = "¡Excelente! Un curso altamente recomendado." elif calificacion >= 3.5: emoji = "🌟🌟🌟🌟" descripcion = "Muy bueno. Vale la pena considerarlo." elif calificacion >= 2.5: emoji = "🌟🌟🌟" descripcion = "Bueno, pero hay margen de mejora." elif calificacion >= 1.5: emoji = "🌟🌟" descripcion = "Regular. Podría ser mejor." else: emoji = "🌟" descripcion = "Por debajo de las expectativas." return f"Curso: {nombre_curso}\nCalificación: {calificacion} {emoji}\n{descripcion}" except json.JSONDecodeError as e: print("Error al analizar JSON:", e) # Manejar el error adecuadamente return "Error al procesar la respuesta de la API." else: print("No se encontró un patrón JSON válido en la respuesta.") # Manejar la ausencia de un patrón JSON return "No se pudo extraer la información del curso." dircionarioDemografias = { 1: "Menores de Edad", 2: "Jóvenes", 3: "Adultos", 4: "Adultos Mayores", 5: "Todos" } diccionarioIngresos = { 1: "Bajo (hasta 2 salarios mínimos)", 2: "Medio bajo (2-4 salarios mínimos)", 3: "Medio (4-6 salarios mínimos)", 4: "Medio alto (6-8 salarios mínimos)", 5: "Alto (más de 8 salarios mínimos)" } dircionarioSituacionLaboral = { 1: "Desempleado 5 Horas", 2: "Estudiante 4 Horas", 3: "Independiente 3 Horas", 4: "Estudiante 2 Horas", 5: "No Aplica 1 Horas" } dircionarioIntereses = { 1: "Ciencia y matemáticas", 2: "Desarrollo personal y profesional", 3: "Artes y humanidades", 4: "Tecnología e innovación", 5: "Salud y bienestar" } dircionarioAccesibilidadTecnologia = { 5: "Mínimo (smartphone básico)", 4: "Bajo (computadora de escritorio antigua o laptop)", 3: "Moderado (smartphone avanzado o tablet)", 2: "Alto (laptop o PC moderno)", 1: "Muy alto (múltiples dispositivos de última generación)" } diccionarioComplejidad = { 5: "Introductorio (sin conocimientos previos necesarios)", 4: "Básico (conocimientos generales del tema)", 3: "Intermedio (alguna experiencia previa necesaria)", 2: "Avanzado (experiencia significativa en el tema)", 1: "Experto (para especialistas en el tema)" } diccionarios = { "Demografía Local": dircionarioDemografias, "Nivel de Ingresos": diccionarioIngresos , "Situación Laboral": dircionarioSituacionLaboral, "Intereses Específicos de la Población": dircionarioIntereses, "Accesibilidad a la Tecnología": dircionarioAccesibilidadTecnologia, "Complejidad del Curso": diccionarioComplejidad } with gr.Blocks(theme=gr.themes.Soft()) as demo: with gr.Row(): with gr.Column(): nombre = gr.Textbox("Nombre del Curso", placeholder="Introducción a la Programación") demografia = gr.Dropdown(dircionarioDemografias.values(),type="index", label="Demografía Local") ingresos = gr.Dropdown(diccionarioIngresos.values(),type="index", label="Nivel de Ingresos") situacion_laboral = gr.Dropdown(dircionarioSituacionLaboral.values(),type="index", label="Situación Laboral") intereses = gr.Dropdown(dircionarioIntereses.values(),type="index", label="Intereses Específicos de la Población") accesibilidad_tecnologia = gr.Dropdown(dircionarioAccesibilidadTecnologia.values(),type="index", label="Accesibilidad a la Tecnología") complejidad = gr.Dropdown(diccionarioComplejidad.values(),type="index", label="Complejidad del Curso") button_submit = gr.Button("Enviar") with gr.Column(): gr.Label("Resultado"), resultado = gr.Textbox("Resultado", placeholder="Aquí aparecerá el resultado",label="Resultado") button_submit.click( curso_info, inputs=[nombre, demografia, demografia, demografia, demografia, demografia, demografia], # Actualizar según corresponda outputs=resultado ) if __name__ == "__main__": demo.launch()