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