caissaa23 commited on
Commit
52cc649
·
verified ·
1 Parent(s): 2c71b00

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -100
app.py CHANGED
@@ -1,5 +1,6 @@
1
  import gradio as gr
2
  import random
 
3
  from datetime import datetime
4
  from chatbot_nuti import buscar_respuesta
5
  from coach_emocional import coach_emocional_inteligente
@@ -13,6 +14,8 @@ MEMORIA_COACH = []
13
  calorias_totales = 0
14
  calorias_restantes = 0
15
  historial_comidas = []
 
 
16
 
17
  # ---------- CHATBOT NUTI ---------- #
18
  def conversar_nuti(mensaje, historial):
@@ -22,6 +25,7 @@ def conversar_nuti(mensaje, historial):
22
  historial = historial + [(mensaje, respuesta)]
23
  return historial, ""
24
 
 
25
  # ---------- COACH EMOCIONAL ---------- #
26
  def conversar_coach(mensaje, historial):
27
  MEMORIA_COACH.append({"user": mensaje})
@@ -30,6 +34,7 @@ def conversar_coach(mensaje, historial):
30
  historial = historial + [(mensaje, respuesta)]
31
  return historial, ""
32
 
 
33
  # ---------- CÁLCULO DE CALORÍAS ---------- #
34
  def calcular_calorias(edad, peso, altura, genero, actividad, meta):
35
  global calorias_totales, calorias_restantes
@@ -48,7 +53,6 @@ def calcular_calorias(edad, peso, altura, genero, actividad, meta):
48
 
49
  calorias_base = bmr * factores.get(actividad.lower(), 1.55)
50
 
51
- # Ajuste según meta del usuario
52
  if meta.lower() == "bajar de peso":
53
  calorias_totales = round(calorias_base * 0.8)
54
  elif meta.lower() == "subir de peso":
@@ -60,23 +64,17 @@ def calcular_calorias(edad, peso, altura, genero, actividad, meta):
60
  return f"🎯 Tu meta es **{meta.lower()}**.\n🔥 Puedes consumir aproximadamente **{calorias_totales} calorías por día**."
61
 
62
 
63
- # ---------- SIMULACIÓN DE RELOJ INTELIGENTE ---------- #
64
  def calorias_reloj(calorias_quemadas):
65
  global calorias_restantes
66
  calorias_restantes += calorias_quemadas
67
  return f"⌚ Has quemado **{calorias_quemadas} kcal** según tu reloj. Te quedan **{calorias_restantes} kcal** disponibles hoy."
68
 
69
- # ---------- DETECCIÓN DE COMIDA POR FOTO (SIMULADA) ---------- #
 
70
  def analizar_foto(imagen):
71
- """
72
- Aquí normalmente se usaría un modelo de visión (por ejemplo, FoodAI o CLIP)
73
- para detectar la comida y estimar las calorías.
74
- En esta versión simulamos un reconocimiento básico.
75
- """
76
  if imagen is None:
