caissaa23 commited on
Commit
34706c0
·
verified ·
1 Parent(s): 549b9fe

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +99 -97
app.py CHANGED
@@ -1,23 +1,44 @@
1
  import gradio as gr
2
- import datetime
3
- import random
4
  import json
5
  import os
 
 
6
  from registro import guardar_registro, cargar_registro
7
  from chatbot_nuti import buscar_respuesta
8
  from optimizacion import resize_imagen, cargar_modelo_ligero, cache_resultado
9
 
10
- # -------------------- SESIÓN --------------------
 
11
  SESION_FILE = "sesion.json"
12
 
13
- def obtener_usuario_actual():
14
- if os.path.exists(SESION_FILE):
15
- with open(SESION_FILE, "r") as f:
16
- data = json.load(f)
17
- return data.get("usuario", None)
18
- return None
19
-
20
- usuario_actual = obtener_usuario_actual()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
  # -------------------- ESTADO --------------------
23
  estado = cargar_registro()
@@ -30,20 +51,18 @@ for k, v in {
30
  # -------------------- MODELO --------------------
31
  modelo = cargar_modelo_ligero()
32
 
33
- # Calorías promedio
34
  calorias_promedio = {
35
  "pizza": 285, "hamburger": 354, "apple": 95, "banana": 105,
36
  "salad": 150, "pasta": 350, "rice": 200, "ice cream": 210,
37
  "donut": 195, "fish": 206, "chicken": 239, "broccoli": 55
38
  }
39
 
40
- # Actividades físicas con MET aproximado
41
  actividades = {
42
  "Correr": 700, "Caminar": 250, "Fútbol": 600,
43
  "Natación": 550, "Básquetbol": 500, "Voleibol": 400, "Yoga": 200,
44
  }
45
 
46
- # Nutriólogos
47
  nutriologos = [
48
  {"nombre": "Dra. Ana López", "pais": "México", "estado": "Sonora", "ciudad": "Hermosillo",
49
  "especialidad": "Nutrición deportiva", "direccion": "Av. Universidad 200", "contacto": "Instagram: @dra.analpz"},
@@ -57,7 +76,9 @@ nutriologos = [
57
  "especialidad": "Nutrición general y recetas personalizadas", "direccion": "Av. Chapultepec 100", "contacto": "IG: @sofiariveranutri"},
58
  ]
59
 
60
- # -------------------- FUNCIONES --------------------
 
 
61
  def calcular_calorias(edad, peso, altura, sexo, actividad):
62
  if sexo.lower() == "hombre":
63
  bmr = 88.36 + (13.4 * peso) + (4.8 * altura) - (5.7 * edad)
@@ -73,15 +94,12 @@ def calcular_calorias(edad, peso, altura, sexo, actividad):
73
  def analizar_foto(img):
74
  if estado["meta_diaria"] == 0:
75
  return "⚠️ Primero calcula tu meta diaria."
76
- img_opt = resize_imagen(img, size=(224,224))
77
  resultado = cache_resultado(str(img_opt.tobytes()), modelo, img_opt)
78
  nombre = resultado[0]['label'].lower()
79
  calorias = calorias_promedio.get(nombre, 250)
80
  estado["restantes"] = max(0, estado["restantes"] - calorias)
81
- estado["registro"].append({
82
- "fecha": str(datetime.datetime.now()), "tipo": "comida",
83
- "nombre": nombre, "calorias": calorias
84
- })
85
  estado["puntos"] += 10
86
  guardar_registro(estado)
87
  return f"🍽️ {nombre.title()} ≈ {calorias} cal. Restan {estado['restantes']} / {estado['meta_diaria']} cal."
@@ -92,10 +110,7 @@ def registrar_actividad(tipo, duracion):
92
  quemadas = int(actividades[tipo] * (duracion / 60))
93
  estado["restantes"] += quemadas
94
  estado["quemas"] += quemadas
95
- estado["registro"].append({
96
- "fecha": str(datetime.datetime.now()), "tipo": "actividad",
97
- "nombre": tipo, "calorias": quemadas
98
- })
99
  estado["puntos"] += 15
100
  guardar_registro(estado)
101
  return f"🏃‍♂️ {tipo} durante {duracion} min ≈ {quemadas} cal quemadas. Restantes: {estado['restantes']}."
@@ -111,14 +126,7 @@ def coach_emocional(emocion):
111
  guardar_registro(estado)
112
  return sugerencias.get(emocion.lower(), "💬 Cuéntame más sobre cómo te sientes.")
113
 
114
- misiones = [
115
- "🥤 Bebe 8 vasos de agua.",
116
- "🍎 Come 3 frutas distintas.",
117
- "🚶 Camina 20 minutos.",
118
- "🌈 Come 4 colores de comida diferentes.",
119
- "🧘 Haz 10 minutos de respiración o yoga."
120
- ]
121
-
122
  def generar_mision():
123
  mision = random.choice(misiones)
124
  estado["mision_actual"] = mision
@@ -130,12 +138,8 @@ def chatbot_nuti(pregunta):
130
  return f"🤖 Nuti dice: {respuesta}"
131
 
132
  def buscar_nutriologo(pais, estado_, ciudad):
133
- resultados = [n for n in nutriologos if
134
- n["pais"].lower() == pais.lower() and
135
- n["estado"].lower() == estado_.lower() and
136
- n["ciudad"].lower() == ciudad.lower()]
137
- if not resultados:
138
- return "😔 No se encontraron nutriólogos en esa zona aún."
139
  salida = "👩‍⚕️ Nutriólogos disponibles:\n"
140
  for n in resultados:
141
  salida += f"\n• {n['nombre']} — {n['especialidad']}\n 📍 {n['direccion']}\n 📞 {n['contacto']}\n"
@@ -143,62 +147,60 @@ def buscar_nutriologo(pais, estado_, ciudad):
143
 
144
  # -------------------- INTERFAZ --------------------
145
  with gr.Blocks() as demo:
146
- # Bienvenida
147
- if usuario_actual:
148
- gr.Markdown(f"👋 Hola, **{usuario_actual}**. Bienvenido a NutriBot Ultra!")
149
- else:
150
- gr.Markdown("👋 Hola! Bienvenido a NutriBot Ultra!")
151
-
152
- gr.Markdown("# 🥦 NutriBot Ultra — Tu Asistente de Bienestar Integral 🌈")
153
- gr.Markdown("IA que une nutrición, emociones y diversión 💪🍎")
154
-
155
- with gr.Tab("🧍 Tu perfil"):
156
- edad = gr.Number(label="Edad (años)")
157
- peso = gr.Number(label="Peso (kg)")
158
- altura = gr.Number(label="Altura (cm)")
159
- sexo = gr.Radio(["Hombre", "Mujer"], label="Sexo")
160
- actividad = gr.Dropdown(["Sedentario", "Ligero", "Moderado", "Activo", "Muy activo"], label="Nivel de actividad")
161
- btn_meta = gr.Button("Calcular meta calórica")
162
- salida_meta = gr.Textbox(label="Resultado")
163
- btn_meta.click(calcular_calorias, inputs=[edad, peso, altura, sexo, actividad], outputs=salida_meta)
164
-
165
- with gr.Tab("📸 Tu comida"):
166
- img = gr.Image(type="pil", label="Sube una foto de tu comida")
167
- btn_foto = gr.Button("Analizar comida")
168
- salida_foto = gr.Textbox(label="Resultado")
169
- btn_foto.click(analizar_foto, inputs=img, outputs=salida_foto)
170
-
171
- with gr.Tab("🏃 Actividad física"):
172
- tipo = gr.Dropdown(list(actividades.keys()), label="Tipo de actividad")
173
- duracion = gr.Number(label="Duración (minutos)")
174
- btn_act = gr.Button("Registrar actividad")
175
- salida_act = gr.Textbox(label="Resultado")
176
- btn_act.click(registrar_actividad, inputs=[tipo, duracion], outputs=salida_act)
177
-
178
- with gr.Tab("🧠 Coach emocional"):
179
- emocion = gr.Textbox(label="¿Cómo te sientes hoy?")
180
- btn_emocion = gr.Button("Enviar emoción")
181
- salida_emocion = gr.Textbox(label="Consejo")
182
- btn_emocion.click(coach_emocional, inputs=emocion, outputs=salida_emocion)
183
-
184
- with gr.Tab("🎯 Misión saludable"):
185
- btn_mision = gr.Button("Generar misión diaria")
186
- salida_mision = gr.Textbox(label="Tu reto de hoy")
187
- btn_mision.click(generar_mision, outputs=salida_mision)
188
-
189
- with gr.Tab("👩‍⚕️ Nutriólogos recomendados"):
190
- pais = gr.Textbox(label="País")
191
- estado_ = gr.Textbox(label="Estado o provincia")
192
- ciudad = gr.Textbox(label="Ciudad")
193
- btn_buscar = gr.Button("Buscar nutriólogos")
194
- salida_nutri = gr.Textbox(label="Resultados")
195
- btn_buscar.click(buscar_nutriologo, inputs=[pais, estado_, ciudad], outputs=salida_nutri)
196
-
197
- with gr.Tab("🤖 Nuti - Tu asistente"):
198
- pregunta = gr.Textbox(label="Hazle una pregunta a Nuti 🍓")
199
- btn_chat = gr.Button("Preguntar")
200
- salida_chat = gr.Textbox(label="Respuesta de Nuti")
201
- btn_chat.click(chatbot_nuti, inputs=pregunta, outputs=salida_chat)
202
-
203
- demo.launch()
204
-
 
1
  import gradio as gr
 
 
2
  import json
3
  import os
4
+ import datetime
5
+ import random
6
  from registro import guardar_registro, cargar_registro
7
  from chatbot_nuti import buscar_respuesta
8
  from optimizacion import resize_imagen, cargar_modelo_ligero, cache_resultado
9
 
10
+ # -------------------- ARCHIVOS --------------------
11
+ USUARIOS_FILE = "usuarios.json"
12
  SESION_FILE = "sesion.json"
13
 
14
+ def cargar_usuarios():
15
+ if os.path.exists(USUARIOS_FILE):
16
+ with open(USUARIOS_FILE, "r") as f:
17
+ return json.load(f)
18
+ return {}
19
+
20
+ def guardar_usuarios(data):
21
+ with open(USUARIOS_FILE, "w") as f:
22
+ json.dump(data, f, indent=4)
23
+
24
+ def registrar_usuario(nombre, email, password):
25
+ usuarios = cargar_usuarios()
26
+ if email in usuarios:
27
+ return "⚠️ Ya existe una cuenta con ese correo."
28
+ usuarios[email] = {"nombre": nombre, "password": password}
29
+ guardar_usuarios(usuarios)
30
+ return "✅ Registro exitoso. ¡Ahora puedes iniciar sesión!"
31
+
32
+ def iniciar_sesion(email, password):
33
+ usuarios = cargar_usuarios()
34
+ if email not in usuarios:
35
+ return "❌ Usuario no encontrado.", False, ""
36
+ if usuarios[email]["password"] != password:
37
+ return "🔐 Contraseña incorrecta.", False, ""
38
+ # Guardar sesión
39
+ with open(SESION_FILE, "w") as f:
40
+ json.dump({"usuario": email, "nombre": usuarios[email]["nombre"]}, f)
41
+ return f"✅ Bienvenido de nuevo, {usuarios[email]['nombre']}!", True, usuarios[email]['nombre']
42
 
43
  # -------------------- ESTADO --------------------
44
  estado = cargar_registro()
 
51
  # -------------------- MODELO --------------------
52
  modelo = cargar_modelo_ligero()
53
 
54
+ # -------------------- DATOS --------------------
55
  calorias_promedio = {
56
  "pizza": 285, "hamburger": 354, "apple": 95, "banana": 105,
57
  "salad": 150, "pasta": 350, "rice": 200, "ice cream": 210,
58
  "donut": 195, "fish": 206, "chicken": 239, "broccoli": 55
59
  }
60
 
 
61
  actividades = {
62
  "Correr": 700, "Caminar": 250, "Fútbol": 600,
63
  "Natación": 550, "Básquetbol": 500, "Voleibol": 400, "Yoga": 200,
64
  }
65
 
 
66
  nutriologos = [
67
  {"nombre": "Dra. Ana López", "pais": "México", "estado": "Sonora", "ciudad": "Hermosillo",
68
  "especialidad": "Nutrición deportiva", "direccion": "Av. Universidad 200", "contacto": "Instagram: @dra.analpz"},
 
76
  "especialidad": "Nutrición general y recetas personalizadas", "direccion": "Av. Chapultepec 100", "contacto": "IG: @sofiariveranutri"},
77
  ]
