Vlytz commited on
Commit
31870e0
verified
1 Parent(s): ba5dc71

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +119 -113
app.py CHANGED
@@ -1,114 +1,120 @@
1
- # En: app/app.py
2
- import gradio as gr
3
- import requests # Para llamar a nuestra propia API de FastAPI
4
- import os
5
-
6
- # --- 1. Importa tu App de FastAPI ---
7
- # (Aseg煤rate de que api/main.py exista en la carpeta 'api')
8
- from api.main import app as fastapi_app
9
-
10
- # --- 2. Define la URL de tu API ---
11
- # Esto es CLAVE para que funcione en Hugging Face Spaces
12
- # Busca la URL del Space y, si no la encuentra, usa la local.
13
- BASE_URL = os.getenv("SPACE_URL", "http://127.0.0.1:7860")
14
- API_PREDICT_URL = f"{BASE_URL}/api/predict"
15
- API_COACH_URL = f"{BASE_URL}/api/coach"
16
-
17
-
18
- # --- 3. L贸gica de la Interfaz Gradio ---
19
- # Esta funci贸n es el "cerebro" de la UI.
20
- # Llama a los endpoints FALSOS de FastAPI.
21
-
22
- def chatbot_response(chat_message, chat_history, edad, sexo, asistencia, notas):
23
- """
24
- Funci贸n que Gradio ChatInterface llamar谩.
25
- Se comunica con la API (FastAPI) para obtener respuestas.
26
- """
27
-
28
- # --- Paso A: Llamar a /predict ---
29
- predict_payload = {
30
- "edad": edad,
31
- "sexo": sexo,
32
- "asistencia": asistencia,
33
- "notas": notas
34
- }
35
-
36
- try:
37
- # Llama al endpoint /predict de tu API
38
- response_predict = requests.post(API_PREDICT_URL, json=predict_payload)
39
- response_predict.raise_for_status() # Lanza un error si la API falla
40
- predict_data = response_predict.json()
41
- score = predict_data.get("score", 0.0)
42
-
43
- except requests.exceptions.RequestException as e:
44
- yield f"Error al conectar con el motor de riesgo (/predict): {e}"
45
- return
46
-
47
- # --- Paso B: Llamar a /coach ---
48
- coach_payload = {
49
- "consulta": chat_message,
50
- "riesgo": score
51
- }
52
-
53
- try:
54
- # Llama al endpoint /coach de tu API
55
- response_coach = requests.post(API_COACH_URL, json=coach_payload)
56
- response_coach.raise_for_status()
57
- coach_data = response_coach.json()
58
-
59
- # Formatear la respuesta del coach para el chat
60
- plan_texto = coach_data.get("plan", "No se pudo generar un plan.")
61
- citas = coach_data.get("citas", [])
62
-
63
- # Esta es la respuesta final que ve el usuario
64
- respuesta_final = f"**Riesgo Estimado: {score*100:.0f}%**\n\n{plan_texto}"
65
-
66
- if citas:
67
- respuesta_final += "\n\n**Fuentes (Mock):**\n"
68
- for cita in citas:
69
- respuesta_final += f"- `{cita}`\n"
70
-
71
- yield respuesta_final
72
-
73
- except requests.exceptions.RequestException as e:
74
- yield f"Error al conectar con el Coach RAG (/coach): {e}"
75
-
76
-
77
- # --- 4. Definici贸n de la UI de Gradio ---
78
- with gr.Blocks(theme=gr.themes.Soft(), title="Tutor Virtual") as demo:
79
- gr.Markdown("# 馃 Tutor Virtual Adaptativo (Demo)")
80
- gr.Markdown("Esta demo usa un backend **simulado (mock)** para pruebas.")
81
-
82
- with gr.Row():
83
- # --- Columna 1: El "Formulario" (Sidebar) ---
84
- with gr.Column(scale=1, min_width=350):
85
- with gr.Accordion("Perfil del Alumno", open=True):
86
- gr.Markdown("Ingrese los datos del alumno para la simulaci贸n.")
87
- input_edad = gr.Slider(10, 25, value=18, label="Edad")
88
- input_sexo = gr.Radio(["Masculino", "Femenino", "Otro"], value="Masculino", label="Sexo")
89
- input_asistencia = gr.Slider(0, 100, value=80, label="Asistencia (%)")
90
- input_notas = gr.Slider(1.0, 7.0, step=0.1, value=4.5, label="Promedio Notas")
91
-
92
- gr.Markdown("*(Nota: El puntaje de riesgo cambiar谩 si las notas son < 4.0)*")
93
-
94
- # --- Columna 2: El "Chat" (脕rea Principal) ---
95
- with gr.Column(scale=4):
96
- gr.ChatInterface(
97
- fn=chatbot_response,
98
- chatbot=gr.Chatbot(height=500, label="Chat con Tutor", avatar_images=("user.png", "bot.png")),
99
- textbox=gr.Textbox(placeholder="Hola, 驴en qu茅 puedo ayudarte hoy?"),
100
- submit_btn="Enviar Consulta",
101
- retry_btn=None,
102
- undo_btn=None,
103
- clear_btn="Limpiar Chat",
104
- # 隆Clave! Pasa los inputs del formulario a la funci贸n `chatbot_response`
105
- additional_inputs=[input_edad, input_sexo, input_asistencia, input_notas]
106
- )
107
-
108
- # --- 5. Montar y Lanzar (La Magia) ---
109
- # Esto le dice a Gradio que tambi茅n sirva la API de FastAPI
110
- # en la ruta "/api"
111
- app = gr.mount_app(demo, fastapi_app, path="/api")
112
-
113
- # NOTA: No uses demo.launch().
 
 
 
 
 
 
114
  # Hugging Face usar谩 la variable 'app' para lanzar el servidor.
 
