目录入口见 README。评测集定义见 dumatebench,分数快照见 dumatebench。

先看这条:这是国内唯一”开放提交 + 直接给 harness 排名 + 公司可打”的 Agent 榜,提交走 Harbor(与 Terminal-Bench 同一框架,适配工作可复用)。但它不是 Coding Agent 榜——Code 只占 200 题里的 88 道。榜上已有 OpenCode 69.1 / OpenClaw 78.0 的现成基线,是「OpenCode 二开」类的正面对标位。门槛是 200 题 × 5 trials = 至少 1,000 次 rollout。

是什么

一句话:考 agent 能不能在缺工具、网络抖动、脏目录的真实办公环境里,把一份能直接交出去的产物做出来。

  • 发布方:百度搭子(DuMate);论文 arXiv:2608.26546(目标 WSDM 2027);代码 Apache-2.0。
  • 榜单:https://dumatebench.com/leaderboard
  • 规模:200 题 / 8 大类场景 / 17 个细粒度任务类型;能力覆盖 Text 160 · Code 88 · Web 86 · Files 34 · Multimedia 46。
  • 指标:F = 0.3P + 0.7J(P = 确定性原子检查通过率,J = artifact 级 LLM Judge)。
  • 执行框架:Harbor(版本对齐 harbor==0.20.0)。
  • 榜上对手:DuMate、Hermes、Claude Code、OpenClaw、OpenCode(× GPT-5.5 / Opus-4.8 / GLM-5.2 / DeepSeek-V4-Pro)。

提交前必须确认的两件事

  1. 最终分公式:论文/官网写 0.3P + 0.7J,仓库 submissions/README.md 写「30% complete + 30% partial + 40% judge」。先去仓库开 issue 问清,否则复现出来的分数会被 CI 判不一致。
  2. canonical dataset revision:正式提交必须用维护者配置在仓库变量里的 DUMATEBENCH_HARBOR_DATASET + DUMATEBENCH_HARBOR_DATASET_REF;本地导出的任务目录没有 registry identity,不能作为正式 submission 证据。

怎么打

第 1 步:装环境

cd /path/to/dumate-bench
python3 -m venv .venv && source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r dumatebench/requirements.txt
python -m pip install -e dumatebench_cli/
python -m pip install harbor==0.20.0          # 正式提交路径需要,版本敏感
python -m pip install huggingface_hub          # 仅下载数据集时需要
 
# LLM Judge / 全量评测需要宿主机工具(不能用 pip 装)
brew install ffmpeg libreoffice poppler

前置:Python 3.10+(建议 3.12/3.13)、Docker Desktop(含 docker compose v2)、首次构建需要 PyPI 与 Docker Hub 网络。

代码明确说明:当前只支持源码方式使用,不要 pip install .,wheel 包不含共享 evaluator。

第 2 步:跑确定性 smoke test(不调模型、不花钱)

bash dumatebench/scripts/run_template_task.sh
cat dumatebench/datasets/dev/template_task/run_outputs/reward.json

预期输出含 complete_pass: 1 / partial_pass: 1.0 / environment_recovery: 1 / network_recovery: 1。脚本会故意注入 OCR 与 calendar 故障,固定 smoke agent 负责重试。

第 3 步:下载并准备公开数据集

DATA_ROOT=/absolute/path/to/dumate_bench
hf download Annihi/dumate_bench --repo-type dataset --local-dir "$DATA_ROOT"
tar -xzf "$DATA_ROOT/dumate_bench_data.tar.gz" -C "$DATA_ROOT"

压缩包约 3.5GB,解压后还要一份工作副本。

公开任务包故意不含 environment/,必须先补运行层:

WORK_ROOT=/absolute/path/to/dumatebench_work
TEMPLATE=$PWD/dumatebench/datasets/dev/template_task
mkdir -p "$WORK_ROOT"
cp -a "$DATA_ROOT/final_dataset_clean/." "$WORK_ROOT/"
dumate template fill --dataset "$WORK_ROOT" --template "$TEMPLATE" --task-glob 'task_*'
dumate package check "$WORK_ROOT/task_1"

