from typing import List, Optional from pydantic_settings import BaseSettings, SettingsConfigDict from pydantic import Field, AliasChoices, computed_field import json, os # ensure sane defaults for caches os.environ.setdefault("HOME", "/workspace") os.environ.setdefault("INSIGHTFACE_HOME", "/workspace/cache/insightface") os.environ.setdefault("MPLCONFIGDIR", "/workspace/cache/matplotlib") class Settings(BaseSettings): model_config = SettingsConfigDict(env_file=".env", extra="ignore") INDEX_DIR: str = "/workspace/data/index" CACHE_DIR: str = "/workspace/cache" THRESHOLD: float = 0.50 MARGIN: float = 0.05 TIMEOUT: int = 180 TOPK_DB: int = 20 TOPK_SHOW: int = 3 SQLITE_PATH: str = "/workspace/data/demo.db" LLM_MODEL_ID: str = "google/gemma-3-27b-it" HF_TOKEN: Optional[str] = None LLM_MAX_NEW_TOKENS: int = 200 LLM_TEMPERATURE: float = 0.2 PROVIDERS_RAW: Optional[str] = Field(default=None, validation_alias=AliasChoices("PROVIDERS")) @computed_field(return_type=List[str]) @property def PROVIDERS(self) -> List[str]: s = (self.PROVIDERS_RAW or "").strip() if not s: return ["CPUExecutionProvider"] if s.startswith("["): return json.loads(s) return [p.strip() for p in s.split(",") if p.strip()] settings = Settings() os.makedirs(settings.INDEX_DIR, exist_ok=True) os.makedirs(settings.CACHE_DIR, exist_ok=True)