98 lines
3.0 KiB
Python
98 lines
3.0 KiB
Python
"""动态编译唯一命令行入口。"""
|
|
|
|
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
|