from __future__ import annotations import os from dataclasses import dataclass from pathlib import Path def _env(name: str, default: str = "") -> str: return os.environ.get(name, default) def _resolve_models_yaml() -> str: if env := os.environ.get("MODELS_YAML"): return env here = Path(__file__).resolve().parent # app/ candidates = [ here.parent / "models.yaml", # image/models.yaml (Docker) here.parent.parent / "models.yaml", # /models.yaml (dev) Path("/app/models.yaml"), # explicit container path ] for p in candidates: if p.exists(): return str(p) return str(candidates[0]) # let load fail with a clear path @dataclass(frozen=True) class Settings: spark1_host: str spark1_user: str spark2_host: str spark2_user: str ssh_key_path: str ssh_known_hosts: str models_yaml: str vllm_port: int parakeet_port: int magpie_port: int bind_port: int @classmethod def from_env(cls) -> "Settings": return cls( spark1_host=_env("SPARK1_HOST"), spark1_user=_env("SPARK1_USER", ""), spark2_host=_env("SPARK2_HOST"), spark2_user=_env("SPARK2_USER", ""), ssh_key_path=_env("SSH_KEY_PATH"), ssh_known_hosts=_env("SSH_KNOWN_HOSTS"), models_yaml=_resolve_models_yaml(), vllm_port=int(_env("VLLM_PORT", "8888")), parakeet_port=int(_env("PARAKEET_PORT", "8000")), magpie_port=int(_env("MAGPIE_PORT", "9000")), bind_port=int(_env("BIND_PORT", "9999")), ) @property def configured(self) -> bool: return bool(self.spark1_host)