78
 
79
+ # -------------------- FUNCIONES NUTRIBOT --------------------
80
+ # Aquí pegas tus funciones: calcular_calorias, analizar_foto, registrar_actividad, coach_emocional, generar_mision, chatbot_nuti, buscar_nutriologo
81
+
82
  def calcular_calorias(edad, peso, altura, sexo, actividad):
83
  if sexo.lower() == "hombre":
84
  bmr = 88.36 + (13.4 * peso) + (4.8 * altura) - (5.7 * edad)
 
94
  def analizar_foto(img):
95
  if estado["meta_diaria"] == 0:
96
  return "⚠️ Primero calcula tu meta diaria."
97
+ img_opt = resize_imagen(img)
98
  resultado = cache_resultado(str(img_opt.tobytes()), modelo, img_opt)
99
  nombre = resultado[0]['label'].lower()
100
  calorias = calorias_promedio.get(nombre, 250)
101
  estado["restantes"] = max(0, estado["restantes"] - calorias)
102
+ estado["registro"].append({"fecha": str(datetime.datetime.now()), "tipo": "comida", "nombre": nombre, "calorias": calorias})
 
 
 
103
  estado["puntos"] += 10
104
  guardar_registro(estado)
105
  return f"🍽️ {nombre.title()} ≈ {calorias} cal. Restan {estado['restantes']} / {estado['meta_diaria']} cal."
 