1
+ # En: app/app.py
2
+ import gradio as gr
3
+ import requests # Para llamar a nuestra propia API de FastAPI
4
+ import os
5
+
6
+ # --- 1. Importa tu App de FastAPI ---
7
+ # (Aseg煤rate de que api/main.py exista en la carpeta 'api')
8
+ from api.main import app as fastapi_app
9
+
10
+ # --- 2. Define la URL de tu API ---
11
+ # Esto es CLAVE para que funcione en Hugging Face Spaces
12
+ # Busca la URL del Space y, si no la encuentra, usa la local.
13
+ BASE_URL = os.getenv("SPACE_URL", "http://127.0.0.1:7860")
14
+ API_PREDICT_URL = f"{BASE_URL}/api/predict"
15
+ API_COACH_URL = f"{BASE_URL}/api/coach"
16
+
17
+
18
+ # --- 3. L贸gica de la Interfaz Gradio ---
19
+ # Esta funci贸n es el "cerebro" de la UI.
20
+ # Llama a los endpoints FALSOS de FastAPI.
21
+
22
+ def chatbot_response(chat_message, chat_history, edad, sexo, asistencia, notas):
23
+ """
24
+ Funci贸n que Gradio ChatInterface llamar谩.
25
+ Se comunica con la API (FastAPI) para obtener respuestas.
26
+ """
27
+
28
+ # --- Paso A: Llamar a /predict ---
29
+ predict_payload = {
30
+ "edad": edad,
31
+ "sexo": sexo,
32
+ "asistencia": asistencia,
33
+ "notas": notas
34
+ }
35
+
36
+ try:
37
+ # Llama al endpoint /predict de tu API
38
+ response_predict = requests.post(API_PREDICT_URL, json=predict_payload)
39
+ response_predict.raise_for_status() # Lanza un error si la API falla
40
+ predict_data = response_predict.json()
41
+ score = predict_data.get("score", 0.0)
42
+
43
+ except requests.exceptions.RequestException as e:
44
+ yield f"Error al conectar con el motor de riesgo (/predict): {e}"
45
+ return
46
+
47
+ # --- Paso B: Llamar a /coach ---
48
+ coach_payload = {
49
+ "consulta": chat_message,
50
+ "riesgo": score
51
+ }
52
+
53
+ try:
54
+ # Llama al endpoint /coach de tu API
55
+ response_coach = requests.post(API_COACH_URL, json=coach_payload)
56
+ response_coach.raise_for_status()
57
+ coach_data = response_coach.json()
58
+
59
+ # Formatear la respuesta del coach para el chat
60
+ plan_texto = coach_data.get("plan", "No se pudo generar un plan.")
61
+ citas = coach_data.get("citas", [])
62
+
63
+ # Esta es la respuesta final que ve el usuario
64
+ respuesta_final = f"**Riesgo Estimado: {score*100:.0f}%**\n\n{plan_texto}"
65
+
66
+ if citas:
67
+ respuesta_final += "\n\n**Fuentes (Mock):**\n"
68
+ for cita in citas:
69
+ respuesta_final += f"- `{cita}`\n"
70
+
71
+ yield respuesta_final
72
+
73
+ except requests.exceptions.RequestException as e:
74
+ yield f"Error al conectar con el Coach RAG (/coach): {e}"
75
+
76
+
77
+ # --- 4. Definici贸n de la UI de Gradio ---
78
+ with gr.Blocks(theme=gr.themes.Soft(), title="Tutor Virtual") as demo:
79
+ gr.Markdown("# 馃 Tutor Virtual Adaptativo (Demo)")
80
+ gr.Markdown("Esta demo usa un backend **simulado (mock)** para pruebas.")
81
+
82
+ with gr.Row():
83
+ # --- Columna 1: El "Formulario" (Sidebar) ---
84
+ with gr.Column(scale=1, min_width=350):
85
+ with gr.Accordion("Perfil del Alumno", open=True):
86
+ gr.Markdown("Ingrese los datos del alumno para la simulaci贸n.")
87
+ input_edad = gr.Slider(10, 25, value=18, label="Edad")
88
+ input_sexo = gr.Radio(["Masculino", "Femenino", "Otro"], value="Masculino", label="Sexo")
89
+ input_asistencia = gr.Slider(0, 100, value=80, label="Asistencia (%)")
90
+ input_notas = gr.Slider(1.0, 7.0, step=0.1, value=4.5, label="Promedio Notas")
91
+
92
+ gr.Markdown("*(Nota: El puntaje de riesgo cambiar谩 si las notas son < 4.0)*")
93
+
94
+ # --- Columna 2: El "Chat" (脕rea Principal) ---
95
+ with gr.Column(scale=4):
96
+ gr.ChatInterface(
97
+ fn=chatbot_response,
98
+
99
+ chatbot=gr.Chatbot(
100
+ height=500,
101
+ label="Chat con Tutor",
102
+ avatar_images=("user.png", "bot.png"),
103
+ type='messages' # <--- 1. A脩ADE ESTA L脥NEA (para el warning)
104
+ ),
105
+
106
+ textbox=gr.Textbox(placeholder="Hola, 驴en qu茅 puedo ayudarte hoy?"),
107
+ submit_btn="Enviar Consulta",
108
+ # retry_btn=None, <--- 2. BORRA ESTA L脥NEA (para el error)
109
+ # undo_btn=None, <--- 3. BORRA ESTA L脥NEA (para el error)
110
+ clear_btn="Limpiar Chat",
111
+ additional_inputs=[input_edad, input_sexo, input_asistencia, input_notas]
112
+ )
113
+
114
+ # --- 5. Montar y Lanzar (La Magia) ---
115
+ # Esto le dice a Gradio que tambi茅n sirva la API de FastAPI
116
+ # en la ruta "/api"
117
+ app = gr.mount_app(demo, fastapi_app, path="/api")
118
+
119
+ # NOTA: No uses demo.launch().
120
  # Hugging Face usar谩 la variable 'app' para lanzar el servidor.