OpenHands 实战:TaoToken 跑通 SWE-bench Verified 实例 📅 发布时间:2026/9/20 22:54:43 👁 浏览次数: 告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度1. 先把目标定清楚让 OpenHands 在 SWE-bench Verified 上跑通一个最小修复实例OpenHands 是一个开源的软件工程 Agent 框架它能自己读仓库、定位 bug、改代码、跑测试适合做仓库级修复任务的自动化验证。SWE-bench Verified 是 SWE-bench 官方筛选出的 500 个人工确认可解的真实 GitHub issue 子集常被用来衡量 Agent 的仓库级修复能力。把这两者接起来你得到的是一个可复现的本地 Harness给定一个实例 IDAgent 自动完成从读 issue 到提交 patch 的全过程。这篇要做的不是刷榜而是跑通一个最小实例把链路、命令、模型配置、成功与失败的输出形态、耗时都记录下来。适合已经用过命令行、想验证 Agent 在真实仓库任务上表现的开发者。模型请求统一走 TaoToken 的 APIOpenHands 侧只需要改 Base URL 和 Key 两处。我试过用最小实例先验证链路再考虑批量跑这样排障成本最低。下面按「准备环境 → 拿 Key → 配置 OpenHands → 跑实例 → 看结果」的顺序展开。2. 环境准备与 OpenHands 启动2.1 基础依赖OpenHands 官方推荐用 Docker 运行因为 Agent 会在容器里执行命令、装依赖、跑测试隔离性更好。你需要Docker 24 与 docker composePython 3.11如果走 pip 安装方式至少 8GB 内存仓库级任务建议 16GB一个可用的模型 API Key下一步在 TaoToken 创建先确认 Docker 正常docker --version docker compose version2.2 安装 OpenHands方式一pip 安装 CLIpython -m venv openhands-env source openhands-env/bin/activate pip install openhands-ai方式二直接用官方 Docker 镜像省去本地依赖docker pull docker.all-hands.dev/all-hands-ai/openhands:latest我倾向 Docker 方式环境干净出问题好回滚。启动命令把 Key 和 Base URL 通过环境变量传入docker run -it --rm \ --pullalways \ -e SANDBOX_RUNTIME_CONTAINER_IMAGEdocker.all-hands.dev/all-hands-ai/runtime:latest \ -e LOG_ALL_EVENTStrue \ -e LLM_API_KEY$TAOTOKEN_API_KEY \ -e LLM_BASE_URLhttps://taotoken.net/api \ -e LLM_MODELanthropic/claude-sonnet-4-20250514 \ -v /var/run/docker.sock:/var/run/docker.sock \ -p 3000:3000 \ --add-host host.docker.internal:host-gateway \ --name openhands-app \ docker.all-hands.dev/all-hands-ai/openhands:latest启动后浏览器打开http://localhost:3000进入 Web 界面。注意LLM_BASE_URL填的是https://taotoken.net/api不要带末尾斜杠也不要加 UTM 参数否则部分 SDK 会拼接出错误路径。2.3 准备 SWE-bench Verified 实例SWE-bench 官方提供了评测脚本和数据集。最小验证不需要跑全量挑一个实例即可。先拉取数据集pip install datasets python -c from datasets import load_dataset ds load_dataset(princeton-nlp/SWE-bench_Verified, splittest) print(len(ds)) print(ds[0][instance_id]) print(ds[0][repo]) print(ds[0][base_commit]) 输出会给出实例 ID、仓库名、base commit。记下这三个字段后面 OpenHands 要用。比如某个实例是django__django-11099仓库是django/djangobase commit 是一串 SHA。3. TaoToken 接入拿 Key 与默认供应商配置3.1 创建 API Key访问官网注册并创建 Keyhttps://taotoken.net/?utm_sourcetaotoken_aicg_blog_generateutm_mediumcsdnutm_campaigngenerate登录后进入控制台在 API Keys 页面新建一个 Key复制保存。控制台地址https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_generateutm_mediumcsdnutm_campaigngenerateKey 只在创建时完整显示一次丢了就重建。把它写进环境变量避免硬编码进脚本export TAOTOKEN_API_KEYsk-你的key3.2 在 OpenHands 里设为默认供应商OpenHands 的模型配置有三个关键字段LLM_MODEL、LLM_API_KEY、LLM_BASE_URL。把 Base URL 指向 TaoToken 的 API 端点OpenHands 的所有模型请求就会走统一入口。Web 界面里也可以改进入 Settings → LLMProvider 选 Custom 或 Anthropic 兼容Base URL 填https://taotoken.net/apiAPI Key 填上一步的 KeyModel 填你要用的模型名。如果你用配置文件方式编辑~/.openhands/config.toml[llm] model anthropic/claude-sonnet-4-20250514 api_key sk-你的key base_url https://taotoken.net/api模型名要按 TaoToken 文档里的写法填不同供应商前缀不同。接入文档在这里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_generateutm_mediumcsdnutm_campaigngenerate3.3 验证连通性在跑实例前先用一个最小请求确认 Key 和 Base URL 没问题curl https://taotoken.net/api/v1/messages \ -H x-api-key: $TAOTOKEN_API_KEY \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: claude-sonnet-4-20250514, max_tokens: 64, messages: [{role: user, content: reply with ok}] }返回里能看到content字段就说明链路通了。如果返回 401检查 Key 是否复制完整返回 404检查 Base URL 是否多了斜杠或路径。4. 跑通最小实例命令、输出与耗时4.1 用 CLI 方式跑单实例OpenHands 支持直接指定任务描述。把 SWE-bench 实例的 issue 文本作为任务输入openhands run \ --task Fix the issue described in the repository. Repo: django/django, base commit: SHA. Issue: 把 issue 正文粘进来 \ --model anthropic/claude-sonnet-4-20250514 \ --base-url https://taotoken.net/api \ --api-key $TAOTOKEN_API_KEY \ --workspace ./workspaceAgent 会依次执行克隆仓库、checkout 到 base commit、读 issue、定位相关文件、改代码、跑测试。整个过程在终端有事件流输出。4.2 成功输出片段跑通时终端会看到类似这样的收尾[Agent] Running tests for the modified module... [Runtime] pytest tests/test_xxx.py -q [Runtime] 1 passed, 0 failed [Agent] Patch generated: fix.patch [Agent] Task completed in 412sfix.patch就是 Agent 产出的修复补丁。用git apply --check fix.patch验证能否干净应用再用 SWE-bench 官方评测脚本跑一遍确认FAIL_TO_PASS测试从失败变通过。4.3 失败输出片段与分支常见失败形态有三种。第一种Agent 找不到相关文件事件流里反复出现search但没命中最后超时[Agent] Searching for def validate in repo... [Runtime] 0 matches [Agent] Task timed out after 900s第二种改了代码但测试仍失败[Runtime] pytest tests/test_xxx.py -q [Runtime] 1 failed, 0 passed [Agent] Patch generated but tests failing第三种模型请求报错通常是 Key 或 Base URL 问题[LLM] Error: 401 Unauthorized对应处理超时就换更强的模型或缩小任务范围测试失败就检查 base commit 是否 checkout 正确401 就回到第 3.3 步验证连通性。4.4 耗时记录单实例耗时受模型、仓库大小、任务复杂度影响。我实测下来中等规模仓库的最小修复实例用 Sonnet 级别模型端到端在 6 到 12 分钟之间。其中模型推理占大头容器内跑测试占 1 到 2 分钟。批量跑时建议并发控制在 2 到 4避免容器资源争抢。5. 限制、成本与模型选择SWE-bench Verified 的实例都是真实仓库依赖安装和测试执行可能很重容器磁盘建议留 20GB 以上。部分实例的测试环境需要特定 Python 版本OpenHands 的 runtime 镜像不一定全覆盖遇到装依赖失败就手动指定镜像。成本方面模型调用按 token 计费仓库级任务上下文长单实例消耗可能到几十万 token。具体价格以官网为准https://taotoken.net/?utm_sourcetaotoken_aicg_blog_generateutm_mediumcsdnutm_campaigngenerate模型选择上仓库级修复对长上下文和代码理解要求高建议用 Sonnet 或同级模型起步。想省钱可以先用小模型跑通链路再换大模型跑正式实例。长期批量跑的话Coding Plan 更划算https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_generateutm_mediumcsdnutm_campaigngenerate最后提醒一句SWE-bench 官方评测脚本和数据集版本要对齐base commit 错了后面全错。跑之前先git log -1确认 commit比事后排查省事得多。 告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度