JairoCesar commited on
Commit
8ed012f
·
verified ·
1 Parent(s): 559c276

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +37 -41
app.py CHANGED
@@ -1,4 +1,5 @@
1
  # ==================== El Detective de Alimentos v 2.0
 
2
  # Por: JAIRO CESAR ALEXANDER E. MD DIANA MILENA SOLER MARTINEZ PSI. ESP. U JUAN N CORPAS
3
  import streamlit as st
4
  import google.generativeai as genai
@@ -1067,49 +1068,53 @@ if st.session_state.search_results is not None:
1067
  if not results:
1068
  st.warning(f"No se encontraron coincidencias claras para tu caso: '{st.session_state.user_query}'. Prueba a describir los síntomas de otra manera.")
1069
  else:
1070
- # --- CORRECCIÓN APLICADA: Definir best_match y best_match_data al principio ---
1071
  best_match_data = results[0]
1072
  best_match = best_match_data['entry']
 
 
 
 
 
 
 
 
 
 
 
 
 
1073
 
1074
- # Ahora el resto del código puede usar 'best_match' y 'best_match_data' sin problemas
 
 
 
 
 
 
 
 
 
 
 
1075
  col1, col2 = st.columns([3,1])
1076
  with col1:
1077
  st.success(f"Hemos encontrado {len(results)} posible(s) causa(s) relacionada(s) con tu caso.")
1078
-
1079
  with col2:
1080
- if 'report_generated' not in st.session_state:
1081
- st.session_state.report_generated = False
1082
- st.session_state.word_file_buffer = None
1083
-
1084
- if st.button("📄 Preparar Informe (Word)", key="prepare_report"):
1085
- with st.spinner("Generando su informe personalizado, por favor espere..."):
1086
- ai_analysis_text = st.session_state.analysis_cache.get('best_match_analysis', "Análisis con IA no generado.")
1087
- base_report_text = generate_report_text(st.session_state.user_query, results)
1088
- neuro_report_text = generate_neuro_report_text(st.session_state.entities, FOOD_TO_COMPOUND_MAP, INTEGRATED_NEURO_FOOD_MAP)
1089
- molecular_report_text = generate_molecular_report_text(best_match, st.session_state.entities, foodb_index, FOOD_NAME_TO_FOODB_KEY, COMPOUND_SYNONYM_MAP, KNOWN_TRIGGERS_MAP)
1090
-
1091
- complete_report_string = f"{base_report_text}\n\n{ai_analysis_text}\n{neuro_report_text}\n{molecular_report_text}"
1092
-
1093
- st.session_state.word_file_buffer = generate_word_report(complete_report_string)
1094
- st.session_state.report_generated = True
1095
- st.rerun()
1096
-
1097
- if st.session_state.report_generated and st.session_state.word_file_buffer:
1098
  st.download_button(
1099
- label=" Descargar Informe Ahora",
1100
- data=st.session_state.word_file_buffer,
1101
  file_name=f"Informe_Detective_Alimentos_{datetime.now().strftime('%Y%m%d')}.docx",
1102
  mime="application/vnd.openxmlformats-officedocument.wordprocessingml.document",
1103
  key="download_word_report"
1104
  )
1105
- st.success("¡Su informe está listo!")
1106
 
1107
  st.subheader("Análisis de Relevancia de las Coincidencias")
1108
  st.altair_chart(create_relevance_chart(results), use_container_width=True)
1109
 
1110
  with st.expander(f"**Análisis Detallado de la Principal Coincidencia: {best_match.get('condicion_asociada')}**", expanded=True):
1111
  col1_expander, col2_expander = st.columns([3, 1])
1112
-
1113
  with col1_expander:
1114
  st.markdown("##### Desglose de la Puntuación de Relevancia:")
1115
  score_col1, score_col2, score_col3 = st.columns(3)
@@ -1118,27 +1123,18 @@ if st.session_state.search_results is not None:
1118
  score_col3.metric("PUNTUACIÓN TOTAL", f"{best_match_data['score']['total']}", delta="Máxima coincidencia")
1119
 
1120
  with col2_expander:
1121
- with st.popover("🔬 Componentes Moleculares del Diagnóstico"):
1122
- molecular_report_text_display = generate_molecular_report_text(best_match, st.session_state.entities, foodb_index, FOOD_NAME_TO_FOODB_KEY, COMPOUND_SYNONYM_MAP, KNOWN_TRIGGERS_MAP)
1123
- st.markdown(molecular_report_text_display.replace("=", ""))
1124
 
1125
  st.markdown("---")
1126
  with st.container(border=True):
1127
- neuro_report_text_display = generate_neuro_report_text(st.session_state.entities, FOOD_TO_COMPOUND_MAP, INTEGRATED_NEURO_FOOD_MAP)
1128
- st.markdown(neuro_report_text_display.replace("=", ""))
1129
 
1130
  st.markdown("---")
1131
-
1132
- if 'best_match_analysis' not in st.session_state.analysis_cache:
1133
- with st.spinner("✍️ Generando análisis personalizado con IA..."):
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."
1140
-
1141
- st.markdown(st.session_state.analysis_cache.get('best_match_analysis', "Cargando análisis..."))
1142
 
