JairoCesar commited on
Commit
a54319c
·
verified ·
1 Parent(s): 5f2935a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +72 -18
app.py CHANGED
@@ -957,44 +957,34 @@ if st.session_state.search_results is not None:
957
  score_col2.metric("Puntos por Síntomas", f"{best_match_data['score']['symptoms']}")
958
  score_col3.metric("PUNTUACIÓN TOTAL", f"{best_match_data['score']['total']}", delta="Máxima coincidencia")
959
 
960
- with col2_expander:
961
  st.write("")
962
  if foodb_index:
963
  with st.popover("🔬 Componentes Moleculares del Diagnóstico"):
964
-
965
  st.info("Análisis de los compuestos en los alimentos mencionados que están directamente implicados en el diagnóstico principal.")
966
-
967
  user_foods_mentioned = st.session_state.entities.get("alimentos", [])
968
 
969
  if not user_foods_mentioned:
970
  st.warning("No se identificó un alimento específico para buscar.")
971
  else:
972
- # --- LÓGICA HÍBRIDA MEJORADA ---
973
  target_compounds = set()
974
 
975
- # 1. PRIORIDAD 1: Intentar extraer el compuesto directamente del diagnóstico.
976
  target_compounds_text = best_match.get("compuesto_alimento", "").lower()
977
- cleaned_text = re.sub(r'\(.*?\)', '', target_compounds_text) # Limpiar texto en paréntesis
978
- direct_keywords = set(re.findall(r'\b[a-zA-Z-]+\b', cleaned_text)) # Extraer palabras
979
 
980
- # Filtrar palabras genéricas para forzar el fallback si es necesario
981
  generic_words = {'y', 'o', 'en', 'con', 'lácteos', 'carnes', 'pescados'}
982
  direct_keywords -= generic_words
983
 
984
  if direct_keywords:
985
  target_compounds.update(direct_keywords)
986
- logger.info(f"Método Directo: Compuestos objetivo encontrados: {target_compounds}")
987
 
988
- # 2. PRIORIDAD 2: Si el método directo falla o es muy genérico, usar el método indirecto.
989
  if not target_compounds:
990
- logger.info("Método Directo falló, usando Fallback (método indirecto)...")
991
- main_diagnosis_symptoms = set(s.lower() for s in best_match.get("sintomas_clave", []))
992
  for compound, triggered_symptoms in KNOWN_TRIGGERS_MAP.items():
993
- # Usar intersection para encontrar síntomas compartidos
994
  if main_diagnosis_symptoms.intersection(triggered_symptoms):
995
  target_compounds.add(compound.lower())
996
- logger.info(f"Método Indirecto: Compuestos objetivo encontrados: {target_compounds}")
997
-
998
  if not target_compounds:
999
  st.warning(f"No se pudieron determinar los compuestos moleculares clave para '{best_match.get('condicion_asociada')}'.")
1000
  else:
@@ -1008,10 +998,8 @@ with col2_expander:
1008
  relevant_compounds = []
1009
  for item in compounds_data:
1010
  compound_name_lower = item['compound'].lower()
1011
- # Comprobar si el nombre del compuesto contiene ALGUNA de las palabras clave objetivo
1012
  if any(target in compound_name_lower for target in target_compounds):
1013
  relevant_compounds.append(item)
1014
-
1015
  if relevant_compounds:
1016
  found_any_data = True
1017
  with st.container(border=True):
@@ -1020,7 +1008,6 @@ with col2_expander:
1020
  for item in relevant_compounds[:5]:
1021
  st.write(f"**Compuesto:** {item['compound']}")
1022
  st.caption(f"Este compuesto está directamente relacionado con '{best_match.get('condicion_asociada')}'.")
1023
-
1024
  if not found_any_data:
1025
  st.warning(f"No se encontraron los compuestos específicos de '{best_match.get('condicion_asociada')}' en los alimentos analizados en la base de datos FoodB.")
1026
 
