"""Configuration applicative centralisée (principe 12-factor : config via env). Équivalent Python du `application.properties` Spring Boot, avec validation Pydantic : une variable manquante/invalide = crash au démarrage, pas une NullPointerException surprise à la 3ème requête. """ from functools import lru_cache from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): """Settings chargés depuis .env ou variables d'environnement.""" model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", extra="ignore", ) ollama_base_url: str = "http://localhost:11434" llm_model: str = "gemma4:26b" llm_timeout_seconds: int = 120 # Fenêtre de contexte (num_ctx Ollama). Défaut Ollama = 2048, trop étroit # dès que le Structural Context du Lore dépasse ~10 pages (b9). On monte # à 16384 pour tenir ~100 pages enrichies. Coût VRAM : ~600 MB de KV cache # supplémentaire (vs 2048) pour le modèle gemma 2B. Surchargeable via # LLM_NUM_CTX dans .env si besoin (ex: VRAM limitée → 8192). llm_num_ctx: int = 16384 @lru_cache def get_settings() -> Settings: """Singleton via cache — FastAPI l'injecte avec Depends() dans les routes.""" return Settings()