refactor: réorganisation référentiels, nouveaux modules extraction, nettoyage code obsolète

- Réorganisation data/referentiels/ : pdfs/, dicts/, user/ (structure unifiée)
- Fix badges "Source absente" sur page admin référentiels
- Ré-indexation COCOA 2025 (555 → 1451 chunks, couverture 94%)
- Fix VRAM OOM : embeddings forcés CPU via T2A_EMBED_CPU
- Nouveaux modules : document_router, docx_extractor, image_extractor, ocr_engine
- Module complétude (quality/completude.py + config YAML)
- Template DIM (synthèse dimensionnelle)
- Gunicorn config + systemd service t2a-viewer
- Suppression t2a_install_rag_cleanup/ (copie obsolète)
- Suppression scripts/ et scripts_t2a_v2/ (anciens benchmarks)
- Suppression 81 fichiers _doc.txt de test
- Cache Ollama : TTL configurable, corrections loader YAML
- Dashboard : améliorations templates (base, index, detail, cpam, validation)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
dom
2026-03-07 16:48:10 +01:00
parent 2578afb6ff
commit 4e2b4bd946
210 changed files with 6939 additions and 22104 deletions

View File

@@ -0,0 +1,437 @@
# Règles de complétude documentaire DIM
# Pour chaque famille diagnostique : éléments obligatoires/recommandés
# qui doivent être présents dans le dossier pour justifier le code.
#
# Catégories : biologie | imagerie | document | acte | clinique
# Importance : obligatoire | recommande
# match_type : bio (biologie_cle.test), imagerie (imagerie.type), document (doc_types),
# clinique (sejour.imc/poids/taille), acte (actes_ccam)
#
# Seuils (optionnel) : confrontation valeur ↔ diagnostic
# type: below | above | range
# value / value_m / value_f / range_min / range_max
# message_ok / message_ko
version: 2
# --- Règles par préfixe CIM-10 ---
diagnostics:
denutrition:
prefixes: ["E43", "E44", "E46"]
libelle_famille: "Dénutrition"
items:
- categorie: biologie
element: Albumine
match_bio: ["albumine"]
importance: obligatoire
impact_cpam: "Albumine exigée par la CPAM pour valider une dénutrition (critère ATIH)"
seuil:
code_filter: "E43"
type: below
value: 30
message_ok: "Albumine < 30 g/L confirme la dénutrition sévère"
message_ko: "Albumine ≥ 30 g/L : dénutrition sévère non confirmée biologiquement"
- categorie: biologie
element: Albumine
match_bio: ["albumine"]
importance: obligatoire
impact_cpam: "Albumine exigée pour dénutrition modérée"
seuil:
code_filter: "E44"
type: range
range_min: 30
range_max: 35
message_ok: "Albumine entre 30-35 g/L confirme la dénutrition modérée"
message_ko: "Albumine hors plage 30-35 g/L pour dénutrition modérée"
- categorie: clinique
element: IMC
match_clinique: imc
importance: obligatoire
impact_cpam: "IMC nécessaire pour classifier le degré de dénutrition"
seuil:
code_filter: "E43"
type: below
value: 18.5
message_ok: "IMC < 18.5 confirme la dénutrition sévère"
message_ko: "IMC ≥ 18.5 : dénutrition sévère non confirmée"
- categorie: clinique
element: IMC
match_clinique: imc
importance: obligatoire
impact_cpam: "IMC nécessaire pour dénutrition modérée"
seuil:
code_filter: "E44"
type: range
range_min: 18.5
range_max: 21
message_ok: "IMC entre 18.5-21 confirme la dénutrition modérée"
message_ko: "IMC hors plage 18.5-21 pour dénutrition modérée"
- categorie: biologie
element: Préalbumine
match_bio: ["prealbumine", "préalbumine", "transthyretine", "transthyrétine"]
importance: recommande
impact_cpam: "Renforce la preuve de dénutrition si albumine limite"
anemie:
prefixes: ["D50", "D62", "D63", "D64"]
libelle_famille: "Anémie"
items:
- categorie: biologie
element: Hémoglobine
match_bio: ["hemoglobine", "hémoglobine", "hb"]
importance: obligatoire
impact_cpam: "Hémoglobine indispensable pour confirmer et qualifier une anémie"
seuil:
type: below
value_m: 13
value_f: 12
message_ok: "Hémoglobine basse confirme l'anémie"
message_ko: "Hémoglobine normale : anémie non confirmée biologiquement"
- categorie: biologie
element: Ferritine
match_bio: ["ferritine"]
importance: recommande
impact_cpam: "Permet de typer l'anémie (carentielle vs inflammatoire)"
- categorie: biologie
element: VGM
match_bio: ["vgm", "volume globulaire moyen"]
importance: recommande
impact_cpam: "Oriente l'étiologie (microcytaire/macrocytaire)"
insuffisance_renale:
prefixes: ["N17", "N18", "N19"]
libelle_famille: "Insuffisance rénale"
items:
- categorie: biologie
element: Créatinine
match_bio: ["creatinine", "créatinine", "creat"]
importance: obligatoire
impact_cpam: "Créatinine obligatoire pour confirmer une insuffisance rénale"
seuil:
type: above
value: 120
message_ok: "Créatinine > 120 µmol/L confirme l'insuffisance rénale"
message_ko: "Créatinine ≤ 120 µmol/L : IR non confirmée biologiquement"
- categorie: biologie
element: DFG
match_bio: ["dfg", "clairance", "dfge", "débit de filtration"]
importance: recommande
impact_cpam: "Permet de stadifier l'IR selon KDIGO"
- categorie: biologie
element: Urée
match_bio: ["uree", "urée"]
importance: recommande
impact_cpam: "Élément complémentaire de la fonction rénale"
sepsis:
prefixes: ["A40", "A41"]
libelle_famille: "Sepsis / Septicémie"
items:
- categorie: biologie
element: CRP
match_bio: ["crp", "proteine c reactive", "protéine c réactive"]
importance: obligatoire
impact_cpam: "Marqueur inflammatoire essentiel pour documenter un sepsis"
seuil:
type: above
value: 50
message_ok: "CRP > 50 mg/L confirme le syndrome inflammatoire"
message_ko: "CRP ≤ 50 mg/L : syndrome inflammatoire non significatif"
- categorie: biologie
element: Leucocytes
match_bio: ["leucocytes", "gb", "globules blancs"]
importance: obligatoire
impact_cpam: "Leucocytose ou leucopénie attendue dans le sepsis"
seuil:
type: outside_range
range_min: 4
range_max: 10
message_ok: "Leucocytes hors norme (< 4 ou > 10 G/L) : compatible avec sepsis"
message_ko: "Leucocytes normaux (4-10 G/L) : sepsis non confirmé biologiquement"
- categorie: biologie
element: Procalcitonine
match_bio: ["procalcitonine", "pct"]
importance: recommande
impact_cpam: "Marqueur spécifique d'infection bactérienne, renforce la preuve"
- categorie: biologie
element: Hémocultures
match_bio: ["hemoculture", "hémoculture", "hemocultures", "hémocultures"]
importance: recommande
impact_cpam: "Documentation bactériologique du sepsis"
troubles_electrolytiques:
prefixes: ["E87"]
libelle_famille: "Troubles électrolytiques"
items:
- categorie: biologie
element: Sodium
match_bio: ["sodium", "natremie", "natrémie", "na"]
importance: obligatoire
impact_cpam: "Ionogramme obligatoire pour justifier un trouble électrolytique"
seuil:
type: below
value: 135
message_ok: "Sodium < 135 mmol/L confirme l'hyponatrémie"
message_ko: "Sodium ≥ 135 mmol/L : hyponatrémie non confirmée"
- categorie: biologie
element: Potassium
match_bio: ["potassium", "kaliemie", "kaliémie", "k"]
importance: obligatoire
impact_cpam: "Ionogramme obligatoire pour justifier un trouble électrolytique"
seuil:
type: outside_range
range_min: 3.5
range_max: 5.0
message_ok: "Potassium hors norme : trouble confirmé"
message_ko: "Potassium normal (3.5-5.0) : trouble non confirmé"
diabete:
prefixes: ["E10", "E11"]
libelle_famille: "Diabète"
items:
- categorie: biologie
element: HbA1c
match_bio: ["hba1c", "hemoglobine glyquee", "hémoglobine glyquée"]
importance: recommande
impact_cpam: "HbA1c attendue pour documenter l'équilibre glycémique"
- categorie: biologie
element: Glycémie
match_bio: ["glycemie", "glycémie", "glucose"]
importance: recommande
impact_cpam: "Glycémie de base pour confirmer le diagnostic"
pancreatite:
prefixes: ["K85"]
libelle_famille: "Pancréatite aiguë"
items:
- categorie: biologie
element: Lipasémie
match_bio: ["lipase", "lipasemie", "lipasémie"]
importance: obligatoire
impact_cpam: "Lipase > 3N est le critère diagnostique de référence"
seuil:
type: above
value: 180
message_ok: "Lipase > 180 UI/L (3× la normale) confirme la pancréatite"
message_ko: "Lipase ≤ 180 UI/L : critère diagnostique non atteint"
- categorie: imagerie
element: Scanner abdominal
match_imagerie: ["scanner", "tdm", "tomodensitometrie"]
importance: recommande
impact_cpam: "Scanner recommandé pour évaluer la sévérité (Balthazar)"
embolie_pulmonaire:
prefixes: ["I26"]
libelle_famille: "Embolie pulmonaire"
items:
- categorie: imagerie
element: Angioscanner thoracique
match_imagerie: ["angioscanner", "scanner", "tdm", "angiotdm"]
importance: obligatoire
impact_cpam: "Imagerie indispensable pour confirmer une EP"
- categorie: biologie
element: D-dimères
match_bio: ["d-dimeres", "d-dimères", "ddimeres", "d dimeres"]
importance: recommande
impact_cpam: "D-dimères utiles si négatifs pour exclure, non suffisants seuls"
tumeurs_malignes:
prefixes: ["C"]
libelle_famille: "Tumeur maligne"
items:
- categorie: document
element: ANAPATH
match_document: ["anapath", "anatomopathologie", "biopsie"]
importance: obligatoire
impact_cpam: "Compte-rendu anatomopathologique exigé pour tout code C (tumeur maligne)"
pathologies_hepatiques:
prefixes: ["K70", "K71", "K72", "K73", "K74", "K75", "K76", "K77"]
libelle_famille: "Pathologie hépatique"
items:
- categorie: biologie
element: ASAT
match_bio: ["asat", "got", "aspartate aminotransferase"]
importance: obligatoire
impact_cpam: "Bilan hépatique obligatoire pour documenter une atteinte hépatique"
seuil:
type: above
value: 40
message_ok: "ASAT > 40 UI/L confirme la cytolyse hépatique"
message_ko: "ASAT ≤ 40 UI/L : cytolyse non confirmée"
- categorie: biologie
element: ALAT
match_bio: ["alat", "gpt", "alanine aminotransferase"]
importance: obligatoire
impact_cpam: "Bilan hépatique obligatoire"
seuil:
type: above
value: 40
message_ok: "ALAT > 40 UI/L confirme la cytolyse hépatique"
message_ko: "ALAT ≤ 40 UI/L : cytolyse non confirmée"
- categorie: biologie
element: Bilirubine
match_bio: ["bilirubine", "bili"]
importance: recommande
impact_cpam: "Bilirubine renforce la documentation d'une atteinte hépatique"
obesite:
prefixes: ["E66"]
libelle_famille: "Obésité"
items:
- categorie: clinique
element: IMC
match_clinique: imc
importance: obligatoire
impact_cpam: "IMC ≥ 30 indispensable pour coder une obésité"
seuil:
type: above
value: 30
message_ok: "IMC ≥ 30 confirme l'obésité"
message_ko: "IMC < 30 : obésité non confirmée"
- categorie: clinique
element: Poids
match_clinique: poids
importance: obligatoire
impact_cpam: "Poids nécessaire pour calculer l'IMC"
insuffisance_cardiaque:
prefixes: ["I50"]
libelle_famille: "Insuffisance cardiaque"
items:
- categorie: biologie
element: BNP / NT-proBNP
match_bio: ["bnp", "nt-probnp", "ntprobnp", "pro-bnp"]
importance: obligatoire
impact_cpam: "BNP/NT-proBNP attendu pour confirmer une insuffisance cardiaque"
seuil:
type: above
value: 100
message_ok: "BNP > 100 pg/mL (ou NT-proBNP > 300) confirme l'IC"
message_ko: "BNP ≤ 100 pg/mL : IC non confirmée biologiquement"
- categorie: imagerie
element: Échographie cardiaque
match_imagerie: ["echographie cardiaque", "échocardiographie", "echo coeur", "ett", "eto"]
importance: recommande
impact_cpam: "ETT recommandée pour documenter la FEVG"
# --- 8 NOUVELLES FAMILLES ---
avc_ait:
prefixes: ["I60", "I61", "I62", "I63", "I64", "G45"]
libelle_famille: "AVC / AIT"
items:
- categorie: imagerie
element: Scanner/IRM cérébral
match_imagerie: ["scanner cerebral", "irm cerebral", "irm cérébral", "scanner cérébral", "tdm cerebral", "tdm cérébral", "irm encephalique", "irm encéphalique"]
importance: obligatoire
impact_cpam: "Imagerie cérébrale indispensable pour confirmer un AVC/AIT"
- categorie: biologie
element: ECG
match_bio: ["ecg", "electrocardiogramme", "électrocardiogramme"]
importance: recommande
impact_cpam: "ECG recommandé pour rechercher une cause cardioembolique"
idm:
prefixes: ["I21", "I22"]
libelle_famille: "Infarctus du myocarde"
items:
- categorie: biologie
element: Troponine
match_bio: ["troponine", "tnc", "tni", "tnt", "troponine i", "troponine t", "troponine us"]
importance: obligatoire
impact_cpam: "Troponine obligatoire pour confirmer un IDM"
seuil:
type: above
value: 0.04
message_ok: "Troponine > 0.04 confirme la nécrose myocardique"
message_ko: "Troponine ≤ 0.04 : IDM non confirmé biologiquement"
- categorie: biologie
element: ECG
match_bio: ["ecg", "electrocardiogramme", "électrocardiogramme"]
importance: recommande
impact_cpam: "ECG recommandé pour caractériser l'IDM (ST+/ST-)"
- categorie: imagerie
element: Coronarographie
match_imagerie: ["coronarographie", "coronaro", "coro"]
importance: recommande
impact_cpam: "Coronarographie recommandée pour documenter les lésions"
pneumopathie:
prefixes: ["J12", "J13", "J14", "J15", "J16", "J17", "J18"]
libelle_famille: "Pneumopathie"
items:
- categorie: imagerie
element: Radio/Scanner thoracique
match_imagerie: ["radio thorax", "radiographie thoracique", "scanner thoracique", "tdm thoracique", "rx thorax", "radio pulmonaire"]
importance: obligatoire
impact_cpam: "Imagerie thoracique indispensable pour confirmer une pneumopathie"
- categorie: biologie
element: CRP
match_bio: ["crp", "proteine c reactive", "protéine c réactive"]
importance: recommande
impact_cpam: "CRP recommandée pour documenter le syndrome inflammatoire"
tvp:
prefixes: ["I80"]
libelle_famille: "Thrombose veineuse profonde"
items:
- categorie: imagerie
element: Écho-doppler veineux
match_imagerie: ["echo-doppler", "écho-doppler", "echo doppler", "écho doppler", "doppler veineux", "echodoppler"]
importance: obligatoire
impact_cpam: "Écho-doppler veineux indispensable pour confirmer une TVP"
insuffisance_respiratoire:
prefixes: ["J96"]
libelle_famille: "Insuffisance respiratoire"
items:
- categorie: biologie
element: Gaz du sang
match_bio: ["gaz du sang", "gazometrie", "gazométrie", "gds", "pao2", "paco2"]
importance: obligatoire
impact_cpam: "Gazométrie artérielle obligatoire pour confirmer une insuffisance respiratoire"
fractures:
prefixes: ["S02", "S12", "S22", "S32", "S42", "S52", "S62", "S72", "S82", "S92"]
libelle_famille: "Fracture"
items:
- categorie: imagerie
element: Imagerie osseuse
match_imagerie: ["radio", "radiographie", "scanner", "tdm", "irm", "rx"]
importance: obligatoire
impact_cpam: "Imagerie indispensable pour confirmer une fracture"
infection_urinaire:
prefixes: ["N39.0"]
libelle_famille: "Infection urinaire"
items:
- categorie: biologie
element: ECBU
match_bio: ["ecbu", "examen cytobacteriologique", "examen cytobactériologique"]
importance: obligatoire
impact_cpam: "ECBU obligatoire pour documenter une infection urinaire"
fa_flutter:
prefixes: ["I48"]
libelle_famille: "Fibrillation auriculaire / Flutter"
items:
- categorie: biologie
element: ECG
match_bio: ["ecg", "electrocardiogramme", "électrocardiogramme"]
importance: obligatoire
impact_cpam: "ECG obligatoire pour documenter une FA/flutter"
# --- Règles par préfixe CCAM (actes) ---
actes:
chirurgie:
description: "Acte chirurgical nécessitant un CRO"
prefixes: ["H", "J", "K", "L"]
items:
- categorie: document
element: CRO
match_document: ["cro", "compte rendu operatoire", "compte-rendu opératoire"]
importance: obligatoire
impact_cpam: "Compte-rendu opératoire obligatoire pour tout acte chirurgical"

View File

@@ -26,9 +26,9 @@ mutual_exclusions:
incompatibilities:
- pair: ["E66", "E40", "E41", "E42", "E43", "E44", "E45", "E46"]
atih_ref: "Guide Méthodologique MCO : Incompatibilité clinique Obésité / Dénutrition"
message: "Obésité (E66) et Dénutrition/Malnutrition (E40-E46) sont cliniquement incompatibles"
severity: "HARD"
atih_ref: "HAS/FFN nov 2021 : un patient obèse peut être dénutri"
message: "Obésité et Dénutrition coexistent — vérifier critères HAS 2021 (perte de poids, sarcopénie, albumine)"
severity: "MEDIUM"
- pair: ["I10", "I95"]
atih_ref: "Guide Méthodologique MCO : Incohérence Hypertension / Hypotension sur le même séjour"