1. 先搞清楚 Claw-SWE-Bench 到底在测什么
Claw-SWE-Bench 是一个面向编程智能体的多语言基准,全量包含 350 个真实 GitHub Issue 修复实例,覆盖 8 种语言、43 个仓库。它要解决的问题很具体:像 OpenClaw 这类通用智能体,本身并不会自动满足 SWE-bench 的评分契约——干净的 Docker 工作区、可应用的 diff patch、规范的预测文件,这些都需要一层适配器来衔接。所以这个基准的核心不只是“模型能不能改代码”,而是“你的 agent harness 能不能在固定协议下把代码改动变成可评分的补丁”。
适合谁来跟做?如果你手上有 OpenClaw 或类似的编程智能体,想本地验证它在真实 Issue 上的修复能力,而不是只看排行榜上的一个数字,那这套流程就是为你准备的。我实测下来,最容易踩坑的地方不是模型选型,而是环境契约没对齐——补丁提取方式、工作区状态、超时预算,任何一项没固定住,跑出来的 Pass@1 都没法横向比较。
这篇会带你走完一条可复现的路径:用 TaoToken 统一 Key 管理模型调用,配置 OpenClaw 的config.toml和settings.json,然后从 350 个实例里抽样跑通几个任务,最后核对结果。全程不需要 GPU,模型推理走远程 API,一台 16 核 CPU、60 GiB 内存的机器就够。
2. 前置准备:TaoToken 统一 Key 与 OpenClaw 环境
2.1 为什么用统一 Key
Claw-SWE-Bench 的模型扫描涉及多个模型,如果每个模型单独配一套 Key 和环境变量,切换起来非常乱。TaoToken 的做法是给你一个统一的 API 入口,模型名在请求里指定,Key 只有一套。这样你在config.toml里改模型名就能切换骨干,不用动 Key 配置。
先拿到 Key:访问控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 创建 API Key,然后在 API Keys 页面 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 复制出来。API 基地址是https://taotoken.net/api,注意这个地址不带 UTM 参数,直接写进配置即可。
2.2 环境依赖
OpenClaw 的运行依赖 Python 3.10+、Docker(用于拉起 SWE-bench 评估镜像)、Git。Docker 是必须的,因为每个实例都跑在对应的评估镜像里,仓库会被重置到 base commit 并挂载到/testbed。
# 检查基础环境 python3 --version # 需要 3.10 及以上 docker --version # 需要能正常拉取镜像 git --version # 拉取基准仓库 git clone https://github.com/opensquilla/claw-swe-bench.git cd claw-swe-bench pip install -r requirements.txt如果你只想快速验证,不想跑全量 350 个,可以直接用 Lite-80 子集。它是通过 cost-aware、rank-aware 流程从 17 个校准列里选出来的 80 个实例,一次完整运行的成本大约是 full-350 的 22.9%,聚合 Pass@1 偏差控制在 0.4 个百分点左右。对本地验证来说,Lite-80 是更现实的选择。
3. 可复制配置:config.toml 与 settings.json 骨架
3.1 config.toml
这是 OpenClaw 的主配置,核心是把模型调用指向 TaoToken 的统一入口,并固定运行时预算。下面这份骨架可以直接改。
# config.toml [agent] name = "openclaw" # 每实例墙钟超时,基准固定为 3600 秒 wall_clock_timeout = 3600 # 每实例只运行一次 max_runs_per_instance = 1 # worker 并发固定为 3 concurrency = 3 [workspace] # 仓库挂载点,基准协议固定 mount_path = "/testbed" # 禁止 agent 执行 git add / git commit allow_git_add = false allow_git_commit = false # 禁止修改测试文件 allow_modify_tests = false [model] # TaoToken 统一入口 base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" # 骨干模型,可切换 model_name = "glm-5.1" # 关闭 web 检索,保证公平性 enable_web_tool = false [patch] # 从仓库状态导出补丁,而不是解析最终消息 extraction = "git_diff" # 移除 agent 生成的元数据文件 strip_artifacts = ["AGENTS.md", "SOUL.md", "TOOLS.md", "USER.md", "memory/", "sessions/"] [evaluation] # 使用 SWE-bench 官方评估器 evaluator = "swebench" dataset = "claw-swe-bench-lite"这里有几个参数值得单独说。extraction = "git_diff"是关键,它决定了补丁是从/testbed的最终仓库状态导出的,而不是让模型在回复里手写 unified diff。论文里的 bare adapter 就是让模型直接输出 diff 文本,结果 Apply Failed 率高达 69.1%,Pass@1 只有 19.1%;换成完整适配器后 Pass@1 到 73.4%,Apply Failed 降到 1.5% 以下。差别就在这一步。
3.2 settings.json
settings.json 管的是 agent 循环层面的行为,包括工具接口和停止规则。
{ "agent_loop": { "max_turns": 120, "stop_on_patch_ready": true, "stop_on_no_progress_turns": 15 }, "tools": { "file_read": true, "file_write": true, "shell_exec": true, "grep_search": true, "web_search": false }, "prompt_template": "shared_8stage", "stage_flow": [ "READING", "RUNNING", "EXPLORATION", "TEST_CREATION", "FIX_ANALYSIS", "FIX_IMPLEMENTATION", "VERIFICATION", "FINAL_REVIEW" ], "patch_export": { "format": "swebench_prediction", "include_untracked": false } }prompt_template用共享的 8 阶段模板,这是基准固定 prompt 的一部分。8 个阶段从重述问题、探索仓库结构,到写最小复现脚本、做最小修改、跑验证、最后对比 base commit 复查。web_search必须关掉,否则会引入基准之外的检索能力,破坏公平性。
3.3 设置环境变量
export TAOTOKEN_API_KEY="你的Key" # 确认能连通 curl -s https://taotoken.net/api/models \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" | head -c 3004. 跑通抽样任务与结果核对
4.1 从 Lite-80 里抽样
不要一上来就跑全量。先挑几个实例验证链路是否通。Lite-80 的实例列表在仓库的data/lite80.jsonl里,每行一个实例,包含instance_id、repo、base_commit、problem_statement。
# 查看前 5 个实例的 id 和语言 python3 -c " import json with open('data/lite80.jsonl') as f: for i, line in enumerate(f): if i >= 5: break d = json.loads(line) print(d['instance_id'], d.get('language', 'unknown')) "建议先选 Python 和 Java 各一个。Python 来自 SWE-bench-Verified-Mini,天然不受未来提交可见性问题影响;Java 在模型扫描里通常表现较好,容易先看到成功案例。
4.2 单实例运行
python3 run.py \ --config config.toml \ --settings settings.json \ --instance-id <你的instance_id> \ --output-dir ./runs/sample运行过程会做这几件事:拉起对应的 SWE-bench 评估 Docker 镜像,把仓库重置到 base commit 挂载到/testbed,用共享 prompt 实例化任务,驱动 OpenClaw 在容器内读写文件和执行命令,超时或 agent 停止后计算相对 base commit 的git diff,清理元数据文件,写出 SWE-bench 兼容的预测文件。
4.3 核对结果
跑完后./runs/sample下会有预测文件和运行日志。核对分三步。
第一步,看补丁是否成功应用。评估器会尝试把预测补丁应用到仓库 checkout 上,如果应用失败会标记为 Apply Failed。这一步失败通常意味着补丁格式或上下文有问题。
# 查看预测文件 cat ./runs/sample/<instance_id>/prediction.jsonl # 查看评估日志里的应用状态 grep -i "apply" ./runs/sample/<instance_id>/eval.log第二步,看仓库级测试是否通过。评估器在 Docker 环境里应用补丁后运行仓库测试,全部通过才标记为 Resolved。
grep -iE "resolved|failed|passed" ./runs/sample/<instance_id>/eval.log第三步,记录成本与时长。运行日志里会有 token 用量和墙钟时长。论文把成本核算作为一等维度,因为相似 Pass@1 的系统总 API 成本可能差很多。比如 DeepSeek-V4 Flash 达到 70.3% Pass@1 只花 8.2 美元,而 GPT 5.5 到 78.0% 花了 1399.1 美元。本地验证时把这两个数记下来,比只看解决率更有参考价值。
4.4 批量跑 Lite-80
单实例通了之后,可以批量跑。
python3 run.py \ --config config.toml \ --settings settings.json \ --dataset data/lite80.jsonl \ --output-dir ./runs/lite80 \ --concurrency 3并发固定为 3,和基准协议一致。跑完后聚合 Pass@1:
python3 scripts/aggregate.py --runs ./runs/lite80 --metric pass@15. 本篇常见错排查
5.1 补丁应用失败率高
如果你看到大量 Apply Failed,先检查config.toml里的extraction是不是git_diff。如果误设成让模型直接输出 diff 文本,失败率会飙升。另一个原因是strip_artifacts没配全,agent 生成的AGENTS.md、memory/等文件混进了补丁,导致应用时冲突。
5.2 未来提交可见导致虚高
来自 SWE-bench-Multilingual 的非 Python 实例,部分 Docker 镜像仍暴露 base commit 之后的 Git 提交。如果不做 future-commit cleanup,agent 可能读到未来代码,Pass@1 会虚高。论文里 Claude Opus 4.7 清理后从 84.7% 降到 76.7%,掉了 8 个百分点。确认 runner 执行了移除可达未来提交的步骤。
5.3 模型调用 401 或超时
401 通常是TAOTOKEN_API_KEY没设或设错。超时先看wall_clock_timeout,基准固定 3600 秒,本地网络慢可以适当放宽,但横向比较时要保持一致。如果单个请求就超时,检查base_url是不是写成了带 UTM 的地址,API 基地址应该是https://taotoken.net/api。
5.4 并发过高导致资源争抢
基准固定 worker 并发为 3。本地机器内存不够时,Docker 镜像同时拉起会 OOM。61 GiB 内存跑 3 并发是论文的配置,如果你机器更小,降到 1 或 2,但要知道这会影响墙钟时长的可比性。
5.5 语言差异被忽略
Go 在模型扫描里是 9 个模型无一例外的最差语言,范围 33.3% 到 61.9%,比总体均值低 11 到 22 个百分点。如果你抽样只抽了 Go,可能会误判 agent 的整体能力。抽样时覆盖多个语言,至少 Python、Java、Go 各一个。
6. 继续深入的方向
跑通抽样之后,如果你想做更有价值的验证,可以试试固定模型换 harness。论文发现固定模型下 harness 选择能改变 Pass@1 达 27.4 个百分点,和模型选择的 29.4 个百分点处于同一量级。也就是说,换一个 agent 循环、工具接口或停止策略,效果可能和换模型差不多。
想快速对比不同模型在编程任务上的表现,可以直接用模型对话 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 手动试几个 Issue 的 problem statement,感受一下不同骨干的推理风格。如果要做长期的编码智能体迭代,Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 更适合持续跑批量任务。接入细节和参数说明在接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 里,配置卡住的时候对着查一遍通常能定位问题。
最后提醒一句,Lite-80 的构建基于特定 17 列校准池,如果你换了完全不同的模型或 harness 分布,聚合偏差可能会变大,必要时重新校准子集。全量 350 个实例的完整运行墙钟时间约 1148 小时,按 3 线程调度约 15.9 天,本地验证优先用 Lite-80 是更务实的选择。