Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -713,27 +713,99 @@ INTEGRATED_NEURO_FOOD_MAP = {
|
|
| 713 |
"amatoxinas": {
|
| 714 |
"efecto_neuropsicologico": "Aunque su principal toxicidad es hepática y renal, el fallo hepático fulminante conduce secundariamente a una encefalopatía hepática. Esto se manifiesta como confusión severa, cambios de personalidad, desorientación, letargo y puede progresar a coma.",
|
| 715 |
"fuentes_comunes": ["hongos silvestres venenosos (ej. Amanita phalloides)"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 716 |
}
|
| 717 |
}
|
| 718 |
-
|
| 719 |
def generate_word_report(report_text):
|
| 720 |
"""
|
| 721 |
Carga una plantilla de Word, reemplaza un marcador de posición y la devuelve como un objeto binario en memoria.
|
| 722 |
"""
|
| 723 |
try:
|
| 724 |
-
# Carga el documento de plantilla
|
| 725 |
template_path = os.path.join("PLANTILLAS", "PLANTILLA_INTERPRETACION.docx")
|
| 726 |
doc = docx.Document(template_path)
|
| 727 |
-
|
| 728 |
-
# Busca y reemplaza el marcador de posición
|
| 729 |
for paragraph in doc.paragraphs:
|
| 730 |
if '<INTERPRETACION>' in paragraph.text:
|
| 731 |
-
# Limpiamos el párrafo del marcador para empezar de cero
|
| 732 |
paragraph.clear()
|
| 733 |
-
# Añadimos el nuevo texto. add_run permite añadir más formato si se quiere en el futuro
|
| 734 |
paragraph.add_run(report_text)
|
| 735 |
-
|
| 736 |
-
# Guarda el documento modificado en un buffer de memoria
|
| 737 |
doc_io = BytesIO()
|
| 738 |
doc.save(doc_io)
|
| 739 |
doc_io.seek(0)
|
|
@@ -753,8 +825,6 @@ def sanitize_text(text):
|
|
| 753 |
def extract_entities_with_gemini(query):
|
| 754 |
if not model: return None
|
| 755 |
logger.info("Intentando extracción de entidades con Gemini...")
|
| 756 |
-
|
| 757 |
-
# --- PROMPT MEJORADO Y MÁS EXPLÍCITO ---
|
| 758 |
system_prompt = f"""
|
| 759 |
Eres un asistente de triaje clínico experto. Tu única tarea es analizar la consulta de un usuario y extraer de forma exhaustiva dos tipos de información:
|
| 760 |
1. `alimentos`: Una lista de todos los alimentos, bebidas o ingredientes mencionados.
|
|
@@ -797,20 +867,14 @@ def reinforce_entities_with_keywords(entities, query, food_map, master_symptom_m
|
|
| 797 |
entities = {"alimentos": [], "sintomas": []}
|
| 798 |
|
| 799 |
query_sanitized = sanitize_text(query)
|
| 800 |
-
|
| 801 |
-
# --- Parte 1: Reforzar Alimentos (sin cambios en la lógica) ---
|
| 802 |
current_foods = entities.get("alimentos", []) or []
|
| 803 |
current_foods_sanitized = {sanitize_text(f) for f in current_foods}
|
| 804 |
for food_keyword in food_map.keys():
|
| 805 |
if food_keyword in query_sanitized and food_keyword not in current_foods_sanitized:
|
| 806 |
current_foods.append(food_keyword)
|
| 807 |
entities["alimentos"] = list(set(current_foods))
|
| 808 |
-
|
| 809 |
-
# --- Parte 2: Normalizar y Reforzar Síntomas usando el Diccionario Maestro ---
|
| 810 |
current_symptoms = entities.get("sintomas", []) or []
|
| 811 |
query_to_search_symptoms = " " + query_sanitized + " "
|
| 812 |
-
|
| 813 |
-
# Iterar sobre el diccionario maestro para encontrar coincidencias
|
| 814 |
for main_symptom, details in master_symptom_map.items():
|
| 815 |
# Ordenar las frases de la más larga a la más corta para máxima precisión
|
| 816 |
phrases_es = details.get("frases_es", [])
|
|
@@ -820,8 +884,6 @@ def reinforce_entities_with_keywords(entities, query, food_map, master_symptom_m
|
|
| 820 |
if main_symptom not in current_symptoms:
|
| 821 |
logger.info(f"Sistema de respaldo: Normalizando '{phrase}' a '{main_symptom}'.")
|
| 822 |
current_symptoms.append(main_symptom)
|
| 823 |
-
|
| 824 |
-
# Reemplazamos la frase encontrada para evitar sub-coincidencias
|
| 825 |
query_to_search_symptoms = query_to_search_symptoms.replace(" " + phrase + " ", " ")
|
| 826 |
|
| 827 |
entities["sintomas"] = list(set(current_symptoms))
|
|
@@ -967,10 +1029,7 @@ def find_best_foodb_matches(user_foods_es, foodb_index_keys, food_name_map, limi
|
|
| 967 |
return []
|
| 968 |
|
| 969 |
sorted_terms = sorted(list(search_terms_en), key=len, reverse=True)
|
| 970 |
-
|
| 971 |
found_matches = []
|
| 972 |
-
|
| 973 |
-
# Búsqueda por prioridades
|
| 974 |
all_possible_matches = []
|
| 975 |
for term in sorted_terms:
|
| 976 |
# Prioridad 1: Coincidencia perfecta
|
|
@@ -1025,7 +1084,6 @@ def generate_detailed_analysis(query, match):
|
|
| 1025 |
|
| 1026 |
f'''* **Conversa con un Profesional:** Este es el paso más importante. Comparte estos resultados con tu médico o un nutricionista. Ellos pueden guiarte en una **dieta de eliminación y reintroducción controlada** para confirmar la sensibilidad y asegurar que tu nutrición siga siendo completa y equilibrada.''',
|
| 1027 |
|
| 1028 |
-
# --- NUEVA SECCIÓN DE DESCARGO DE RESPONSABILIDAD Y BANDERAS ROJAS ---
|
| 1029 |
"\n### **IMPORTANTE: Descargo de Responsabilidad y Banderas Rojas**",
|
| 1030 |
"Este análisis es una herramienta informativa de IA y **NO es un diagnóstico médico.** La información proporcionada no debe sustituir la consulta con un profesional cualificado.",
|
| 1031 |
|
|
@@ -1090,7 +1148,6 @@ def create_relevance_chart(results):
|
|
| 1090 |
)
|
| 1091 |
|
| 1092 |
return chart
|
| 1093 |
-
|
| 1094 |
def generate_neuro_report_text(entities, food_map, neuro_map):
|
| 1095 |
"""
|
| 1096 |
Genera una sección de texto para el informe de Word sobre los efectos neuropsicológicos.
|
|
|
|
| 713 |
"amatoxinas": {
|
| 714 |
"efecto_neuropsicologico": "Aunque su principal toxicidad es hepática y renal, el fallo hepático fulminante conduce secundariamente a una encefalopatía hepática. Esto se manifiesta como confusión severa, cambios de personalidad, desorientación, letargo y puede progresar a coma.",
|
| 715 |
"fuentes_comunes": ["hongos silvestres venenosos (ej. Amanita phalloides)"]
|
| 716 |
+
},
|
| 717 |
+
"sulforafano": {
|
| 718 |
+
"efecto_neuropsicologico": "Reduce la neuroinflamación y activa respuestas antioxidantes; estudios pequeños muestran mejora en comportamientos sociales y cognitivos en trastornos neuropsiquiátricos (investigación activa).",
|
| 719 |
+
"fuentes_comunes": ["broccoli sprouts (retoños de brócoli)", "col rizada", "coliflor"]
|
| 720 |
+
},
|
| 721 |
+
"beta-caryophyllene": {
|
| 722 |
+
"efecto_neuropsicologico": "Agonista selectivo de CB2 con efecto antiinflamatorio; en modelos animales reduce ansiedad y síntomas relacionados con estrés inflamatorio.",
|
| 723 |
+
"fuentes_comunes": ["pimienta negra", "clavo de olor", "orégano", "albahaca"]
|
| 724 |
+
},
|
| 725 |
+
"uridina (UMP)": {
|
| 726 |
+
"efecto_neuropsicologico": "Precursor para sintetizar fosfolípidos sinápticos; en combinación con DHA y colina favorece formación de sinapsis y mejora el aprendizaje en estudios experimentales y ensayos piloto.",
|
| 727 |
+
"fuentes_comunes": ["levadura de cerveza", "hígado", "pescado", "mariscos"]
|
| 728 |
+
},
|
| 729 |
+
"trimetilamina N-óxido (TMAO)": {
|
| 730 |
+
"efecto_neuropsicologico": "Metabolito microbiano de colina/carnitina vinculado a inflamación vascular y, en estudios recientes, asociado a mayor riesgo de declive cognitivo en poblaciones y modelos animales.",
|
| 731 |
+
"fuentes_comunes": ["yema de huevo (precursor colina)", "carnes rojas (precursor carnitina)", "alimentos ricos en colina/carnitina"]
|
| 732 |
+
},
|
| 733 |
+
"productos de glicación avanzada (AGEs)": {
|
| 734 |
+
"efecto_neuropsicologico": "Se acumulan en tejidos, favorecen inflamación y estrés oxidativo; asociados a mayor velocidad de declive cognitivo y riesgo de demencia cuando la dieta es alta en alimentos muy dorados/quemados.",
|
| 735 |
+
"fuentes_comunes": ["alimentos fritos y asados intensamente", "carnes a la parrilla", "productos horneados muy dorados"]
|
| 736 |
+
},
|
| 737 |
+
"acrilamida": {
|
| 738 |
+
"efecto_neuropsicologico": "Contaminante formado en alimentos ricos en almidón al dorarse; es neurotóxico en estudios y se vincula a alteraciones neurológicas en modelos; el riesgo humano sigue siendo objeto de evaluación regulatoria.",
|
| 739 |
+
"fuentes_comunes": ["papas fritas", "chips", "pan tostado muy dorado", "café soluble"]
|
| 740 |
+
},
|
| 741 |
+
"S-equol (metabolito de isoflavonas de soya)": {
|
| 742 |
+
"efecto_neuropsicologico": "Metabolito producido por ciertas microbiotas que puede tener efectos neuroprotectores y vasculares; los ‘equol-producers’ muestran en estudios mejor desempeño cognitivo en algunos contextos.",
|
| 743 |
+
"fuentes_comunes": ["productos de soya (tofu, natto) — depende de la microbiota del individuo"]
|
| 744 |
+
},
|
| 745 |
+
"palmitoiletanolamida (PEA)": {
|
| 746 |
+
"efecto_neuropsicologico": "Lípido endógeno con actividad anti-neuroinflamatoria; en estudios clínicos mejora dolor neuropático y hay interés en su uso para modular neuroinflamación y estado de ánimo.",
|
| 747 |
+
"fuentes_comunes": ["yema de huevo", "soja", "algas (trazas)", "suplementación alimentaria"]
|
| 748 |
+
},
|
| 749 |
+
"xanthohumol (prenilflavonoide del lúpulo)": {
|
| 750 |
+
"efecto_neuropsicologico": "Potente antioxidante y antiinflamatorio en modelos; evidencia preclínica sugiere protección frente a daño cerebral y mejoras en flexibilidad cognitiva.",
|
| 751 |
+
"fuentes_comunes": ["lúpulo (cerveza artesanal, extractos de lúpulo)"]
|
| 752 |
+
},
|
| 753 |
+
"salsolinol": {
|
| 754 |
+
"efecto_neuropsicologico": "Alcaloide que puede generarse por metabolismo o por fermentación; implicado en estrés oxidativo de neuronas dopaminérgicas (hipótesis en Parkinson) — papel dual y aún controvertido.",
|
| 755 |
+
"fuentes_comunes": ["alimentos y bebidas fermentadas", "alcohol", "algunas fermentaciones caseras"]
|
| 756 |
+
},
|
| 757 |
+
"microplásticos (partículas plásticas ingeridas)": {
|
| 758 |
+
"efecto_neuropsicologico": "Exposición ambiental emergente: pueden alterar microbiota, inducir neuroinflamación y han sido detectados en tejidos humanos; impacto a largo plazo en neurología es tema de investigación activa.",
|
| 759 |
+
"fuentes_comunes": ["mariscos contaminados", "sal de mesa con microplásticos", "alimentos procesados en contacto con plásticos"]
|
| 760 |
+
},
|
| 761 |
+
"glifosato (residuos de herbicidas)": {
|
| 762 |
+
"efecto_neuropsicologico": "Efectos sobre microbiota y vías neuroinmunes observados en modelos; evidencia en humanos es limitada y actualmente su papel en desarrollo neurológico está en estudio y debate científico.",
|
| 763 |
+
"fuentes_comunes": ["residuos en frutas/verduras mal lavadas o cultivos tratados (dependiente de prácticas agrícolas)"]
|
| 764 |
+
},
|
| 765 |
+
"GABA (producido por fermentación en alimentos)": {
|
| 766 |
+
"efecto_neuropsicologico": "El GABA alimentario o producido por bacterias probióticas puede modular la ansiedad y la excitabilidad neuronal; los alimentos fermentados son fuente natural y pueden actuar vía eje intestino-cerebro.",
|
| 767 |
+
"fuentes_comunes": ["kimchi", "tempeh", "yogur fermentado", "quesos fermentados"]
|
| 768 |
+
},
|
| 769 |
+
"berberina": {
|
| 770 |
+
"efecto_neuropsicologico": "Alcaloide con propiedades antiinflamatorias y moduladoras de neurotransmisores; estudios preclínicos y clínicos preliminares muestran potencial efecto antidepresivo y neuroprotector.",
|
| 771 |
+
"fuentes_comunes": ["plantas como berberis, sello de oro; suplementos herbales"]
|
| 772 |
+
},
|
| 773 |
+
"nicotina (trazas en Solanaceae comestibles)": {
|
| 774 |
+
"efecto_neuropsicologico": "Las cantidades en tomate/papa/berenjena son minúsculas, pero la nicotina modula atención y memoria en humanos; el impacto dietario directo es marginal, aunque biológicamente plausible.",
|
| 775 |
+
"fuentes_comunes": ["tomate", "papa", "berenjena (trazas)"]
|
| 776 |
+
},
|
| 777 |
+
"flavanoles del cacao": {
|
| 778 |
+
"efecto_neuropsicologico": "Mejoran perfusión cerebral y funciones ejecutivas en ensayos controlados; efecto agudo y crónico estudiado con resultados positivos en adultos mayores.",
|
| 779 |
+
"fuentes_comunes": ["cocoa puro", "chocolate negro (alto en flavanoles)"]
|
| 780 |
+
},
|
| 781 |
+
"beta-hidroxibutirato (BHB) / cuerpos cetónicos (MCT)": {
|
| 782 |
+
"efecto_neuropsicologico": "Cuerpo cetónico que nutre neuronas, actúa como señalizador antiinflamatorio y puede mejorar función cognitiva en MCI y algunos ensayos clínicos al aumentar disponibilidad energética cerebral.",
|
| 783 |
+
"fuentes_comunes": ["aceite MCT (suplementos)", "dieta cetogénica (endógeno)"]
|
| 784 |
+
},
|
| 785 |
+
"ergotioneína (ergothioneine)": {
|
| 786 |
+
"efecto_neuropsicologico": "Antioxidante presente en hongos; niveles bajos plasmáticos se asocian con mayor riesgo de deterioro cognitivo en cohortes; investigada como factor protector neurológico.",
|
| 787 |
+
"fuentes_comunes": ["hongos comestibles (setas), algunos granos y legumbres en menor cantidad"]
|
| 788 |
+
},
|
| 789 |
+
"nitratos dietarios (óxido nítrico via remolacha)": {
|
| 790 |
+
"efecto_neuropsicologico": "Aumentan óxido nítrico y flujo sanguíneo cerebral, con efectos agudos en mejora de rendimiento cognitivo ejecutivo en pruebas; resultados a largo plazo son mixtos.",
|
| 791 |
+
"fuentes_comunes": ["remolacha (beetroot)", "verduras de hoja (espinaca, rúcula)"]
|
| 792 |
+
},
|
| 793 |
+
"metabolitos de la vía de la quinurenina (kynurenina/quinolinato)": {
|
| 794 |
+
"efecto_neuropsicologico": "La inflamación y la microbiota desvían el triptófano hacia metabolitos neuroactivos que pueden causar fatiga, cambios de ánimo y contribuir a depresión o deterioro cognitivo; es un foco creciente de investigación.",
|
| 795 |
+
"fuentes_comunes": ["inflamación sistémica modulada por dieta rica en grasas/sacharosa; el pathway es endógeno pero sensible a la dieta y microbiota"]
|
| 796 |
}
|
| 797 |
}
|
|
|
|
| 798 |
def generate_word_report(report_text):
|
| 799 |
"""
|
| 800 |
Carga una plantilla de Word, reemplaza un marcador de posición y la devuelve como un objeto binario en memoria.
|
| 801 |
"""
|
| 802 |
try:
|
|
|
|
| 803 |
template_path = os.path.join("PLANTILLAS", "PLANTILLA_INTERPRETACION.docx")
|
| 804 |
doc = docx.Document(template_path)
|
|
|
|
|
|
|
| 805 |
for paragraph in doc.paragraphs:
|
| 806 |
if '<INTERPRETACION>' in paragraph.text:
|
|
|
|
| 807 |
paragraph.clear()
|
|
|
|
| 808 |
paragraph.add_run(report_text)
|
|
|
|
|
|
|
| 809 |
doc_io = BytesIO()
|
| 810 |
doc.save(doc_io)
|
| 811 |
doc_io.seek(0)
|
|
|
|
| 825 |
def extract_entities_with_gemini(query):
|
| 826 |
if not model: return None
|
| 827 |
logger.info("Intentando extracción de entidades con Gemini...")
|
|
|
|
|
|
|
| 828 |
system_prompt = f"""
|
| 829 |
Eres un asistente de triaje clínico experto. Tu única tarea es analizar la consulta de un usuario y extraer de forma exhaustiva dos tipos de información:
|
| 830 |
1. `alimentos`: Una lista de todos los alimentos, bebidas o ingredientes mencionados.
|
|
|
|
| 867 |
entities = {"alimentos": [], "sintomas": []}
|
| 868 |
|
| 869 |
query_sanitized = sanitize_text(query)
|
|
|
|
|
|
|
| 870 |
current_foods = entities.get("alimentos", []) or []
|
| 871 |
current_foods_sanitized = {sanitize_text(f) for f in current_foods}
|
| 872 |
for food_keyword in food_map.keys():
|
| 873 |
if food_keyword in query_sanitized and food_keyword not in current_foods_sanitized:
|
| 874 |
current_foods.append(food_keyword)
|
| 875 |
entities["alimentos"] = list(set(current_foods))
|
|
|
|
|
|
|
| 876 |
current_symptoms = entities.get("sintomas", []) or []
|
| 877 |
query_to_search_symptoms = " " + query_sanitized + " "
|
|
|
|
|
|
|
| 878 |
for main_symptom, details in master_symptom_map.items():
|
| 879 |
# Ordenar las frases de la más larga a la más corta para máxima precisión
|
| 880 |
phrases_es = details.get("frases_es", [])
|
|
|
|
| 884 |
if main_symptom not in current_symptoms:
|
| 885 |
logger.info(f"Sistema de respaldo: Normalizando '{phrase}' a '{main_symptom}'.")
|
| 886 |
current_symptoms.append(main_symptom)
|
|
|
|
|
|
|
| 887 |
query_to_search_symptoms = query_to_search_symptoms.replace(" " + phrase + " ", " ")
|
| 888 |
|
| 889 |
entities["sintomas"] = list(set(current_symptoms))
|
|
|
|
| 1029 |
return []
|
| 1030 |
|
| 1031 |
sorted_terms = sorted(list(search_terms_en), key=len, reverse=True)
|
|
|
|
| 1032 |
found_matches = []
|
|
|
|
|
|
|
| 1033 |
all_possible_matches = []
|
| 1034 |
for term in sorted_terms:
|
| 1035 |
# Prioridad 1: Coincidencia perfecta
|
|
|
|
| 1084 |
|
| 1085 |
f'''* **Conversa con un Profesional:** Este es el paso más importante. Comparte estos resultados con tu médico o un nutricionista. Ellos pueden guiarte en una **dieta de eliminación y reintroducción controlada** para confirmar la sensibilidad y asegurar que tu nutrición siga siendo completa y equilibrada.''',
|
| 1086 |
|
|
|
|
| 1087 |
"\n### **IMPORTANTE: Descargo de Responsabilidad y Banderas Rojas**",
|
| 1088 |
"Este análisis es una herramienta informativa de IA y **NO es un diagnóstico médico.** La información proporcionada no debe sustituir la consulta con un profesional cualificado.",
|
| 1089 |
|
|
|
|
| 1148 |
)
|
| 1149 |
|
| 1150 |
return chart
|
|
|
|
| 1151 |
def generate_neuro_report_text(entities, food_map, neuro_map):
|
| 1152 |
"""
|
| 1153 |
Genera una sección de texto para el informe de Word sobre los efectos neuropsicológicos.
|