Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -12,7 +12,7 @@ import re
|
|
| 12 |
|
| 13 |
st.set_page_config(
|
| 14 |
page_title="Asistente de Bienestar Digestivo",
|
| 15 |
-
page_icon="🍎", #
|
| 16 |
layout="wide"
|
| 17 |
)
|
| 18 |
|
|
@@ -46,7 +46,6 @@ def get_gemini_model():
|
|
| 46 |
"""Carga el modelo generativo de Gemini."""
|
| 47 |
logger.info("🔄 Cargando modelo Gemini (gemini-1.5-flash)...")
|
| 48 |
try:
|
| 49 |
-
# Usamos un modelo más reciente y potente para tareas de extracción y análisis
|
| 50 |
return genai.GenerativeModel("gemini-1.5-flash")
|
| 51 |
except Exception as e:
|
| 52 |
st.error(f"❌ No se pudo cargar el modelo Gemini: {e}")
|
|
@@ -117,8 +116,13 @@ def extract_entities_with_gemini(query):
|
|
| 117 |
"""
|
| 118 |
try:
|
| 119 |
response = model.generate_content(system_prompt)
|
| 120 |
-
# Limpiar y parsear la respuesta JSON
|
| 121 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 122 |
return json.loads(json_text)
|
| 123 |
except Exception as e:
|
| 124 |
logger.error(f"Error extrayendo entidades con Gemini: {e}")
|
|
@@ -141,7 +145,7 @@ def find_best_matches(entities, data):
|
|
| 141 |
scores = {}
|
| 142 |
for index, entry in enumerate(data):
|
| 143 |
score = 0
|
| 144 |
-
entry_compound = entry.get("Compuesto / Alimento Intolerante", "").split('(')[0].strip()
|
| 145 |
entry_symptoms = entry.get("Posibles Síntomas (Presentación Clínica Representativa)", "").lower()
|
| 146 |
|
| 147 |
# Puntuar por coincidencia de compuesto
|
|
@@ -180,7 +184,7 @@ def generate_detailed_analysis(query, match):
|
|
| 180 |
- **Recomendaciones Generales:** {match.get("Recomendaciones Médicas / Exámenes Confirmatorios")}
|
| 181 |
|
| 182 |
**Tu Tarea:**
|
| 183 |
-
Redacta una respuesta completa para el usuario. La respuesta debe estar estructurada en las siguientes secciones (usa los títulos en negrita):
|
| 184 |
|
| 185 |
1. **Posible Causa:** Comienza resumiendo por qué sus síntomas podrían estar relacionados con este compuesto, vinculando directamente su caso con la información proporcionada.
|
| 186 |
2. **¿Qué podría estar pasando en tu cuerpo?:** Explica el "Mecanismo Fisiológico" en términos sencillos que cualquiera pueda entender.
|
|
@@ -198,11 +202,8 @@ def generate_detailed_analysis(query, match):
|
|
| 198 |
return "No se pudo generar el análisis detallado. Por favor, inténtalo de nuevo."
|
| 199 |
|
| 200 |
# --- INTERFAZ DE USUARIO (UI) ---
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
with col_text:
|
| 204 |
-
st.title("Asistente de Bienestar Digestivo")
|
| 205 |
-
st.markdown("Explora la posible relación entre lo que comes y cómo te sientes.")
|
| 206 |
|
| 207 |
# Manejo de estado
|
| 208 |
if 'search_results' not in st.session_state: st.session_state.search_results = None
|
|
@@ -223,12 +224,12 @@ if submitted:
|
|
| 223 |
st.error("La base de datos de alimentos no está disponible. No se puede continuar.")
|
| 224 |
else:
|
| 225 |
st.session_state.user_query = query
|
| 226 |
-
with st.spinner("Interpretando tu caso con IA..."):
|
| 227 |
entities = extract_entities_with_gemini(query)
|
| 228 |
|
| 229 |
-
if entities:
|
| 230 |
st.info(f"IA identificó - Alimentos: {', '.join(entities.get('alimentos',[])) or 'Ninguno'}, Síntomas: {', '.join(entities.get('sintomas',[])) or 'Ninguno'}")
|
| 231 |
-
with st.spinner("Buscando posibles causas en la base de conocimiento..."):
|
| 232 |
results = find_best_matches(entities, alimentos_data)
|
| 233 |
st.session_state.search_results = results
|
| 234 |
else:
|
|
@@ -249,7 +250,7 @@ if st.session_state.search_results is not None:
|
|
| 249 |
best_match = results[0]
|
| 250 |
|
| 251 |
with st.expander(f"**Principal Coincidencia: {best_match.get('Compuesto / Alimento Intolerante')}**", expanded=True):
|
| 252 |
-
with st.spinner("Generando un análisis detallado con IA..."):
|
| 253 |
detailed_analysis = generate_detailed_analysis(st.session_state.user_query, best_match)
|
| 254 |
st.markdown(detailed_analysis)
|
| 255 |
|
|
|
|
| 12 |
|
| 13 |
st.set_page_config(
|
| 14 |
page_title="Asistente de Bienestar Digestivo",
|
| 15 |
+
page_icon="🍎", # El ícono para la pestaña del navegador
|
| 16 |
layout="wide"
|
| 17 |
)
|
| 18 |
|
|
|
|
| 46 |
"""Carga el modelo generativo de Gemini."""
|
| 47 |
logger.info("🔄 Cargando modelo Gemini (gemini-1.5-flash)...")
|
| 48 |
try:
|
|
|
|
| 49 |
return genai.GenerativeModel("gemini-1.5-flash")
|
| 50 |
except Exception as e:
|
| 51 |
st.error(f"❌ No se pudo cargar el modelo Gemini: {e}")
|
|
|
|
| 116 |
"""
|
| 117 |
try:
|
| 118 |
response = model.generate_content(system_prompt)
|
| 119 |
+
# Limpiar y parsear la respuesta JSON del texto que puede venir con Markdown
|
| 120 |
+
json_text_match = re.search(r'```json\s*(\{.*?\})\s*```', response.text, re.DOTALL)
|
| 121 |
+
if json_text_match:
|
| 122 |
+
json_text = json_text_match.group(1)
|
| 123 |
+
else: # Si no encuentra el formato Markdown, busca un JSON simple
|
| 124 |
+
json_text = re.search(r'\{.*\}', response.text, re.DOTALL).group(0)
|
| 125 |
+
|
| 126 |
return json.loads(json_text)
|
| 127 |
except Exception as e:
|
| 128 |
logger.error(f"Error extrayendo entidades con Gemini: {e}")
|
|
|
|
| 145 |
scores = {}
|
| 146 |
for index, entry in enumerate(data):
|
| 147 |
score = 0
|
| 148 |
+
entry_compound = entry.get("Compuesto / Alimento Intolerante", "").split('(')[0].strip().lower()
|
| 149 |
entry_symptoms = entry.get("Posibles Síntomas (Presentación Clínica Representativa)", "").lower()
|
| 150 |
|
| 151 |
# Puntuar por coincidencia de compuesto
|
|
|
|
| 184 |
- **Recomendaciones Generales:** {match.get("Recomendaciones Médicas / Exámenes Confirmatorios")}
|
| 185 |
|
| 186 |
**Tu Tarea:**
|
| 187 |
+
Redacta una respuesta completa para el usuario. La respuesta debe estar estructurada en las siguientes secciones (usa los títulos en negrita y formato Markdown):
|
| 188 |
|
| 189 |
1. **Posible Causa:** Comienza resumiendo por qué sus síntomas podrían estar relacionados con este compuesto, vinculando directamente su caso con la información proporcionada.
|
| 190 |
2. **¿Qué podría estar pasando en tu cuerpo?:** Explica el "Mecanismo Fisiológico" en términos sencillos que cualquiera pueda entender.
|
|
|
|
| 202 |
return "No se pudo generar el análisis detallado. Por favor, inténtalo de nuevo."
|
| 203 |
|
| 204 |
# --- INTERFAZ DE USUARIO (UI) ---
|
| 205 |
+
st.title("🍎 Asistente de Bienestar Digestivo")
|
| 206 |
+
st.markdown("Explora la posible relación entre lo que comes y cómo te sientes.")
|
|
|
|
|
|
|
|
|
|
| 207 |
|
| 208 |
# Manejo de estado
|
| 209 |
if 'search_results' not in st.session_state: st.session_state.search_results = None
|
|
|
|
| 224 |
st.error("La base de datos de alimentos no está disponible. No se puede continuar.")
|
| 225 |
else:
|
| 226 |
st.session_state.user_query = query
|
| 227 |
+
with st.spinner("🧠 Interpretando tu caso con IA..."):
|
| 228 |
entities = extract_entities_with_gemini(query)
|
| 229 |
|
| 230 |
+
if entities and (entities.get("alimentos") or entities.get("sintomas")):
|
| 231 |
st.info(f"IA identificó - Alimentos: {', '.join(entities.get('alimentos',[])) or 'Ninguno'}, Síntomas: {', '.join(entities.get('sintomas',[])) or 'Ninguno'}")
|
| 232 |
+
with st.spinner("🔬 Buscando posibles causas en la base de conocimiento..."):
|
| 233 |
results = find_best_matches(entities, alimentos_data)
|
| 234 |
st.session_state.search_results = results
|
| 235 |
else:
|
|
|
|
| 250 |
best_match = results[0]
|
| 251 |
|
| 252 |
with st.expander(f"**Principal Coincidencia: {best_match.get('Compuesto / Alimento Intolerante')}**", expanded=True):
|
| 253 |
+
with st.spinner("✍️ Generando un análisis detallado con IA..."):
|
| 254 |
detailed_analysis = generate_detailed_analysis(st.session_state.user_query, best_match)
|
| 255 |
st.markdown(detailed_analysis)
|
| 256 |
|