跳转到主要内容
扩展 AgentCompass 时,优先遵守现有 runtime 边界:benchmark 负责任务和评分,harness 负责 agent 执行,environment 负责执行 primitive,recipe 负责 provider-specific 兼容性,analyzer 负责后置诊断。

添加 Benchmark

Benchmark 负责数据集协议、任务构造、任务准备、评分逻辑和指标聚合。它不应该负责模型调用、agent loop、sandbox 生命周期,也不应该硬编码某个 provider 的镜像选择。 当你要引入新的任务族、新的评测协议或新的 scoring 逻辑时,添加 benchmark。如果只是要把现有 benchmark 适配到某个远程 sandbox 的镜像、workspace 或资源参数,应该添加 recipe。

Benchmark 文件

src/agentcompass/benchmarks/ 下新增模块。通常包含一个 RuntimeBenchmarkConfig、一个可选 BenchmarkPlan,以及一个继承 BaseBenchmark 的实现。

Benchmark 职责

TaskSpec.metadata 适合保存原始记录、镜像名、expected files、benchmark-specific id 等信息;PreparedTask.inputPreparedTask.output 才是 harness 应消费的正式契约。

注册与验证

src/agentcompass/benchmarks/__init__.py 中导出:
确认组件可以被发现,并跑一个最小样例:

添加 Harness

Harness 负责 agent 或 model 的执行 loop。它消费 PreparedTaskRunRequest.modelEnvironmentSession,并返回标准化的 RunResult。它不应该加载数据集、判断 benchmark correctness,或硬编码某个 provider 的 sandbox 镜像。 当你要接入新的 agent framework、coding assistant、GUI agent、direct model-call path 或 tool-use 策略时,添加 harness。

Harness 文件

src/agentcompass/harnesses/ 下新增模块。通常包含一个用户可配置的 RuntimeHarnessConfig、一个 HarnessPlan,以及一个继承 BaseHarness 的实现。

Harness 职责

Harness 应消费 prepared.input.workspacefilesmediatoolsmessages 等正式字段,而不是反向依赖某个 benchmark 的私有 metadata。这样同一个 harness 才能复用到多个 benchmark。

注册与验证

src/agentcompass/harnesses/__init__.py 中导出:
然后确认发现和 smoke run:

添加 Environment

Environment provider 负责执行 primitive:命令执行、文件传输、文本读写、目录同步、endpoint discovery 和 teardown。它不应该知道 benchmark scoring,也不应该处理 agent 行为。 当 AgentCompass 需要在新的本地进程、容器运行时、云 sandbox 或远程执行 provider 上运行同一套 benchmark/harness 矩阵时,添加 environment。

Environment 文件

src/agentcompass/environments/ 下新增模块。每个 provider 通常包含 session class、config dataclass 和 BaseEnvironment 实现。

Environment 职责

通用 provider 默认值可以放进 config/defaults.yaml。Benchmark-specific image、snapshot、workspace 或 resource 映射应放在 recipe 中。

注册与验证

src/agentcompass/environments/__init__.py 中导出。可选 SDK 依赖需要用 import guard:
然后编译 provider,并用一个最小任务验证命令和文件 primitive:

添加 Recipe

Recipe 是 benchmark family 和 environment provider 之间的兼容层。它在 sandbox 启动前改写单个 task 的 ExecutionPlan,通常用于选择镜像、workspace、resource request、snapshot、环境变量或 evaluation layout。 当 task metadata 已经包含 provider 需要的信息,并且用户不应该在 CLI 手动传入这些参数时,添加 recipe。

Recipe 文件

src/agentcompass/recipes/<benchmark_family>/ 下新增模块。不同 provider 的行为差异较大时,推荐一个 provider 一个文件。

Recipe 职责

execution.enabled_recipes 为空时,recipe 会自动匹配。用户也可以通过 --enabled-recipes 限定 recipe 选择。

注册与验证

从 package initializer 导出 recipe:
运行单个样例,并确认日志中出现 Recipe matched 和新 recipe id:

添加 Analyzer

Analyzer 在任务生成 RunResult 之后运行。它检查 trajectory、metrics、error、latency、模型输出或 tool calls,并把 AnalysisResult 写到每个 details JSON 的 analysis_result.<AnalyzerId> 下。跨任务聚合字段会渲染到 analysis_summary.mdanalysis_summary.json 当逻辑属于后置诊断或统计时,新增 analyzer。不要把可重新运行的诊断逻辑塞进 benchmark 或 harness。

Analyzer 文件

src/agentcompass/analyzers/basic/ 下新增文件;如果是一组较大的 analyzer,也可以创建新的 sub-package。每个 analyzer 都要继承 BaseAnalyzer,使用 @ANALYZERS.register() 注册,并实现 analysis()

Analyzer 属性

AnalysisResult.is_badcase 应设置为:True 表示 badcase,False 表示明确通过,None 表示 statistics-only analyzer,不参与 badcase ratio。

聚合字段

需要进入跨任务 summary 的字段必须声明在 distribution_fields 中: 只有 AnalysisResult.details 中返回的 key 才能被聚合。

注册与验证

把 analyzer 从 package initializer 导出,确保 registry import side effects 能看到它:
确认它已经出现在组件列表中:
在 evaluation 中启用:
或对已有结果重新运行:

开发者说明

  • Analyzer 应只读取和诊断已有结果,不应修改 benchmark 执行行为。
  • Benchmark-specific analyzer 应优先使用 datasets 限定适用范围。
  • 当 benchmark-specific analyzer 需要覆盖 generic analyzer 时,使用 base_analyzerpriority
  • 如果缺少可选 trajectory 字段,返回带 errorAnalysisResult,不要直接抛异常中断整批 analysis。