"""动态编译唯一命令行入口。""" from __future__ import annotations import argparse import os import sys from pathlib import Path from scripts.provider_router import parse_model_reference from .pipeline import run_pipeline from .scoring.agentrm import ( DEFAULT_BATCH_SIZE, DEFAULT_CONCURRENCY, DEFAULT_MAX_LENGTH, DEFAULT_RM_API_URL, DEFAULT_TIMEOUT, ) def _provider_model(value: str) -> str: try: return parse_model_reference(value).value except ValueError as exc: raise argparse.ArgumentTypeError(str(exc)) from exc def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( prog="python -m scripts.dynamic_compile.fast", description="从一组 BenchFlow 历史轨迹生成一个动态编译候选 Skill。", ) parser.add_argument("--traces", required=True, type=Path, help="BenchFlow 轨迹目录") parser.add_argument("--skill", required=True, type=Path, help="含根 SKILL.md 的 Skill 包") parser.add_argument("--score-output", type=Path, help="评分阶段产物目录") parser.add_argument("--output", type=Path, help="分析与候选 Skill 产物目录") parser.add_argument( "--model", required=True, type=_provider_model, help="所有外部模型调用使用的 provider/model", ) parser.add_argument("--max-parallel", type=int, default=3) parser.add_argument( "--rm-api-url", default=os.environ.get("RM_API_URL", DEFAULT_RM_API_URL) ) parser.add_argument( "--rm-max-length", type=int, default=os.environ.get("RM_MAX_LENGTH", str(DEFAULT_MAX_LENGTH)), ) parser.add_argument( "--rm-timeout", type=float, default=os.environ.get("RM_TIMEOUT", str(DEFAULT_TIMEOUT)), ) parser.add_argument( "--rm-concurrency", type=int, default=os.environ.get("RM_CONCURRENCY", str(DEFAULT_CONCURRENCY)), ) parser.add_argument( "--rm-batch-size", type=int, default=os.environ.get("RM_BATCH_SIZE", str(DEFAULT_BATCH_SIZE)), ) parser.add_argument( "--force", action="store_true", help="复用有效评分/Map 缓存,强制重建 Reduce、Patch 和候选 Skill", ) return parser def main(argv: list[str] | None = None) -> int: args = build_parser().parse_args(argv) try: result = run_pipeline( args.traces, args.skill, score_output=args.score_output, output=args.output, model=args.model, max_parallel=args.max_parallel, rm_api_url=args.rm_api_url, rm_max_length=args.rm_max_length, rm_timeout=args.rm_timeout, rm_concurrency=args.rm_concurrency, rm_batch_size=args.rm_batch_size, force=args.force, ) except (OSError, RuntimeError, ValueError) as exc: print(f"error: {exc}", file=sys.stderr) return 2 print(result) return 0