File size: 2,253 Bytes
e317359
 
 
 
 
8c1bce7
e317359
 
 
 
 
 
 
 
 
 
 
 
 
 
8c1bce7
 
 
e317359
 
 
 
 
 
 
 
 
 
 
8c1bce7
e317359
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/env python3
"""Apply organization repository secrets and variables to an existing Space."""
from __future__ import annotations

import os
import re
from pathlib import Path


def configure(api, env):
    names = ("HF_TOKEN", "TSFM_API_KEY", "TABPFN_TOKEN")
    missing = [name for name in names if not env.get(name)]
    if missing:
        raise ValueError("Missing repository secrets: " + ", ".join(missing))
    repo = env.get("HF_SPACE_REPO") or "ThinkcatLab/LiveHouse-TS"
    results = env.get("HF_RESULTS_REPO") or repo + "-results"
    state = env.get("HF_STATE_REPO") or repo + "-state"
    enabled = env.get("TSFM_EVALUATOR_ENABLED", "0")
    if enabled not in {"0", "1"}:
        raise ValueError("TSFM_EVALUATOR_ENABLED must be 0 or 1")
    acceptance = env.get("LIVEHOUSE_ACCEPTANCE_ID", "")
    if acceptance and not re.fullmatch(r"[a-z0-9][a-z0-9-]{1,60}", acceptance):
        raise ValueError("Invalid cloud acceptance ID")
    # Validate all destinations before the first secret/variable write.
    api.space_info(repo)
    if not api.dataset_info(state).private:
        raise ValueError("Operator state Dataset must be private")
    if api.dataset_info(results).private:
        raise ValueError("Leaderboard results Dataset must be public")
    if "state/manifest.json" not in api.list_repo_files(state, repo_type="dataset"):
        raise ValueError("Initialize and verify durable state before configuring the worker")
    for name in names:
        api.add_space_secret(repo, name, env[name])
    variables = {"HF_SPACE_REPO":repo, "HF_RESULTS_REPO":results, "HF_STATE_REPO":state,
                 "TSFM_EVALUATOR_ENABLED":enabled, "LIVEHOUSE_ACCEPTANCE_ID":acceptance}
    for name, value in variables.items():
        api.add_space_variable(repo, name, value)
    return {"space":repo, "secret_names":list(names), "variables":variables}


def main():
    import json
    from dotenv import load_dotenv
    from huggingface_hub import HfApi
    load_dotenv(Path(__file__).resolve().parents[1] / ".env")
    if not os.getenv("HF_TOKEN"):
        raise SystemExit("HF_TOKEN is required")
    print(json.dumps(configure(HfApi(token=os.environ["HF_TOKEN"]), os.environ), indent=2))


if __name__ == "__main__":
    main()