JairoCesar commited on
Commit
451fced
verified
1 Parent(s): 8c83230

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +14 -17
app.py CHANGED
@@ -1,5 +1,5 @@
1
- # ==================== El Detective de Alimentos (Versi贸n 10.1 - UI Personalizada) =====================================
2
- # Mejoras: Cabecera con dos im谩genes y eliminaci贸n de la funcionalidad de feedback.
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 "Histaminosis / Intolerancia a la Histamina." o "Migra帽a.", no "Intolerancia a la Lactosa.".
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
- # A帽adimos una comprobaci贸n de seguridad extra por si la API devuelve una respuesta vac铆a
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
- # MANEJO DE ESTADO
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
- # --- CAMBIO 1: A脩ADIMOS LA BANDERA DE CONTROL ---
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
- # --- CAMBIO 2: NUEVA FUNCI脫N PARA LOS BOTONES DE EJEMPLO ---
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
- # SECCI脫N: EJEMPLOS DE CONSULTA
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
- # --- CAMBIO 3: LOS BOTONES AHORA LLAMAN A LA NUEVA FUNCI脫N ---
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
- # --- CAMBIO 4: ESTRUCTURA PRINCIPAL MODIFICADA ---
434
- # El formulario solo define la UI y activa la bandera al ser enviado.
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
- # La l贸gica de an谩lisis se ejecuta si CUALQUIER bot贸n activ贸 la bandera.
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 para mi M茅dico",
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.")