@@ -1056,6 +1043,73 @@ with col2_expander:
1056
  st.session_state.analysis_cache['best_match_analysis'] = "❌ Lo sentimos, no se pudo generar el análisis detallado en este momento debido a un problema con la IA. Por favor, intenta de nuevo más tarde."
1057
  st.markdown(st.session_state.analysis_cache['best_match_analysis'])
1058
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1059
  if len(results) > 1:
1060
  with st.expander("🔍 **Explora otras posibilidades relevantes (Diagnóstico Diferencial)**"):
1061
  for i, result in enumerate(results[1:5]):
 
957
  score_col2.metric("Puntos por Síntomas", f"{best_match_data['score']['symptoms']}")
958
  score_col3.metric("PUNTUACIÓN TOTAL", f"{best_match_data['score']['total']}", delta="Máxima coincidencia")
959
 
960
+ with col2_expander:
961
  st.write("")
962
  if foodb_index:
963
  with st.popover("🔬 Componentes Moleculares del Diagnóstico"):
 
964
  st.info("Análisis de los compuestos en los alimentos mencionados que están directamente implicados en el diagnóstico principal.")
 
965
  user_foods_mentioned = st.session_state.entities.get("alimentos", [])
966
 
967
  if not user_foods_mentioned:
968
  st.warning("No se identificó un alimento específico para buscar.")
969
  else:
970
+ main_diagnosis_symptoms = set(s.lower() for s in best_match.get("sintomas_clave", []))
971
  target_compounds = set()
972
 
 
973
  target_compounds_text = best_match.get("compuesto_alimento", "").lower()
974
+ cleaned_text = re.sub(r'\(.*?\)', '', target_compounds_text)
975
+ direct_keywords = set(re.findall(r'\b[a-zA-Z-]+\b', cleaned_text))
976
 
 
977
  generic_words = {'y', 'o', 'en', 'con', 'lácteos', 'carnes', 'pescados'}
978
  direct_keywords -= generic_words
979
 
980
  if direct_keywords:
981
  target_compounds.update(direct_keywords)
 
982
 
 
983
  if not target_compounds:
 
 
984
  for compound, triggered_symptoms in KNOWN_TRIGGERS_MAP.items():
 
985
  if main_diagnosis_symptoms.intersection(triggered_symptoms):
986
  target_compounds.add(compound.lower())
987
+
 
988
  if not target_compounds:
989
  st.warning(f"No se pudieron determinar los compuestos moleculares clave para '{best_match.get('condicion_asociada')}'.")
990
  else:
 
998
  relevant_compounds = []
999
  for item in compounds_data:
1000
  compound_name_lower = item['compound'].lower()
 
1001
  if any(target in compound_name_lower for target in target_compounds):
1002
  relevant_compounds.append(item)
 
1003
  if relevant_compounds:
1004
  found_any_data = True
1005
  with st.container(border=True):
 
1008
  for item in relevant_compounds[:5]:
1009
  st.write(f"**Compuesto:** {item['compound']}")
1010
  st.caption(f"Este compuesto está directamente relacionado con '{best_match.get('condicion_asociada')}'.")
 
1011
  if not found_any_data:
1012
  st.warning(f"No se encontraron los compuestos específicos de '{best_match.get('condicion_asociada')}' en los alimentos analizados en la base de datos FoodB.")
1013
 
 
1043
  st.session_state.analysis_cache['best_match_analysis'] = "❌ Lo sentimos, no se pudo generar el análisis detallado en este momento debido a un problema con la IA. Por favor, intenta de nuevo más tarde."
1044
  st.markdown(st.session_state.analysis_cache['best_match_analysis'])
1045
 
