Skip to content

Roadmap: Harbor + terminus2 评测 + camel-agent 对比文档(现状盘点 + 待办 checkbox) #5

@HansBug

Description

@HansBug

TL;DR

本次拆解的 4 项 TODO 与本仓库当前实际进度对照:

  • a. Harbor 框架下使用 terminus2 harness — Terminal-bench Qwen3-8B 测试0% 进度
  • b. camel-agent (terminal-rl 训练侧) 与 terminus2 (TB 官方 harness) 对比分析文档0% 进度
  • c. 是否替换 camel-agent → terminus2 作为 RL rollout agent 的决策 — 依赖 b. 的产出
  • 📋 d. TODO list — 本 issue 即是

环境基础已就位

  • terminal-bench 0.2.18 已装在 conda env tbench-rlpip show terminal-bench 已确认)
  • Terminus2 类可直接 from terminal_bench.agents.terminus_2.terminus_2 import Terminus2,构造签名见 §3.2
  • ✅ run-3 训完的 35 个 ckpt 全部落盘(save_interval=8,rollout 7→279),本 issue 跑分选其中 4 个代表性 ckpt — 详见 §2.5.1
  • ✅ Qwen3-8B base weights 在 /nfs/models/Qwen3-8B/(也可作 baseline)
  • harbor未装pip list | grep harbor 空,which harbor 空 — 见 §3.1)
  • tbench_test(terminal-bench-core v0.1.x 80-task 冻结集)未下载

本 issue 把这些 TODO 拆成 3 个 Phase + 8 个待决策开放问题,所有项都用 - [ ] checkbox,方便后续勾选/分配。

参考来源:


1. 现状对照表

