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 的任务完成、工具使用、策略遵守综合能力

二、支持的功能

  1. 多 Agent 支持

    • 内置 Agent:terminus-2, claude-code, openhands, aider, codex 等

    • 自定义 Agent:通过 --agent-import-path 指定

  2. 多环境支持

    • Docker(本地)

    • Daytona(云端)

    • E2B(沙箱)

    • Modal(云端)

  3. 数据集支持

    • 本地路径:-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 依赖

  1. 在python 3.12的运行环境内,参考 AISBench 安装文档 安装 AISBench 测评工具。

  2. 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架构

打包压缩包大小

terminal-bench-2-prepared-images_aarch64.tar

https://aisbench.obs.cn-north-4.myhuaweicloud.com/terminal-bench-2-images/terminal-bench-2-prepared-images_aarch64.tar

aarch64

48.50 GB

terminal-bench-2-prepared-images_x86_64.tar

https://aisbench.obs.cn-north-4.myhuaweicloud.com/terminal-bench-2-images/terminal-bench-2-prepared-images_x86_64.tar

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 任务

  1. 在 AISBench 工具根目录下执行以下命令:

    ais_bench ais_bench/configs/agent_example/harbor_terminal_bench_2_task.py --debug
    

这里推荐加--debug的原因是因为harbor执行过程中原生的日志看板更加清晰详细,可以精确到实时得分,但是这个实时刷新的看板的内容日志在非debug场景后台执行时无法落盘,只能在终端看到,所以推荐在debug场景下执行。

  1. 执行过程看板示例

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                |
+-----------------------------------+-----------+------------------------------------------------------------+-------------+----------+-------------------------------------------------+---------------------+
  1. 任务执行完成后,会打印如下精度结果:

============================================================
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 次执行的成功率

  1. 最终 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 中)关键参数说明

参数

类型

默认值

说明

path

str

-

本地数据集路径(-p/–path)

n_attempts

int

1

每个 trial 的尝试次数(-k/–n-attempts)

n_concurrent_trials

int

5

并发 trial 数(-n/–n-concurrent)

environment_type

str

docker

环境类型(-e/–env)

environment_force_build

bool

False

是否强制重建环境

environment_delete

bool

True

完成后是否删除环境

timeout_multiplier

float

1.0

超时倍数

max_retries

int

0

最大重试次数

task_names

list[str]

None

包含的任务名(–include-task-name)

exclude_task_names

list[str]

None

排除的任务名(–exclude-task-name)

n_tasks

int

None

最大任务数量(–n-tasks)

Agent 配置(models 中)相关参数说明

参数

类型

默认值

说明

abbr

str

-

模型简称

agent_name

str

oracle

Agent 名称(-a/–agent)

model_names

list[str]

None

模型名称(-m/–model)

agent_kwargs

dict

{}

Agent 额外参数(–ak/–agent-kwarg)

agent_env

dict

{}

Agent 环境变量(–ae/–agent-env)