Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -492,7 +492,6 @@ if st.session_state.start_analysis:
|
|
| 492 |
else:
|
| 493 |
st.error("No se pudieron identificar alimentos o síntomas claros en tu descripción. Intenta ser más específico.")
|
| 494 |
st.session_state.search_results = []
|
| 495 |
-
|
| 496 |
if st.session_state.search_results is not None:
|
| 497 |
results = st.session_state.search_results
|
| 498 |
|
|
@@ -500,7 +499,8 @@ if st.session_state.search_results is not None:
|
|
| 500 |
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.")
|
| 501 |
else:
|
| 502 |
col1, col2 = st.columns([3,1])
|
| 503 |
-
with col1:
|
|
|
|
| 504 |
with col2:
|
| 505 |
report_data = generate_report_text(st.session_state.user_query, results)
|
| 506 |
st.download_button(label="📄 Descargar Informe", data=report_data, file_name=f"informe_detective_{datetime.now().strftime('%Y%m%d')}.txt", mime="text/plain")
|
|
@@ -511,14 +511,19 @@ if st.session_state.search_results is not None:
|
|
| 511 |
best_match_data = results[0]
|
| 512 |
best_match = best_match_data['entry']
|
| 513 |
with st.expander(f"**Análisis Detallado de la Principal Coincidencia: {best_match.get('condicion_asociada')}**", expanded=True):
|
|
|
|
| 514 |
col1, col2 = st.columns([3, 1])
|
|
|
|
|
|
|
| 515 |
with col1:
|
| 516 |
st.markdown("##### Desglose de la Puntuación de Relevancia:")
|
| 517 |
score_col1, score_col2, score_col3 = st.columns(3)
|
| 518 |
score_col1.metric("Puntos por Alimento(s)", f"{best_match_data['score']['food']}")
|
| 519 |
score_col2.metric("Puntos por Síntomas", f"{best_match_data['score']['symptoms']}")
|
| 520 |
score_col3.metric("PUNTUACIÓN TOTAL", f"{best_match_data['score']['total']}", delta="Máxima coincidencia")
|
| 521 |
-
|
|
|
|
|
|
|
| 522 |
st.write("") # Para alinear verticalmente el popover
|
| 523 |
if foodb_index:
|
| 524 |
with st.popover("🔬 Componentes moleculares"):
|
|
@@ -531,15 +536,12 @@ with col2:
|
|
| 531 |
found_data = False
|
| 532 |
displayed_foodb_keys = set()
|
| 533 |
|
| 534 |
-
# Iterar sobre los alimentos que el usuario mencionó
|
| 535 |
for alimento_es in user_foods_mentioned:
|
| 536 |
search_terms_en = []
|
| 537 |
-
# Traducir de español a inglés usando el diccionario
|
| 538 |
for key_es, value_en_list in FOOD_NAME_TO_FOODB_KEY.items():
|
| 539 |
if key_es in alimento_es.lower():
|
| 540 |
search_terms_en.extend(value_en_list)
|
| 541 |
|
| 542 |
-
# Buscar los términos en inglés en el índice de FoodB
|
| 543 |
for term in set(search_terms_en):
|
| 544 |
for foodb_key, foodb_data in foodb_index.items():
|
| 545 |
if term in foodb_key and foodb_key not in displayed_foodb_keys:
|
|
@@ -547,7 +549,6 @@ with col2:
|
|
| 547 |
displayed_foodb_keys.add(foodb_key)
|
| 548 |
with st.container(border=True):
|
| 549 |
st.subheader(f"Análisis de: {foodb_key.capitalize()}")
|
| 550 |
-
# Mostrar los 3 compuestos más relevantes
|
| 551 |
for item in foodb_data[:3]:
|
| 552 |
st.write(f"**Compuesto:** {item['compound']}")
|
| 553 |
st.write(f"**Efectos reportados:** {', '.join(item['effects'])}")
|
|
@@ -555,10 +556,8 @@ with col2:
|
|
| 555 |
|
| 556 |
if not found_data:
|
| 557 |
st.warning("No se encontraron datos moleculares para los alimentos mencionados.")
|
| 558 |
-
if foodb_index:
|
| 559 |
-
with st.popover("🔬 Componentes moleculares"):
|
| 560 |
-
st.info("Información de la base de datos FoodB (en inglés).")
|
| 561 |
|
|
|
|
| 562 |
st.markdown("---")
|
| 563 |
with st.spinner("✍️ Generando un análisis personalizado con IA..."):
|
| 564 |
if 'best_match_analysis' not in st.session_state.analysis_cache:
|
|
@@ -570,40 +569,36 @@ with col2:
|
|
| 570 |
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."
|
| 571 |
st.markdown(st.session_state.analysis_cache['best_match_analysis'])
|
| 572 |
|
| 573 |
-
|
| 574 |
-
|
| 575 |
-
|
| 576 |
-
|
| 577 |
-
|
| 578 |
-
|
| 579 |
-
|
| 580 |
-
|
| 581 |
-
|
| 582 |
-
|
| 583 |
-
|
| 584 |
-
|
| 585 |
-
|
| 586 |
-
|
| 587 |
-
|
| 588 |
-
|
| 589 |
-
|
| 590 |
-
|
| 591 |
-
|
| 592 |
-
|
| 593 |
-
|
| 594 |
-
|
| 595 |
-
|
| 596 |
-
|
| 597 |
-
|
| 598 |
-
|
| 599 |
-
|
| 600 |
-
|
| 601 |
-
|
| 602 |
-
|
| 603 |
-
|
| 604 |
-
|
| 605 |
-
|
| 606 |
-
|
| 607 |
-
# Añade un separador visual entre las entradas
|
| 608 |
-
if i < len(results[1:5]) - 1:
|
| 609 |
-
st.markdown("---")
|
|
|
|
| 492 |
else:
|
| 493 |
st.error("No se pudieron identificar alimentos o síntomas claros en tu descripción. Intenta ser más específico.")
|
| 494 |
st.session_state.search_results = []
|
|
|
|
| 495 |
if st.session_state.search_results is not None:
|
| 496 |
results = st.session_state.search_results
|
| 497 |
|
|
|
|
| 499 |
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.")
|
| 500 |
else:
|
| 501 |
col1, col2 = st.columns([3,1])
|
| 502 |
+
with col1:
|
| 503 |
+
st.success(f"Hemos encontrado {len(results)} posible(s) causa(s) relacionada(s) con tu caso.")
|
| 504 |
with col2:
|
| 505 |
report_data = generate_report_text(st.session_state.user_query, results)
|
| 506 |
st.download_button(label="📄 Descargar Informe", data=report_data, file_name=f"informe_detective_{datetime.now().strftime('%Y%m%d')}.txt", mime="text/plain")
|
|
|
|
| 511 |
best_match_data = results[0]
|
| 512 |
best_match = best_match_data['entry']
|
| 513 |
with st.expander(f"**Análisis Detallado de la Principal Coincidencia: {best_match.get('condicion_asociada')}**", expanded=True):
|
| 514 |
+
# Las columnas se crean DENTRO del expander
|
| 515 |
col1, col2 = st.columns([3, 1])
|
| 516 |
+
|
| 517 |
+
# Contenido de la primera columna
|
| 518 |
with col1:
|
| 519 |
st.markdown("##### Desglose de la Puntuación de Relevancia:")
|
| 520 |
score_col1, score_col2, score_col3 = st.columns(3)
|
| 521 |
score_col1.metric("Puntos por Alimento(s)", f"{best_match_data['score']['food']}")
|
| 522 |
score_col2.metric("Puntos por Síntomas", f"{best_match_data['score']['symptoms']}")
|
| 523 |
score_col3.metric("PUNTUACIÓN TOTAL", f"{best_match_data['score']['total']}", delta="Máxima coincidencia")
|
| 524 |
+
|
| 525 |
+
# Contenido de la segunda columna (AHORA CORRECTAMENTE INDENTADO)
|
| 526 |
+
with col2:
|
| 527 |
st.write("") # Para alinear verticalmente el popover
|
| 528 |
if foodb_index:
|
| 529 |
with st.popover("🔬 Componentes moleculares"):
|
|
|
|
| 536 |
found_data = False
|
| 537 |
displayed_foodb_keys = set()
|
| 538 |
|
|
|
|
| 539 |
for alimento_es in user_foods_mentioned:
|
| 540 |
search_terms_en = []
|
|
|
|
| 541 |
for key_es, value_en_list in FOOD_NAME_TO_FOODB_KEY.items():
|
| 542 |
if key_es in alimento_es.lower():
|
| 543 |
search_terms_en.extend(value_en_list)
|
| 544 |
|
|
|
|
| 545 |
for term in set(search_terms_en):
|
| 546 |
for foodb_key, foodb_data in foodb_index.items():
|
| 547 |
if term in foodb_key and foodb_key not in displayed_foodb_keys:
|
|
|
|
| 549 |
displayed_foodb_keys.add(foodb_key)
|
| 550 |
with st.container(border=True):
|
| 551 |
st.subheader(f"Análisis de: {foodb_key.capitalize()}")
|
|
|
|
| 552 |
for item in foodb_data[:3]:
|
| 553 |
st.write(f"**Compuesto:** {item['compound']}")
|
| 554 |
st.write(f"**Efectos reportados:** {', '.join(item['effects'])}")
|
|
|
|
| 556 |
|
| 557 |
if not found_data:
|
| 558 |
st.warning("No se encontraron datos moleculares para los alimentos mencionados.")
|
|
|
|
|
|
|
|
|
|
| 559 |
|
| 560 |
+
# El separador y el spinner van DESPUÉS de las columnas, pero DENTRO del expander
|
| 561 |
st.markdown("---")
|
| 562 |
with st.spinner("✍️ Generando un análisis personalizado con IA..."):
|
| 563 |
if 'best_match_analysis' not in st.session_state.analysis_cache:
|
|
|
|
| 569 |
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."
|
| 570 |
st.markdown(st.session_state.analysis_cache['best_match_analysis'])
|
| 571 |
|
| 572 |
+
# El expander de "Otras posibilidades" va DESPUÉS del expander principal
|
| 573 |
+
if len(results) > 1:
|
| 574 |
+
with st.expander("🔍 **Explora otras posibilidades relevantes (Diagnóstico Diferencial)**"):
|
| 575 |
+
for i, result in enumerate(results[1:5]):
|
| 576 |
+
with st.container(border=True):
|
| 577 |
+
entry = result['entry']
|
| 578 |
+
score = result['score']
|
| 579 |
+
|
| 580 |
+
st.subheader(f"{i+2}. {entry.get('condicion_asociada')}")
|
| 581 |
+
col_info, col_action = st.columns([3, 1])
|
| 582 |
+
|
| 583 |
+
with col_info:
|
| 584 |
+
if result.get('matched_symptoms'):
|
| 585 |
+
st.markdown(f"**Pistas Clave (Síntomas Coincidentes):** {', '.join(result['matched_symptoms']).capitalize()}")
|
| 586 |
+
st.markdown(f"**Alimentos Típicos Asociados:** {entry.get('compuesto_alimento')}")
|
| 587 |
+
|
| 588 |
+
with col_action:
|
| 589 |
+
st.metric("Relevancia", score['total'])
|
| 590 |
+
analysis_key = f"analysis_{i+2}"
|
| 591 |
+
|
| 592 |
+
if st.button("Generar análisis", key=analysis_key, help=f"Generar análisis de IA para {entry.get('condicion_asociada')}"):
|
| 593 |
+
with st.spinner(f"Generando análisis para {entry.get('condicion_asociada')}..."):
|
| 594 |
+
try:
|
| 595 |
+
analysis_text = generate_detailed_analysis(st.session_state.user_query, entry)
|
| 596 |
+
st.session_state.analysis_cache[analysis_key] = analysis_text
|
| 597 |
+
except Exception as e:
|
| 598 |
+
st.session_state.analysis_cache[analysis_key] = f"❌ Error al generar análisis para {entry.get('condicion_asociada')}."
|
| 599 |
+
|
| 600 |
+
if analysis_key in st.session_state.analysis_cache:
|
| 601 |
+
st.info(st.session_state.analysis_cache[analysis_key])
|
| 602 |
+
|
| 603 |
+
if i < len(results[1:5]) - 1:
|
| 604 |
+
st.markdown("---")
|
|
|
|
|
|
|
|
|
|
|
|