from functools import lru_cache from pathlib import Path from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): qdrant_url: str = Field(default="http://localhost:6333", alias="QDRANT_URL") qdrant_api_key: str | None = Field(default=None, alias="QDRANT_API_KEY") asset_root: Path = Field(default=Path("../data/assets"), alias="AFTERIMAGE_ASSET_ROOT") manifest_path: Path = Field(default=Path("../data/manifest.json"), alias="AFTERIMAGE_MANIFEST") allow_fake_embeddings: bool = Field(default=False, alias="AFTERIMAGE_ALLOW_FAKE_EMBEDDINGS") cors_origins: str = Field(default="http://localhost:5173", alias="AFTERIMAGE_CORS_ORIGINS") collection_name: str = "object_memory" vector_size: int = 512 model_name: str = "Qdrant/clip-ViT-B-32-vision" text_model_name: str = "Qdrant/clip-ViT-B-32-text" model_config = SettingsConfigDict(env_file=".env", extra="ignore") @property def cors_origin_list(self) -> list[str]: return [origin.strip() for origin in self.cors_origins.split(",") if origin.strip()] @property def resolved_asset_root(self) -> Path: return self.asset_root.expanduser().resolve() @property def resolved_manifest_path(self) -> Path: return self.manifest_path.expanduser().resolve() @lru_cache def get_settings() -> Settings: return Settings()