Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -973,47 +973,36 @@ if st.session_state.search_results is not None:
|
|
| 973 |
score_col2.metric("Puntos por Síntomas", f"{best_match_data['score']['symptoms']}")
|
| 974 |
score_col3.metric("PUNTUACIÓN TOTAL", f"{best_match_data['score']['total']}", delta="Máxima coincidencia")
|
| 975 |
|
| 976 |
-
with col2_expander:
|
| 977 |
st.write("")
|
| 978 |
if foodb_index:
|
| 979 |
with st.popover("🔬 Componentes Moleculares del Diagnóstico"):
|
| 980 |
-
|
| 981 |
st.info("Análisis de los compuestos en los alimentos mencionados que están directamente implicados en el diagnóstico principal.")
|
| 982 |
-
|
| 983 |
user_foods_mentioned = st.session_state.entities.get("alimentos", [])
|
| 984 |
|
| 985 |
if not user_foods_mentioned:
|
| 986 |
st.warning("No se identificó un alimento específico para buscar.")
|
| 987 |
else:
|
| 988 |
-
# --- NUEVA LÓGICA DE ENRIQUECIMIENTO DE PISTAS ---
|
| 989 |
-
|
| 990 |
-
# 1. RECOPILACIÓN DE PISTAS INICIALES
|
| 991 |
initial_clues = set()
|
| 992 |
-
|
| 993 |
-
# Pista Directa: del campo 'compuesto_alimento' del diagnóstico
|
| 994 |
direct_text = best_match.get("compuesto_alimento", "").lower()
|
| 995 |
cleaned_text = re.sub(r'\(.*?\)', '', direct_text)
|
| 996 |
initial_clues.update(re.findall(r'\b[a-zA-Z-]+\b', cleaned_text))
|
| 997 |
|
| 998 |
-
# Pistas Indirectas: de los síntomas del diagnóstico via KNOWN_TRIGGERS_MAP
|
| 999 |
main_diagnosis_symptoms = set(s.lower() for s in best_match.get("sintomas_clave", []))
|
| 1000 |
for compound, triggered_symptoms in KNOWN_TRIGGERS_MAP.items():
|
| 1001 |
if main_diagnosis_symptoms.intersection(triggered_symptoms):
|
| 1002 |
initial_clues.add(compound.lower())
|
| 1003 |
|
| 1004 |
-
# 2. ENRIQUECIMIENTO DE PISTAS con sinónimos moleculares
|
| 1005 |
final_search_keywords = set()
|
| 1006 |
for clue in initial_clues:
|
| 1007 |
-
final_search_keywords.add(clue)
|
| 1008 |
if clue in COMPOUND_SYNONYM_MAP:
|
| 1009 |
final_search_keywords.update(COMPOUND_SYNONYM_MAP[clue])
|
| 1010 |
|
| 1011 |
if not final_search_keywords:
|
| 1012 |
st.warning(f"No se pudieron determinar los compuestos moleculares clave para '{best_match.get('condicion_asociada')}'.")
|
| 1013 |
else:
|
| 1014 |
-
logger.info(f"Buscando compuestos moleculares con las palabras clave: {final_search_keywords}")
|
| 1015 |
best_food_matches = find_best_foodb_matches(user_foods_mentioned, foodb_index.keys(), FOOD_NAME_TO_FOODB_KEY)
|
| 1016 |
-
|
| 1017 |
if not best_food_matches:
|
| 1018 |
st.warning("No se encontraron datos moleculares para los alimentos específicos mencionados.")
|
| 1019 |
else:
|
|
@@ -1025,7 +1014,6 @@ with col2_expander:
|
|
| 1025 |
compound_name_lower = item['compound'].lower()
|
| 1026 |
if any(target in compound_name_lower for target in final_search_keywords):
|
| 1027 |
relevant_compounds.append(item)
|
| 1028 |
-
|
| 1029 |
if relevant_compounds:
|
| 1030 |
found_any_data = True
|
| 1031 |
with st.container(border=True):
|
|
@@ -1037,9 +1025,9 @@ with col2_expander:
|
|
| 1037 |
st.write(f"**Compuesto:** {item['compound']}")
|
| 1038 |
st.caption(f"Este compuesto está directamente relacionado con '{best_match.get('condicion_asociada')}'.")
|
| 1039 |
unique_compounds_shown.add(item['compound'])
|
| 1040 |
-
|
| 1041 |
if not found_any_data:
|
| 1042 |
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.")
|
|
|
|
| 1043 |
st.markdown("---")
|
| 1044 |
with st.container(border=True):
|
| 1045 |
st.markdown("##### 🧠 Posibles Efectos Neuropsicológicos de los Componentes")
|
|
@@ -1105,70 +1093,4 @@ with col2_expander:
|
|
| 1105 |
# --- LÍNEA CORREGIDA ---
|
| 1106 |
# Esta línea ahora está fuera del 'with st.container' pero dentro del 'for' loop.
|
| 1107 |
if i < len(results[1:5]) - 1:
|
| 1108 |
-
st.markdown("---")
|
| 1109 |
-
|
| 1110 |
-
|
| 1111 |
-
with st.container(border=True):
|
| 1112 |
-
st.markdown("##### 🧠 Posibles Efectos Neuropsicológicos de los Componentes")
|
| 1113 |
-
user_foods = st.session_state.entities.get("alimentos", [])
|
| 1114 |
-
relevant_compounds = set()
|
| 1115 |
-
if user_foods:
|
| 1116 |
-
for food in user_foods:
|
| 1117 |
-
if food in FOOD_TO_COMPOUND_MAP:
|
| 1118 |
-
relevant_compounds.update(FOOD_TO_COMPOUND_MAP[food])
|
| 1119 |
-
found_neuro_effect = False
|
| 1120 |
-
if relevant_compounds:
|
| 1121 |
-
for compound in sorted(list(relevant_compounds)):
|
| 1122 |
-
if compound in INTEGRATED_NEURO_FOOD_MAP:
|
| 1123 |
-
found_neuro_effect = True
|
| 1124 |
-
effect_info = INTEGRATED_NEURO_FOOD_MAP[compound]
|
| 1125 |
-
with st.container(border=True):
|
| 1126 |
-
st.subheader(f"Componente: {compound.capitalize()}")
|
| 1127 |
-
st.markdown(f"**Efecto:** {effect_info['efecto_neuropsicologico']}")
|
| 1128 |
-
if not found_neuro_effect:
|
| 1129 |
-
st.info("No se encontraron efectos neuropsicológicos específicos en la base de datos para los componentes de los alimentos mencionados.")
|
| 1130 |
-
|
| 1131 |
-
st.markdown("---")
|
| 1132 |
-
with st.spinner("✍️ Generando un análisis personalizado con IA..."):
|
| 1133 |
-
if 'best_match_analysis' not in st.session_state.analysis_cache:
|
| 1134 |
-
try:
|
| 1135 |
-
analysis_text = generate_detailed_analysis(st.session_state.user_query, best_match)
|
| 1136 |
-
st.session_state.analysis_cache['best_match_analysis'] = analysis_text
|
| 1137 |
-
except Exception as e:
|
| 1138 |
-
logger.error(f"Falló la generación del análisis detallado principal: {e}")
|
| 1139 |
-
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."
|
| 1140 |
-
st.markdown(st.session_state.analysis_cache['best_match_analysis'])
|
| 1141 |
-
|
| 1142 |
-
if len(results) > 1:
|
| 1143 |
-
with st.expander("🔍 **Explora otras posibilidades relevantes (Diagnóstico Diferencial)**"):
|
| 1144 |
-
for i, result in enumerate(results[1:5]):
|
| 1145 |
-
with st.container(border=True):
|
| 1146 |
-
entry = result['entry']
|
| 1147 |
-
score = result['score']
|
| 1148 |
-
|
| 1149 |
-
st.subheader(f"{i+2}. {entry.get('condicion_asociada')}")
|
| 1150 |
-
col_info, col_action = st.columns([3, 1])
|
| 1151 |
-
|
| 1152 |
-
with col_info:
|
| 1153 |
-
if result.get('matched_symptoms'):
|
| 1154 |
-
st.markdown(f"**Pistas Clave (Síntomas Coincidentes):** {', '.join(result['matched_symptoms']).capitalize()}")
|
| 1155 |
-
st.markdown(f"**Alimentos Típicos Asociados:** {entry.get('compuesto_alimento')}")
|
| 1156 |
-
|
| 1157 |
-
with col_action:
|
| 1158 |
-
st.metric("Relevancia", score['total'])
|
| 1159 |
-
analysis_key = f"analysis_{i+2}"
|
| 1160 |
-
|
| 1161 |
-
if st.button("Generar análisis", key=analysis_key, help=f"Generar análisis de IA para {entry.get('condicion_asociada')}"):
|
| 1162 |
-
with st.spinner(f"Generando análisis para {entry.get('condicion_asociada')}..."):
|
| 1163 |
-
try:
|
| 1164 |
-
analysis_text = generate_detailed_analysis(st.session_state.user_query, entry)
|
| 1165 |
-
st.session_state.analysis_cache[analysis_key] = analysis_text
|
| 1166 |
-
except Exception as e:
|
| 1167 |
-
st.session_state.analysis_cache[analysis_key] = f"❌ Error al generar análisis para {entry.get('condicion_asociada')}."
|
| 1168 |
-
|
| 1169 |
-
if analysis_key in st.session_state.analysis_cache:
|
| 1170 |
-
st.info(st.session_state.analysis_cache[analysis_key])
|
| 1171 |
-
|
| 1172 |
-
# Esta es la línea que probablemente causaba el error, ahora está correctamente indentada
|
| 1173 |
-
if i < len(results[1:5]) - 1:
|
| 1174 |
-
st.markdown("---")
|
|
|
|
| 973 |
score_col2.metric("Puntos por Síntomas", f"{best_match_data['score']['symptoms']}")
|
| 974 |
score_col3.metric("PUNTUACIÓN TOTAL", f"{best_match_data['score']['total']}", delta="Máxima coincidencia")
|
| 975 |
|
| 976 |
+
with col2_expander:
|
| 977 |
st.write("")
|
| 978 |
if foodb_index:
|
| 979 |
with st.popover("🔬 Componentes Moleculares del Diagnóstico"):
|
|
|
|
| 980 |
st.info("Análisis de los compuestos en los alimentos mencionados que están directamente implicados en el diagnóstico principal.")
|
|
|
|
| 981 |
user_foods_mentioned = st.session_state.entities.get("alimentos", [])
|
| 982 |
|
| 983 |
if not user_foods_mentioned:
|
| 984 |
st.warning("No se identificó un alimento específico para buscar.")
|
| 985 |
else:
|
|
|
|
|
|
|
|
|
|
| 986 |
initial_clues = set()
|
|
|
|
|
|
|
| 987 |
direct_text = best_match.get("compuesto_alimento", "").lower()
|
| 988 |
cleaned_text = re.sub(r'\(.*?\)', '', direct_text)
|
| 989 |
initial_clues.update(re.findall(r'\b[a-zA-Z-]+\b', cleaned_text))
|
| 990 |
|
|
|
|
| 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 |
if main_diagnosis_symptoms.intersection(triggered_symptoms):
|
| 994 |
initial_clues.add(compound.lower())
|
| 995 |
|
|
|
|
| 996 |
final_search_keywords = set()
|
| 997 |
for clue in initial_clues:
|
| 998 |
+
final_search_keywords.add(clue)
|
| 999 |
if clue in COMPOUND_SYNONYM_MAP:
|
| 1000 |
final_search_keywords.update(COMPOUND_SYNONYM_MAP[clue])
|
| 1001 |
|
| 1002 |
if not final_search_keywords:
|
| 1003 |
st.warning(f"No se pudieron determinar los compuestos moleculares clave para '{best_match.get('condicion_asociada')}'.")
|
| 1004 |
else:
|
|
|
|
| 1005 |
best_food_matches = find_best_foodb_matches(user_foods_mentioned, foodb_index.keys(), FOOD_NAME_TO_FOODB_KEY)
|
|
|
|
| 1006 |
if not best_food_matches:
|
| 1007 |
st.warning("No se encontraron datos moleculares para los alimentos específicos mencionados.")
|
| 1008 |
else:
|
|
|
|
| 1014 |
compound_name_lower = item['compound'].lower()
|
| 1015 |
if any(target in compound_name_lower for target in final_search_keywords):
|
| 1016 |
relevant_compounds.append(item)
|
|
|
|
| 1017 |
if relevant_compounds:
|
| 1018 |
found_any_data = True
|
| 1019 |
with st.container(border=True):
|
|
|
|
| 1025 |
st.write(f"**Compuesto:** {item['compound']}")
|
| 1026 |
st.caption(f"Este compuesto está directamente relacionado con '{best_match.get('condicion_asociada')}'.")
|
| 1027 |
unique_compounds_shown.add(item['compound'])
|
|
|
|
| 1028 |
if not found_any_data:
|
| 1029 |
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.")
|
| 1030 |
+
|
| 1031 |
st.markdown("---")
|
| 1032 |
with st.container(border=True):
|
| 1033 |
st.markdown("##### 🧠 Posibles Efectos Neuropsicológicos de los Componentes")
|
|
|
|
| 1093 |
# --- LÍNEA CORREGIDA ---
|
| 1094 |
# Esta línea ahora está fuera del 'with st.container' pero dentro del 'for' loop.
|
| 1095 |
if i < len(results[1:5]) - 1:
|
| 1096 |
+
st.markdown("---")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|