caissaa23 commited on
Commit
26f4348
·
verified ·
1 Parent(s): 678ceb8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +58 -46
app.py CHANGED
@@ -2,64 +2,61 @@ import gradio as gr
2
  import datetime
3
  from transformers import pipeline
4
  from registro import guardar_registro, cargar_registro
 
5
  import random
6
 
7
- # Cargamos estado personal
8
  estado = cargar_registro()
9
-
10
- # Aseguramos claves básicas
11
  for k, v in {
12
  "meta_diaria": 0, "restantes": 0, "quemas": 0, "puntos": 0,
13
  "registro": [], "badges": [], "emocion": "", "nivel": 1
14
  }.items():
15
  estado.setdefault(k, v)
16
 
17
- # Clasificación de comida
18
  modelo = pipeline("image-classification", model="nateraw/food")
19
 
20
- # Calorías promedio (ejemplo)
21
  calorias_promedio = {
22
  "pizza": 285, "hamburger": 354, "apple": 95, "banana": 105,
23
  "salad": 150, "pasta": 350, "rice": 200, "ice cream": 210,
24
  "donut": 195, "fish": 206, "chicken": 239, "broccoli": 55
25
  }
26
 
27
- # Colores por grupo
28
- colores_alimentos = {
29
- "verde": ["broccoli", "lettuce", "spinach", "avocado"],
30
- "rojo": ["apple", "strawberry", "meat", "tomato"],
31
- "amarillo": ["banana", "corn", "rice", "pasta"],
32
- "blanco": ["chicken", "fish", "yogurt"]
33
- }
34
-
35
- # Actividades y gasto calórico por hora (aprox)
36
  actividades = {
37
- "Correr": 700,
38
- "Caminar": 250,
39
- "Fútbol": 600,
40
- "Natación": 550,
41
- "Básquetbol": 500,
42
- "Voleibol": 400,
43
- "Yoga": 200,
44
  }
45
 
46
- # Función: Calcular meta diaria
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  def calcular_calorias(edad, peso, altura, sexo, actividad):
48
  if sexo.lower() == "hombre":
49
  bmr = 88.36 + (13.4 * peso) + (4.8 * altura) - (5.7 * edad)
50
  else:
51
  bmr = 447.6 + (9.2 * peso) + (3.1 * altura) - (4.3 * edad)
52
- niveles = {
53
- "Sedentario": 1.2, "Ligero": 1.375, "Moderado": 1.55,
54
- "Activo": 1.725, "Muy activo": 1.9
55
- }
56
  tdee = bmr * niveles.get(actividad, 1.2)
57
  estado["meta_diaria"] = round(tdee)
58
  estado["restantes"] = round(tdee)
59
  guardar_registro(estado)
60
  return f"🔥 Tu meta calórica diaria es de {round(tdee)} cal."
61
 
62
- # Analizar foto
63
  def analizar_foto(img):
64
  if estado["meta_diaria"] == 0:
65
  return "⚠️ Primero calcula tu meta diaria."
@@ -67,24 +64,28 @@ def analizar_foto(img):
67
  nombre = resultado[0]['label'].lower()
68
  calorias = calorias_promedio.get(nombre, 250)
69
  estado["restantes"] = max(0, estado["restantes"] - calorias)
70
- estado["registro"].append({"fecha": str(datetime.datetime.now()), "tipo": "comida", "nombre": nombre, "calorias": calorias})
 
 
 
71
  estado["puntos"] += 10
72
  guardar_registro(estado)
73
  return f"🍽️ {nombre.title()} ≈ {calorias} cal. Restan {estado['restantes']} / {estado['meta_diaria']} cal."
74
 
75
- # Registrar ejercicio
76
  def registrar_actividad(tipo, duracion):
77
  if tipo not in actividades:
78
  return "Selecciona una actividad válida."
79
  quemadas = int(actividades[tipo] * (duracion / 60))
80
  estado["restantes"] += quemadas
81
  estado["quemas"] += quemadas
82
- estado["registro"].append({"fecha": str(datetime.datetime.now()), "tipo": "actividad", "nombre": tipo, "calorias": quemadas})
 
 
 
83
  estado["puntos"] += 15
84
  guardar_registro(estado)
85
  return f"🏃‍♂️ {tipo} durante {duracion} min ≈ {quemadas} cal quemadas. Restantes: {estado['restantes']}."
86
 
87
- # Coach emocional
88
  def coach_emocional(emocion):
89
  estado["emocion"] = emocion