第 4 步:接入自研 agent

两种方式:

A. dumate adapter 协议(自研 agent,最轻量) agent 从 stdin 读一个 JSON state,向 stdout 写恰好一个 JSON action:

{"command":"ls -la /workspace","reason":"Inspect the workspace"}

结束:

{"finish":true,"reason":"The artifact is ready in /outputs"}
dumate run \
  --dataset "$WORK_ROOT" --task-glob 'task_*' \
  --agent 'python3 /absolute/path/to/my_agent.py' \
  --max-steps 20 --limit 1 --concurrency 1

B. Harbor agent(正式提交用) 把任务导出为 Harbor 格式后,用任意 Harbor 兼容 agent 跑:

dumate harbor export --dataset "$WORK_ROOT" --output "$HARBOR_TASKS" --task-glob 'task_*'
harbor run --path "$HARBOR_TASKS/task_1" --agent openhands-sdk --model "$MODEL" \
  --ae "LLM_API_KEY=$OPENAI_API_KEY" --ae "LLM_BASE_URL=$OPENAI_BASE_URL" \
  --jobs-dir "$JOBS/smoke" --n-concurrent 1 --n-attempts 1 --yes --debug

模型必须用顶层 --model 传。用 --ak model=... 不会设置 model_name,agent 启动后会报 ValueError: Model name is required。--ak 只用于其他构造函数参数。

调试顺序:先 --limit 1 --concurrency 1 跑通一题,再 --n-concurrent 1 跑小批,最后才铺全量。

第 5 步:正式提交跑

harbor run \
  --dataset <org>/<dataset>@<revision> \
  --agent <your-agent> --model <provider/model> \
  --n-attempts 5 \
  --upload --public

硬性约束:

  • 必须用维护者指定的 canonical dataset revision,CI 会逐个核对每题 digest
  • 覆盖 ≥200 题、每题 ≥5 trials
  • error 的 trial 计为失败,不剔除
  • 不得改 agent_timeout_multiplier / verifier_timeout_multiplier / agent_setup_timeout_multiplier / environment_build_timeout_multiplier / 任何 per-trial override_* 超时或资源字段(CI 会拒)
  • 正分 trial 必须有 Harbor trajectory_path,否则不可审计
  • 本地 reward.json 或自报分数永远不是官方依据

第 6 步:生成 manifest 并提 PR

dumate submission from-harbor-job \
  --job-dir /path/to/harbor/jobs/<job-id> \
  --out submissions/dumatebench/<version>/<agent>__<model>.json \
  --agent-name my-agent --agent-org my-organization \
  --model-name my-model --model-provider openai
 
dumate submission check-manifest submissions/dumatebench/<version>/<agent>__<model>.json

然后提 PR 到 main,只新增那一个 manifest 文件,不要改 benchmark 代码。

manifest 最小内容:

{
  "schema_version": 2,
  "harbor_job_id": "job-12345678",
  "metadata": {
    "agent_display_name": "my-agent",
    "agent_org_display_name": "my-organization",
    "models": [{"model_name": "my-model", "model_provider": "openai"}]
  }
}

绝对不要手写 score / accuracy / metrics / verification 字段——CI 会直接拒。

第 7 步:三道门(重要)

你提 manifest PR
  ↓
CI 从 base 分支跑 harbor_verify.py:重拉 Harbor job / 校验 dataset revision 与每题 digest /
拒绝 fairness 覆盖 / 重算 complete_pass + partial_pass(+ final_score)/
校验 agent·model 身份 / run_fingerprint 查重
  ↓
CI 通过 → 拷贝到榜单方自己的 Harbor snapshot → 自动开 bot PR → 你的原 PR 被关闭
  ↓
维护者 review 并 merge bot PR
  ↓
维护者**另外再开一个 PR** 把该 manifest 路径加进 leaderboard/published.json ← 到这一步才上站

