基于Harbor框架的Agent 测评
AISBench 原生集成了 Harbor 作为 Agent 测评引擎,通过 --mode agent 一条命令即可拉起 Harbor 评测、实时查看每个 case 状态,并输出单表 + CSV 汇总结果。该链路完全独立于 AISBench 原生的推理/精度链路,不改变 AISBench 其他任何功能。
👉注意:AISBench对harbor做了一些离线化部署的改造,并会持续接入新的agent,实际依赖的harbor为fork主仓改造后的Harbor
与既有 Harbor Terminal-Bench 的接入不同,本章为通用化 Agent 测评,具备以下能力:
支持 Harbor 定义的全量 Agent:内置 AgentName(terminus-2、claude-code、openhands、aider、codex 等)以及自定义
module.path:ClassNameAgent。统一参数适配:不同 Agent 对同一含义参数(模型服务 base url / API key / LLM 调用参数 / 模型信息)的传入方式不同(有的走 kwargs、有的走环境变量),由
AgentParamAdapter自动转换,用户只使用一套统一语义参数。支持 Harbor 全量数据集来源:本地路径(含单一 task 目录)、registry
name@version、packageorg/name@ref。实时监控 HTTP 服务:标准库实现,无需额外依赖,外部可实时获取各 Harbor 任务的执行信息。
独立依赖集:Agent 测评只需安装
requirements/agent.txt,不依赖 AISBench 原生繁重依赖。
资源准备
agent测评主要要准备如下资源:harbor格式数据集、数据集对应镜像、agent依赖,请依据实际测试需求将这3个资源在测试环境上准备好。
1. harbor格式数据集准备
AISBench 理论上支持全量Harbor适配的数据集,具体支持的数据集参考Harbor 数据集适配器列表 。这些数据集需要参考harbor的文档自行构建。
🔍AISBench直接提供了如下数据集资源:
数据集名称 |
全量数据集资源 |
小规模采样数据集资源 |
备注 |
|---|---|---|---|
SWEBench Verified |
https://modelers.cn/datasets/AISBench/SWE-Bench_Verified_mini |
小规模采样数据集资源中 |
|
SWEBench Multilingual |
https://modelers.cn/datasets/AISBench/SWE-Bench_Multilingual_mini |
小规模采样数据集资源中 |
|
SWEBench Pro |
小规模采样数据集资源中 |
||
terminal-bench 2.0 |
https://modelers.cn/datasets/AISBench/terminal-bench-2-offline-mini |
⚠️执行过程中agent需要访问外网 |
|
terminal-bench 2.1 |
https://modelers.cn/datasets/AISBench/terminal-bench-2-1-mini |
⚠️执行过程中需要agent访问外网 |
|
DeepSWE |
NA |
2. 数据集对应镜像准备
agent数据集的测评每一个case都有对应的镜像,这些镜像名称在数据集中定义,如果在x86_64服务器上,网络条件良好且能够访问外网,执行过程中会自动拉取并构建对应的镜像。但是这个过程往往比较漫长。
🔍AISBench直接提供了如下镜像打包资源:
以下打包镜像资源可通过docker load -i <镜像打包资源>命令加载到测试环境中。
3. Agent 依赖准备
AISBench 支持 Harbor 定义的全量 Agent(-a/--agent 直接传名称),也支持通过 --agent-import-path 指定自定义 module.path:ClassName Agent。以下为 Harbor AgentName 内置全部 Agent:
Agent(AgentName) |
Agent(AgentName) |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
💡 不同 Agent 对同一含义参数(模型服务 base url / API key 等)的传入方式不同,AISBench 的
AgentParamAdapter会自动转换:走环境变量的(如claude-code→ANTHROPIC_*、dsh→DSH_*、openhands→LLM_*/OPENAI_*)与走构造函数 kwarg 的(如terminus-2→api_base)均使用同一套统一语义参数(--api-base/--agent-api-key)即可,无需区分。
在测评任务执行过程中,harbor会在每个case的容器中安装对应agent的依赖,包括agent的代码、依赖库、配置文件等,如果你的环境没有网络条件:
🔍AISBench直接提供了如下agent依赖打包资源:
⚠️注意:依据数据集镜像的基础os,选择对应的agent打包资源。
Agent |
ubuntu:22.04 |
ubuntu:24.04 |
debian:13 |
debian:12 |
debian:11 |
备注 |
|---|---|---|---|---|---|---|
terminus-2 |
||||||
mini-swe-agent |
||||||
claude-code |
⚠️ claude-code是发的请求是遵循anthropic格式的,与openai格式不同,需要用litellm[proxy]做请求转发才能对接仅支持openai格式的模型服务 |
|||||
dsh |
||||||
codex |
debian:11 暂无打包 |
安装agent运行环境(docker 容器)
请确保测试环境上已安装docker,且docker服务已启动。
获取agent运行镜像
从📦Agent runtime镜像列表 获取最新的agent运行镜像信息。
后续文档以ghcr.io/aisbench/agent-runtime:v3.1-20260912-master-ubuntu24.04-py312为例
获取agent环境一键部署脚本
wget https://aisbench.obs.cn-north-4.myhuaweicloud.com/agent/scripts/start_agent_runtime.sh
启动一键部署脚本
查看脚本提示信息:
# 查看脚本提示信息,有脚本的使用示例
bash start_agent_runtime.sh --help
启动一键部署脚本(使用时删除注释):
# 以agent:terminus-2,dataset:terminal-bench-2为例
# (推荐) 默认 socket 模式启动
./start_agent_runtime.sh \
--image ghcr.io/aisbench/agent-runtime:v3.1-20260912-master-ubuntu24.04-py312 \ # agent runtime镜像名:tag
--dataset /abs/path/terminal-bench-2 \ # 数据集路径,注意这个路径内必须是case名称的文件夹,有些数据集可能需要传/path/to/{datasets-name}/tasks
--case-images /abs/path/case-images.tar[.gz] \ # (可选)数据集对应的镜像,也可以在物理机上直接加载
--agent-deps /abs/path/agent-deps-dir \ # agent deps的文件夹路径(里面放置各种os的镜像打包资源)
--agent terminus-2 \ # agent名称
# 其他可选命令:
# [--name agent-runtime] # 容器名称
# [--trials-dir ~/harbor-trials] # 挂载的工作路径
# dind 模式启动(强隔离),docker版本 > 20.0.0
./start_agent_runtime.sh --mode dind \
--image ghcr.io/aisbench/agent-runtime:v3.1-20260912-master-ubuntu24.04-py312 \ # agent runtime镜像名:tag
--dataset /abs/path/terminal-bench-2 \ # 数据集路径,注意这个路径内必须是case名称的文件夹,有些数据集可能需要传/path/to/{datasets-name}/tasks
--case-images /abs/path/case-images.tar[.gz] \ # (必选)数据集对应的镜像,也可以在物理机上直接加载
--agent-deps /abs/path/agent-deps-dir \
--agent terminus-2 \
# 其他可选命令:
# [--name agent-runtime] # 容器名称
# [--trials-dir ~/harbor-trials] # 挂载的工作路径
按照一键部署脚本引导进入容器中的测评环境
# 进入容器中的测评环境
docker exec -it agent-runtime /bin/bash
# 今天我们使用harbor环境进行测评
agent_env harbor
cd {工作路径}
👉 更多agent runtime 镜像构建以及一键部署脚本的说明请参考 一键部署脚本说明
agent测评快速入门(两种方式任选其一)
⭐ 推荐:使用命令行参数 |
备选:使用自定义配置文件 |
|---|---|
先准备一个自定义配置文件(含 |
所有参数集中在配置文件,一次编写多次复用 |
命令行显式指定的参数优先级最高,开箱即用 |
支持 Python 全部语法,灵活扩展 |
Agent 测评仍需先准备一个自定义配置文件(这个配置文件路径在进入测评容器后会打印出来,一般是/path/to/harbor_agent_task.py),然后通过命令行在配置基础上覆盖/补充 Agent、模型服务、数据集与运行参数;命令行显式指定的参数优先级高于配置文件。除常规模型服务参数外,Agent 测评新引入的参数(--mode agent、-a/--agent、--api-base、--agent-api-key、-p/--agent-dataset-path、-d/--dataset、-n/--n-concurrent、-k/--n-attempts、-e/--environment、--monitor-port 等)均配合 --mode agent / --mode agent_viz 使用。完整参数见 📚 用户配置参数 - Agent 测评参数。
以本地 terminal-bench-2 数据集 + terminus-2 Agent 为例(<config>.py 为含 HarborRunner/HarborAgentTask 的自定义配置文件,可参考 harbor_agent_task.py):
ais_bench /path/to/harbor_agent_task.py --mode agent \
-a terminus-2 \ # Agent 名称(或自定义 import path)
--model hosted_vllm/qwen3 \ # 模型名称(可多次),用户自行配置
--api-base http://0.0.0.0:8080/v1 \ # 模型服务 base url(统一语义),用户自行配置
--agent-api-key sk-xxx \ # 模型服务 API key(统一语义),用户自行配置
-p /path/to/terminal-bench-2 \ # 本地数据集路径,容器中的命令示例已经给出
--agent-deps /path/to/terminus-2-offline-pack/ \ # Agent 依赖打包资源路径, 容器中的命令示例已经给出
-n 5 \ # 并发 trial 数
-k 1 \ # 每个 trial 尝试次数
如需为 Agent 追加原始参数或环境变量(优先级最高),可用 --ak key=value / --ae KEY=VALUE:
ais_bench <config>.py --mode agent -a terminus-2 --model hosted_vllm/qwen3 \
--api-base http://0.0.0.0:8080/v1 \
-p /path/to/terminal-bench-2 \
--ak max_tokens=4096 \ # agent的额外参数
--ae HTTPS_PROXY=http://proxy:port # agent的额外环境变量
⚠️ 注意,不同的agent支持的–ak不同,具体支持哪些参数请参考harbor agent适配器。
自定义配置文件(这个配置文件路径在进入测评容器后会打印出来,一般是/path/to/harbor_agent_task.py)把「模型服务与 Agent 本身参数」放在 models、把「Agent 测评任务参数」放在 datasets,一次编写多次复用。以下为完整示例:
from mmengine.config import read_base
from ais_bench.benchmark.tasks.custom_tasks.harbor_agent_task import HarborAgentTask
from ais_bench.benchmark.runners.harbor_runner import HarborRunner
from ais_bench.benchmark.tasks.base import EmptyTask
from ais_bench.benchmark.summarizers.harbor import HarborSummarizer
with read_base():
from ais_bench.benchmark.configs.summarizers.example import summarizer
# models:模型服务与 agent 本身参数;统一语义参数由 AgentParamAdapter 自动转换
models = [
dict(
abbr="terminus-2",
agent_name="terminus-2", # -a/--agent: harbor AgentName 或 module.path:ClassName
model_names=["hosted_vllm/qwen3"], # --model: 模型名称(可多值)
api_base="http://0.0.0.0:8080/v1", # --api-base: 模型服务 base url(统一语义)
agent_api_key="sk-xxx", # --agent-api-key: 模型服务 API key(统一语义)
llm_kwargs={"max_tokens": 4096}, # LLM 调用参数,合并进 agent kwargs
model_info={ # 模型 token 限制与成本信息
"max_input_tokens": 128000,
"max_output_tokens": 4096,
},
deps_path=None, # (可选,推荐)--agent-deps: 离线 agent 依赖包路径, 里面放置各种os的tar.gz文件
)
]
# datasets:Agent 测评任务参数
datasets = [
dict(
abbr="harbor_terminal-bench-2",
args=dict(
path="/path/to/terminal-bench-2/", # -p/--agent-dataset-path: 本地数据集路径
# dataset_name_version=None, # -d/--dataset: 远程数据集 name@version / org/name@ref
n_concurrent_trials=5, # -n/--n-concurrent: 并发 trial 数
n_attempts=1, # -k/--n-attempts: 每个 trial 尝试次数
environment_type="docker", # -e/--environment: 环境类型
max_retries=0, # --max-retries: 最大重试次数
yes=True, # -y/--yes: 自动确认环境变量提示
),
)
]
# agent 模式无需原生 inference 阶段
infer = dict(runner=dict(task=dict(type=EmptyTask)))
eval = dict(
runner=dict(
type=HarborRunner,
monitor_port=0, # --monitor-port: 监控 HTTP 服务端口(0=关闭)
task=dict(type=HarborAgentTask),
),
)
summarizer = dict(attr="accuracy", type=HarborSummarizer)
修改好配置文件后,执行命令:
ais_bench ais_bench/configs/agent_example/harbor_agent_task.py --mode agent
💡 命令行显式指定的参数会覆盖自定义配置文件中对应字段。各参数的含义与可选值详见文末 📚 附录:自定义配置文件参数说明。
实时监控服务
通过 --monitor-port <port> 开启只读 HTTP 服务(标准库实现,默认 0 = 关闭):
ais_bench ... --mode agent --monitor-port 8788
常用端点({模型}、{数据集}、{case} 参考实际任务):
端点 |
说明 |
|---|---|
|
存活探测 |
|
全部任务级快照 |
|
任务总览 = |
|
单 case 原始 |
|
每 case 派生状态/成败原因明细 |
|
各 job 进度(聚合计数 + case 状态统计) |
中断续测 & 异常用例自动重试
Harbor 会自动检测 details/config.json 是否存在并跳过已完成 trial,再次执行相同命令(可加 --reuse <时间戳>)即可续测:
ais_bench ais_bench/configs/agent_example/harbor_agent_task.py --mode agent --reuse 20260530_012601
--purge-exception-cases 开关仅在 --reuse 生效时启用:执行前从每个任务 result.json 的 exception_stats 提取异常 case 名,删除同目录下的 case 目录,使 Harbor 重建 job 时自动重跑这些异常退出的 case:
# 先正常跑出部分异常 case,再重跑
ais_bench ... --mode agent --reuse 20260530_012601 --purge-exception-cases
已有结果后,可用 --mode agent_viz 只做汇总,不启动任何 Harbor job:
ais_bench ... --mode agent_viz --reuse 20260530_012601
执行结果与落盘文件
执行结果含义
任务结束后 HarborSummarizer 会打印一张汇总表并落盘一个 CSV,每行对应一个(模型 × 数据集)任务,列即如下指标:
列 |
含义 |
|---|---|
|
本次使用的 Agent 名称 |
|
模型名称( |
|
数据集任务简称( |
|
该任务平均得分(读取聚合 |
|
得分 |
|
得分 |
|
执行中出现异常的 trial 数(对应 |
💡 更多原始指标(
total_count/n_errors/reward_distribution/exception_distribution/pass@k等)保留在逐任务落盘的results/{模型}/{数据集}.json与details/result.json中,如需查看可叠加--monitor-port端点或直接读取落盘文件。
落盘文件结构与含义
结果保存在 outputs/default/{时间戳}/(工作目录可通过 --work-dir 修改),外层目录与 AISBench 其它场景保持一致,核心是 results/{模型}/{数据集}/details/ 下的 Harbor 落盘结果,它镜像了 Harbor job 的结果布局,逐 case 记录了执行与验证明细:
outputs/default/20260530_012601/
├── configs
│ └── 20260530_012601.py # 合成后的完整配置(含 CLI/配置文件的全部参数)
├── logs/eval/{模型}/{数据集}.out # 执行过程日志
├── results/{模型}/{数据集}/ # 测评结果(Harbor 落盘所在目录)
│ ├── details/ # ▽ 该任务 Harbor job 的结果目录(核心)▽
│ │ ├── config.json # 该任务的 job 配置原文(断点续测依据:存在即 resume)
│ │ ├── result.json # 任务级汇总:n_total_trials/stats/trial_results/exception_stats
│ │ └── trial_00000/ # 每个 case 一个目录(按调度序编号)
│ │ ├── result.json # 该 case 结果(status/reward/exception_info/timings/agent_info)
│ │ ├── exception.txt # 该 case 的异常消息文本(异常退出时生成)
│ │ ├── trial.log # 该 case 的 trial 运行日志
│ │ ├── config.json # 该 case 的任务配置
│ │ ├── agent/ # Agent 执行产物
│ │ │ └── trajectory.json # Agent 运行轨迹(是否存在表示有无轨迹)
│ │ └── verifier/ # 验证器产物
│ │ ├── reward.json # 该 case 得分
│ │ ├── ctrf.json # 逐测试用例 pass/fail/skip + 失败原因
│ │ ├── test-stdout.txt # 验证执行 stdout 尾部
│ │ └── test-stderr.txt # 验证执行 stderr 尾部
│ └── {数据集}.json # 该任务聚合结果(供 summarizer 汇总)
└── summary/
├── summary_20260530_012601.csv # 汇总表(csv 格式)
├── summary_20260530_012601.md # 汇总表(markdown 格式)
└── summary_20260530_012601.txt # 汇总表(文本格式)
各 Harbor 落盘文件的作用:
文件 |
作用 |
|---|---|
|
job 配置原文;是否存在决定了是否断点续测(存在则 |
|
任务级汇总; |
|
单个 case 的结果(状态 / reward / exception_info / 耗时 / agent 信息) |
|
异常 case 的异常消息文本,便于排查失败原因 |
|
单个 case 的运行日志 |
|
Agent 运行轨迹;存在即代表该 case 有轨迹可复现 |
|
该 case 的得分 |
|
逐测试用例 pass / fail / skip 与失败信息,用于定位 case 具体失败点 |
|
验证执行的输出 / 错误尾部 |
💡 实时监控服务(
--monitor-port)逐条读取上述文件(result.json/ctrf.json等),并以 mtime 增量缓存保证高频刷新下开销低廉;这些文件也被用于在任务执行中实时计算correct / wrong / exception / avg_score展示在看板与/api/*端点上。
附录:自定义配置文件参数说明
models(模型服务与 Agent 本身参数)
参数 |
对应 CLI |
说明 |
|---|---|---|
|
- |
模型简称(唯一标识,用于结果目录名) |
|
|
Agent 名称(Harbor AgentName)或自定义 import path |
|
|
自定义 Agent 的导入路径( |
|
|
模型名称列表,可多值 |
|
|
模型服务 base url(统一语义,自动转换) |
|
|
模型服务 API key(统一语义,自动转换) |
|
- |
LLM 调用参数(如 |
|
- |
模型 token 限制与成本信息( |
|
|
追加的 Agent 原始 kwargs(优先级最高) |
|
|
追加的 Agent 环境变量(优先级最高) |
|
|
离线 Agent 依赖包路径 |
|
- |
每个 Agent 的并发上限 |
|
- |
Agent 技能目录 / MCP 服务器配置 |
|
- |
跨步恢复 agent 会话 / 预加载轨迹文件 |
|
- |
额外允许访问的 host/IP |
|
- |
保留 / 排除的 agent 日志 glob |
|
- |
Agent 执行 / 环境搭建超时覆盖与上限 |
datasets[].args(Agent 测评任务参数)
参数 |
对应 CLI |
说明 |
|---|---|---|
|
|
本地数据集路径(或单一 task 目录) |
|
|
远程数据集 |
|
- |
数据集 registry 地址 / 路径 |
|
|
并发运行 trial 数 |
|
|
每个 trial 尝试次数 |
|
|
启用调试日志 |
|
|
抑制单个 trial 进度显示 |
|
|
任务超时倍数 |
|
- |
各环节超时倍数 |
|
|
最大重试次数 |
|
- |
重试包含 / 排除的异常类型集合 |
|
|
环境类型( |
|
|
是否强制重建环境 |
|
|
完成后是否删除环境 |
|
|
环境附加参数( |
|
- |
环境变量 |
|
|
禁用 verifier |
|
- |
verifier 环境变量 / 自定义导入路径 / 附加参数 |
|
|
需要包含的任务名(支持 glob) |
|
|
需要排除的任务名(支持 glob) |
|
|
从数据集选取的最大任务数量 |
|
|
自动确认环境变量提示 |
|
|
|
其他:eval.runner
参数 |
对应 CLI |
说明 |
|---|---|---|
|
|
Harbor 监控 HTTP 服务端口(0 = 关闭,默认 0) |
📚 更详细的 Harbor 环境准备、terminal-bench 2/2.1 数据集与镜像说明,参见 Harbor Terminal-Bench。全部 CLI 参数见 📚 用户配置参数 - Agent 测评参数。
附录:源码安装
前置约束
Python 3.12 运行环境;
执行 Harbor 所需的 Docker / 环境按 Harbor 要求准备(docker > 20.0.0, docker compose > 2.0.0, docker buildx > 0.18.0)。
安装 Agent 独立依赖集
pip install -r requirements/agent.txt
⚠️ 安装过程中的无关紧要报错说明:执行 Agent 依赖安装(尤其是从源码以可编辑方式安装 Harbor 及其传递依赖)时,
pip可能会输出一些不影响 Agent 测评使用的报错或告警,主要包括:
依赖版本冲突告警(例如 Harbor 会把
datasets库升级到 4.0.0+,导致该库与其它依赖出现版本冲突告警);个别包编译/构建的 warning,或依赖解析时的
yanked/deprecated提示等。 这些告警只要未导致安装失败(pip 报error并中断),即可直接忽略,继续安装后的 Harbor Agent 测评即可正常使用。若确需判断是否安装成功,可在安装后执行pip show harbor确认 Harbor 已正确就位。