from __future__ import annotations import argparse import os from pathlib import Path from huggingface_hub import HfApi ROOT = Path(__file__).resolve().parents[1] VARIABLE_DEFAULTS = { "GRADIO_ROOT_PATH": "https://build-small-hackathon-ai-time-machine.hf.space", "TIME_MACHINE_ADAPTER_PROFILE": "modal", "TIME_MACHINE_MODAL_TTS_MODEL_FAMILY": "chatterbox_turbo", "TIME_MACHINE_MODAL_TTS_LATENCY_PROFILE": "turbo", } VARIABLE_NAMES = [ "GRADIO_ROOT_PATH", "TIME_MACHINE_ADAPTER_PROFILE", "TIME_MACHINE_MODAL_STT_URL", "TIME_MACHINE_MODAL_TTS_URL", "TIME_MACHINE_MODAL_TTS_MODEL_FAMILY", "TIME_MACHINE_MODAL_TTS_LATENCY_PROFILE", "TIME_MACHINE_MODAL_STT_TIMEOUT", "TIME_MACHINE_MODAL_TTS_TIMEOUT", "TIME_MACHINE_MODAL_STT_LANGUAGE", "TIME_MACHINE_MODAL_TTS_LANGUAGE", "TIME_MACHINE_LLM_BASE_URL", "TIME_MACHINE_LLM_MODEL", "TIME_MACHINE_IMAGE_BASE_URL", "TIME_MACHINE_IMAGE_MODEL", "TIME_MACHINE_IMAGE_STEPS", ] SECRET_NAMES = [ "TIME_MACHINE_LLM_API_KEY", "TOGETHER_API_KEY", "TIME_MACHINE_IMAGE_API_KEY", "TIME_MACHINE_MODAL_BEARER_TOKEN", ] def main() -> None: parser = argparse.ArgumentParser(description="Configure Hugging Face Space runtime variables.") parser.add_argument("--repo-id", default="build-small-hackathon/ai-time-machine") parser.add_argument("--dry-run", action="store_true") args = parser.parse_args() load_local_env(ROOT / ".env") load_local_env(ROOT / "data" / "local.env") api = HfApi() changed: list[str] = [] missing: list[str] = [] for name in VARIABLE_NAMES: value = env_value(name) or VARIABLE_DEFAULTS.get(name) if not value: if name in {"TIME_MACHINE_MODAL_STT_URL", "TIME_MACHINE_MODAL_TTS_URL"}: missing.append(name) continue changed.append(f"variable:{name}") if not args.dry_run: api.add_space_variable(args.repo_id, name, value) for name in SECRET_NAMES: value = env_value(name) if not value: continue changed.append(f"secret:{name}") if not args.dry_run: api.add_space_secret(args.repo_id, name, value) print("Configured values:") for item in changed: print(f"- {item}") if missing: print("Missing required runtime values:") for name in missing: print(f"- {name}") raise SystemExit(2) def load_local_env(path: Path) -> None: if not path.exists(): return for raw_line in path.read_text(encoding="utf-8").splitlines(): line = raw_line.strip() if not line or line.startswith("#") or "=" not in line: continue key, value = line.split("=", 1) key = key.strip() value = value.strip().strip('"').strip("'") if key and key not in os.environ: os.environ[key] = value def env_value(name: str) -> str | None: value = os.getenv(name) if value is None: return None value = value.strip() return value or None if __name__ == "__main__": main()