Spaces:
Running
Running
Update app.py
Browse files
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 |
-
|
| 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)
|
| 978 |
-
direct_keywords = set(re.findall(r'\b[a-zA-Z-]+\b', cleaned_text))
|
| 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 |
-
|
| 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]):
|