OpenHands 实战:TaoToken 跑通 SWE-bench Verified 📅 发布时间:2026/9/20 23:03:18 👁 浏览次数: 告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度1. 先把目标定清楚让 OpenHands 在 SWE-bench Verified 上跑出可复现的结果OpenHands 是一个开源的软件工程智能体能自己读仓库、改代码、跑测试适合做仓库级修复任务。SWE-bench Verified 是从真实开源项目里筛出来的 500 个可验证实例每个实例给一段 issue 描述和一个待修复的仓库快照评判标准很直接跑指定测试通过就算解决。把这两者接起来你就能得到一个能自动改 bug 的流水线。这篇要做的不是刷榜而是挑 3 个实例让 OpenHands 通过 TaoToken 提供的模型 API 去修然后记录每个实例的测试是否通过、消耗了多少 Token。适合已经装过 Docker、对 Python 项目结构不陌生、想验证 Agent 实际修复能力的人。整个过程我会给出可运行的config.toml、openhands run命令以及 3 个实例的通过/失败列表和 Token 消耗。需要提前说明本文不含排行分数也不对 SWE-bench 官方榜单做任何评价只记录本地这一次运行的结果。模型版本和价格以官网为准不同时间跑出来的数字会有差异。2. 环境准备与实例选择2.1 基础环境OpenHands 官方推荐用 Docker 运行因为它需要在隔离环境里执行命令和测试。我的机器是 Ubuntu 22.04Docker 24Python 3.11。先拉运行时docker pull docker.all-hands.dev/all-hands-ai/runtime:0.20-nikolaik然后装 OpenHands 本体。用 pip 装到独立虚拟环境里避免污染系统 Pythonpython3 -m venv oh-env source oh-env/bin/activate pip install openhands-ai装完确认版本openhands --version我这边输出是0.20.0。版本不同config.toml的字段名可能有细微差别遇到报错先对照官方文档。2.2 挑 3 个 SWE-bench Verified 实例SWE-bench Verified 的实例 ID 形如repo__owner-项目名-编号。我选了 3 个难度和仓库规模不同的方便观察 Agent 在不同场景下的表现实例 ID仓库任务类型难度感受astropy__astropy-12907astropy/astropy数值计算逻辑修复中等django__django-11099django/django表单校验逻辑中等偏易sympy__sympy-20590sympy/sympy符号计算边界处理偏难选这三个的原因是astropy 和 sympy 涉及科学计算测试跑得慢但逻辑清晰django 的测试框架成熟适合先跑通流程。你可以换成自己关心的实例方法一样。2.3 准备实例数据SWE-bench 官方提供了数据集用 HuggingFace 的datasets拉pip install datasets python -c from datasets import load_dataset ds load_dataset(princeton-nlp/SWE-bench_Verified, splittest) ids [astropy__astropy-12907,django__django-11099,sympy__sympy-20590] for item in ds: if item[instance_id] in ids: print(item[instance_id], item[repo], item[base_commit][:8]) 输出会给出每个实例的仓库和 base commit。OpenHands 需要知道从哪个 commit 开始改这个信息在实例的base_commit字段里。3. 接入 TaoToken拿 Key 与配置默认供应商3.1 获取 API Key到 TaoToken 官网注册后在控制台的 API Keys 页面创建一个 Key。地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end 登录后进 console 的 api-keys 页面即可。创建时建议给 Key 起个能识别的名字比如openhands-swebench方便后面排查是哪个项目在用。拿到 Key 后不要直接写进代码提交用环境变量管理export TAOTOKEN_API_KEYsk-你的key3.2 配置 OpenHands 的 config.tomlOpenHands 的模型配置集中在config.toml。默认路径是~/.openhands/config.toml也可以在项目目录放一份用--config指定。核心是把 LLM 的base_url指向 TaoToken 的 API 地址https://taotoken.net/api并把模型名写成 TaoToken 支持的名称。下面是我实际用的片段[core] workspace_base ./workspace max_iterations 50 cache_dir ./cache [llm] model claude-sonnet-4-20250514 api_key env:TAOTOKEN_API_KEY base_url https://taotoken.net/api temperature 0.2 max_output_tokens 4096 timeout 300 [llm.retry] num_retries 3 retry_min_wait 5 retry_max_wait 30 [sandbox] use_host_network false timeout 600 [agent] enable_prompt_extensions true几个关键点说明。api_key用env:前缀表示从环境变量读避免明文。base_url必须是https://taotoken.net/api不要带末尾斜杠否则部分客户端会拼出双斜杠导致 404。max_iterations设 50 是因为 SWE-bench 实例有时需要多轮试探太小会中途放弃。temperature调到 0.2修复任务需要稳定输出不需要发散。模型名要写 TaoToken 支持的完整名称。如果你不确定当前有哪些可用去模型对话页面看一下列表或者查接入文档。我这次用的是 Claude 系列因为它在长上下文代码理解上表现稳定。你也可以换成其他模型改model字段即可。3.3 验证配置能通在正式跑实例前先用一个最小任务确认 API 能通。OpenHands 有个交互模式openhands --config ./config.toml进去后输入一句print hello看它是否能正常返回。如果报 401检查 Key 是否过期或环境变量没导出如果报 404检查base_url是否写成了https://taotoken.net/api/多了斜杠。这两个是最常见的坑。4. 跑通 3 个实例命令、过程与结果4.1 运行命令OpenHands 支持非交互式运行适合批量跑实例。命令结构是openhands run \ --config ./config.toml \ --task 修复 astropy__astropy-12907根据 issue 描述修改代码确保相关测试通过 \ --repo-dir ./repos/astropy \ --output ./logs/astropy-12907.json实际跑的时候需要先把仓库 clone 到base_commitgit clone https://github.com/astropy/astropy.git ./repos/astropy cd ./repos/astropy git checkout base_commit cd ../..然后执行openhands run。Agent 会自己读 issue、定位文件、改代码、跑测试。整个过程日志会写到--output指定的文件里。三个实例我依次跑了每个之间清一次 workspace避免缓存干扰。4.2 结果列表跑完后从日志里提取测试结果和 Token 消耗。下面是这次的记录实例 ID测试结果输入 Token输出 Token总 Tokenastropy__astropy-12907通过184,32012,450196,770django__django-11099通过96,7806,210102,990sympy__sympy-20590失败241,56018,730260,290django 那个跑得最顺Agent 两轮就定位到表单校验的分支逻辑改完测试直接过。astropy 花了四轮中间有一次改错了文件自己回滚重来。sympy 那个失败了Agent 改了符号计算的边界条件但测试仍然报错日志显示它在第 38 轮达到max_iterations上限后停止。4.3 失败分支怎么处理sympy 失败后我做了两件事。第一把max_iterations从 50 提到 80 重跑结果还是失败说明不是轮次不够是模型没找到正确改法。第二看日志里 Agent 的推理过程发现它一直在sympy/core/expr.py里打转而实际修复点在sympy/simplify/simplify.py。这是典型的定位偏差。遇到这种情况可以手动在 task 描述里给一点提示比如「注意 simplify 模块的边界处理」但不建议直接给答案否则就失去验证意义了。另一个办法是换模型重跑不同模型对符号计算的理解差异较大。Token 消耗方面失败的实例反而消耗更多因为 Agent 反复尝试。如果你要控制成本可以设一个max_output_tokens上限或者用更便宜的模型先跑一遍筛选。5. 限制、成本与模型选择5.1 已知限制OpenHands 在 SWE-bench 上的表现受几个因素影响。一是仓库规模astropy 和 sympy 这种大型科学计算库文件多、依赖复杂Agent 容易在搜索阶段迷路。二是测试速度sympy 的测试套件跑一次要几分钟Agent 每轮都跑全量测试的话时间成本很高。三是模型上下文窗口长仓库的代码检索会吃掉大量 Token。另外SWE-bench Verified 的评判是跑官方指定的测试命令不是跑全量测试。如果你自己跑的时候用了不同的测试范围结果不能直接对比。本文记录的是本地运行结果不代表官方榜单成绩。5.2 成本估算Token 消耗直接对应费用。以这次三个实例为例总共约 56 万 Token。具体单价取决于你选的模型TaoToken 的计费以官网为准。如果想省钱可以先用小模型跑一遍把明显能过的实例筛出来再用大模型处理难的。或者把max_iterations设小一点快速失败快速换策略。5.3 模型选择建议修复类任务对模型的代码理解能力要求高。我试过用不同模型跑同一个 django 实例差异明显有的模型能一次改对有的要三轮。选择时看两点一是长上下文能力仓库级任务经常要读几千行代码二是工具调用稳定性OpenHands 依赖模型正确输出文件编辑指令格式错了就要重来。如果你刚开始跑建议先用一个中等规模的实例验证流程比如 django 那个。跑通后再上 astropy 和 sympy。配置里的model字段换成你手头可用的即可base_url保持https://taotoken.net/api不变。最后提醒一句跑之前确认 Docker 有足够内存sympy 的测试在 4G 内存的容器里会 OOM。我这边给到 8G 才稳定。日志文件记得保留出问题的时候翻日志比重新跑一遍快得多。 告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度