#!/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 \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:]))