from functools import lru_cache from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore") nextcloud_webdav_url: str nextcloud_user: str nextcloud_app_password: str ollama_url: str ollama_embed_model: str qdrant_url: str qdrant_collection: str webhook_secret: str ingest_root: str = "Documents/THB/Studium" chunk_size_words: int = 500 chunk_overlap_words: int = 50 log_level: str = "INFO" # MCP server (app.mcp_server). Optional so the ingestor — which shares # this Settings model — is unaffected. The MCP server itself refuses to # start when rag_mcp_token is empty. rag_mcp_token: str = "" rag_mcp_port: int = 9009 @lru_cache(maxsize=1) def get_settings() -> Settings: return Settings()