| 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() |
|
|