Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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
|
|
|
|
|
|
|
| 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 |
-
|
| 793 |
-
|
| 794 |
-
|
| 795 |
-
|
| 796 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
| 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)
|