110
  quemadas = int(actividades[tipo] * (duracion / 60))
111
  estado["restantes"] += quemadas
112
  estado["quemas"] += quemadas
113
+ estado["registro"].append({"fecha": str(datetime.datetime.now()), "tipo": "actividad", "nombre": tipo, "calorias": quemadas})
 
 
 
114
  estado["puntos"] += 15
115
  guardar_registro(estado)
116
  return f"🏃‍♂️ {tipo} durante {duracion} min ≈ {quemadas} cal quemadas. Restantes: {estado['restantes']}."
 
126
  guardar_registro(estado)
127
  return sugerencias.get(emocion.lower(), "💬 Cuéntame más sobre cómo te sientes.")
128
 
129
+ misiones = ["🥤 Bebe 8 vasos de agua.","🍎 Come 3 frutas distintas.","🚶 Camina 20 minutos.","🌈 Come 4 colores de comida diferentes.","🧘 Haz 10 minutos de respiración o yoga."]
 
 
 
 
 
 
 
130
  def generar_mision():
131
  mision = random.choice(misiones)
132
  estado["mision_actual"] = mision
 
138
  return f"🤖 Nuti dice: {respuesta}"
139
 
140
  def buscar_nutriologo(pais, estado_, ciudad):
141
+ resultados = [n for n in nutriologos if n["pais"].lower()==pais.lower() and n["estado"].lower()==estado_.lower() and n["ciudad"].lower()==ciudad.lower()]
142
+ if not resultados: return "😔 No se encontraron nutriólogos en esa zona aún."
 
 
 
 
143
  salida = "👩‍⚕️ Nutriólogos disponibles:\n"
