feat: scoring DP déterministe + parser CPAM nouveau format + sections CRH

- Nouveau module dp_scoring.py : shortlist, scoring multi-critères, select_dp,
  LLM one-shot fallback avec garde-fous (négation, comorbidité, Z/R-codes)
- Parser CPAM : auto-détection format legacy/ucr_extract, 6 nouveaux champs
  ControleCPAM (codes_etablissement, libelle, codes_retenus, ghm_ghs)
- CRH parser : 3 nouvelles sections (diag_sortie, diag_principal, synthese)
- Prompt DP_LLM_ONESHOT externalisé dans templates.py
- Propagation dp_selection dans fusion.py
- 808 tests passent (dont 21 nouveaux CPAM + 77 dp_scoring + 8 CRH)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
dom
2026-02-23 22:28:59 +01:00
parent 540e0cb400
commit aa501789fd
12 changed files with 2370 additions and 43 deletions

View File

@@ -653,6 +653,38 @@ class TestBackwardCompatAntecedent:
assert all(isinstance(c, Complication) for c in dossier.complications)
class TestDPSelectionIntegration:
"""Tests d'intégration du scoring DP dans le pipeline d'extraction."""
def test_crh_dp_selection_populated(self):
"""Un CRH sans DP Trackare déclenche le scoring et peuple dp_selection."""
parsed = {
"type": "crh",
"patient": {"sexe": "M"},
"sejour": {},
"diagnostics": [],
}
text = "Pancréatite aiguë biliaire.\nTTT de sortie :\nParacétamol\n\nDevenir : retour."
dossier = extract_medical_info(parsed, text)
assert dossier.diagnostic_principal is not None
assert dossier.diagnostic_principal.cim10_suggestion == "K85.1"
assert dossier.dp_selection is not None
assert len(dossier.dp_selection.candidates) >= 1
def test_dp_selection_serialization(self):
"""dp_selection est sérialisable en JSON via model_dump()."""
from src.config import DPCandidate, DPSelection
sel = DPSelection(
verdict="confirmed",
candidates=[DPCandidate(code="K85.1", label="Test", source_section="regex")],
winner_reason="candidat unique",
)
data = sel.model_dump()
assert data["verdict"] == "confirmed"
assert len(data["candidates"]) == 1
assert data["candidates"][0]["code"] == "K85.1"
class TestSourceTrackingFields:
"""Tests que les champs source_page/source_excerpt existent sur les modèles."""