第一步:确定由谁执行
这一步决定由 Harness 还是 Benchmark 执行 agent 循环:HarnessFreeBenchmark 是 BaseBenchmark 的子类,两者共享任务加载、准备、产物收集、评测和聚合契约,只是在执行阶段由不同组件负责。优先使用 Harness 驱动;只有上游交互协议本身属于 Benchmark 定义时,才使用 Benchmark 驱动。
第二步:选择评测位置
这一步决定evaluate() 在哪里运行,不受第一步选择的影响:
BaseBenchmark 和 HarnessFreeBenchmark 都可以使用这三种模式。通过 TaskSpec.artifacts 使用公共采集与 fresh 恢复:普通任务没有隐式路径,Harbor 适配层在未声明或空列表时仍补入 /logs/artifacts/。执行参数可以覆盖这些路径和命令列表,通过 execution.save_artifacts 控制本地保存。需要生成或整理文件时声明 TaskSpec.artifact_collect 命令;否则直接收集已有文件。具体实现见评测模式与产物。
第三步:选择聚合方式
这一步决定如何把各次任务尝试的判定汇总为请求级指标,但不会改变由谁执行或在哪里评测:
具体结果字段和聚合实现见结果与聚合。无论最终组合是什么,都先阅读共同契约,确定任务字段、可见性边界和逐任务计划。
共享生命周期
每次请求先加载并选择任务,之后再为每个任务和每次尝试执行以下步骤:evaluate() 的执行位置由评测模式决定;所有任务完成后,aggregate_metrics() 读取持久化结果并完成汇总。
方法分工
实现完成后,按文档更新补充用户入口,再按验证与对齐验证真实数据、Environment 和官方结果。
在 Benchmark 类上声明
collect_artifacts = False,表示不支持公共产物收集。runtime 会在创建环境前拒绝与此冲突的任务/Recipe 声明及用户路径/命令覆盖。默认值为 True;没有默认产物路径本身不代表禁用该能力。