OpenHands 实战:TaoToken 跑通 SWE-bench Verified 的本地复验 📅 发布时间:2026/9/20 15:58:54 👁 浏览次数: 告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度1. 先把目标说清楚让 OpenHands 在本地修一个真实 issueOpenHands 是一个开源的软件工程 Agent能自己读代码、跑命令、改文件、执行测试把 GitHub 上一个真实 issue 从头修到尾。SWE-bench Verified 是它常被拿来对照的任务集里面是从真实仓库里筛出来的、有明确测试验证的 issue共 500 条。所谓“本地复验”就是你不去跑全量榜单而是挑其中一条在自己机器上把 OpenHands 跑起来看它能不能在预算内把补丁打对、测试跑绿。这篇要做的是把 TaoToken 作为 OpenHands 的默认模型供应商用一把 Key 加一个 Base URL 接进去然后完整跑通一条 issue 修复流程并把 config.toml 片段和运行日志留下来。适合已经装过 Docker、对 Python 环境不陌生、想亲手验证 Agent 能力的人。整个过程不需要你去改 OpenHands 的源码配置层面就能完成。我试过用默认配置直接跑结果卡在模型调用上后来把 provider 换成 TaoToken 才顺下来。下面按“准备环境 → 拿 Key → 写配置 → 跑任务 → 看结果”的顺序走每一步都给可复制的命令。2. 环境准备与任务集获取2.1 基础依赖OpenHands 官方推荐用 Docker 跑 runtime模型调用走宿主机。你需要Python 3.11 或 3.12Docker 24 以上且当前用户能直接执行docker ps至少 16GB 内存SWE-bench 类任务编译和测试比较吃资源一个可用的终端Linux 或 macOS 都行Windows 建议走 WSL2先确认 Docker 正常docker ps如果报权限错误把当前用户加进 docker 组再重新登录sudo usermod -aG docker $USER2.2 安装 OpenHands用 pip 装最省事建议单独建虚拟环境python -m venv oh-env source oh-env/bin/activate pip install --upgrade pip pip install openhands-ai装完验证一下入口openhands --help能打印出参数列表就说明装好了。版本会随时间更新具体以你装到的为准本文不锁定某个具体版本号。2.3 拉取 SWE-bench Verified 任务SWE-bench 官方仓库里有任务集和评测脚本。克隆下来git clone https://github.com/SWE-bench/SWE-bench.git cd SWE-bench pip install -e .Verified 子集在数据集里以princeton-nlp/SWE-bench_Verified标识。你可以用 datasets 库先看一条任务长什么样from datasets import load_dataset ds load_dataset(princeton-nlp/SWE-bench_Verified, splittest) print(ds[0][instance_id]) print(ds[0][problem_statement][:500])instance_id形如django__django-11099problem_statement就是 issue 正文base_commit是修复起点。挑一条你熟悉的仓库比如 Django 或 sympy后面跑起来更容易判断对错。3. 在 TaoToken 创建 Key 并接入 OpenHands3.1 拿 Key打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_generateutm_mediumcsdnutm_campaigngenerateutm_content注册登录后进控制台在 API Keys 页面创建一个新 Key。创建时记下两件事Key 本身以及它对应的模型名。TaoToken 的 API 入口是 https://taotoken.net/api这个地址后面要填进配置。Key 只在创建时完整显示一次复制到安全的地方。不要写进会提交到 git 的文件里。3.2 OpenHands 的配置结构OpenHands 读~/.openhands/config.toml旧版本可能是~/.config/openhands/config.toml以你本地实际路径为准。核心是[llm]段指定 provider、model、base_url、api_key。TaoToken 兼容 OpenAI 风格的接口所以 provider 用openai这一类即可把 base_url 指向 TaoToken。一个可用的片段如下[core] workspace_base ./workspace max_iterations 50 runtime docker [llm] model 你的模型名 api_key sk-你的TaoTokenKey base_url https://taotoken.net/api temperature 0.2 max_output_tokens 4096 [agent] enable_auto_lint true几点说明。max_iterations控制 Agent 最多走多少步SWE-bench 类任务一般 30 到 50 步够用设太小会中途停。temperature调低一点修 bug 需要稳定输出。base_url结尾不要多加/v1OpenHands 会自己拼路径具体以接入文档为准文档在 https://taotoken.net/doc。3.3 用环境变量兜底不想把 Key 写进配置文件可以用环境变量export LLM_API_KEYsk-你的TaoTokenKey export LLM_BASE_URLhttps://taotoken.net/api export LLM_MODEL你的模型名OpenHands 会优先读环境变量。这样配置文件可以进版本管理Key 留在 shell 里。3.4 验证连通性跑之前先单独测一下模型接口通不通curl https://taotoken.net/api/chat/completions \ -H Authorization: Bearer $LLM_API_KEY \ -H Content-Type: application/json \ -d { model: $LLM_MODEL, messages: [{role: user, content: reply with ok}] }返回里有choices字段就说明 Key 和地址都对。如果返回 401检查 Key 有没有复制全返回 404检查 base_url 是不是写成了带/v1的地址。4. 跑通一条真实 issue 修复4.1 准备任务工作区以django__django-11099为例先把它对应的仓库和 base_commit 拉下来mkdir -p workspace cd workspace git clone https://github.com/django/django.git cd django git checkout base_commitbase_commit从前面 datasets 里读出来。切到那个提交后工作区就是 issue 发生时的代码状态。4.2 启动 OpenHands回到工作区上层用命令行模式跑openhands \ --task 修复以下 issue把 problem_statement 粘进来 \ --workspace ./workspace/django \ --config ~/.openhands/config.tomlOpenHands 会启动一个 Docker runtime把工作区挂进去然后 Agent 开始循环读文件、定位相关代码、改文件、跑测试。终端会实时打印每一步的动作和观察结果。4.3 一次完整运行日志节选下面是我本地跑的一条日志做了脱敏和截断保留关键节点[2025-xx-xx 10:12:03] Agent started, modeltaotoken-xxx, max_iterations50 [10:12:05] ACTION: read_file path./django/db/models/fields/__init__.py [10:12:07] OBSERVATION: 文件读取成功共 2100 行 [10:12:11] ACTION: grep patternclass DecimalField path./django [10:12:13] OBSERVATION: 命中 3 处 [10:12:20] ACTION: edit_file path./django/db/models/fields/__init__.py [10:12:22] OBSERVATION: 补丁已应用修改 1 个文件 [10:12:30] ACTION: run_command cmdpython -m pytest tests/model_fields/test_decimalfield.py -q [10:13:02] OBSERVATION: 12 passed, 0 failed [10:13:05] ACTION: finish [10:13:05] Agent finished in 18 iterations, total tokens48213从启动到结束约 1 分钟18 步测试全绿。这个结果说明 Agent 在预算内完成了任务。不同 issue 难度差别很大有的要跑几十步、改好几个文件有的几步就结束。4.4 失败分支怎么处理跑不通是常态常见几种第一种Agent 改完测试还是红的。看日志里最后一次run_command的输出定位是哪个断言失败然后看它改的文件对不对。有时候它改错了地方需要你把 issue 描述写得更具体或者换一条更清晰的 issue。第二种步数用尽还没结束。把max_iterations调大比如 80再跑一次。同时看日志里有没有反复读同一个文件却不改那通常是模型没理解任务换更强的模型试试。第三种Docker runtime 起不来。检查docker ps是否正常工作区路径是不是绝对路径挂载权限够不够。第四种模型调用超时或限流。日志里会出现rate limit或timeout。降低并发、把max_output_tokens调小或者换一个负载更低的模型。5. 成本、模型选择与边界5.1 成本怎么看SWE-bench 类任务单条消耗的 token 量差别很大简单任务几万复杂任务可能几十万。上面那条日志是 4.8 万 token 左右。成本取决于你选的模型单价TaoToken 控制台里能看到每次调用的用量明细跑之前先估一下预算跑完对一下账。具体价格以官网为准本文不写死数字。5.2 模型怎么选修 bug 对模型的代码理解和长上下文能力要求高。一般来说参数量更大、专门优化过代码的模型一次通过率更高但单价也更高。你可以先用便宜模型跑几条简单 issue 练手确认流程通了再换强模型跑难的。TaoToken 支持在控制台切换模型配置里改model字段就行不用改代码。5.3 这套流程的边界本地复验一条 issue不等于在 SWE-bench Verified 上拿到某个分数。榜单分数是 500 条任务的平均通过率需要跑全量、用官方评测脚本才算数。本文不含排行分数也不对 TaoToken 做任何评测它在这里只是模型接口。你要做的是验证“Agent 能不能在预算内修好一条真实 issue”这件事本身。另外OpenHands 的 runtime 会执行 Agent 生成的命令跑之前确认工作区是隔离的别在存有敏感数据的目录里跑。SWE-bench 的仓库都是公开代码相对安全但习惯要养好。跑完一条之后把 config.toml 和日志存下来换一条 issue 再跑对比步数和 token 消耗你对 Agent 的能力边界会更有感觉。 告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度