64 lines
2.1 KiB
Python
64 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
"""P4 Cascade Benchmark controller CLI. subcommand 를 bench_cascade 모듈로 dispatch.
|
|
유료 실행(calibrate/judge/arm-run --execute)은 예산 receipt 필수(Blocker 4)."""
|
|
import os
|
|
import sys
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
from bench_cascade import budget, planner # noqa: E402
|
|
|
|
|
|
def _opts(argv):
|
|
o = {}
|
|
i = 0
|
|
while i < len(argv):
|
|
if argv[i].startswith("--"):
|
|
k = argv[i][2:]
|
|
if i + 1 < len(argv) and not argv[i + 1].startswith("--"):
|
|
o[k] = argv[i + 1]; i += 2
|
|
else:
|
|
o[k] = True; i += 1
|
|
else:
|
|
i += 1
|
|
return o
|
|
|
|
|
|
def _budget_path():
|
|
from bench_cascade import paths
|
|
return os.path.join(paths.controller_dir(), "runs", "budget-receipt.json")
|
|
|
|
|
|
def main(argv):
|
|
if not argv:
|
|
sys.stderr.write("usage: benchmark_cascade.py <plan|approve-budget|calibrate|arm-run|sanitize|judge|compare|probe>\n")
|
|
return 1
|
|
cmd, rest = argv[0], argv[1:]
|
|
o = _opts(rest)
|
|
if cmd == "plan":
|
|
import yaml
|
|
print(yaml.safe_dump(planner.summary(), allow_unicode=True, sort_keys=False))
|
|
return 0
|
|
if cmd == "approve-budget":
|
|
budget.approve(o.get("plan-id", "p"), int(o.get("max-tokens", 0)), float(o.get("max-cost", 0)), _budget_path())
|
|
print(f"[budget] approved → {_budget_path()}")
|
|
return 0
|
|
if cmd in ("calibrate", "judge", "arm-run"):
|
|
if o.get("execute"):
|
|
try:
|
|
budget.require(_budget_path())
|
|
except RuntimeError as e:
|
|
sys.stderr.write(f"[budget] {e}\n")
|
|
return 2
|
|
sys.stderr.write(f"[{cmd}] not-implemented — orchestrator 미배선(pilot 실행 단계에서 배선)\n")
|
|
return 3
|
|
if cmd in ("sanitize", "compare", "probe"):
|
|
sys.stderr.write(f"[{cmd}] not-implemented — orchestrator 미배선(pilot 실행 단계에서 배선)\n")
|
|
return 3
|
|
sys.stderr.write(f"unknown subcommand: {cmd}\n")
|
|
return 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main(sys.argv[1:]))
|