From 768bb9419393f376c25aef93b102452077265fe0 Mon Sep 17 00:00:00 2001 From: dom Date: Sun, 8 Mar 2026 11:49:12 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20validation=20config=20au=20d=C3=A9marra?= =?UTF-8?q?ge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ajoute validate_config() dans src/config.py : * Vérifie accessibilité Ollama (warning si injoignable) * Warning si ANTHROPIC_API_KEY absente (fallback cloud indispo) * Warning si modèles CPAM et validation identiques * Vérifie qu'au moins un modèle LLM est configuré - Appel automatique au démarrage du viewer Flask - Ne fait jamais crasher l'app (warnings uniquement) Co-Authored-By: Claude Opus 4.6 --- src/config.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++ src/viewer/app.py | 7 +++++++ 2 files changed, 58 insertions(+) diff --git a/src/config.py b/src/config.py index e8e0a32..738e581 100644 --- a/src/config.py +++ b/src/config.py @@ -123,6 +123,57 @@ def check_adversarial_model_config() -> tuple[bool, str]: return False, "" +def validate_config() -> list[str]: + """Valide la configuration au démarrage et retourne la liste des warnings émis. + + Vérifie : + - OLLAMA_URL défini et accessible (warning si injoignable, pas de crash) + - ANTHROPIC_API_KEY présente (warning si absente — fallback cloud indisponible) + - Modèles CPAM et validation distincts (validation adversariale) + - Au moins un modèle LLM configuré + + Ne fait jamais crasher l'application. + """ + warnings_emitted: list[str] = [] + + # 1. Vérifier OLLAMA_URL + if not OLLAMA_URL: + msg = "OLLAMA_URL non défini — aucun LLM local disponible" + _cfg_logger.warning(msg) + warnings_emitted.append(msg) + else: + try: + import requests as _req + resp = _req.get(f"{OLLAMA_URL}/api/tags", timeout=5) + resp.raise_for_status() + _cfg_logger.info("Ollama accessible sur %s", OLLAMA_URL) + except Exception as e: + msg = f"Ollama injoignable sur {OLLAMA_URL} — {e}" + _cfg_logger.warning(msg) + warnings_emitted.append(msg) + + # 2. Vérifier ANTHROPIC_API_KEY + if not os.environ.get("ANTHROPIC_API_KEY"): + msg = "ANTHROPIC_API_KEY absente — fallback cloud (Haiku) indisponible" + _cfg_logger.warning(msg) + warnings_emitted.append(msg) + + # 3. Vérifier modèles CPAM vs validation (adversarial) + same, adv_msg = check_adversarial_model_config() + if same: + _cfg_logger.warning(adv_msg) + warnings_emitted.append(adv_msg) + + # 4. Vérifier qu'au moins un modèle LLM est configuré + has_model = bool(OLLAMA_MODEL) or any(OLLAMA_MODELS.values()) + if not has_model: + msg = "Aucun modèle LLM configuré (OLLAMA_MODEL et OLLAMA_MODELS vides)" + _cfg_logger.warning(msg) + warnings_emitted.append(msg) + + return warnings_emitted + + # --- Configuration RUM / établissement --- FINESS = os.environ.get("T2A_FINESS", "000000000") diff --git a/src/viewer/app.py b/src/viewer/app.py index 101bb0f..e577496 100644 --- a/src/viewer/app.py +++ b/src/viewer/app.py @@ -85,6 +85,13 @@ def create_app() -> Flask: except Exception as e: logger.error("Verification FAISS echouee : %s", e) + # Validation config au démarrage + try: + from ..config import validate_config + validate_config() + except Exception as e: + logger.error("Validation config échouée : %s", e) + ref_manager = ReferentielManager() val_manager = ValidationManager()