JairoCesar commited on
Commit
7790fe6
·
verified ·
1 Parent(s): d2ec35c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +80 -23
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.