Update app.py
Browse files
app.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
| 1 |
import gradio as gr
|
|
|
|
| 2 |
from datetime import datetime
|
| 3 |
from chatbot_nuti import buscar_respuesta
|
| 4 |
from coach_emocional import coach_emocional_inteligente
|
|
@@ -7,7 +8,7 @@ from coach_emocional import coach_emocional_inteligente
|
|
| 7 |
MEMORIA_NUTI = []
|
| 8 |
MEMORIA_COACH = []
|
| 9 |
|
| 10 |
-
# ---------- CHATBOT NUTI
|
| 11 |
def conversar_nuti(mensaje, historial):
|
| 12 |
MEMORIA_NUTI.append({"user": mensaje})
|
| 13 |
respuesta = buscar_respuesta(mensaje, MEMORIA_NUTI)
|
|
@@ -29,7 +30,7 @@ def calcular_calorias(edad, peso, altura, genero, actividad):
|
|
| 29 |
bmr = 655 + (9.6 * peso) + (1.8 * altura) - (4.7 * edad)
|
| 30 |
else:
|
| 31 |
bmr = 66 + (13.7 * peso) + (5 * altura) - (6.8 * edad)
|
| 32 |
-
|
| 33 |
factores = {
|
| 34 |
"sedentario": 1.2,
|
| 35 |
"ligero": 1.375,
|
|
@@ -40,8 +41,14 @@ def calcular_calorias(edad, peso, altura, genero, actividad):
|
|
| 40 |
calorias = round(bmr * factores.get(actividad.lower(), 1.55))
|
| 41 |
return f"🔥 Puedes consumir aproximadamente **{calorias} calorías por día** para mantener tu peso actual."
|
| 42 |
|
| 43 |
-
# ----------
|
| 44 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
MISIONES = [
|
| 46 |
"Bebe 8 vasos de agua hoy 💧",
|
| 47 |
"Come una fruta nueva 🍎",
|
|
@@ -51,23 +58,78 @@ MISIONES = [
|
|
| 51 |
"Duerme al menos 8 horas 😴",
|
| 52 |
"Haz 10 minutos de respiración consciente 🧘♀️"
|
| 53 |
]
|
| 54 |
-
|
| 55 |
def nueva_mision():
|
| 56 |
return f"🎯 Tu misión de hoy: {random.choice(MISIONES)}"
|
| 57 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 58 |
# ---------- INTERFAZ PRINCIPAL ---------- #
|
| 59 |
def main():
|
| 60 |
with gr.Blocks(title="NutriBot Ultra 🥗") as app:
|
| 61 |
gr.Markdown("""
|
| 62 |
# 🧠 Bienvenido a **NutriBot Ultra**
|
| 63 |
-
Tu asistente inteligente de **nutrición
|
| 64 |
-
|
| 65 |
-
- Habla con **Nuti**, tu guía de alimentación 🍽️
|
| 66 |
-
- Habla con tu **Coach Emocional** 💬
|
| 67 |
-
- Cumple **retos saludables** 🎮
|
| 68 |
""")
|
| 69 |
|
| 70 |
-
|
|
|
|
| 71 |
with gr.Row():
|
| 72 |
edad = gr.Number(label="Edad (años)")
|
| 73 |
peso = gr.Number(label="Peso (kg)")
|
|
@@ -79,27 +141,56 @@ def main():
|
|
| 79 |
)
|
| 80 |
boton_calorias = gr.Button("Calcular calorías 🔥")
|
| 81 |
salida_calorias = gr.Markdown()
|
| 82 |
-
boton_calorias.click(
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
)
|
|
|
|
|
|
|
|
|
|
| 87 |
|
|
|
|
| 88 |
with gr.Tab("🤖 Chat con Nuti"):
|
| 89 |
chat_nuti = gr.Chatbot(label="Nuti - Tu guía de nutrición 🍎")
|
| 90 |
entrada_nuti = gr.Textbox(label="Escribe algo para Nuti...")
|
| 91 |
boton_nuti = gr.Button("Enviar")
|
| 92 |
boton_nuti.click(conversar_nuti, inputs=[entrada_nuti, chat_nuti], outputs=[chat_nuti, entrada_nuti])
|
| 93 |
|
|
|
|
| 94 |
with gr.Tab("🧘 Coach Emocional"):
|
| 95 |
chat_coach = gr.Chatbot(label="Coach Emocional 🌿")
|
| 96 |
entrada_coach = gr.Textbox(label="Cuéntame cómo te sientes hoy...")
|
| 97 |
boton_coach = gr.Button("Enviar")
|
| 98 |
boton_coach.click(conversar_coach, inputs=[entrada_coach, chat_coach], outputs=[chat_coach, entrada_coach])
|
| 99 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 100 |
with gr.Tab("🎮 Misiones Saludables"):
|
| 101 |
-
gr.Markdown("¡
|
| 102 |
-
boton_mision = gr.Button("Obtener misión del día
|
| 103 |
salida_mision = gr.Textbox(label="Tu reto de hoy")
|
| 104 |
boton_mision.click(nueva_mision, outputs=salida_mision)
|
| 105 |
|
|
|
|
| 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
|
|
|
|
| 8 |
MEMORIA_NUTI = []
|
| 9 |
MEMORIA_COACH = []
|
| 10 |
|
| 11 |
+
# ---------- CHATBOT NUTI ---------- #
|
| 12 |
def conversar_nuti(mensaje, historial):
|
| 13 |
MEMORIA_NUTI.append({"user": mensaje})
|
| 14 |
respuesta = buscar_respuesta(mensaje, MEMORIA_NUTI)
|
|
|
|
| 30 |
bmr = 655 + (9.6 * peso) + (1.8 * altura) - (4.7 * edad)
|
| 31 |
else:
|
| 32 |
bmr = 66 + (13.7 * peso) + (5 * altura) - (6.8 * edad)
|
| 33 |
+
|
| 34 |
factores = {
|
| 35 |
"sedentario": 1.2,
|
| 36 |
"ligero": 1.375,
|
|
|
|
| 41 |
calorias = round(bmr * factores.get(actividad.lower(), 1.55))
|
| 42 |
return f"🔥 Puedes consumir aproximadamente **{calorias} calorías por día** para mantener tu peso actual."
|
| 43 |
|
| 44 |
+
# ---------- SIMULACIÓN DE RELOJ INTELIGENTE ---------- #
|
| 45 |
+
def calorias_reloj(calorias_base, calorias_quemadas):
|
| 46 |
+
total = calorias_base - calorias_quemadas
|
| 47 |
+
if total < 0:
|
| 48 |
+
total = 0
|
| 49 |
+
return f"⌚ Has quemado **{calorias_quemadas} kcal** según tu reloj.\nTe quedan **{total} kcal** por consumir hoy."
|
| 50 |
+
|
| 51 |
+
# ---------- MISIÓN SALUDABLE ---------- #
|
| 52 |
MISIONES = [
|
| 53 |
"Bebe 8 vasos de agua hoy 💧",
|
| 54 |
"Come una fruta nueva 🍎",
|
|
|
|
| 58 |
"Duerme al menos 8 horas 😴",
|
| 59 |
"Haz 10 minutos de respiración consciente 🧘♀️"
|
| 60 |
]
|
|
|
|
| 61 |
def nueva_mision():
|
| 62 |
return f"🎯 Tu misión de hoy: {random.choice(MISIONES)}"
|
| 63 |
|
| 64 |
+
# ---------- RECETAS DEL NUTRIÓLOGO ---------- #
|
| 65 |
+
RECETAS = []
|
| 66 |
+
|
| 67 |
+
def subir_receta(nombre, descripcion, imagen):
|
| 68 |
+
if nombre and descripcion:
|
| 69 |
+
receta = {"nombre": nombre, "descripcion": descripcion, "imagen": imagen}
|
| 70 |
+
RECETAS.append(receta)
|
| 71 |
+
return f"✅ Receta '{nombre}' añadida correctamente."
|
| 72 |
+
return "⚠️ Por favor, ingresa nombre y descripción."
|
| 73 |
+
|
| 74 |
+
def mostrar_recetas():
|
| 75 |
+
if not RECETAS:
|
| 76 |
+
return "📭 Aún no hay recetas cargadas. ¡Sube una con tu nutriólogo!"
|
| 77 |
+
texto = "🍽️ **Recetas Recomendadas:**\n\n"
|
| 78 |
+
for r in RECETAS:
|
| 79 |
+
texto += f"**{r['nombre']}**\n{r['descripcion']}\n\n"
|
| 80 |
+
return texto
|
| 81 |
+
|
| 82 |
+
# ---------- BUSCADOR DE NUTRIÓLOGOS ---------- #
|
| 83 |
+
def buscar_nutriologos(pais, estado, ciudad):
|
| 84 |
+
ejemplos = [
|
| 85 |
+
{
|
| 86 |
+
"nombre": "Dra. Sofía Martínez",
|
| 87 |
+
"pais": "México",
|
| 88 |
+
"estado": "Sonora",
|
| 89 |
+
"ciudad": "Hermosillo",
|
| 90 |
+
"especialidad": "Nutrición deportiva",
|
| 91 |
+
"redes": "@nutrisofi (Instagram)",
|
| 92 |
+
"reseña": "⭐️⭐️⭐️⭐️⭐️ 4.9 - Excelente trato y planes realistas."
|
| 93 |
+
},
|
| 94 |
+
{
|
| 95 |
+
"nombre": "Lic. Andrés Gómez",
|
| 96 |
+
"pais": "México",
|
| 97 |
+
"estado": "CDMX",
|
| 98 |
+
"ciudad": "Coyoacán",
|
| 99 |
+
"especialidad": "Nutrición clínica",
|
| 100 |
+
"redes": "@andresnutricion (TikTok)",
|
| 101 |
+
"reseña": "⭐️⭐️⭐️⭐️ 4.7 - Muy actualizado en tendencias saludables."
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"nombre": "Dra. Camila Silva",
|
| 105 |
+
"pais": "Chile",
|
| 106 |
+
"estado": "Región Metropolitana",
|
| 107 |
+
"ciudad": "Santiago",
|
| 108 |
+
"especialidad": "Nutrición y salud emocional",
|
| 109 |
+
"redes": "@camila.wellness (Instagram)",
|
| 110 |
+
"reseña": "⭐️⭐️⭐️⭐️⭐️ 5.0 - Enfoque integral cuerpo-mente."
|
| 111 |
+
}
|
| 112 |
+
]
|
| 113 |
+
resultados = [n for n in ejemplos if n["pais"].lower() == pais.lower() or n["ciudad"].lower() == ciudad.lower() or n["estado"].lower() == estado.lower()]
|
| 114 |
+
if not resultados:
|
| 115 |
+
return "❌ No se encontraron nutriólogos en esa ubicación aún. Prueba con otro lugar."
|
| 116 |
+
texto = "🧑⚕️ **Nutriólogos Recomendados:**\n\n"
|
| 117 |
+
for n in resultados:
|
| 118 |
+
texto += f"**{n['nombre']}** ({n['especialidad']}) - {n['ciudad']}, {n['pais']}\n"
|
| 119 |
+
texto += f"📱 {n['redes']}\n💬 {n['reseña']}\n\n"
|
| 120 |
+
return texto
|
| 121 |
+
|
| 122 |
# ---------- INTERFAZ PRINCIPAL ---------- #
|
| 123 |
def main():
|
| 124 |
with gr.Blocks(title="NutriBot Ultra 🥗") as app:
|
| 125 |
gr.Markdown("""
|
| 126 |
# 🧠 Bienvenido a **NutriBot Ultra**
|
| 127 |
+
Tu asistente inteligente de **nutrición + emociones + bienestar** 💪
|
| 128 |
+
Conecta tu reloj, sube recetas, encuentra nutriólogos y habla con tu IA saludable 🌿
|
|
|
|
|
|
|
|
|
|
| 129 |
""")
|
| 130 |
|
| 131 |
+
# --- CALCULADORA DE CALORÍAS Y RELOJ --- #
|
| 132 |
+
with gr.Tab("📊 Calorías y Actividad"):
|
| 133 |
with gr.Row():
|
| 134 |
edad = gr.Number(label="Edad (años)")
|
| 135 |
peso = gr.Number(label="Peso (kg)")
|
|
|
|
| 141 |
)
|
| 142 |
boton_calorias = gr.Button("Calcular calorías 🔥")
|
| 143 |
salida_calorias = gr.Markdown()
|
| 144 |
+
boton_calorias.click(calcular_calorias, inputs=[edad, peso, altura, genero, actividad], outputs=salida_calorias)
|
| 145 |
+
|
| 146 |
+
gr.Markdown("### ⌚ Calorías registradas por tu reloj (simulación)")
|
| 147 |
+
calorias_base = gr.Number(label="Calorías diarias (según cálculo anterior)")
|
| 148 |
+
calorias_quemadas = gr.Number(label="Calorías quemadas (Apple Watch, Fitbit, etc.)")
|
| 149 |
+
boton_reloj = gr.Button("Actualizar datos del reloj")
|
| 150 |
+
salida_reloj = gr.Markdown()
|
| 151 |
+
boton_reloj.click(calorias_reloj, inputs=[calorias_base, calorias_quemadas], outputs=salida_reloj)
|
| 152 |
|
| 153 |
+
# --- CHAT NUTI --- #
|
| 154 |
with gr.Tab("🤖 Chat con Nuti"):
|
| 155 |
chat_nuti = gr.Chatbot(label="Nuti - Tu guía de nutrición 🍎")
|
| 156 |
entrada_nuti = gr.Textbox(label="Escribe algo para Nuti...")
|
| 157 |
boton_nuti = gr.Button("Enviar")
|
| 158 |
boton_nuti.click(conversar_nuti, inputs=[entrada_nuti, chat_nuti], outputs=[chat_nuti, entrada_nuti])
|
| 159 |
|
| 160 |
+
# --- COACH EMOCIONAL --- #
|
| 161 |
with gr.Tab("🧘 Coach Emocional"):
|
| 162 |
chat_coach = gr.Chatbot(label="Coach Emocional 🌿")
|
| 163 |
entrada_coach = gr.Textbox(label="Cuéntame cómo te sientes hoy...")
|
| 164 |
boton_coach = gr.Button("Enviar")
|
| 165 |
boton_coach.click(conversar_coach, inputs=[entrada_coach, chat_coach], outputs=[chat_coach, entrada_coach])
|
| 166 |
|
| 167 |
+
# --- RECETAS --- #
|
| 168 |
+
with gr.Tab("🍽️ Recetas del Nutriólogo"):
|
| 169 |
+
gr.Markdown("Sube o consulta recetas recomendadas por expertos 🥦")
|
| 170 |
+
nombre = gr.Textbox(label="Nombre de la receta")
|
| 171 |
+
descripcion = gr.Textbox(label="Descripción o ingredientes")
|
| 172 |
+
imagen = gr.Image(label="Foto (opcional)")
|
| 173 |
+
boton_subir = gr.Button("Subir receta")
|
| 174 |
+
salida_subir = gr.Textbox(label="Estado")
|
| 175 |
+
boton_subir.click(subir_receta, inputs=[nombre, descripcion, imagen], outputs=salida_subir)
|
| 176 |
+
|
| 177 |
+
boton_ver = gr.Button("Ver recetas disponibles 🍲")
|
| 178 |
+
salida_recetas = gr.Markdown()
|
| 179 |
+
boton_ver.click(mostrar_recetas, outputs=salida_recetas)
|
| 180 |
+
|
| 181 |
+
# --- NUTRIÓLOGOS --- #
|
| 182 |
+
with gr.Tab("🧑⚕️ Buscar Nutriólogos"):
|
| 183 |
+
pais = gr.Textbox(label="País")
|
| 184 |
+
estado = gr.Textbox(label="Estado/Provincia")
|
| 185 |
+
ciudad = gr.Textbox(label="Ciudad")
|
| 186 |
+
boton_buscar = gr.Button("Buscar Nutriólogos 🌍")
|
| 187 |
+
salida_nutri = gr.Markdown()
|
| 188 |
+
boton_buscar.click(buscar_nutriologos, inputs=[pais, estado, ciudad], outputs=salida_nutri)
|
| 189 |
+
|
| 190 |
+
# --- MISIONES --- #
|
| 191 |
with gr.Tab("🎮 Misiones Saludables"):
|
| 192 |
+
gr.Markdown("¡Cumple retos diarios y gana puntos por tu bienestar! 🌟")
|
| 193 |
+
boton_mision = gr.Button("Obtener misión del día")
|
| 194 |
salida_mision = gr.Textbox(label="Tu reto de hoy")
|
| 195 |
boton_mision.click(nueva_mision, outputs=salida_mision)
|
| 196 |
|