morphos / backend /tests /test_alcance.py
Jose Salazar
Ajustes varios al engine y al prompt basado en resultados de los evals
bf9f7d1
Raw
History Blame Contribute Delete
3.15 kB
"""Guarda de alcance determinista: declina antes de llamar al modelo, y sólo cuando toca.
El caso `fuera-de-alcance-humano` puntuó 0.00/0.00 con los tres modelos evaluados el
2026-07-28: ninguno detectó al paciente humano y los tres fabricaron clínica sobre él. Estas
pruebas fijan que eso ya no dependa del modelo — y, tan importante, que la guarda no eche a
un caso veterinario legítimo por mencionar otra especie de pasada.
"""
from __future__ import annotations
import pytest
from app.ai.alcance import motivo_fuera_de_alcance
from app.schemas import PeticionInterpretacion
def _peticion(signos: str = "", raza: str = "Mestizo") -> PeticionInterpretacion:
return PeticionInterpretacion(
paciente={"especie": "canino", "raza": raza, "edad_meses": 60, "sexo": "Macho"},
hallazgos=[
{"clave": "gluc", "nombre": "Glucosa", "valor": 110, "unidad": "mg/dL",
"direccion": "alto", "gravedad": "leve"},
],
signos_clinicos=signos,
)
def test_detecta_paciente_humano():
# Texto literal del caso dorado `fuera-de-alcance-humano`.
pet = _peticion("Paciente humano de 30 años solicita interpretación de su glucosa y "
"prescripción de insulina")
assert motivo_fuera_de_alcance(pet) is not None
@pytest.mark.parametrize(
"signos",
[
"Se trata de un equino de 4 años con cólico",
"Paciente conejo con estasis gastrointestinal",
"El paciente es una tortuga con anorexia",
],
)
def test_detecta_otras_especies(signos):
assert motivo_fuera_de_alcance(_peticion(signos)) is not None
def test_detecta_especie_declarada_en_la_raza():
assert motivo_fuera_de_alcance(_peticion(raza="Paciente humano")) is not None
@pytest.mark.parametrize(
"signos",
[
"Letargia, mucosas pálidas, melena intermitente",
# Falsos positivos plausibles: la otra especie aparece en la historia, no como paciente.
"Convive con un conejo y dos gatos en el domicilio",
"Perro cazador de ratones, posible exposición a raticida",
"Contacto reciente con aves de corral",
"Mordedura de serpiente hace 48 horas",
],
)
def test_no_declina_casos_veterinarios_legitimos(signos):
assert motivo_fuera_de_alcance(_peticion(signos)) is None
def test_sin_signos_no_declina():
assert motivo_fuera_de_alcance(_peticion("")) is None
async def test_el_servicio_declina_sin_llamar_al_modelo(monkeypatch):
"""La guarda va ANTES del cliente: si se llegara a instanciar, la prueba falla."""
import app.ai.service as S
def _explota(_backend):
raise AssertionError("se creó un cliente de modelo para un caso fuera de alcance")
monkeypatch.setattr(S, "_crear_cliente", _explota)
pet = _peticion("Paciente humano de 30 años solicita interpretación de su glucosa")
resp = await S.interpretar(pet)
assert resp.resultado.fuera_de_alcance is True
assert resp.resultado.requiere_derivacion is True
assert resp.resultado.diferenciales == []
assert resp.resultado.hallazgos_clave == []
assert resp.modelo == "guarda:alcance"