90
  sugerencias = {
@@ -96,7 +97,6 @@ def coach_emocional(emocion):
96
  guardar_registro(estado)
97
  return sugerencias.get(emocion.lower(), "💬 Cuéntame más sobre cómo te sientes.")
98
 
99
- # Misiones diarias
100
  misiones = [
101
  "🥤 Bebe 8 vasos de agua.",
102
  "🍎 Come 3 frutas distintas.",
@@ -111,24 +111,28 @@ def generar_mision():
111
  guardar_registro(estado)
112
  return f"🎯 Tu misión de hoy: {mision}"
113
 
114
- # Chatbot Nuti
115
  def chatbot_nuti(pregunta):
116
- respuestas = {
117
- "hambre": "Si tienes hambre, prueba una manzana o zanahorias. Sacian sin muchas calorías.",
118
- "cena": "Una cena ligera con proteína y vegetales es ideal.",
119
- "subir de peso": "Agrega frutos secos, aguacate y avena a tus comidas.",
120
- "bajar de peso": "Evita bebidas azucaradas y prioriza proteína magra y fibra.",
121
- "agua": "Bebe al menos 2 litros al día 💧."
122
- }
123
- for clave, resp in respuestas.items():
124
- if clave in pregunta.lower():
125
- return f"🤖 Nuti dice: {resp}"
126
- return "🤖 Nuti: No estoy seguro, pero intenta comer balanceado y escuchar a tu cuerpo 💚."
 
 
 
 
 
 
127
 
128
- # Interfaz principal
129
  with gr.Blocks() as demo:
130
  gr.Markdown("# 🥦 NutriBot Ultra — Tu Asistente de Bienestar Integral 🌈")
131
- gr.Markdown("IA que une nutrición, emociones, y diversión 💪🍎")
132
 
133
  with gr.Tab("🧍 Tu perfil"):
134
  edad = gr.Number(label="Edad (años)")
@@ -164,6 +168,14 @@ with gr.Blocks() as demo:
164
  salida_mision = gr.Textbox(label="Tu reto de hoy")
165
  btn_mision.click(generar_mision, outputs=salida_mision)
166
 
 
 
 
 
 
 
 
 
167
  with gr.Tab("🤖 Nuti - Tu asistente"):
168
  pregunta = gr.Textbox(label="Hazle una pregunta a Nuti 🍓")
169
  btn_chat = gr.Button("Preguntar")
 
2
  import datetime
3
  from transformers import pipeline
4
  from registro import guardar_registro, cargar_registro
5
+ from chatbot_nuti import buscar_respuesta
6
  import random
7
 
8
+ # Cargar estado local
9
  estado = cargar_registro()
 
 
10
  for k, v in {
11
  "meta_diaria": 0, "restantes": 0, "quemas": 0, "puntos": 0,
12
  "registro": [], "badges": [], "emocion": "", "nivel": 1
13
  }.items():
14
  estado.setdefault(k, v)
15
 
16
+ # Modelo de comida
17
  modelo = pipeline("image-classification", model="nateraw/food")
18
 
19
+ # Calorías promedio
20
  calorias_promedio = {
21
  "pizza": 285, "hamburger": 354, "apple": 95, "banana": 105,
22
  "salad": 150, "pasta": 350, "rice": 200, "ice cream": 210,
23
  "donut": 195, "fish": 206, "chicken": 239, "broccoli": 55
24
  }
25
 
26
+ # Actividades
 
 
 
 
 
 
 
 
27
  actividades = {
28
+ "Correr": 700, "Caminar": 250, "Fútbol": 600,
29
+ "Natación": 550, "Básquetbol": 500, "Voleibol": 400, "Yoga": 200,
 
 
 
 
 
30
  }
31
 
32
+ # Base de nutriólogos por país/estado/ciudad
33
+ nutriologos = [
34
+ {"nombre": "Dra. Ana López", "pais": "México", "estado": "Sonora", "ciudad": "Hermosillo",
35
+ "especialidad": "Nutrición deportiva", "direccion": "Av. Universidad 200", "contacto": "Instagram: @dra.analpz"},
36
+ {"nombre": "Lic. Jorge Ramírez", "pais": "México", "estado": "CDMX", "ciudad": "Coyoacán",
37
+ "especialidad": "Control de peso", "direccion": "Centro NutriVida, Av. Pacífico 300", "contacto": "Tel: +52 55 1234 5678"},
38
+ {"nombre": "Dra. Camila Torres", "pais": "Colombia", "estado": "Antioquia", "ciudad": "Medellín",
39
+ "especialidad": "Nutrición infantil", "direccion": "Cra 40 #23", "contacto": "Email: camilatorresnutri@gmail.com"},
40
+ {"nombre": "Dr. Luis Fernández", "pais": "España", "estado": "Madrid", "ciudad": "Madrid",
41
+ "especialidad": "Nutrición clínica", "direccion": "Calle Mayor 45", "contacto": "Web: www.drfernandez.es"},
42
+ {"nombre": "Lic. Sofía Rivera", "pais": "México", "estado": "Jalisco", "ciudad": "Guadalajara",
43
+ "especialidad": "Nutrición general y recetas personalizadas", "direccion": "Av. Chapultepec 100", "contacto": "IG: @sofiariveranutri"},
44
+ ]
45
+
46
+ # ------------------------------- FUNCIONES -------------------------------
47
+
48
  def calcular_calorias(edad, peso, altura, sexo, actividad):
49
  if sexo.lower() == "hombre":
50
  bmr = 88.36 + (13.4 * peso) + (4.8 * altura) - (5.7 * edad)
51
  else:
52
  bmr = 447.6 + (9.2 * peso) + (3.1 * altura) - (4.3 * edad)
53
+ niveles = {"Sedentario": 1.2, "Ligero": 1.375, "Moderado": 1.55, "Activo": 1.725, "Muy activo": 1.9}
 
 
 
54
  tdee = bmr * niveles.get(actividad, 1.2)
55
  estado["meta_diaria"] = round(tdee)
56
  estado["restantes"] = round(tdee)
57
  guardar_registro(estado)
58
  return f"🔥 Tu meta calórica diaria es de {round(tdee)} cal."
59
 
 
60
  def analizar_foto(img):
61
  if estado["meta_diaria"] == 0:
62
  return "⚠️ Primero calcula tu meta diaria."
 
64
  nombre = resultado[0]['label'].lower()
65
  calorias = calorias_promedio.get(nombre, 250)
66
  estado["restantes"] = max(0, estado["restantes"] - calorias)
67
+ estado["registro"].append({
68
+ "fecha": str(datetime.datetime.now()), "tipo": "comida",
69
+ "nombre": nombre, "calorias": calorias
70
+ })
71
  estado["puntos"] += 10
72
  guardar_registro(estado)
73
  return f"🍽️ {nombre.title()} ≈ {calorias} cal. Restan {estado['restantes']} / {estado['meta_diaria']} cal."
74
 
 
75
  def registrar_actividad(tipo, duracion):
76
  if tipo not in actividades:
77
  return "Selecciona una actividad válida."
78
  quemadas = int(actividades[tipo] * (duracion / 60))
79
  estado["restantes"] += quemadas
80
  estado["quemas"] += quemadas
81
+ estado["registro"].append({
82
+ "fecha": str(datetime.datetime.now()), "tipo": "actividad",
83
+ "nombre": tipo, "calorias": quemadas
84
+ })
85
  estado["puntos"] += 15
86
  guardar_registro(estado)
87
  return f"🏃‍♂️ {tipo} durante {duracion} min ≈ {quemadas} cal quemadas. Restantes: {estado['restantes']}."
88
 
 
89
  def coach_emocional(emocion):
90
  estado["emocion"] = emocion
91
  sugerencias = {
 
97
  guardar_registro(estado)
98
  return sugerencias.get(emocion.lower(), "💬 Cuéntame más sobre cómo te sientes.")
99
 
 
100
  misiones = [
101
  "🥤 Bebe 8 vasos de agua.",
102
  "🍎 Come 3 frutas distintas.",
 
111
  guardar_registro(estado)
112
  return f"🎯 Tu misión de hoy: {mision}"
113
 
 
114
  def chatbot_nuti(pregunta):
115
+ respuesta = buscar_respuesta(pregunta)
116
+ return f"🤖 Nuti dice: {respuesta}"
117
+
118
+ # NUEVA FUNCIÓN: Buscar nutriólogos
119
+ def buscar_nutriologo(pais, estado, ciudad):
120
+ resultados = [n for n in nutriologos if
121
+ n["pais"].lower() == pais.lower() and
122
+ n["estado"].lower() == estado.lower() and
123
+ n["ciudad"].lower() == ciudad.lower()]
124
+ if not resultados:
125
+ return "😔 No se encontraron nutriólogos en esa zona aún."
126
+ salida = "👩‍⚕️ Nutriólogos disponibles:\n"
127
+ for n in resultados:
128
+ salida += f"\n• {n['nombre']} — {n['especialidad']}\n 📍 {n['direccion']}\n 📞 {n['contacto']}\n"
129
+ return salida
130
+
131
+ # ------------------------------- INTERFAZ -------------------------------
132
 
 
133
  with gr.Blocks() as demo:
134
  gr.Markdown("# 🥦 NutriBot Ultra — Tu Asistente de Bienestar Integral 🌈")
135
+ gr.Markdown("IA que une nutrición, emociones y diversión 💪🍎")
136
 
137
  with gr.Tab("🧍 Tu perfil"):
138
  edad = gr.Number(label="Edad (años)")
 
168
  salida_mision = gr.Textbox(label="Tu reto de hoy")
169
  btn_mision.click(generar_mision, outputs=salida_mision)
170
 
171
+ with gr.Tab("👩‍⚕️ Nutriólogos recomendados"):
172
+ pais = gr.Textbox(label="País")
173
+ estado_ = gr.Textbox(label="Estado o provincia")
174
+ ciudad = gr.Textbox(label="Ciudad")
175
+ btn_buscar = gr.Button("Buscar nutriólogos")
176
+ salida_nutri = gr.Textbox(label="Resultados")
177
+ btn_buscar.click(buscar_nutriologo, inputs=[pais, estado_, ciudad], outputs=salida_nutri)
178
+
179
  with gr.Tab("🤖 Nuti - Tu asistente"):
180
  pregunta = gr.Textbox(label="Hazle una pregunta a Nuti 🍓")
181
  btn_chat = gr.Button("Preguntar")