144
  for n in resultados:
145
  salida += f"\n• {n['nombre']} — {n['especialidad']}\n 📍 {n['direccion']}\n 📞 {n['contacto']}\n"
 
147
 
148
  # -------------------- INTERFAZ --------------------
149
  with gr.Blocks() as demo:
150
+ user_name = gr.State(value="") # Guarda el nombre del usuario
151
+
152
+ # ----- LOGIN/REGISTRO -----
153
+ with gr.Tab("🔑 Iniciar sesión / Registrarse"):
154
+ gr.Markdown("### Bienvenido a NutriBot Ultra 🥦\nPrimero inicia sesión o crea una cuenta para continuar.")
155
+ # Registro
156
+ nombre_reg = gr.Textbox(label="Nombre completo")
157
+ email_reg = gr.Textbox(label="Correo electrónico")
158
+ pass_reg = gr.Textbox(label="Contraseña", type="password")
159
+ salida_reg = gr.Textbox(label="Resultado del registro")
160
+ btn_reg = gr.Button("Crear cuenta")
161
+ btn_reg.click(registrar_usuario, inputs=[nombre_reg,email_reg,pass_reg], outputs=salida_reg)
162
+ # Login
163
+ email_login = gr.Textbox(label="Correo electrónico")
164
+ pass_login = gr.Textbox(label="Contraseña", type="password")
165
+ salida_login = gr.Textbox(label="Mensaje")
166
+ btn_login = gr.Button("Entrar")
167
+ def login_click(email, password, state_user):
168
+ mensaje, exito, nombre = iniciar_sesion(email,password)
169
+ if exito: state_user.value = nombre
170
+ return mensaje, gr.Tabs.update(visible=exito)
171
+ btn_login.click(login_click, inputs=[email_login, pass_login, user_name], outputs=[salida_login])
172
+
173
+ # ----- TABS NUTRIBOT (ocultas hasta login) -----
174
+ with gr.Tabs(visible=False) as tabs_nuti:
175
+ gr.Markdown(lambda name: f"## 👋 Hola, **{name}**", user_name)
176
+
177
+ with gr.Tab("🧍 Tu perfil"):
178
+ edad = gr.Number(label="Edad (años)")
179
+ peso = gr.Number(label="Peso (kg)")
180
+ altura = gr.Number(label="Altura (cm)")
181
+ sexo = gr.Radio(["Hombre","Mujer"], label="Sexo")
182
+ actividad = gr.Dropdown(["Sedentario","Ligero","Moderado","Activo","Muy activo"], label="Nivel de actividad")
183
+ btn_meta = gr.Button("Calcular meta calórica")
184
+ salida_meta = gr.Textbox(label="Resultado")
185
+ btn_meta.click(calcular_calorias, inputs=[edad,peso,altura,sexo,actividad], outputs=salida_meta)
186
+
187
+ with gr.Tab("📸 Tu comida"):
188
+ img = gr.Image(type="pil", label="Sube una foto de tu comida")
189
+ btn_foto = gr.Button("Analizar comida")
190
+ salida_foto = gr.Textbox(label="Resultado")
191
+ btn_foto.click(analizar_foto, inputs=img, outputs=salida_foto)
192
+
193
+ with gr.Tab("🏃 Actividad física"):
194
+ tipo = gr.Dropdown(list(actividades.keys()), label="Tipo de actividad")
195
+ duracion = gr.Number(label="Duración (minutos)")
196
+ btn_act = gr.Button("Registrar actividad")
197
+ salida_act = gr.Textbox(label="Resultado")
198
+ btn_act.click(registrar_actividad, inputs=[tipo,duracion], outputs=salida_act)
199
+
200
+ with gr.Tab("🧠 Coach emocional"):
201
+ emocion = gr.Textbox(label="¿Cómo te sientes hoy?")
202
+ btn_emocion = gr.Button("Enviar emoción")
203
+ salida_emocion = gr.Textbox(label="Consejo")
204
+ btn_emocion.click(coach_emocional, inputs=emocion, outputs=salida_emocion)
205
+
206
+