OpenHands 实战:TaoToken 跑通 SWE-bench Verified
2026/9/20 23:03:05 网站建设 项目流程

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度

1. 先把目标定清楚:让 OpenHands 在 SWE-bench Verified 上跑出可复现的结果

OpenHands 是一个开源的软件工程智能体,能自己读仓库、改代码、跑测试,适合做仓库级修复任务。SWE-bench Verified 是从真实开源项目里筛出来的 500 个可验证实例,每个实例给一段 issue 描述和一个待修复的仓库快照,评判标准很直接:跑指定测试,通过就算解决。把这两者接起来,你就能得到一个能自动改 bug 的流水线。

这篇要做的不是刷榜,而是挑 3 个实例,让 OpenHands 通过 TaoToken 提供的模型 API 去修,然后记录每个实例的测试是否通过、消耗了多少 Token。适合已经装过 Docker、对 Python 项目结构不陌生、想验证 Agent 实际修复能力的人。整个过程我会给出可运行的config.tomlopenhands run命令,以及 3 个实例的通过/失败列表和 Token 消耗。

需要提前说明:本文不含排行分数,也不对 SWE-bench 官方榜单做任何评价,只记录本地这一次运行的结果。模型版本和价格以官网为准,不同时间跑出来的数字会有差异。

2. 环境准备与实例选择

2.1 基础环境

OpenHands 官方推荐用 Docker 运行,因为它需要在隔离环境里执行命令和测试。我的机器是 Ubuntu 22.04,Docker 24,Python 3.11。先拉运行时:

docker pull docker.all-hands.dev/all-hands-ai/runtime:0.20-nikolaik

然后装 OpenHands 本体。用 pip 装到独立虚拟环境里,避免污染系统 Python:

python3 -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', split='test') 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_source=taotoken_aicg_blog_end ,登录后进 console 的 api-keys 页面即可。创建时建议给 Key 起个能识别的名字,比如openhands-swebench,方便后面排查是哪个项目在用。

拿到 Key 后不要直接写进代码提交,用环境变量管理:

export TAOTOKEN_API_KEY="sk-你的key"

3.2 配置 OpenHands 的 config.toml

OpenHands 的模型配置集中在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_keyenv:前缀表示从环境变量读,避免明文。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_commit

git 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总 Token
astropy__astropy-12907通过184,32012,450196,770
django__django-11099通过96,7806,210102,990
sympy__sympy-20590失败241,56018,730260,290

django 那个跑得最顺,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 才稳定。日志文件记得保留,出问题的时候翻日志比重新跑一遍快得多。

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询