JairoCesar commited on
Commit
3ea969c
·
verified ·
1 Parent(s): 35002d9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +39 -11
app.py CHANGED
@@ -132,7 +132,9 @@ FOOD_TO_COMPOUND_MAP = {
132
  "crema de leche": ["caseína", "lactosa"],
133
  "helado": ["lactosa", "caseína", "azúcar refinado"],
134
 
135
- # FRUTAS Y PLATOS
 
 
136
  "bandeja paisa": ["fodmaps", "lectinas", "histamina", "tiramina", "fitatos", "nitritos"],
137
  "sancocho": ["fodmaps", "solanina", "histamina"],
138
  "ajiaco": ["fodmaps", "solanina", "lactosa", "caseína"],
@@ -360,7 +362,11 @@ INTEGRATED_NEURO_FOOD_MAP = {
360
  },
361
  "fenoles": {
362
  "efecto_neuropsicologico": "La sobrecarga de fenoles satura las vías de detoxificación hepática de sulfatación, acumulando catecolaminas que producen agitación nocturna e insomnio.",
363
- "fuentes_comunes": ["jugo de naranja", "chontaduro", "frutas concentradas", "colorantes artificiales", "té"]
 
 
 
 
364
  },
365
  "cafeína": {
366
  "efecto_neuropsicologico": "Bloquea los receptores de adenosina en el cerebro. En personas sensibles provoca hiperactivación del SNC, ansiedad e insomnio.",
@@ -408,6 +414,7 @@ CONSEJOS_POR_COMPUESTO = {
408
  "tiramina": "Amina vasoactiva. En personas con degradación reducida por MAO, controlar alimentos añejados evita picos de presión arterial y cefaleas.",
409
  "salicilatos": "La sensibilidad a salicilatos/fenoles se relaciona con baja enzima Fenol Sulfotransferasa (PST). Moderar el consumo concentrado de jugos cítricos y especias estabiliza el sueño.",
410
  "fenoles": "La sobrecarga de fenoles satura las vías hepáticas de sulfatación. Reducir la ingesta concentrada de jugos de frutas alivia la hiperestimulación del SNC.",
 
411
  "fructosa": "La malabsorción surge por saturación de transportadores GLUT-5. Consumir fructosa acompañada de glucosa facilita su co-transporte.",
412
  "fodmaps": "Los carbohidratos fermentables deben abordarse en 3 fases (Eliminación, Reintroducción y Personalización) para no dañar el microbioma.",
413
  "cafeína": "Metabolizada por CYP1A2. Moderar su consumo antes de mitad de tarde protege la arquitectura del sueño.",
@@ -592,7 +599,7 @@ def extract_entities_with_gemini(query):
592
  system_prompt = f"""
593
  Rol: Extractor Médico JSON experto en nutrición y síntomas.
594
  Tarea: Analiza el texto del usuario y extrae un JSON estricto con dos claves:
595
- - "alimentos": lista de alimentos o bebidas mencionados en español, forma simple (ej: "jugo de naranja", "chontaduro", "bandeja paisa", "queso", "vino tinto").
596
  - "sintomas": lista de síntomas mencionados en español, forma clínica simple (ej: "insomnio", "dolor de cabeza", "hinchazón").
597
 
598
  Input: "{query}"
@@ -621,6 +628,19 @@ def reinforce_entities_with_keywords(entities, query, food_map, master_symptom_m
621
  for food_keyword in food_map.keys():
622
  if food_keyword in query_sanitized:
623
  current_foods.add(food_keyword)
 
 
 
 
 
 
 
 
 
 
 
 
 
624
  entities["alimentos"] = list(current_foods)
625
 
626
  current_symptoms = set(entities.get("sintomas", []))
@@ -789,11 +809,19 @@ def generate_ai_hypothesis_on_the_fly(query, entities):
789
  contents=prompt
790
  )
791
  raw = response.text.strip()
792
- if "```json" in raw:
793
- raw = raw.split("```json")[1].split("```")[0]
794
- elif "```" in raw:
795
- raw = raw.split("```")[1].split("```")[0]
796
- data = json.loads(raw.strip())
 
 
 
 
 
 
 
 
797
  data["es_hipotesis_local"] = True
798
  return data
799
  except Exception as e:
@@ -922,7 +950,7 @@ def generate_detailed_analysis(query, match, entities=None, food_compound_map=No
922
  Tarea: Escribe un análisis en Markdown estructurado:
923
  1. Saludo breve y empático.
924
  2. Frase inicial clara con la hipótesis probable.
925
- 3. Explicación de las moléculas responsables (ej: histamina, tiramina, sulfitos, fructosa, gluten, salicilatos, fenoles).
926
  4. Mecanismo fisiológico en términos sencillos.
927
  5. Alimentos a evitar o moderar.
928
  6. Alternativas o reemplazos sugeridos.
@@ -965,7 +993,7 @@ def generate_neuro_report_text(entities, food_map, neuro_map):
965
 
966
  return "\n".join(report_lines)
967
 
968
- # FIX PARÁMETROS DE REPORTE MOLECULAR (8 PARÁMETROS)
969
  def generate_molecular_report_text(best_match, entities, _foodb_index, _foodb_lower_map, food_name_map, synonym_map, food_compound_map, neuro_map):
970
  report_lines = ["\n### 🔬 Análisis Molecular y Efectos Bioactivos"]
971
  user_foods = entities.get("alimentos", [])
@@ -1092,7 +1120,7 @@ if submitted:
1092
  st.session_state.search_results = None
1093
  st.session_state.entities = None
1094
 
1095
- with st.spinner("🔍 Analizando pistas con Gemini..."):
1096
  raw_entities = extract_entities_with_gemini(current_query)
1097
  reinforced = reinforce_entities_with_keywords(raw_entities, current_query, FOOD_TO_COMPOUND_MAP, MASTER_SYMPTOM_MAP)
1098
  final_symptoms = translate_symptoms_local(reinforced.get("sintomas", []), MASTER_SYMPTOM_MAP)
 
132
  "crema de leche": ["caseína", "lactosa"],
133
  "helado": ["lactosa", "caseína", "azúcar refinado"],
134
 
135
+ # FRUTAS, PLATOS Y FRUTAS TROPICALES
136
+ "noni": ["escopoletina", "fenoles", "salicilatos", "fructosa", "histamina"],
137
+ "jugo de noni": ["escopoletina", "fenoles", "salicilatos", "fructosa", "histamina"],
138
  "bandeja paisa": ["fodmaps", "lectinas", "histamina", "tiramina", "fitatos", "nitritos"],
139
  "sancocho": ["fodmaps", "solanina", "histamina"],
140
  "ajiaco": ["fodmaps", "solanina", "lactosa", "caseína"],
 
362
  },
363
  "fenoles": {
364
  "efecto_neuropsicologico": "La sobrecarga de fenoles satura las vías de detoxificación hepática de sulfatación, acumulando catecolaminas que producen agitación nocturna e insomnio.",
365
+ "fuentes_comunes": ["jugo de naranja", "chontaduro", "noni", "frutas concentradas", "colorantes artificiales", "té"]
366
+ },
367
+ "escopoletina": {
368
+ "efecto_neuropsicologico": "Fitoquímico presente en el Noni que modula la vasodilatación y neurotransmisión serotoninérgica; en altas dosis por la noche induce sobreestimulación e insomnio.",
369
+ "fuentes_comunes": ["noni", "jugo de noni"]
370
  },
371
  "cafeína": {
372
  "efecto_neuropsicologico": "Bloquea los receptores de adenosina en el cerebro. En personas sensibles provoca hiperactivación del SNC, ansiedad e insomnio.",
 
414
  "tiramina": "Amina vasoactiva. En personas con degradación reducida por MAO, controlar alimentos añejados evita picos de presión arterial y cefaleas.",
415
  "salicilatos": "La sensibilidad a salicilatos/fenoles se relaciona con baja enzima Fenol Sulfotransferasa (PST). Moderar el consumo concentrado de jugos cítricos y especias estabiliza el sueño.",
416
  "fenoles": "La sobrecarga de fenoles satura las vías hepáticas de sulfatación. Reducir la ingesta concentrada de jugos de frutas alivia la hiperestimulación del SNC.",
417
+ "escopoletina": "Fitoquímico presente en el Noni con acción vasoactiva y moduladora. Consumirlo concentrado antes de dormir interfiere en la síntesis de melatonina.",
418
  "fructosa": "La malabsorción surge por saturación de transportadores GLUT-5. Consumir fructosa acompañada de glucosa facilita su co-transporte.",
419
  "fodmaps": "Los carbohidratos fermentables deben abordarse en 3 fases (Eliminación, Reintroducción y Personalización) para no dañar el microbioma.",
420
  "cafeína": "Metabolizada por CYP1A2. Moderar su consumo antes de mitad de tarde protege la arquitectura del sueño.",
 
599
  system_prompt = f"""
600
  Rol: Extractor Médico JSON experto en nutrición y síntomas.
601
  Tarea: Analiza el texto del usuario y extrae un JSON estricto con dos claves:
602
+ - "alimentos": lista de alimentos o bebidas mencionados en español, forma simple (ej: "jugo de naranja", "chontaduro", "noni", "bandeja paisa", "queso", "vino tinto").
603
  - "sintomas": lista de síntomas mencionados en español, forma clínica simple (ej: "insomnio", "dolor de cabeza", "hinchazón").
604
 
605
  Input: "{query}"
 
628
  for food_keyword in food_map.keys():
629
  if food_keyword in query_sanitized:
630
  current_foods.add(food_keyword)
631
+
632
+ # PATRÓN SINTÁCTICO DE EXTRACCIÓN DE RESPALDO (Captura frases como "jugo de noni", "si tomo X", "como X")
633
+ if not current_foods:
634
+ match_jugo = re.search(r'\b(jugo|zumo|batido|licuado)\s+de\s+([a-zA-ZáéíóúñÁÉÍÓÚÑ]+)\b', query_sanitized)
635
+ if match_jugo:
636
+ current_foods.add(match_jugo.group(0))
637
+ else:
638
+ match_tomo = re.search(r'\b(como|tomo|consumo|ingiero)\s+([a-zA-ZáéíóúñÁÉÍÓÚÑ\s]{3,20})\b', query_sanitized)
639
+ if match_tomo:
640
+ food_extracted = match_tomo.group(2).strip()
641
+ if food_extracted not in STOPWORDS_ES:
642
+ current_foods.add(food_extracted)
643
+
644
  entities["alimentos"] = list(current_foods)
645
 
646
  current_symptoms = set(entities.get("sintomas", []))
 
809
  contents=prompt
810
  )
811
  raw = response.text.strip()
812
+
813
+ # EXTRACCIÓN ROBUSTA DE JSON POR REGEX (Captura JSON dentro de cualquier formato)
814
+ json_match = re.search(r'\{.*\}', raw, re.DOTALL)
815
+ if json_match:
816
+ raw_clean = json_match.group(0)
817
+ else:
818
+ raw_clean = raw
819
+ if "```json" in raw_clean:
820
+ raw_clean = raw_clean.split("```json")[1].split("```")[0]
821
+ elif "```" in raw_clean:
822
+ raw_clean = raw_clean.split("```")[1].split("```")[0]
823
+
824
+ data = json.loads(raw_clean.strip())
825
  data["es_hipotesis_local"] = True
826
  return data
827
  except Exception as e:
 
950
  Tarea: Escribe un análisis en Markdown estructurado:
951
  1. Saludo breve y empático.
952
  2. Frase inicial clara con la hipótesis probable.
953
+ 3. Explicación de las moléculas responsables (ej: histamina, tiramina, sulfitos, fructosa, gluten, salicilatos, fenoles, escopoletina).
954
  4. Mecanismo fisiológico en términos sencillos.
955
  5. Alimentos a evitar o moderar.
956
  6. Alternativas o reemplazos sugeridos.
 
993
 
994
  return "\n".join(report_lines)
995
 
996
+ # FIX PARÁMETROS DE REPORTE MOLECULAR (8 PARÁMETROS POSICIONALES)
997
  def generate_molecular_report_text(best_match, entities, _foodb_index, _foodb_lower_map, food_name_map, synonym_map, food_compound_map, neuro_map):
998
  report_lines = ["\n### 🔬 Análisis Molecular y Efectos Bioactivos"]
999
  user_foods = entities.get("alimentos", [])
 
1120
  st.session_state.search_results = None
1121
  st.session_state.entities = None
1122
 
1123
+ with st.spinner("🔍 Analizando pistas..."):
1124
  raw_entities = extract_entities_with_gemini(current_query)
1125
  reinforced = reinforce_entities_with_keywords(raw_entities, current_query, FOOD_TO_COMPOUND_MAP, MASTER_SYMPTOM_MAP)
1126
  final_symptoms = translate_symptoms_local(reinforced.get("sintomas", []), MASTER_SYMPTOM_MAP)