feat: affichage des référentiels intégrés dans la page admin RAG
Ajout d'une section listant les 6 sources built-in (CIM-10, CCAM, Guide Métho, dictionnaires) avec compteurs de chunks et statut. Séparation claire entre référentiels intégrés et référentiels utilisateur uploadés. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -15,7 +15,11 @@ from werkzeug.utils import secure_filename
|
|||||||
|
|
||||||
from collections import Counter
|
from collections import Counter
|
||||||
|
|
||||||
from ..config import STRUCTURED_DIR, OLLAMA_URL, CCAM_DICT_PATH, DossierMedical, ALLOWED_EXTENSIONS, UPLOAD_MAX_SIZE_MB
|
from ..config import (
|
||||||
|
STRUCTURED_DIR, OLLAMA_URL, CCAM_DICT_PATH, DossierMedical,
|
||||||
|
ALLOWED_EXTENSIONS, UPLOAD_MAX_SIZE_MB,
|
||||||
|
CIM10_PDF, GUIDE_METHODO_PDF, CCAM_PDF, CIM10_DICT_PATH, CIM10_SUPPLEMENTS_PATH,
|
||||||
|
)
|
||||||
from .. import config as cfg
|
from .. import config as cfg
|
||||||
from .referentiels import ReferentielManager
|
from .referentiels import ReferentielManager
|
||||||
|
|
||||||
@@ -154,6 +158,43 @@ def collect_cpam_controls(groups: dict[str, list[dict]]) -> list[dict]:
|
|||||||
return controls
|
return controls
|
||||||
|
|
||||||
|
|
||||||
|
def get_builtin_referentiels() -> list[dict]:
|
||||||
|
"""Retourne les infos sur les référentiels intégrés (PDFs + dicts)."""
|
||||||
|
rag_index_meta = Path(STRUCTURED_DIR).parent / "data" / "rag_index" / "metadata.json"
|
||||||
|
chunks_by_doc: dict[str, int] = {}
|
||||||
|
if rag_index_meta.exists():
|
||||||
|
try:
|
||||||
|
import json as _json
|
||||||
|
meta = _json.loads(rag_index_meta.read_text(encoding="utf-8"))
|
||||||
|
for m in meta:
|
||||||
|
doc = m.get("document", "")
|
||||||
|
chunks_by_doc[doc] = chunks_by_doc.get(doc, 0) + 1
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
refs = []
|
||||||
|
builtin_sources = [
|
||||||
|
("CIM-10 FR 2026", CIM10_PDF, ".pdf", ["cim10", "cim10_alpha"]),
|
||||||
|
("Guide Méthodologique MCO 2026", GUIDE_METHODO_PDF, ".pdf", ["guide_methodo"]),
|
||||||
|
("CCAM 2025", CCAM_PDF, ".pdf", ["ccam"]),
|
||||||
|
("Dictionnaire CIM-10", CIM10_DICT_PATH, ".json", []),
|
||||||
|
("Suppléments CIM-10", CIM10_SUPPLEMENTS_PATH, ".json", []),
|
||||||
|
("Dictionnaire CCAM", CCAM_DICT_PATH, ".json", []),
|
||||||
|
]
|
||||||
|
for name, path, ext, doc_keys in builtin_sources:
|
||||||
|
size_mb = path.stat().st_size / (1024 * 1024) if path.exists() else 0
|
||||||
|
chunks = sum(chunks_by_doc.get(k, 0) for k in doc_keys)
|
||||||
|
refs.append({
|
||||||
|
"name": name,
|
||||||
|
"filename": path.name,
|
||||||
|
"extension": ext,
|
||||||
|
"size_mb": size_mb,
|
||||||
|
"chunks": chunks,
|
||||||
|
"exists": path.exists(),
|
||||||
|
})
|
||||||
|
return refs
|
||||||
|
|
||||||
|
|
||||||
def load_ccam_dict() -> dict[str, dict]:
|
def load_ccam_dict() -> dict[str, dict]:
|
||||||
"""Charge le dictionnaire CCAM pour les regroupements."""
|
"""Charge le dictionnaire CCAM pour les regroupements."""
|
||||||
if CCAM_DICT_PATH.exists():
|
if CCAM_DICT_PATH.exists():
|
||||||
@@ -424,7 +465,8 @@ def create_app() -> Flask:
|
|||||||
@app.route("/admin/referentiels")
|
@app.route("/admin/referentiels")
|
||||||
def admin_referentiels():
|
def admin_referentiels():
|
||||||
refs = ref_manager.list_all()
|
refs = ref_manager.list_all()
|
||||||
return render_template("admin_referentiels.html", referentiels=refs, max_size=UPLOAD_MAX_SIZE_MB)
|
builtin = get_builtin_referentiels()
|
||||||
|
return render_template("admin_referentiels.html", referentiels=refs, builtin_refs=builtin, max_size=UPLOAD_MAX_SIZE_MB)
|
||||||
|
|
||||||
@app.route("/admin/referentiels/upload", methods=["POST"])
|
@app.route("/admin/referentiels/upload", methods=["POST"])
|
||||||
def upload_referentiel():
|
def upload_referentiel():
|
||||||
|
|||||||
@@ -34,10 +34,56 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Tableau référentiels -->
|
<!-- Référentiels intégrés (built-in) -->
|
||||||
|
<div class="card" style="margin-bottom:1.5rem;">
|
||||||
|
<h3>Référentiels intégrés</h3>
|
||||||
|
<p style="font-size:0.8rem;color:#64748b;margin-bottom:0.75rem;">
|
||||||
|
Sources intégrées automatiquement dans l'index FAISS au build.
|
||||||
|
</p>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Nom</th>
|
||||||
|
<th>Fichier</th>
|
||||||
|
<th>Type</th>
|
||||||
|
<th>Taille</th>
|
||||||
|
<th>Chunks</th>
|
||||||
|
<th>Statut</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for ref in builtin_refs %}
|
||||||
|
<tr>
|
||||||
|
<td style="font-weight:600;">{{ ref.name }}</td>
|
||||||
|
<td style="font-size:0.8rem;color:#64748b;"><code>{{ ref.filename }}</code></td>
|
||||||
|
<td><span class="badge" style="background:#f1f5f9;color:#334155;">{{ ref.extension }}</span></td>
|
||||||
|
<td>{{ "%.1f"|format(ref.size_mb) }} Mo</td>
|
||||||
|
<td>
|
||||||
|
{% if ref.chunks %}
|
||||||
|
<strong>{{ ref.chunks }}</strong>
|
||||||
|
{% else %}
|
||||||
|
<span style="color:#94a3b8;">—</span>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{% if not ref.exists %}
|
||||||
|
<span class="badge" style="background:#fee2e2;color:#dc2626;">Fichier absent</span>
|
||||||
|
{% elif ref.chunks %}
|
||||||
|
<span class="badge" style="background:#dcfce7;color:#16a34a;">Indexé</span>
|
||||||
|
{% else %}
|
||||||
|
<span class="badge" style="background:#f1f5f9;color:#64748b;">Dictionnaire</span>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Tableau référentiels utilisateur -->
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:0.75rem;">
|
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:0.75rem;">
|
||||||
<h3>Référentiels indexés</h3>
|
<h3>Référentiels utilisateur</h3>
|
||||||
<button id="rebuild-btn"
|
<button id="rebuild-btn"
|
||||||
style="padding:0.35rem 0.75rem;border-radius:6px;border:1px solid #e2e8f0;background:#fff;font-size:0.75rem;cursor:pointer;">
|
style="padding:0.35rem 0.75rem;border-radius:6px;border:1px solid #e2e8f0;background:#fff;font-size:0.75rem;cursor:pointer;">
|
||||||
Rebuild complet
|
Rebuild complet
|
||||||
|
|||||||
Reference in New Issue
Block a user