TODO 项 状态 证据 / 路径
Harbor 框架装好 ❌ 未装 pip list | grep -i harbor 空、which harbor
terminus2 harness 代码 ✅ 已就位 terminal_bench/agents/terminus_2/{terminus_2.py, terminus_json_plain_parser.py, terminus_xml_plain_parser.py}
TB v0.1.x 80-task fixture (tbench_test) ❌ 未下载 terminal-rl/dataset/tbench_test/ 不存在;下载脚本在 terminal-rl/data_utils/download.py:download_tbench_test()
跑过 terminus2 + Qwen3-8B benchmark ❌ 从未跑过 run-1 (lpurziy1) / run-2 (dvu9eexe) / run-3 (msp60ius) 三个 wandb run 全部 0 个 eval/* key(已 grep 验证)
RL ckpt 跑分 ❌ 未跑 iter_0000279 等 ckpt 仅在内部 terminal/accuracy rollout 子集出现过
camel-agent vs terminus2 文档 ❌ 0 进度 find -name '*.md' | xargs grep terminus.?2 全无命中
inference 服务(OpenAI compat 给 Qwen3-8B) ❓ 不确定 训练里 SGLang 起过,但当前 ckpt 走 RL 路径,外部 API 入口未配置

关键认知:camel-agent (terminal-rl/agent_runner.py + terminal-rl/agent/) 是我们 RL 训练时的 rollout agent;terminus2 (terminal_bench/agents/terminus_2/) 是Terminal-Bench 官方 leaderboard 用的 reference agent。这俩是完全不同的 codebase,prompt template / tool schema / context 管理 / max_turns 策略都不同。我们之前 issue #1/2/3/4 报的所有 terminal/accuracy 都是 camel-agent 在 seta-env 训练子集上的 rollout 指标,没有任何一次 是 terminus2 在 TB v0.1.x 上的可对外报数的 benchmark。


2. Phase 1 — 跑通 baseline(不动训练,纯加法)

目标:拿到 base Qwen3-8B 和 RL 训完的 ckpt 在 Terminal-Bench v0.1.x (80 task) 上的 terminus2 跑分。这是最直接需要的对外数字,也是后面 Phase 2 对比的前置依赖。

2.1 装 harbor 框架

  • 1.1.1 调研 harbor 包名:从 SETA tbench_camel_agent_tb2.py 引用 from harbor.models.trial.result import AgentInfo, ModelInfo 来看,应该是某个内部包;先 pip search / 看 SETA 的 setup.sh/requirements.txt 确认正确包名
  • 1.1.2 pip install harbor-...(具体名待 1.1.1 确认)
  • 1.1.3 验证 harbor --help / python -c "import harbor" 可用
  • 1.1.4 如果 harbor 不是 pip 包而是 SETA 内部模块 → 看 SETA 仓库的 install 文档(待决策见 §4 Q1

2.2 下载 TB v0.1.x 冻结集

  • 1.2.1 cd /nfs/terminal-rl-workspace/OpenClaw-RL && python terminal-rl/data_utils/download.py tbench_test (sparse checkout dataset/terminal-bench-core/v0.1.x 分支)
  • 1.2.2 验证 ls terminal-rl/dataset/tbench_test/ 有 80 个 task 子目录
  • 1.2.3 抽 1 个 task 看下 task.yaml 是否含 terminal-bench-canary GUID(确认是冻结集)

2.3 起 OpenAI-compat inference 服务包装 Qwen3-8B

  • 1.3.1 决定后端:vLLM 还是 SGLang(待决策见 §4 Q2
  • 1.3.2 启动 base Qwen3-8B:
    • vLLM: vllm serve /nfs/models/Qwen3-8B --port 8000 --tensor-parallel-size 4 --served-model-name qwen3-8b
    • SGLang: python -m sglang.launch_server --model-path /nfs/models/Qwen3-8B --port 30000 --tp 4
  • 1.3.3 验证 curl http://localhost:8000/v1/chat/completions 可访问
  • 1.3.4 测下 max_tokens / temperature 等参数是否生效

2.4 跑 base Qwen3-8B 走 terminus2 evaluation

  • 1.4.1 起一次 dry-run(1 个 task):

    # 先用 tb 直接跑试试(可能比 harbor 路径短)
    tb run \
        --agent terminus_2 \
        --model openai/qwen3-8b \
        --api-base http://localhost:8000/v1 \
        --tasks-path terminal-rl/dataset/tbench_test \
        --task-id <single-task-id> \
        --runs 1 \
        --output-dir /nfs/eval_results/base_qwen3_8b_dryrun
  • 1.4.2 dry-run 通过后跑全 80 task × 3 runs:

    tb run --agent terminus_2 --model openai/qwen3-8b \
           --api-base http://localhost:8000/v1 \
           --tasks-path terminal-rl/dataset/tbench_test \
           --runs 3 --n-concurrent 8 \
           --output-dir /nfs/eval_results/base_qwen3_8b_full
  • 1.4.3 收集结果,算 pass rate(80 task × 3 run = 240 trial 的成功率)

  • 1.4.4 (可选)改成 harbor CLI 复现一遍,验证 harbor 走出来的数字是否一致:

    harbor run -d terminal-bench@0.1.x \
        --agent-import-path terminal_bench.agents.terminus_2.terminus_2:Terminus2 \
        --agent-kwargs '{"model_name":"openai/qwen3-8b","api_base":"http://localhost:8000/v1"}' \
        --n-concurrent 8
  • 1.4.5 数字记录到 wandb(用 wandb run init 单独建一个 eval run,或者在 issue 里贴)

2.5 跑 RL 训完的 ckpt(来源:wandb msp60ius / issue #4 产物)

2.5.1 选定的 4 个 ckpt

跨"早期 baseline → 中期 plateau → 后期单点峰值 → final"4 个阶段,每个 ckpt 对应 wandb msp60ius 一个具体 rollout 时刻:

ckpt 路径(已验证落盘 ✅) wandb rollout terminal/accuracy 单点 accuracy 末50均值 terminal/reward_mean 单点 non_trainable_ratio response_len_mean 代表的意义
iter_0000007 ckpt/qwen3-8b-terminal-rl/iter_0000007/ 7 0.228 0.197 −0.544 0.000 105 早期 baseline:仅训了 7 个 rollout(≈ rollout_batch=16 × 8 = 128 trajectory × 7),策略基本就是 Qwen3-8B base 的 RL 起步状态。reward 大幅负数说明此时模型还没建立起 "如何在 terminal 里成功完成 task" 的基础行为。
iter_0000119 ckpt/qwen3-8b-terminal-rl/iter_0000119/ 119 0.494 0.475 −0.012 0.009 280 中期 plateau 中位数:训练 ~15h、policy 已经从冷启动学会基本 shell 交互;50-window 0.475 是 issue #4 §3.1 表里 "rollout 100-149 中期均值" 的代表性时刻。reward 接近 0、resp_len 280 token,模型已经稳定输出多轮规划但还在试错阶段。
iter_0000215 ckpt/qwen3-8b-terminal-rl/iter_0000215/ 215 0.673 0.506 +0.346 0.007 181 后期单点峰值:run-3 整轮 283 个 rollout 中的 accuracy 最高单点之一(acc=0.673、reward=+0.35)。但 50-window 仅 0.506,存在 "lucky batch vs 真实策略提升" 的歧义 — OOD 跑分就是来回答这个问题的。resp_len 反而最短(181),可能是模型学会了精炼回答。
iter_0000279 ckpt/qwen3-8b-terminal-rl/iter_0000279/ 279 0.516 0.518 +0.031 0.017 344 final:训练 60h12m 收尾时刻、latest_checkpointed_iteration.txt = 279、对应 issue #4 主帖最终状态。单点 0.516 ≈ 50-window 0.518 → 两者一致,说明此时策略已经收敛到一个稳定水位(issue #4 §3.1 末段说的 "进入第二个平台期"),是最不会被 cherry-pick 误导的代表性 ckpt。

2.5.2 权重存在性验证(已完成)

$ for it in 0000007 0000119 0000215 0000279; do
    du -sh ckpt/qwen3-8b-terminal-rl/iter_$it
    ls    ckpt/qwen3-8b-terminal-rl/iter_$it
  done
ckpt 大小 文件结构
iter_0000007 103 GB 11 文件:__0_0.distcp ~ __3_1.distcp(8 个 DCP shard)+ common.pt + metadata.json
iter_0000119 104 GB 同上
iter_0000215 104 GB 同上
iter_0000279 104 GB 同上

✅ 4 个 ckpt 全部完整,使用 megatron 新版 torch.distributed.checkpoint (DCP) 格式,4-way TP × 2-way DP shard 布局对应训练时 --tensor-model-parallel-size 4

2.5.3 ckpt 转换(megatron DCP → HF safetensors)

DCP 格式无法直接被 vLLM/SGLang 加载,需要先转 HF。

  • 1.5.3.A 找 slime 自带的转换脚本:find /nfs/terminal-rl-workspace/OpenClaw-RL/slime -name '*to_hf*' -o -name 'convert*' (slime 应该有 slime/scripts/megatron_to_hf.py 或类似);如果没有,megatron 自身有 tools/checkpoint/convert.py
  • 1.5.3.B dry-run 转 iter_0000007 → 用 transformers.AutoModelForCausalLM.from_pretrained(...) 验证 load 通过 + generate('Hello, how are you') 输出合理(不是乱码)
  • 1.5.3.C batch 转其余 3 个 ckpt → 输出到 /nfs/eval_ckpts/run3_msp60ius/{iter_007, iter_119, iter_215, iter_279}/
  • 1.5.3.D 转后大小核对:HF safetensors fp16 应 ~16 GB / ckpt(103 GB megatron DCP 包含 actor + optimizer + 4-way TP 切片,合并到 fp16 单 model 后 ~16 GB)

2.5.4 起 inference + 跑分

  • 1.5.4.A 复用 §2.3 的 inference server 配置,逐个 ckpt 起服务(每次只加载 1 个,避免 GPU OOM)
  • 1.5.4.B 对每个 ckpt 跑 80 task × 3 runs(沿用 §2.4.2 的 tb run 命令,仅换 model path / api-base)
  • 1.5.4.C 结果落到 /nfs/eval_results/run3_<iter>_full/,每 ckpt 一份

2.5.5 出对照表

2.6 对外报数 + 横向对比

  • 1.6.1 在 issue 实验记录:terminal-rl Qwen3-8B run-3 (60h, 565 step, wandb msp60ius) — accuracy 0.32→0.52,无 mode-collapse + 6 类 dataset 卡顿 #4 末尾追加一节"§10 Terminal-Bench v0.1.x 跑分",含 §2.5.5 的对比表
  • 1.6.2 跟 leaderboard 对比:GPT-5.5 (82.7%) / Opus 4.7 (69.4%) / DeepSeek V4 Pro (67.9%),看 Qwen3-8B base 大概什么水位、RL 后有无改善
  • 1.6.3 关键判定:iter_0000215 在 OOD 上是否仍 > iter_0000279?
    • 如果是 → 训练后期出现"训练集峰值 ≠ OOD 峰值"现象,下次训练应该更早 stop
    • 如果否 → 单点 0.673 是 lucky batch,跑 OOD 才是真水平,run-4 应该让训练再多跑几个 rollout
  • 1.6.4 (可选)发到 SETA discord / 社区让人帮 review 数字合理性

3. Phase 2 — camel-agent vs terminus2 对比文档

目标:搞清楚两边 agent 在 prompt / tool / context / 错误处理 上的差异,给出"是否替换 camel-agent 作为 RL rollout agent"的决策建议。

3.1 静态对比(读代码即可,无需跑)

  • 2.1.1 读 camel-agent 入口:/nfs/terminal-rl-workspace/OpenClaw-RL/terminal-rl/agent_runner.py(278 行)+ terminal-rl/agent/ 目录所有文件

  • 2.1.2 读 terminus2 入口:terminal_bench/agents/terminus_2/terminus_2.py + terminus_json_plain_parser.py + terminus_xml_plain_parser.py

  • 2.1.3 列出 N 维度差异表:

    维度 camel-agent terminus2
    system prompt 模板 ? _get_prompt_template_path().read_text()
    tool 调用格式 OpenAI function-calling JSON json plain text 或 xml plain text(参数化)
    observation 格式 shell stdout (truncate 8092 token) tmux session capture
    max_turns 策略 hardcode 10 max_episodes=None (默认 1M)
    context overflow 处理 截断 + 丢失上下文 ContextLengthExceededError 抛 → 提前结束
    错误处理 retry 3 次然后 marking FAILED OutputLengthExceededError 同上
    中断 / interrupt 没有 _pending_completion 状态
    LLM client inference_client.py 直接 OpenAI HTTP LiteLLM 封装层
    时间戳 marker _timestamped_markers 列表
  • 2.1.4 写成 markdown 文档放在 docs/camel_agent_vs_terminus2.md

3.2 同 ckpt 双 agent 跑分对比

  • 2.2.1 沿用 Phase 1.3 的 inference 服务(不需要重起)
  • 2.2.2iter_0000279 ckpt 跑 80 task:
    • 走 terminus2: 已经在 1.5.4 跑过
    • 走 camel-agent: 需要让 camel-agent 也吃外部 API 而不是训练时的 SGLang 内部 endpoint(待决策见 §4 Q3
  • 2.2.3 对比 pass rate(绝对差),分析哪些 task camel-agent 通过但 terminus2 失败 / 反之
  • 2.2.4 对比 turn 数 / token 消耗 / 端到端时延

3.3 决策建议

  • 2.3.1 写一节"trade-off 矩阵":替换 camel-agent → terminus2 作为 RL rollout agent 的好处 / 坏处
    • 好处候选:与官方 leaderboard 对齐、context 管理更好、tool 调用格式与社区一致
    • 坏处候选:terminus2 max_episodes=1M 在 GRPO 里没法控制 → 会让单 sample 很长;新增 LiteLLM 依赖;prompt template 不同会导致从 SETA 训练数据迁移过来的模型表现下降
  • 2.3.2 给最终建议(一段话级别):保留 camel-agent / 切换 terminus2 / 双轨并行

4. 待确认 / 待决策的开放问题

这一节是开放的待决策列表,需要团队勾选答复,每条 checkbox 就是一个待回答的二选一/多选一。

Q1. harbor 包名 / 安装方式

  • Q1.A harbor 是 PyPI 公开包 → pip install harbor 即可
  • Q1.B harbor 是 SETA 内部模块 → 需要 fork SETA 仓库或装他们的 setup.sh
  • Q1.C 可以绕过 harbor 直接用 tb CLI(terminal-bench 自带的) → 数字一致即可

Q2. inference 后端选 vLLM 还是 SGLang

  • Q2.A vLLM(社区广、支持 OpenAI-compat 完整)
  • Q2.B SGLang(与训练侧一致,少装一个东西)
  • Q2.C 都跑一遍验证 reproducibility

Q3. camel-agent 走外部 inference 的兼容性

  • Q3.A camel-agent 的 inference_client.py 已经支持外部 OpenAI-compat endpoint,只要换 URL 就行
  • Q3.B 需要改造 camel-agent 才能走外部 API(评估时不用训练时的 SGLang 内置 endpoint)
  • Q3.C 干脆让 camel-agent 始终走训练时同款 SGLang,单独给评估实例

Q4. parser 选 json 还是 xml

  • Q4.A json (terminus2 默认)
  • Q4.B xml (适合 model 不擅长 JSON 时)
  • Q4.C 都跑,对比哪个对 Qwen3-8B 友好

Q5. dataset 选哪个

  • Q5.A terminal-bench-core@0.1.x(80 task,老但稳)
  • Q5.B terminal-bench-core@2.0(89 task,最新 leaderboard 用)
  • Q5.C 都跑,分别报数

Q6. 跑分要不要集成进 wandb

Q7. 替换 camel-agent 决策权

  • Q7.A 由团队决策方拍板
  • Q7.B Phase 2 数字一出立即换
  • Q7.C 等下一轮 run-4 再考虑

Q8. 评测时怎么处理已知坏 task(issue #3 §1.X 列的 5 类失败 task)

Q9. 跑分要不要做 confidence interval(每个 task 跑多次)

  • Q9.A 每 task 1 run(fast,但 noise 大)
  • Q9.B 每 task 3 run(默认 SETA 做法,~3h/Qwen3-8B)
  • Q9.C 每 task 5 run(更稳,但要 ~5h)

Q10. 跑分占 GPU 与训练冲突


5. 风险 / 依赖

  • R1: harbor 包不在 PyPI 公开 → 需要找到 SETA 内部 setup 流程或绕开(Q1
  • R2: megatron 格式 ckpt 转 HF 不顺畅 → Phase 1.5 卡住,需要 ~2h 调通 conversion
  • R3: 80 task × 3 run × Qwen3-8B 占 4 GPU × 2-3h ≈ 实际跑分可能 3-6 小时(每 task 平均 5 min,80 task 并发 8 = 50min × 3 run);与训练同步要预约 GPU
  • R4: terminus2 的 prompt template 与 SETA 训练数据的格式不同 → RL 后 ckpt 可能反而比 base 差(已在 Phase 2.3.1 trade-off 里指出)
  • R5: TB v0.1.x 数据集与 SETA-env 训练集完全独立(issue env-pool 完整记录:架构 / 6 个踩坑 / 持久化配置 / 系统化验证脚本(issue #1/#2 末段退化的环境侧根因) #3/4 已确认),所以这是真正的 OOD 评测,但也意味着模型在训练集上学的 pattern 可能完全不迁移

6. 时间估算

Phase 子任务 估时 阻塞依赖
Phase 1 1.1 装 harbor 0.5–2h Q1
1.2 下 tbench_test 5 min 网络
1.3 inference server 0.5–1h Q2 + GPU
1.4 base 跑分 2–3h 1.3
1.5 RL ckpt 跑分 2–3h 1.3 + ckpt 转换(R2)
1.6 报数 0.5h 1.4/1.5
Phase 1 total 6–10h
Phase 2 2.1 静态对比 4–6h
2.2 双 agent 跑分 2h 1.3 + Q3
2.3 决策建议 1h 2.1 + 2.2
Phase 2 total 7–9h
Phase 3 视情况 1–3 天 Phase 2 结论

全部完成估算: 2–3 个工作日(如果各开放问题决策不卡)


7. 关联


8. 下一步即刻可做(不依赖任何 Q 决策)

最快推进路径:

    • 决定 §4 的 9 个开放问题(如果团队一次性给方向)
    • 不等的话也可以先跑 §2.2 下 tbench_test(5min 零成本)+ §3.1 静态对比文档(半天,纯读代码)
    • inference server 起来后,§2.4.1 dry-run 1 个 task,验证整条链路通了

如果不勾任何 Q,现在就能开始的最小动作:

# Phase 1.2 — 下 tbench_test(5 min)
cd /nfs/terminal-rl-workspace/OpenClaw-RL
python terminal-rl/data_utils/download.py tbench_test
ls terminal-rl/dataset/tbench_test/ | wc -l   # 应该是 80

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions