"""Trigger a rebuild of the (paused) eval-gpu Space image and poll status. Usage: python _rebuild_space.py [--pause-when-done] Reads HF_TOKEN from ../cadgenbench/.env. """ from __future__ import annotations import argparse import os import sys import time from pathlib import Path SID = "HuggingAI4Engineering/cadgenbench-eval-gpu" def _load_token() -> str: # Prefer an explicitly-provided token (e.g. pulled from git's credential # helper, which has write on the Space) over the .env jobs-hf PAT, which # is read-only on this Space and 403s on restart_space. explicit = os.environ.get("HF_REBUILD_TOKEN") if explicit: return explicit.strip() env = Path(__file__).resolve().parent.parent / "cadgenbench" / ".env" for line in env.read_text().splitlines(): if line.startswith("HF_TOKEN="): return line.split("=", 1)[1].strip() raise SystemExit("HF_TOKEN not found in .env") def main() -> int: ap = argparse.ArgumentParser() ap.add_argument("--pause-when-done", action="store_true") ap.add_argument("--timeout", type=float, default=900.0) args = ap.parse_args() from huggingface_hub import HfApi api = HfApi(token=_load_token()) print(f"[rebuild] restart_space({SID})", flush=True) api.restart_space(SID) t0 = time.monotonic() last = None terminal_ok = {"RUNNING", "RUNNING_APP_STARTING", "APP_STARTING"} terminal_bad = {"BUILD_ERROR", "RUNTIME_ERROR", "CONFIG_ERROR"} while time.monotonic() - t0 < args.timeout: rt = api.get_space_runtime(SID) stage = rt.stage if stage != last: print(f"[rebuild] {time.monotonic() - t0:6.0f}s stage={stage}", flush=True) last = stage if stage in terminal_ok: print(f"[rebuild] BUILD OK (stage={stage})", flush=True) if args.pause_when_done: print("[rebuild] pausing space", flush=True) api.pause_space(SID) print("[rebuild] paused", flush=True) return 0 if stage in terminal_bad: print(f"[rebuild] BUILD FAILED (stage={stage})", flush=True) return 1 time.sleep(15) print("[rebuild] TIMEOUT waiting for build", flush=True) return 2 if __name__ == "__main__": sys.exit(main())