Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -320,6 +320,14 @@ MASTER_SYMPTOM_MAP = {
|
|
| 320 |
"depresi贸n": {
|
| 321 |
"frases_es": ["tristeza persistente", "des谩nimo", "depresi贸n"],
|
| 322 |
"keywords_en": ["depression", "depressant", "antidepressant"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 323 |
}
|
| 324 |
}
|
| 325 |
|
|
@@ -612,10 +620,38 @@ def sanitize_text(text):
|
|
| 612 |
@retry(wait=wait_random_exponential(min=1, max=10), stop=stop_after_attempt(3))
|
| 613 |
|
| 614 |
def extract_entities_with_gemini(query):
|
| 615 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 616 |
try:
|
| 617 |
response = model.generate_content(system_prompt)
|
| 618 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 619 |
extracted_data = json.loads(json_text)
|
| 620 |
# Guardar los s铆ntomas originales para la traducci贸n posterior
|
| 621 |
extracted_data['sintomas_originales_ia'] = extracted_data.get('sintomas', [])
|
|
|
|
| 320 |
"depresi贸n": {
|
| 321 |
"frases_es": ["tristeza persistente", "des谩nimo", "depresi贸n"],
|
| 322 |
"keywords_en": ["depression", "depressant", "antidepressant"]
|
| 323 |
+
},
|
| 324 |
+
"dolor": {
|
| 325 |
+
"frases_es": ["dolor", "molestia", "duele", "ardor"],
|
| 326 |
+
"keywords_en": ["pain", "soreness", "discomfort", "analgesic", "nociceptive"]
|
| 327 |
+
},
|
| 328 |
+
"erupci贸n": {
|
| 329 |
+
"frases_es": ["dermatitis herpetiforme", "erupci贸n con ampollas", "erupci贸n cut谩nea", "se pone rojo", "enrojecimiento", "erupci贸n", "ronchas", "urticaria", "sarpullido", "granitos", "eczema", "rojo"],
|
| 330 |
+
"keywords_en": ["dermatitis", "rash", "urticaria", "eczema", "skin", "redness", "erythema"]
|
| 331 |
}
|
| 332 |
}
|
| 333 |
|
|
|
|
| 620 |
@retry(wait=wait_random_exponential(min=1, max=10), stop=stop_after_attempt(3))
|
| 621 |
|
| 622 |
def extract_entities_with_gemini(query):
|
| 623 |
+
if not model: return None
|
| 624 |
+
logger.info("Intentando extracci贸n de entidades con Gemini...")
|
| 625 |
+
|
| 626 |
+
# --- PROMPT MEJORADO Y M脕S EXPL脥CITO ---
|
| 627 |
+
system_prompt = f"""
|
| 628 |
+
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:
|
| 629 |
+
1. `alimentos`: Una lista de todos los alimentos, bebidas o ingredientes mencionados.
|
| 630 |
+
2. `sintomas`: Una lista de TODAS las sensaciones, signos f铆sicos, colores, y localizaciones anat贸micas descritas. S茅 muy detallado.
|
| 631 |
+
|
| 632 |
+
Devuelve la respuesta 脷NICAMENTE en formato JSON estricto. No incluyas explicaciones.
|
| 633 |
+
|
| 634 |
+
EJEMPLO DETALLADO:
|
| 635 |
+
Consulta de Ejemplo: "Cuando como mucha carne me duele, hincha y se pone rojo el primer dedo del pie."
|
| 636 |
+
Respuesta JSON de Ejemplo:
|
| 637 |
+
{{
|
| 638 |
+
"alimentos": ["carne"],
|
| 639 |
+
"sintomas": ["dolor", "hinchaz贸n", "rojo", "dedo del pie"]
|
| 640 |
+
}}
|
| 641 |
+
|
| 642 |
+
Ahora, procesa la siguiente consulta real:
|
| 643 |
+
Consulta: "{query}"
|
| 644 |
+
"""
|
| 645 |
+
|
| 646 |
try:
|
| 647 |
response = model.generate_content(system_prompt)
|
| 648 |
+
json_text_match = re.search(r'```json\s*(\{.*?\})\s*```', response.text, re.DOTALL)
|
| 649 |
+
if json_text_match:
|
| 650 |
+
json_text = json_text_match.group(1)
|
| 651 |
+
else:
|
| 652 |
+
# Fallback para respuestas sin markdown
|
| 653 |
+
json_text = re.search(r'\{.*\}', response.text, re.DOTALL).group(0)
|
| 654 |
+
|
| 655 |
extracted_data = json.loads(json_text)
|
| 656 |
# Guardar los s铆ntomas originales para la traducci贸n posterior
|
| 657 |
extracted_data['sintomas_originales_ia'] = extracted_data.get('sintomas', [])
|