|
import json |
|
import re |
|
import gradio as gr |
|
import time |
|
from openai import OpenAI |
|
import os |
|
from dotenv import load_dotenv |
|
|
|
|
|
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) |
|
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) |
|
|
|
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) |
|
|
|
|
|
|
|
contenido_respuesta = respuesta_api.data[1].content[0].text.value |
|
|
|
|
|
match = re.search(r'\{.*\}', contenido_respuesta, re.DOTALL) |
|
if match: |
|
json_str = match.group(0) |
|
print("JSON string extracted:", json_str) |
|
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) |
|
|
|
return "Error al procesar la respuesta de la API." |
|
else: |
|
print("No se encontró un patrón JSON válido en la respuesta.") |
|
|
|
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], |
|
outputs=resultado |
|
) |
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch() |
|
|