Harbor Terminal-Bench
Harbor 简介
Harbor 是一个用于评估 AI Agent 的框架,支持运行多种 benchmark 任务,包括 Terminal-Bench-2 等。
基准官方仓库:https://github.com/harbor-framework/harbor
一、核心定位与背景
核心功能:支持多种 Agent(Terminus-2、Claude Code、OpenHands 等)的评测
核心创新:
支持多种环境(Docker、Daytona、E2B、Modal 等)
支持并行执行和断点续测
自动评估和结果分析
核心目标:评测 Agent 的任务完成、工具使用、策略遵守综合能力
二、支持的功能
多 Agent 支持
内置 Agent:terminus-2, claude-code, openhands, aider, codex 等
自定义 Agent:通过
--agent-import-path指定
多环境支持
Docker(本地)
Daytona(云端)
E2B(沙箱)
Modal(云端)
数据集支持
本地路径:
-p /path/to/dataset远程数据集:
-d dataset-name@version
三、核心评测机制
自动化验证:通过 verifier 自动评估结果
并行执行:通过
-n/--n-concurrent控制并发数断点续测:检测已有结果,自动跳过已完成任务
轨迹导出:通过
--export-traces导出轨迹
AISBench 中快速上手基于Harbor的Terminal-Bench 2.0 测评
1. 准备推理服务
确保本地或云端部署了遵循 OpenAI chat/completions API 规范且支持 tool call 的被测推理服务。
2. 测评环境准备
确保环境docker 版本 >= 20.10.0,docker compose 版本 >= 2.0.0(docker compose可能需要额外安装)。同时需要准备一个python 3.12的运行环境
3. 安装 AISBench 测评工具 & Harbor 依赖
在python 3.12的运行环境内,参考 AISBench 安装文档 安装 AISBench 测评工具。
python 3.12的运行环境内安装 Harbor:
pip install harbor==0.6.1
⚠️注意:安装harbor会将datasets库的版本升级到4.0.0以上的版本,这会导致安装后报datasets库的依赖冲突,对于执行harbor测试terminal-bench相关数据集没有影响,但是如果你需要测试其他数据集,需要降低datasets库的版本。
4. 准备AISBench修改过的Terminal-Bench-2数据集和对应镜像
AISBench修改的数据集获取链接:https://github.com/AISBench/terminal-bench-2
👉注意: AISBench没有改用例内容,只是将所有环境的准备全部集中到Dockerfile中,避免反复执行还需要反复构建环境和安装依赖
Terminal-Bench-2 预制打包镜像信息:
镜像名称 |
获取链接 |
cpu架构 |
打包压缩包大小 |
|---|---|---|---|
|
aarch64 |
48.50 GB |
|
|
x86_64 |
71.43GB |
👉注意:如果不想准备所有case的镜像,可以从terminal-bench-2-offline-mini获取基于terminal-bench-2.0小规模采样的数据集及对应打包镜像
5. 配置 Harbor 任务的自定义配置文件
在 AISBench 工具根目录下修改 ais_bench/configs/agent_example/harbor_terminal_bench_2_task.py:
models = [
dict(
abbr="terminus-2",
agent_name="terminus-2", # -a/--agent: Agent名称 (terminus-2, claude-code, openhands等)
model_names=["hosted_vllm/qwen3"], # -m/--model: 模型名称, hosted_vllm/{模型名称}
agent_kwargs={ # --ak/--agent-kwarg: Agent额外参数
"api_base": "http://0.0.0.0:8080/v1", # terminus-2需要api_base连接推理服务,例如填"http://0.0.0.0:8080/v1"会访问"http://0.0.0.0:8080/v1/chat/completions"
"model_info": { # 模型token限制和成本信息
"max_input_tokens": 128000,
"max_output_tokens": 4096,
"input_cost_per_token": 0.0,
"output_cost_per_token": 0.0,
},
},
agent_env=None, # --ae/--agent-env: 传递给agent的环境变量
)
]
# ......
datasets = []
for task in sub_tasks:
datasets.append(
dict(
abbr=f'harbor_{task}',
args=dict(
n_attempts=1, # -k/--n-attempts: 每个trial的尝试次数
timeout_multiplier=1.0, # --timeout-multiplier: 超时倍数(所有超时乘以此系数)
# ......
n_concurrent_trials=5, # -n/--n-concurrent: 并发运行的trial数量
# ......
path="/path/to/terminal-bench-2/", # -p/--path: 本地数据集路径
# ......
n_tasks=None, # --n-tasks: 最大任务数量, None默认跑全部,快速入门可以尝试设置几条快速跑通流程
# ......
),
)
)
# ......
6. 执行 Harbor 任务
在 AISBench 工具根目录下执行以下命令:
ais_bench ais_bench/configs/agent_example/harbor_terminal_bench_2_task.py --debug
这里推荐加
--debug的原因是因为harbor执行过程中原生的日志看板更加清晰详细,可以精确到实时得分,但是这个实时刷新的看板的内容日志在非debug场景后台执行时无法落盘,只能在终端看到,所以推荐在debug场景下执行。
执行过程看板示例
Base path of result&log : outputs/default/20260530_012601
Task Progress Table (Updated at: 2026-05-30 01:30:00)
Press Up/Down arrow to page, 'P' to PAUSE/RESUME screen refresh, 'Ctrl + C' to exit
+-----------------------------------+-----------+------------------------------------------------------------+-------------+----------+-------------------------------------------------+---------------------+
| Task Name | Process | Progress | Time Cost | Status | Log Path | Extend Parameters |
+===================================+===========+============================================================+=============+==========+=================================================+=====================+
| terminus-2/harbor_terminal-bench-2 | 1234567 | [###### ] 10/21 Running Harbor | 0:07:13 | running | logs/eval/terminus-2/harbor_terminal-bench-2.out | None |
+-----------------------------------+-----------+------------------------------------------------------------+-------------+----------+-------------------------------------------------+---------------------+
任务执行完成后,会打印如下精度结果:
============================================================
Dataset: harbor_terminal-bench-2
Model: terminus-2
============================================================
Total Count: 74
Errors: 54
Avg Score: 0.045
Reward Distribution:
+--------+-------+
| Score | Count |
+========+=======+
| 0.0 | 70 |
+--------+-------+
| 1.0 | 4 |
+--------+-------+
Exception Distribution:
+----------------------------+-------+
| Exception | Count |
+============================+=======+
| AgentTimeoutError | 39 |
+----------------------------+-------+
| AgentSetupTimeoutError | 13 |
+----------------------------+-------+
| InternalServerError | 2 |
+----------------------------+-------+
Pass@k:
+----+-----------+
| k | Pass Rate |
+====+===========+
| 1 | 0.0541 |
+----+-----------+
| 2 | 0.0811 |
+----+-----------+
+--------------------+-----------+----------------+--------+---------------+--------------+
| dataset | version | metric | mode | total_count | terminus-2 |
+========================+===========+================+========+===============+==============+
| harbor_terminal-bench-2 | a39421 | avg_score | gen | 74 | 0.045 |
+--------------------+-----------+----------------+--------+---------------+--------------+
| harbor_terminal-bench-2 | a39421 | n_errors | gen | 74 | 54 |
+--------------------+-----------+----------------+--------+---------------+--------------+
| harbor_terminal-bench-2 | a39421 | n_total_trials | gen | 74 | 74 |
+--------------------+-----------+----------------+--------+---------------+--------------+
Avg Score:所有任务的平均得分n_errors:执行过程中出现的异常数量reward_distribution:奖励分布exception_distribution:异常类型分布pass@k:k 次执行的成功率
最终
outputs/default/{时间戳}目录下结果文件的结构如下:
outputs/default/20260530_012601
├── configs
│ └── 20260530_012601.py
├── logs
│ └── eval
│ └── terminus-2
│ └── harbor_terminal-bench-2.out
├── results
│ └── terminus-2
│ └── harbor_terminal-bench-2
│ ├── details
│ │ ├── config.json
│ │ ├── result.json
│ │ └── trial_*/
│ └── harbor_terminal-bench-2.json
└── summary
├── summary_20260530_012601.csv
├── summary_20260530_012601.md
└── summary_20260530_012601.txt
中断后继续执行测评
中断任务执行后(如按下 Ctrl+C),再次执行相同命令即可自动续测:
ais_bench ais_bench/configs/agent_example/harbor_terminal_bench_2_task.py --debug --reuse 20260530_012601
其中20260530_012601为上次失败任务执行时的时间戳,需要根据实际情况替换。
Harbor 会自动检测 details/config.json 是否存在,并跳过已完成的 trial。
单条 case 多次执行(pass@k)
修改 n_attempts 参数可以多次执行同一 case:
datasets.append(
dict(
abbr='harbor_terminal-bench-2',
args=dict(
path="/path/to/terminal-bench-2/",
n_attempts=5, # 每个trial尝试5次
n_concurrent_trials=5,
),
)
)
执行后将显示 pass@k 指标,表示 k 次执行中至少成功一次的概率。
任务配置(datasets 中)关键参数说明
参数 |
类型 |
默认值 |
说明 |
|---|---|---|---|
|
str |
- |
本地数据集路径(-p/–path) |
|
int |
1 |
每个 trial 的尝试次数(-k/–n-attempts) |
|
int |
5 |
并发 trial 数(-n/–n-concurrent) |
|
str |
docker |
环境类型(-e/–env) |
|
bool |
False |
是否强制重建环境 |
|
bool |
True |
完成后是否删除环境 |
|
float |
1.0 |
超时倍数 |
|
int |
0 |
最大重试次数 |
|
list[str] |
None |
包含的任务名(–include-task-name) |
|
list[str] |
None |
排除的任务名(–exclude-task-name) |
|
int |
None |
最大任务数量(–n-tasks) |
Agent 配置(models 中)相关参数说明
参数 |
类型 |
默认值 |
说明 |
|---|---|---|---|
|
str |
- |
模型简称 |
|
str |
oracle |
Agent 名称(-a/–agent) |
|
list[str] |
None |
模型名称(-m/–model) |
|
dict |
{} |
Agent 额外参数(–ak/–agent-kwarg) |
|
dict |
{} |
Agent 环境变量(–ae/–agent-env) |