提交有效 ≠ 一定上榜。最后一步是维护者手工控制的第二道闸,published.json 目前是空数组。

必填材料速查

项说明
Harbor job公开可读(--upload --public),CI 只信任能从 Harbor 重拉的数据
manifestsubmissions/dumatebench/<version>/<agent>__<model>.json,含 job_id + agent/model 声明,不含分数
覆盖度≥200 题 × ≥5 trials
轨迹正分 trial 必须有 Harbor trajectory_path
dataset必须命中维护者配置的 canonical revision

成本

项数据
rollout 次数200 题 × 5 trials = 1,000 次(下限)
论文单题 token(每题均值)最省 273,532(OpenCode+GPT-5.5);最高 4,603,930(Claude Code+GLM-5.2)
论文单题耗时275s(Claude Code+GPT-5.5)~ 1039s(DuMate+Opus-4.8)
全量 token 量级(粗估)约 2.7 亿 ~ 15 亿 token(1,000 × 0.27M–1.5M)
美元量级粗估 10k(非官方;随模型单价与 cache 命中率浮动,另需 LLM Judge 调用成本)
磁盘数据集压缩包 ~3.5GB + 解压副本 + 每题 Docker 镜像

论文没有明确给出每题重复次数,其 per-task 均值不能直接当作「正式提交的开销」。正式提交硬性要求 5 trials,所以预算应按 5 × 200 = 1,000 次 rollout 准备(论文单题均值只能当量级参考),按 $5k 量级备,不要用论文数字直接乘 200。

单题容器限额(论文口径)

项值
CPU / 内存 / 存储2 vCPU / 8 GB / 12 GB
墙钟预算1,800 秒
基础镜像python:3.12-slim,只预装通用 shell/网络/PDF/进程工具(bash、curl、git、dnsutils、iproute2、iptables、jq、poppler-utils、procps、unzip、vim-tiny),任务专用系统工具与 Python 包一律不预装

Unstable 条件的故障注入参数:启动时 DNS 失败 / 延迟丢包 / 目标阻断各持续 8 秒;运行中故障守护进程每 45 秒按 0.35 / 0.45 / 0.25 的概率重新采样,选中后分别持续 6 / 10 / 8 秒;工具层还强制首次 OCR 调用失败,并有 0.4 概率让后续一次 OCR 响应延迟 5 秒。

常见坑

  1. 公式口径没核实就开跑 → 论文 0.3P+0.7J 与仓库「30/30/40」矛盾,先开 issue 问清
  2. 用本地导出的 dataset 提正式提交 → 没有 registry identity,CI 直接拒
  3. 动了 fairness 参数 → 任何 timeout/resource multiplier 或 override_* 都会导致拒收
  4. 用 --ak model= 传模型 → 不会设置 model_name,agent 启动即报 Model name is required
  5. 把 error 的 trial 剔掉 → 规则是计为失败而非排除,剔了等于覆盖度不足
  6. 在 manifest 里写分数 → CI 拒绝带 score/accuracy/metrics/verification 的 manifest
  7. 以为合并 bot PR 就上站了 → 还需要维护者把它加进 published.json
  8. 容器内网络没配代理 → OpenHands SDK 会在每题容器里装运行时;Docker daemon 不继承宿主 PAC,setup 超时的话模型根本没被调用(表现为 token/cost 为 null)
  9. Docker 镜像/数据集没预热 → 200 题首次构建会非常慢,建议预构建镜像或配好 daemon 代理
  10. 拿它证明 coding 能力 → Code 仅 88/200,且是办公交付语境;coding 主证据仍应走 SWE-bench-Live

相关

信源

信息来自 baidubce/dumate-bench 仓库 leaderboard/SUBMIT.md、leaderboard/README.md、submissions/README.md、仓库主 README,官网榜单页与 overview,arXiv:2608.26546,以及 HuggingFace Annihi/dumate_bench 数据集页。数据截至 2026-09-22。美元成本为粗估,非官方口径。