-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcli.py
More file actions
113 lines (89 loc) · 3.48 KB
/
Copy pathcli.py
File metadata and controls
113 lines (89 loc) · 3.48 KB
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/bin/env python3
"""PSE 任务平台 CLI — pse list / pse run <task> / pse trace。
用法:
python cli.py list # 列出所有任务
python cli.py run <task> # 运行任务(prepare + run)
python cli.py prepare <task> # 仅运行数据准备
python cli.py trace # 查看最近的执行 trace
"""
import json
import subprocess
import sys
from argparse import ArgumentParser
from pathlib import Path
ROOT = Path(__file__).parent # project root
TASKS_DIR = ROOT / "tasks"
VENV_PYTHON = ROOT / ".venv/bin/python" if (ROOT / ".venv").exists() else Path(sys.executable)
def _load_registry() -> dict:
return json.loads((TASKS_DIR / "_registry.json").read_text())
def _check_task(name: str) -> Path:
task_dir = TASKS_DIR / name
if not task_dir.is_dir():
valid = ", ".join(_load_registry()["tasks"].keys())
sys.exit(f"未知任务: {name}(可用: {valid})")
return task_dir
def cmd_list():
registry = _load_registry()
print("可用任务:\n")
for name, info in registry["tasks"].items():
print(f" {name:20s} {info['label']}")
print(f" {'':20s} {info['description']}")
print()
def cmd_prepare(name: str):
task_dir = _check_task(name)
prepare_script = task_dir / "prepare.py"
if not prepare_script.exists():
print(f"⚠️ {name} 无 prepare.py,跳过数据准备")
return
print(f"⏳ {name}: prepare ...")
subprocess.run([str(VENV_PYTHON), str(prepare_script)], check=True, cwd=str(ROOT))
def cmd_run(name: str, skip_prepare: bool = False):
task_dir = _check_task(name)
if not skip_prepare:
cmd_prepare(name)
run_script = task_dir / "run.py"
if not run_script.exists():
sys.exit(f"❌ 未找到 run.py: {run_script}")
print(f"🚀 {name}: run ...")
subprocess.run([str(VENV_PYTHON), str(run_script)], check=True, cwd=str(ROOT))
def cmd_trace(_n: int = 5):
trace_dir = ROOT / "outputs" / "traces"
if not trace_dir.is_dir():
print("还没有执行 trace")
return
files = sorted(trace_dir.glob("trace_*.json"), reverse=True)
if not files:
print("还没有执行 trace")
return
print(f"最近 {min(len(files), _n)} 次执行:\n")
for f in files[:_n]:
data = json.loads(f.read_text())
t = data.get("started_at", "?")[:16]
v = data.get("verdict", "?")
cyc = data.get("total_cycles", "?")
tokens = data.get("total_tokens", 0)
print(f" {f.stem} [{t}] {v} {cyc}轮 {tokens} tokens")
def main():
parser = ArgumentParser(description="PSE 任务平台")
sub = parser.add_subparsers(dest="cmd")
sub.add_parser("list", help="列出所有任务")
r = sub.add_parser("run", help="运行任务")
r.add_argument("task")
r.add_argument("--skip-prepare", action="store_true", help="跳过数据准备")
p = sub.add_parser("prepare", help="仅运行数据准备")
p.add_argument("task")
t = sub.add_parser("trace", help="查看执行 trace")
t.add_argument("-n", type=int, default=5, help="显示最近 N 条")
args = parser.parse_args()
if args.cmd == "list":
cmd_list()
elif args.cmd == "run":
cmd_run(args.task, args.skip_prepare)
elif args.cmd == "prepare":
cmd_prepare(args.task)
elif args.cmd == "trace":
cmd_trace(args.n)
else:
parser.print_help()
if __name__ == "__main__":
main()