feat: quality_tier CPAM (A/B/C) + requires_review + warnings catégorisés

- ControleCPAM enrichi : quality_tier, requires_review, quality_warnings
- _assess_quality_tier() : classification basée sur score adversarial + warnings
  - Tier C (requires_review) : score <4, code hors périmètre, >2 preuves non traçables
  - Tier B : score 4-6, warnings mineurs
  - Tier A : score >=7, 0 critique
- _format_response() : bandeau "REVUE MANUELLE REQUISE" pour tier C,
  sections CRITIQUES/MINEURS séparées
- Badge qualité dans le viewer CPAM (vert A / orange B / rouge C)
- 17 tests : tier A/B/C, bandeau, séparation warnings, backward compat

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
dom
2026-02-20 11:01:21 +01:00
parent 77ffbc56d4
commit 5d5f119057
5 changed files with 404 additions and 7 deletions

View File

@@ -27,6 +27,7 @@ from .cpam_validation import (
_validate_codes_in_response,
_build_correction_prompt,
_format_response,
_assess_quality_tier,
)
# Backward compat — sera retiré dans un commit futur
@@ -38,7 +39,7 @@ from .cpam_context import ( # noqa: F401
_build_bio_summary,
_check_das_bio_coherence,
)
from .cpam_validation import _CIM10_CODE_RE, _validate_adversarial as _validate_adversarial # noqa: F401
from .cpam_validation import _CIM10_CODE_RE, _validate_adversarial as _validate_adversarial, _assess_quality_tier as _assess_quality_tier # noqa: F401
logger = logging.getLogger(__name__)
@@ -220,8 +221,23 @@ def generate_cpam_response(
all_warnings = ref_warnings + grounding_warnings + code_warnings + adversarial_warnings
# 8c. Classification qualité (A/B/C)
tier, needs_review, cat_warnings = _assess_quality_tier(
result, ref_warnings, grounding_warnings, code_warnings, validation,
)
controle.quality_tier = tier
controle.requires_review = needs_review
controle.quality_warnings = cat_warnings
logger.info(" Qualité CPAM : tier %s, requires_review=%s, %d warnings",
tier, needs_review, len(cat_warnings))
# 9. Formater la réponse
text = _format_response(result, all_warnings)
text = _format_response(
result,
ref_warnings=all_warnings,
quality_tier=tier,
categorized_warnings=cat_warnings,
)
logger.info(" Contre-argumentation générée (%d caractères)", len(text))
return text, result, rag_sources