1046
+ if len(results) > 1:
1047
+ with st.expander("🔍 **Explora otras posibilidades relevantes (Diagnóstico Diferencial)**"):
1048
+ for i, result in enumerate(results[1:5]):
1049
+ with st.container(border=True):
1050
+ entry = result['entry']
1051
+ score = result['score']
1052
+
1053
+ st.subheader(f"{i+2}. {entry.get('condicion_asociada')}")
1054
+ col_info, col_action = st.columns([3, 1])
1055
+
1056
+ with col_info:
1057
+ if result.get('matched_symptoms'):
1058
+ st.markdown(f"**Pistas Clave (Síntomas Coincidentes):** {', '.join(result['matched_symptoms']).capitalize()}")
1059
+ st.markdown(f"**Alimentos Típicos Asociados:** {entry.get('compuesto_alimento')}")
1060
+
1061
+ with col_action:
1062
+ st.metric("Relevancia", score['total'])
1063
+ analysis_key = f"analysis_{i+2}"
1064
+
1065
+ if st.button("Generar análisis", key=analysis_key, help=f"Generar análisis de IA para {entry.get('condicion_asociada')}"):
1066
+ with st.spinner(f"Generando análisis para {entry.get('condicion_asociada')}..."):
1067
+ try:
1068
+ analysis_text = generate_detailed_analysis(st.session_state.user_query, entry)
1069
+ st.session_state.analysis_cache[analysis_key] = analysis_text
1070
+ except Exception as e:
1071
+ st.session_state.analysis_cache[analysis_key] = f"❌ Error al generar análisis para {entry.get('condicion_asociada')}."
1072
+
1073
+ if analysis_key in st.session_state.analysis_cache:
1074
+ st.info(st.session_state.analysis_cache[analysis_key])
1075
+
1076
+ # --- LÍNEA CORREGIDA ---
1077
+ # Esta línea ahora está fuera del 'with st.container' pero dentro del 'for' loop.
1078
+ if i < len(results[1:5]) - 1:
1079
+ st.markdown("---")
1080
+
1081
+
1082
+ with st.container(border=True):
1083
+ st.markdown("##### 🧠 Posibles Efectos Neuropsicológicos de los Componentes")
1084
+ user_foods = st.session_state.entities.get("alimentos", [])
1085
+ relevant_compounds = set()
1086
+ if user_foods:
1087
+ for food in user_foods:
1088
+ if food in FOOD_TO_COMPOUND_MAP:
1089
+ relevant_compounds.update(FOOD_TO_COMPOUND_MAP[food])
1090
+ found_neuro_effect = False
1091
+ if relevant_compounds:
1092
+ for compound in sorted(list(relevant_compounds)):
1093
+ if compound in INTEGRATED_NEURO_FOOD_MAP:
1094
+ found_neuro_effect = True
1095
+ effect_info = INTEGRATED_NEURO_FOOD_MAP[compound]
1096
+ with st.container(border=True):
1097
+ st.subheader(f"Componente: {compound.capitalize()}")
1098
+ st.markdown(f"**Efecto:** {effect_info['efecto_neuropsicologico']}")
1099
+ if not found_neuro_effect:
1100
+ st.info("No se encontraron efectos neuropsicológicos específicos en la base de datos para los componentes de los alimentos mencionados.")
1101
+
1102
+ st.markdown("---")
1103
+ with st.spinner("✍️ Generando un análisis personalizado con IA..."):
1104
+ if 'best_match_analysis' not in st.session_state.analysis_cache:
1105
+ try:
1106
+ analysis_text = generate_detailed_analysis(st.session_state.user_query, best_match)
1107
+ st.session_state.analysis_cache['best_match_analysis'] = analysis_text
1108
+ except Exception as e:
1109
+ logger.error(f"Falló la generación del análisis detallado principal: {e}")
1110
+ st.session_state.analysis_cache['best_match_analysis'] = "❌ Lo sentimos, no se pudo generar el análisis detallado en este momento debido a un problema con la IA. Por favor, intenta de nuevo más tarde."
1111
+ st.markdown(st.session_state.analysis_cache['best_match_analysis'])
1112
+
1113
  if len(results) > 1:
1114
  with st.expander("🔍 **Explora otras posibilidades relevantes (Diagnóstico Diferencial)**"):
1115
  for i, result in enumerate(results[1:5]):