Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
-
# ==================== El Detective de Alimentos (Versi贸n 10.1
|
| 2 |
-
#
|
| 3 |
|
| 4 |
import streamlit as st
|
| 5 |
import google.generativeai as genai
|
|
@@ -61,7 +61,6 @@ def load_data():
|
|
| 61 |
return None, None, None
|
| 62 |
alimentos_data, lista_condiciones, foodb_index = load_data()
|
| 63 |
|
| 64 |
-
# --- DICCIONARIOS DE MAPEADO (EXPANDIDOS Y CORREGIDOS) ---
|
| 65 |
FOOD_TO_COMPOUND_MAP = {
|
| 66 |
# --- CEREALES Y GRANOS ---
|
| 67 |
"pan": ["gluten"], "trigo": ["gluten"], "harina": ["gluten"], "cebada": ["gluten"], "centeno": ["gluten"], "pasta": ["gluten"], "galletas": ["gluten"], "pizza": ["gluten"], "torta": ["gluten"], "pastel": ["gluten"], "avena": ["gluten"], # Avena es sensible para cel铆acos por contaminaci贸n cruzada y avenina
|
|
@@ -224,7 +223,7 @@ def extract_and_infer_with_gemini(query, condiciones):
|
|
| 224 |
|
| 225 |
Devuelve la respuesta 脷NICAMENTE en formato JSON estricto.
|
| 226 |
|
| 227 |
-
Ejemplo: si el usuario dice "vino tinto y dolor de cabeza", la condici贸n probable es "
|
| 228 |
|
| 229 |
Consulta: "{query}"
|
| 230 |
"""
|
|
@@ -304,9 +303,7 @@ def generate_detailed_analysis(query, match):
|
|
| 304 |
prompt_parts = [
|
| 305 |
"Eres un asistente de IA experto en nutrici贸n personalizada y comunicaci贸n m茅dica. Tu objetivo es explicar conceptos complejos de forma sencilla y emp谩tica.",
|
| 306 |
f'El usuario ha descrito el siguiente caso: "{query}"',
|
| 307 |
-
# --- L脥NEA CLAVE A脩ADIDA PARA ENRIQUECER EL PROMPT ---
|
| 308 |
f'Tu sistema ha identificado una posible conexi贸n con "{match.get("condicion_asociada", "N/A")}". Los s铆ntomas clave asociados en la base de datos para esta condici贸n son: {sintomas_clave_texto}.',
|
| 309 |
-
# --- FIN DE LA L脥NEA A脩ADIDA ---
|
| 310 |
f'El mecanismo fisiol贸gico es: "{match.get("mecanismo_fisiologico", "No especificado")}".',
|
| 311 |
f'Las recomendaciones generales son: "{match.get("recomendaciones_examenes", "No especificadas")}".',
|
| 312 |
f'Otros alimentos implicados son: "{match.get("compuesto_alimento", "No especificados")}".',
|
|
@@ -334,7 +331,7 @@ def generate_detailed_analysis(query, match):
|
|
| 334 |
prompt = "\n".join(prompt_parts)
|
| 335 |
try:
|
| 336 |
response = model.generate_content(prompt)
|
| 337 |
-
|
| 338 |
if response.text and len(response.text) > 1:
|
| 339 |
return response.text
|
| 340 |
else:
|
|
@@ -394,13 +391,13 @@ with col_img2:
|
|
| 394 |
st.image("buho.png", width=120)
|
| 395 |
st.markdown("---")
|
| 396 |
|
| 397 |
-
|
| 398 |
if 'search_results' not in st.session_state: st.session_state.search_results = None
|
| 399 |
if 'user_query' not in st.session_state: st.session_state.user_query = ""
|
| 400 |
if 'entities' not in st.session_state: st.session_state.entities = None
|
| 401 |
if 'analysis_cache' not in st.session_state: st.session_state.analysis_cache = {}
|
| 402 |
if 'query' not in st.session_state: st.session_state.query = ""
|
| 403 |
-
|
| 404 |
if 'start_analysis' not in st.session_state: st.session_state.start_analysis = False
|
| 405 |
|
| 406 |
def clear_search_state():
|
|
@@ -409,12 +406,12 @@ def clear_search_state():
|
|
| 409 |
st.session_state.entities = None
|
| 410 |
st.session_state.analysis_cache = {}
|
| 411 |
|
| 412 |
-
|
| 413 |
def set_query_and_trigger_analysis(example_text):
|
| 414 |
st.session_state.query = example_text
|
| 415 |
st.session_state.start_analysis = True
|
| 416 |
|
| 417 |
-
|
| 418 |
st.write("**驴No sabes por d贸nde empezar? Prueba con un ejemplo:**")
|
| 419 |
example_cols = st.columns(3)
|
| 420 |
example_queries = [
|
|
@@ -422,7 +419,7 @@ example_queries = [
|
|
| 422 |
"Despu茅s de tomar leche, tengo muchos gases e hinchaz贸n.",
|
| 423 |
"El vino tinto siempre me da dolor de cabeza, a que se debe"
|
| 424 |
]
|
| 425 |
-
|
| 426 |
if example_cols[0].button(example_queries[0]):
|
| 427 |
set_query_and_trigger_analysis(example_queries[0])
|
| 428 |
if example_cols[1].button(example_queries[1]):
|
|
@@ -430,15 +427,15 @@ if example_cols[1].button(example_queries[1]):
|
|
| 430 |
if example_cols[2].button(example_queries[2]):
|
| 431 |
set_query_and_trigger_analysis(example_queries[2])
|
| 432 |
|
| 433 |
-
|
| 434 |
-
|
| 435 |
with st.form(key="search_form"):
|
| 436 |
st.text_area("Describe tu caso aqu铆:", height=150, key="query")
|
| 437 |
submitted = st.form_submit_button("Analizar mi caso", type="primary")
|
| 438 |
if submitted:
|
| 439 |
st.session_state.start_analysis = True
|
| 440 |
|
| 441 |
-
|
| 442 |
if st.session_state.start_analysis:
|
| 443 |
# Inmediatamente bajamos la bandera para evitar ejecuciones repetidas.
|
| 444 |
st.session_state.start_analysis = False
|
|
@@ -482,7 +479,7 @@ if st.session_state.search_results is not None:
|
|
| 482 |
with col2:
|
| 483 |
report_data = generate_report_text(st.session_state.user_query, results)
|
| 484 |
st.download_button(
|
| 485 |
-
label="馃搫 Descargar Informe
|
| 486 |
data=report_data,
|
| 487 |
file_name=f"informe_detective_alimentos_{datetime.now().strftime('%Y%m%d')}.txt",
|
| 488 |
mime="text/plain"
|
|
@@ -506,7 +503,7 @@ if st.session_state.search_results is not None:
|
|
| 506 |
with col2:
|
| 507 |
st.write("")
|
| 508 |
if foodb_index:
|
| 509 |
-
with st.popover("馃敩 Principales componentes moleculares"):
|
| 510 |
user_foods_mentioned = st.session_state.entities.get("alimentos", [])
|
| 511 |
if not user_foods_mentioned:
|
| 512 |
st.info("El usuario no especific贸 un alimento, no se puede realizar la b煤squeda molecular.")
|
|
|
|
| 1 |
+
# ==================== El Detective de Alimentos (Versi贸n 10.1) =====================================
|
| 2 |
+
# Por: JAIRO CESAR ALEXANDER E. MD DIANA MILENA SOLER MARTINEZ PSI. ESP. U JUAN N CORPAS
|
| 3 |
|
| 4 |
import streamlit as st
|
| 5 |
import google.generativeai as genai
|
|
|
|
| 61 |
return None, None, None
|
| 62 |
alimentos_data, lista_condiciones, foodb_index = load_data()
|
| 63 |
|
|
|
|
| 64 |
FOOD_TO_COMPOUND_MAP = {
|
| 65 |
# --- CEREALES Y GRANOS ---
|
| 66 |
"pan": ["gluten"], "trigo": ["gluten"], "harina": ["gluten"], "cebada": ["gluten"], "centeno": ["gluten"], "pasta": ["gluten"], "galletas": ["gluten"], "pizza": ["gluten"], "torta": ["gluten"], "pastel": ["gluten"], "avena": ["gluten"], # Avena es sensible para cel铆acos por contaminaci贸n cruzada y avenina
|
|
|
|
| 223 |
|
| 224 |
Devuelve la respuesta 脷NICAMENTE en formato JSON estricto.
|
| 225 |
|
| 226 |
+
Ejemplo: si el usuario dice "vino tinto y dolor de cabeza", la condici贸n probable es "Intolerancia a la Quercetina." o "Migra帽a.", no "Intolerancia a la Lactosa.".
|
| 227 |
|
| 228 |
Consulta: "{query}"
|
| 229 |
"""
|
|
|
|
| 303 |
prompt_parts = [
|
| 304 |
"Eres un asistente de IA experto en nutrici贸n personalizada y comunicaci贸n m茅dica. Tu objetivo es explicar conceptos complejos de forma sencilla y emp谩tica.",
|
| 305 |
f'El usuario ha descrito el siguiente caso: "{query}"',
|
|
|
|
| 306 |
f'Tu sistema ha identificado una posible conexi贸n con "{match.get("condicion_asociada", "N/A")}". Los s铆ntomas clave asociados en la base de datos para esta condici贸n son: {sintomas_clave_texto}.',
|
|
|
|
| 307 |
f'El mecanismo fisiol贸gico es: "{match.get("mecanismo_fisiologico", "No especificado")}".',
|
| 308 |
f'Las recomendaciones generales son: "{match.get("recomendaciones_examenes", "No especificadas")}".',
|
| 309 |
f'Otros alimentos implicados son: "{match.get("compuesto_alimento", "No especificados")}".',
|
|
|
|
| 331 |
prompt = "\n".join(prompt_parts)
|
| 332 |
try:
|
| 333 |
response = model.generate_content(prompt)
|
| 334 |
+
|
| 335 |
if response.text and len(response.text) > 1:
|
| 336 |
return response.text
|
| 337 |
else:
|
|
|
|
| 391 |
st.image("buho.png", width=120)
|
| 392 |
st.markdown("---")
|
| 393 |
|
| 394 |
+
|
| 395 |
if 'search_results' not in st.session_state: st.session_state.search_results = None
|
| 396 |
if 'user_query' not in st.session_state: st.session_state.user_query = ""
|
| 397 |
if 'entities' not in st.session_state: st.session_state.entities = None
|
| 398 |
if 'analysis_cache' not in st.session_state: st.session_state.analysis_cache = {}
|
| 399 |
if 'query' not in st.session_state: st.session_state.query = ""
|
| 400 |
+
|
| 401 |
if 'start_analysis' not in st.session_state: st.session_state.start_analysis = False
|
| 402 |
|
| 403 |
def clear_search_state():
|
|
|
|
| 406 |
st.session_state.entities = None
|
| 407 |
st.session_state.analysis_cache = {}
|
| 408 |
|
| 409 |
+
|
| 410 |
def set_query_and_trigger_analysis(example_text):
|
| 411 |
st.session_state.query = example_text
|
| 412 |
st.session_state.start_analysis = True
|
| 413 |
|
| 414 |
+
|
| 415 |
st.write("**驴No sabes por d贸nde empezar? Prueba con un ejemplo:**")
|
| 416 |
example_cols = st.columns(3)
|
| 417 |
example_queries = [
|
|
|
|
| 419 |
"Despu茅s de tomar leche, tengo muchos gases e hinchaz贸n.",
|
| 420 |
"El vino tinto siempre me da dolor de cabeza, a que se debe"
|
| 421 |
]
|
| 422 |
+
|
| 423 |
if example_cols[0].button(example_queries[0]):
|
| 424 |
set_query_and_trigger_analysis(example_queries[0])
|
| 425 |
if example_cols[1].button(example_queries[1]):
|
|
|
|
| 427 |
if example_cols[2].button(example_queries[2]):
|
| 428 |
set_query_and_trigger_analysis(example_queries[2])
|
| 429 |
|
| 430 |
+
|
| 431 |
+
|
| 432 |
with st.form(key="search_form"):
|
| 433 |
st.text_area("Describe tu caso aqu铆:", height=150, key="query")
|
| 434 |
submitted = st.form_submit_button("Analizar mi caso", type="primary")
|
| 435 |
if submitted:
|
| 436 |
st.session_state.start_analysis = True
|
| 437 |
|
| 438 |
+
|
| 439 |
if st.session_state.start_analysis:
|
| 440 |
# Inmediatamente bajamos la bandera para evitar ejecuciones repetidas.
|
| 441 |
st.session_state.start_analysis = False
|
|
|
|
| 479 |
with col2:
|
| 480 |
report_data = generate_report_text(st.session_state.user_query, results)
|
| 481 |
st.download_button(
|
| 482 |
+
label="馃搫 Descargar Informe",
|
| 483 |
data=report_data,
|
| 484 |
file_name=f"informe_detective_alimentos_{datetime.now().strftime('%Y%m%d')}.txt",
|
| 485 |
mime="text/plain"
|
|
|
|
| 503 |
with col2:
|
| 504 |
st.write("")
|
| 505 |
if foodb_index:
|
| 506 |
+
with st.popover("馃敩 Principales componentes moleculares (En Ingles"):
|
| 507 |
user_foods_mentioned = st.session_state.entities.get("alimentos", [])
|
| 508 |
if not user_foods_mentioned:
|
| 509 |
st.info("El usuario no especific贸 un alimento, no se puede realizar la b煤squeda molecular.")
|