77
- return "⚠️ Sube una foto de tu comida."
78
-
79
- # Simulación de detección aleatoria de platillos
80
  comidas = [
81
  ("Ensalada de pollo", 350),
82
  ("Hamburguesa con papas", 800),
@@ -90,7 +88,7 @@ def analizar_foto(imagen):
90
  nombre, calorias = random.choice(comidas)
91
  return f"🍽️ Parece que comiste **{nombre}** (~{calorias} kcal).", calorias
92
 
93
- # ---------- REGISTRO Y RESTA DE CALORÍAS ---------- #
94
  def registrar_comida(imagen):
95
  global calorias_restantes, historial_comidas
96
  info, calorias = analizar_foto(imagen)
@@ -100,6 +98,7 @@ def registrar_comida(imagen):
100
  historial_comidas.append({"comida": info, "calorias": calorias})
101
  return f"{info}\n\n🔥 Calorías restantes del día: **{calorias_restantes} kcal**."
102
 
 
103
  def mostrar_historial():
104
  if not historial_comidas:
105
  return "📭 Aún no has registrado comidas hoy."
@@ -109,14 +108,15 @@ def mostrar_historial():
109
  texto += f"\n🔥 Te quedan **{calorias_restantes} kcal** por consumir hoy."
110
  return texto
111
 
 
112
  # ---------- RECETAS ---------- #
113
- RECETAS = []
114
  def subir_receta(nombre, descripcion, imagen):
115
  if nombre and descripcion:
116
  RECETAS.append({"nombre": nombre, "descripcion": descripcion, "imagen": imagen})
117
  return f"✅ Receta '{nombre}' añadida correctamente."
118
  return "⚠️ Ingresa nombre y descripción."
119
 
 
120
  def mostrar_recetas():
121
  if not RECETAS:
122
  return "📭 No hay recetas cargadas aún."
@@ -125,36 +125,13 @@ def mostrar_recetas():
125
  texto += f"**{r['nombre']}**\n{r['descripcion']}\n\n"
126
  return texto
127
 
 
128
  # ---------- BUSCADOR DE NUTRIÓLOGOS ---------- #
129
  def buscar_nutriologos(pais, estado, ciudad):
130
  ejemplos = [
131
- {
132
- "nombre": "Dra. Sofía Martínez",
133
- "pais": "México",
134
- "estado": "Sonora",
135
- "ciudad": "Hermosillo",
136
- "especialidad": "Nutrición deportiva",
137
- "redes": "@nutrisofi (Instagram)",
138
- "reseña": "⭐️⭐️⭐️⭐️⭐️ 4.9"
139
- },
140
- {
141
- "nombre": "Lic. Andrés Gómez",
142
- "pais": "México",
143
- "estado": "CDMX",
144
- "ciudad": "Coyoacán",
145
- "especialidad": "Nutrición clínica",
146
- "redes": "@andresnutricion (TikTok)",
147
- "reseña": "⭐️⭐️⭐️⭐️ 4.7"
148
- },
149
- {
150
- "nombre": "Dra. Camila Silva",
151
- "pais": "Chile",
152
- "estado": "Región Metropolitana",
153
- "ciudad": "Santiago",
154
- "especialidad": "Salud emocional",
155
- "redes": "@camila.wellness (Instagram)",
156
- "reseña": "⭐️⭐️⭐️⭐️⭐️ 5.0"
157
- }
158
  ]
159
  resultados = [n for n in ejemplos if n["pais"].lower() == pais.lower() or n["ciudad"].lower() == ciudad.lower() or n["estado"].lower() == estado.lower()]
160
  if not resultados:
@@ -164,59 +141,40 @@ def buscar_nutriologos(pais, estado, ciudad):
164
  texto += f"**{n['nombre']}** - {n['especialidad']} ({n['ciudad']}, {n['pais']})\n📱 {n['redes']}\n💬 {n['reseña']}\n\n"
165
  return texto
166
 
167
- # ---------- INTERFAZ PRINCIPAL ---------- #
 
168
  def main():
169
  with gr.Blocks(title="NutriBot IA 🥗") as app:
170
  gr.Markdown("# 🧠 Bienvenido a **NutriBot IA** 🍎")
171
- gr.Markdown("Comer sano, inteligente y divertido.🌿")
172
-
173
- # --- DATOS PERSONALES / PERFIL DE SALUD --- #
174
- with gr.Tab("👤 Datos Personales"):
175
- with gr.Row():
176
- nombre = gr.Textbox(label="Nombre completo")
177
- edad = gr.Number(label="Edad (años)")
178
- peso = gr.Number(label="Peso (kg)")
179
- altura = gr.Number(label="Altura (cm)")
180
- genero = gr.Radio(["Hombre", "Mujer"], label="Género")
181
- actividad = gr.Dropdown(
182
- ["Sedentario", "Ligero", "Moderado", "Activo", "Muy activo"],
183
- label="Nivel de actividad física"
184
- )
185
- meta = gr.Radio(
186
- ["Bajar de peso", "Mantener peso", "Subir de peso"],
187
- label="🎯 Meta personal"
188
- )
189
-
190
- condicion = gr.Textbox(
191
- label="🩺 ¿Tienes alguna enfermedad o condición alimenticia?",
192
- placeholder="Ejemplo: diabetes, hipertensión, intolerancia a la lactosa..."
193
- )
194
-
195
- guardar_datos = gr.Button("Guardar información 🧾")
196
- salida_datos = gr.Markdown()
197
-
198
- def guardar_informacion(nombre, edad, peso, altura, genero, actividad, meta, condicion):
199
- perfil = {
200
- "nombre": nombre,
201
- "edad": edad,
202
- "peso": peso,
203
- "altura": altura,
204
- "genero": genero,
205
- "actividad": actividad,
206
- "meta": meta,
207
- "condicion": condicion
208
- }
209
- with open("perfil_usuario.json", "w") as f:
210
- json.dump(perfil, f, indent=4)
211
- return f"✅ Información guardada. Nuti ahora sabe que tienes: **{condicion or 'ninguna condición registrada'}**."
212
-
213
- guardar_datos.click(
214
- guardar_informacion,
215
- inputs=[nombre, edad, peso, altura, genero, actividad, meta, condicion],
216
- outputs=salida_datos
217
- )
218
-
219
- # --- FOTO DE COMIDA --- #
220
  with gr.Tab("📸 Registro de Comidas"):
221
  gr.Markdown("Sube una foto de tu comida y NutriBot estimará las calorías 🍽️")
222
  imagen = gr.Image(label="Foto de tu comida", type="filepath")
@@ -228,41 +186,36 @@ with gr.Tab("👤 Datos Personales"):
228
  salida_historial = gr.Markdown()
229
  boton_historial.click(mostrar_historial, outputs=salida_historial)
230
 
231
- # --- RELOJ INTELIGENTE --- #
232
  with gr.Tab("⌚ Calorías del Reloj"):
233
  calorias_quemadas = gr.Number(label="Calorías quemadas (reloj inteligente)")
234
  boton_reloj = gr.Button("Actualizar 🔁")
235
  salida_reloj = gr.Markdown()
236
  boton_reloj.click(calorias_reloj, inputs=[calorias_quemadas], outputs=salida_reloj)
237
 
238
- # --- CHAT NUTI --- #
239
  with gr.Tab("🤖 Chat con Nuti"):
240
  chat_nuti = gr.Chatbot(label="Nuti - Tu guía de nutrición 🍎")
241
  entrada_nuti = gr.Textbox(label="Escribe algo para Nuti...")
242
  boton_nuti = gr.Button("Enviar")
243
  boton_nuti.click(conversar_nuti, inputs=[entrada_nuti, chat_nuti], outputs=[chat_nuti, entrada_nuti])
244
 
245
- # --- COACH EMOCIONAL --- #
246
  with gr.Tab("🧘 Coach Emocional"):
247
  chat_coach = gr.Chatbot(label="Coach Emocional 🌿")
248
  entrada_coach = gr.Textbox(label="Cuéntame cómo te sientes hoy...")
249
  boton_coach = gr.Button("Enviar")
250
  boton_coach.click(conversar_coach, inputs=[entrada_coach, chat_coach], outputs=[chat_coach, entrada_coach])
251
 
252
- # --- RECETAS --- #
253
  with gr.Tab("🍽️ Recetas del Nutriólogo"):
254
- nombre = gr.Textbox(label="Nombre de la receta")
255
  descripcion = gr.Textbox(label="Descripción o ingredientes")
256
  imagen_receta = gr.Image(label="Imagen (opcional)")
257
  boton_subir = gr.Button("Subir receta")
258
  salida_subir = gr.Textbox(label="Estado")
259
- boton_subir.click(subir_receta, inputs=[nombre, descripcion, imagen_receta], outputs=salida_subir)
260
 
261
  boton_ver = gr.Button("Ver recetas disponibles 🍲")
262
  salida_recetas = gr.Markdown()
263
  boton_ver.click(mostrar_recetas, outputs=salida_recetas)
264
 
265
- # --- RETOS SALUDABLES --- #
266
  with gr.Tab("🎯 Retos Saludables"):
267
  salida_retos = gr.Markdown()
268
  boton_ver_retos = gr.Button("Ver Retos del Día")
@@ -272,8 +225,6 @@ with gr.Tab("👤 Datos Personales"):
272
  boton_completar = gr.Button("Completar Reto 🏅")
273
  boton_completar.click(completar_reto, inputs=[numero_reto], outputs=salida_retos)
274
 
275
-
276
- # --- NUTRIÓLOGOS --- #
277
  with gr.Tab("🧑‍⚕️ Buscar Nutriólogos"):
278
  pais = gr.Textbox(label="País")
279
  estado = gr.Textbox(label="Estado")
@@ -282,7 +233,8 @@ with gr.Tab("👤 Datos Personales"):
282
  salida_nutri = gr.Markdown()
283
  boton_buscar.click(buscar_nutriologos, inputs=[pais, estado, ciudad], outputs=salida_nutri)
284
 
285
- app.launch()
 
286
 
287
  if __name__ == "__main__":
288
  main()
 
1
  import gradio as gr
2
  import random
3
+ import json
4
  from datetime import datetime
5
  from chatbot_nuti import buscar_respuesta
6
  from coach_emocional import coach_emocional_inteligente
 
14
  calorias_totales = 0
15
  calorias_restantes = 0
16
  historial_comidas = []
17
+ RECETAS = []
18
+
19
 
20
  # ---------- CHATBOT NUTI ---------- #
21
  def conversar_nuti(mensaje, historial):
 
25
  historial = historial + [(mensaje, respuesta)]
26
  return historial, ""
27
 
28
+
29
  # ---------- COACH EMOCIONAL ---------- #
30
  def conversar_coach(mensaje, historial):
31
  MEMORIA_COACH.append({"user": mensaje})
 
34
  historial = historial + [(mensaje, respuesta)]
35
  return historial, ""
36
 
37
+
38
  # ---------- CÁLCULO DE CALORÍAS ---------- #
39
  def calcular_calorias(edad, peso, altura, genero, actividad, meta):
40
  global calorias_totales, calorias_restantes
 
53
 
54
  calorias_base = bmr * factores.get(actividad.lower(), 1.55)
55
 
 
56
  if meta.lower() == "bajar de peso":
57
  calorias_totales = round(calorias_base * 0.8)
58
  elif meta.lower() == "subir de peso":
 
64
  return f"🎯 Tu meta es **{meta.lower()}**.\n🔥 Puedes consumir aproximadamente **{calorias_totales} calorías por día**."
65
 
66
 
67
+ # ---------- RELOJ INTELIGENTE ---------- #
68
  def calorias_reloj(calorias_quemadas):
69
  global calorias_restantes
70
  calorias_restantes += calorias_quemadas
71
  return f"⌚ Has quemado **{calorias_quemadas} kcal** según tu reloj. Te quedan **{calorias_restantes} kcal** disponibles hoy."
72
 
73
+
74
+ # ---------- DETECCIÓN DE COMIDA (SIMULADA) ---------- #
75
  def analizar_foto(imagen):
 
 
 
 
 
76
  if imagen is None:
77
+ return "⚠️ Sube una foto de tu comida.", 0
 
 
78
  comidas = [
79
  ("Ensalada de pollo", 350),
80
  ("Hamburguesa con papas", 800),
 
88
  nombre, calorias = random.choice(comidas)
89
  return f"🍽️ Parece que comiste **{nombre}** (~{calorias} kcal).", calorias
90
 
91
+
92
  def registrar_comida(imagen):
93
  global calorias_restantes, historial_comidas
94
  info, calorias = analizar_foto(imagen)
 
98
  historial_comidas.append({"comida": info, "calorias": calorias})
99
  return f"{info}\n\n🔥 Calorías restantes del día: **{calorias_restantes} kcal**."
100
 
101
+
102
  def mostrar_historial():
103
  if not historial_comidas:
104
  return "📭 Aún no has registrado comidas hoy."
 
108
  texto += f"\n🔥 Te quedan **{calorias_restantes} kcal** por consumir hoy."
109
  return texto
110
 
111
+
112
  # ---------- RECETAS ---------- #
 
113
  def subir_receta(nombre, descripcion, imagen):
114
  if nombre and descripcion:
115
  RECETAS.append({"nombre": nombre, "descripcion": descripcion, "imagen": imagen})
116
  return f"✅ Receta '{nombre}' añadida correctamente."
117
  return "⚠️ Ingresa nombre y descripción."
118
 
119
+
120
  def mostrar_recetas():
121
  if not RECETAS:
122
  return "📭 No hay recetas cargadas aún."
 
125
  texto += f"**{r['nombre']}**\n{r['descripcion']}\n\n"
126
  return texto
127
 
128
+
129
  # ---------- BUSCADOR DE NUTRIÓLOGOS ---------- #
130
  def buscar_nutriologos(pais, estado, ciudad):
131
  ejemplos = [
132
+ {"nombre": "Dra. Sofía Martínez", "pais": "México", "estado": "Sonora", "ciudad": "Hermosillo", "especialidad": "Nutrición deportiva", "redes": "@nutrisofi (Instagram)", "reseña": "⭐️⭐️⭐️⭐️⭐️ 4.9"},
133
+ {"nombre": "Lic. Andrés Gómez", "pais": "México", "estado": "CDMX", "ciudad": "Coyoacán", "especialidad": "Nutrición clínica", "redes": "@andresnutricion (TikTok)", "reseña": "⭐️⭐️⭐️⭐️ 4.7"},
134
+ {"nombre": "Dra. Camila Silva", "pais": "Chile", "estado": "Región Metropolitana", "ciudad": "Santiago", "especialidad": "Salud emocional", "redes": "@camila.wellness (Instagram)", "reseña": "⭐️⭐️⭐️⭐️⭐️ 5.0"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
  ]
136
  resultados = [n for n in ejemplos if n["pais"].lower() == pais.lower() or n["ciudad"].lower() == ciudad.lower() or n["estado"].lower() == estado.lower()]
137
  if not resultados:
 
141
  texto += f"**{n['nombre']}** - {n['especialidad']} ({n['ciudad']}, {n['pais']})\n📱 {n['redes']}\n💬 {n['reseña']}\n\n"
142
  return texto
143
 
144
+
145
+ # ---------- INTERFAZ ---------- #
146
  def main():
147
  with gr.Blocks(title="NutriBot IA 🥗") as app:
148
  gr.Markdown("# 🧠 Bienvenido a **NutriBot IA** 🍎")
149
+ gr.Markdown("Comer sano, inteligente y divertido 🌿")
150
+
151
+ with gr.Tab("👤 Datos Personales"):
152
+ with gr.Row():
153
+ nombre = gr.Textbox(label="Nombre completo")
154
+ edad = gr.Number(label="Edad (años)")
155
+ peso = gr.Number(label="Peso (kg)")
156
+ altura = gr.Number(label="Altura (cm)")
157
+ genero = gr.Radio(["Hombre", "Mujer"], label="Género")
158
+ actividad = gr.Dropdown(["Sedentario", "Ligero", "Moderado", "Activo", "Muy activo"], label="Nivel de actividad física")
159
+ meta = gr.Radio(["Bajar de peso", "Mantener peso", "Subir de peso"], label="🎯 Meta personal")
160
+
161
+ condicion = gr.Textbox(label="🩺 ¿Tienes alguna enfermedad o condición alimenticia?",
162
+ placeholder="Ejemplo: diabetes, hipertensión, intolerancia a la lactosa...")
163
+
164
+ guardar_datos = gr.Button("Guardar información 🧾")
165
+ salida_datos = gr.Markdown()
166
+
167
+ def guardar_informacion(nombre, edad, peso, altura, genero, actividad, meta, condicion):
168
+ perfil = {"nombre": nombre, "edad": edad, "peso": peso, "altura": altura,
169
+ "genero": genero, "actividad": actividad, "meta": meta, "condicion": condicion}
170
+ with open("perfil_usuario.json", "w") as f:
171
+ json.dump(perfil, f, indent=4)
172
+ return f"✅ Información guardada. Nuti ahora sabe que tienes: **{condicion or 'ninguna condición registrada'}**."
173
+
174
+ guardar_datos.click(guardar_informacion,
175
+ inputs=[nombre, edad, peso, altura, genero, actividad, meta, condicion],
176
+ outputs=salida_datos)
177
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
  with gr.Tab("📸 Registro de Comidas"):
179
  gr.Markdown("Sube una foto de tu comida y NutriBot estimará las calorías 🍽️")
180
  imagen = gr.Image(label="Foto de tu comida", type="filepath")
 
186
  salida_historial = gr.Markdown()
187
  boton_historial.click(mostrar_historial, outputs=salida_historial)
188
 
 
189
  with gr.Tab("⌚ Calorías del Reloj"):
190
  calorias_quemadas = gr.Number(label="Calorías quemadas (reloj inteligente)")
191
  boton_reloj = gr.Button("Actualizar 🔁")
192
  salida_reloj = gr.Markdown()
193
  boton_reloj.click(calorias_reloj, inputs=[calorias_quemadas], outputs=salida_reloj)
194
 
 
195
  with gr.Tab("🤖 Chat con Nuti"):
196
  chat_nuti = gr.Chatbot(label="Nuti - Tu guía de nutrición 🍎")
197
  entrada_nuti = gr.Textbox(label="Escribe algo para Nuti...")
198
  boton_nuti = gr.Button("Enviar")
199
  boton_nuti.click(conversar_nuti, inputs=[entrada_nuti, chat_nuti], outputs=[chat_nuti, entrada_nuti])
200
 
 
201
  with gr.Tab("🧘 Coach Emocional"):
202
  chat_coach = gr.Chatbot(label="Coach Emocional 🌿")
203
  entrada_coach = gr.Textbox(label="Cuéntame cómo te sientes hoy...")
204
  boton_coach = gr.Button("Enviar")
205
  boton_coach.click(conversar_coach, inputs=[entrada_coach, chat_coach], outputs=[chat_coach, entrada_coach])
206
 
 
207
  with gr.Tab("🍽️ Recetas del Nutriólogo"):
208
+ nombre_r = gr.Textbox(label="Nombre de la receta")
209
  descripcion = gr.Textbox(label="Descripción o ingredientes")
210
  imagen_receta = gr.Image(label="Imagen (opcional)")
211
  boton_subir = gr.Button("Subir receta")
212
  salida_subir = gr.Textbox(label="Estado")
213
+ boton_subir.click(subir_receta, inputs=[nombre_r, descripcion, imagen_receta], outputs=salida_subir)
214
 
215
  boton_ver = gr.Button("Ver recetas disponibles 🍲")
216
  salida_recetas = gr.Markdown()
217
  boton_ver.click(mostrar_recetas, outputs=salida_recetas)
218
 
 
219
  with gr.Tab("🎯 Retos Saludables"):
220
  salida_retos = gr.Markdown()
221
  boton_ver_retos = gr.Button("Ver Retos del Día")
 
225
  boton_completar = gr.Button("Completar Reto 🏅")
226
  boton_completar.click(completar_reto, inputs=[numero_reto], outputs=salida_retos)
227
 
 
 
228
  with gr.Tab("🧑‍⚕️ Buscar Nutriólogos"):
229
  pais = gr.Textbox(label="País")
230
  estado = gr.Textbox(label="Estado")
 
233
  salida_nutri = gr.Markdown()
234
  boton_buscar.click(buscar_nutriologos, inputs=[pais, estado, ciudad], outputs=salida_nutri)
235
 
236
+ app.launch()
237
+
238
 
239
  if __name__ == "__main__":
240
  main()