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 parakeet_host: str parakeet_user: str parakeet_container: str magpie_host: str magpie_user: str magpie_container: str whisperx_host: str whisperx_user: str whisperx_container: str whisperx_port: int whisperx_model: str ssh_key_path: str ssh_known_hosts: str models_yaml: str vllm_port: int parakeet_port: int magpie_port: int bind_port: int open_webui_url: str ngc_api_key: str @classmethod def from_env(cls) -> "Settings": spark2_host = _env("SPARK2_HOST") spark2_user = _env("SPARK2_USER") # Parakeet, Magpie, and WhisperX all default to Spark 2 unless overridden. return cls( spark1_host=_env("SPARK1_HOST"), spark1_user=_env("SPARK1_USER"), spark2_host=spark2_host, spark2_user=spark2_user, parakeet_host=_env("PARAKEET_HOST") or spark2_host, parakeet_user=_env("PARAKEET_USER") or spark2_user, parakeet_container=_env("PARAKEET_CONTAINER") or "parakeet-asr", magpie_host=_env("MAGPIE_HOST") or spark2_host, magpie_user=_env("MAGPIE_USER") or spark2_user, magpie_container=_env("MAGPIE_CONTAINER") or "magpie-tts", whisperx_host=_env("WHISPERX_HOST") or spark2_host, whisperx_user=_env("WHISPERX_USER") or spark2_user, whisperx_container=_env("WHISPERX_CONTAINER") or "whisperx-asr", whisperx_port=int(_env("WHISPERX_PORT", "8002")), whisperx_model=_env("WHISPERX_MODEL", "medium"), 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")), open_webui_url=_env("OPEN_WEBUI_URL", ""), ngc_api_key=_env("NGC_API_KEY", ""), ) @property def configured(self) -> bool: return bool(self.spark1_host)