from functools import lru_cache from pathlib import Path from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): model_config = SettingsConfigDict(env_file=".env", extra="ignore") public_model_id: str = "glm-5.2-visual-runtime" glm_base_url: str = "https://open.bigmodel.cn/api/paas/v4" glm_api_key: str | None = None glm_model: str = "glm-5.2" vision_base_url: str = "https://open.bigmodel.cn/api/paas/v4" vision_api_key: str | None = None vision_model: str = "glm-5v-turbo" ocr_mode: str = "maas" ocr_base_url: str = "http://ocr:8080" ocr_api_key: str | None = None ocr_model: str = "glm-ocr" database_url: str = "sqlite:///./glm_vvr.db" object_store_endpoint: str = "local://./data/objects" object_store_bucket: str = "glm-vvr" object_store_access_key: str | None = None object_store_secret_key: str | None = None visual_runtime_mode: str = Field(default="test", pattern="^(cloud|hybrid|local|test)$") visual_cache_ttl_days: int = 30 max_image_bytes: int = 10 * 1024 * 1024 max_image_pixels: int = 25_000_000 reference_confidence_threshold: float = 0.72 slides_service_url: str = "http://slides:8787" data_dir: Path = Path("./data") @lru_cache def get_settings() -> Settings: return Settings()