1143
  if len(results) > 1:
1144
  with st.expander("🔍 **Explora otras posibilidades relevantes (Diagnóstico Diferencial)**"):
 
1
  # ==================== El Detective de Alimentos v 2.0
2
+ # ==================== El Detective de Alimentos v 2.0
3
  # Por: JAIRO CESAR ALEXANDER E. MD DIANA MILENA SOLER MARTINEZ PSI. ESP. U JUAN N CORPAS
4
  import streamlit as st
5
  import google.generativeai as genai
 
1068
  if not results:
1069
  st.warning(f"No se encontraron coincidencias claras para tu caso: '{st.session_state.user_query}'. Prueba a describir los síntomas de otra manera.")
1070
  else:
1071
+ # --- PASO 1: GENERAR TODO EL CONTENIDO DEL INFORME EN LA MEMORIA ---
1072
  best_match_data = results[0]
1073
  best_match = best_match_data['entry']
1074
+
1075
+ # Generar análisis detallado con IA (la parte más lenta) y guardarlo en caché
1076
+ if 'best_match_analysis' not in st.session_state.analysis_cache:
1077
+ with st.spinner("✍️ Generando análisis personalizado con IA..."):
1078
+ try:
1079
+ analysis_text = generate_detailed_analysis(st.session_state.user_query, best_match)
1080
+ st.session_state.analysis_cache['best_match_analysis'] = analysis_text
1081
+ except Exception as e:
1082
+ logger.error(f"Falló la generación del análisis detallado principal: {e}")
1083
+ 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."
1084
+
1085
+ # Recuperar o usar el texto ya generado
1086
+ ai_analysis_text = st.session_state.analysis_cache['best_match_analysis']
1087
 
1088
+ # Generar los otros componentes de texto para el informe
1089
+ base_report_text = generate_report_text(st.session_state.user_query, results)
1090
+ neuro_report_text = generate_neuro_report_text(st.session_state.entities, FOOD_TO_COMPOUND_MAP, INTEGRATED_NEURO_FOOD_MAP)
1091
+ molecular_report_text = generate_molecular_report_text(best_match, st.session_state.entities, foodb_index, FOOD_NAME_TO_FOODB_KEY, COMPOUND_SYNONYM_MAP, KNOWN_TRIGGERS_MAP)
1092
+
1093
+ # Unir todo en un solo string para el informe de Word
1094
+ complete_report_string = f"{base_report_text}\n\n{ai_analysis_text}\n{neuro_report_text}\n{molecular_report_text}"
1095
+
1096
+ # Generar el archivo de Word en memoria con todo el contenido
1097
+ word_file_buffer = generate_word_report(complete_report_string)
1098
+
1099
+ # --- PASO 2: CONSTRUIR LA INTERFAZ DE USUARIO USANDO EL CONTENIDO PRE-GENERADO ---
1100
  col1, col2 = st.columns([3,1])
1101
  with col1:
1102
  st.success(f"Hemos encontrado {len(results)} posible(s) causa(s) relacionada(s) con tu caso.")
 
1103
  with col2:
1104
+ if word_file_buffer:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1105
  st.download_button(
1106
+ label="📄 Descargar Informe Completo (Word)",
1107
+ data=word_file_buffer,
1108
  file_name=f"Informe_Detective_Alimentos_{datetime.now().strftime('%Y%m%d')}.docx",
1109
  mime="application/vnd.openxmlformats-officedocument.wordprocessingml.document",
1110
  key="download_word_report"
1111
  )
 
1112
 
1113
  st.subheader("Análisis de Relevancia de las Coincidencias")
1114
  st.altair_chart(create_relevance_chart(results), use_container_width=True)
1115
 
1116
  with st.expander(f"**Análisis Detallado de la Principal Coincidencia: {best_match.get('condicion_asociada')}**", expanded=True):
1117
  col1_expander, col2_expander = st.columns([3, 1])
 
1118
  with col1_expander:
1119
  st.markdown("##### Desglose de la Puntuación de Relevancia:")
1120
  score_col1, score_col2, score_col3 = st.columns(3)
 
1123
  score_col3.metric("PUNTUACIÓN TOTAL", f"{best_match_data['score']['total']}", delta="Máxima coincidencia")
1124
 
1125
  with col2_expander:
1126
+ with st.popover("🔬 Componentes Moleculares"):
1127
+ # Muestra el texto del informe molecular que ya generamos
1128
+ st.markdown(molecular_report_text.replace("=", ""))
1129
 
1130
  st.markdown("---")
1131
  with st.container(border=True):
1132
+ # Muestra el texto del informe neuropsicológico que ya generamos
1133
+ st.markdown(neuro_report_text.replace("=", ""))
1134
 
1135
  st.markdown("---")
1136
+ # Muestra el análisis detallado con IA que ya generamos
1137
+ st.markdown(ai_analysis_text)
 
 
 
 
 
 
 
 
 
1138
 
1139
  if len(results) > 1:
1140
  with st.expander("🔍 **Explora otras posibilidades relevantes (Diagnóstico Diferencial)**"):