demoIAC / app.py
JavierIA's picture
sdsdas
1020f78
raw
history blame
7.24 kB
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()