
告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度1. 目标与产物让 OpenHands 自主修复一个 SWE-bench Verified Python issue本文要完成的事情很具体在本地用 OpenHands 启动一个自主编码 Agent让它读取 SWE-bench Verified 数据集里的一个 Python 仓库级 issue自主定位代码、修改文件、运行相关测试最终产出一个可检查的 patch 和测试输出。整个过程里模型推理和测试执行所消耗的 Token 都通过 TaoToken 转发Key 在 TaoToken 官网创建Base URL 写入 OpenHands 的模型请求地址。如果你之前只把 OpenHands 当成一个“会写代码的聊天框”这次的目标会更接近真实工程给它一个仓库、一个 issue 描述、一组测试命令让它自己决定改哪些文件、怎么改、改完怎么验证。SWE-bench Verified 的价值在于它的 issue 来自真实开源项目测试也是仓库自带的不是人为编造的判断题。因此Agent 是否真的理解代码、是否真的能跑通测试结果很难糊弄。本文的产物包括四样东西一条可复现的 OpenHands 启动命令一个明确选定的 SWE-bench Verified instance IDAgent 生成的 patchdiff 形式相关测试命令的输出结果。需要提前说明本文不包含任何排行分数或评测名次。SWE-bench Verified 的公开榜单由官方维护不同时间、不同 scaffold、不同模型版本的结果差异很大本文只做本地单实例复现不引用、不编造任何榜单数字。TaoToken 也不是任何榜单的参赛方它在这里的角色是模型请求的接入通道。TaoToken 的官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_generateutm_mediumcsdnutm_campaigngenerate API 地址是 https://taotoken.net/api 。下面从拿 Key 开始一步步把 OpenHands 接到这个通道上。2. 操作步骤从拿 Key 到 OpenHands 启动2.1 在 TaoToken 创建 API Key打开 TaoToken 官网进入控制台创建一个新的 API Key。创建时建议给它起一个能区分用途的名字比如openhands-swebench方便后续在多个项目之间切换时辨认。Key 只在创建时完整显示一次复制后先放到本地环境变量里不要直接写进会提交到 Git 的配置文件。export TAOTOKEN_API_KEYsk-你的KeyTaoToken 的 API 基地址是https://taotoken.net/api这个地址后面会写进 OpenHands 的模型配置。注意OpenHands 请求的是 OpenAI 兼容风格的接口所以 Base URL 通常需要保留到/v1这一层具体以 OpenHands 当前版本的配置说明为准。如果启动后出现 404优先检查 Base URL 是否少了或多了一层路径。2.2 安装 OpenHandsOpenHands 官方推荐用 Docker 运行这样它的运行时环境、浏览器工具、文件系统操作都在容器里完成不会污染宿主机。先确认 Docker 可用docker --version docker compose version然后拉取 OpenHands 的运行镜像。不同版本的镜像标签会变化建议以 OpenHands 官方文档当前给出的命令为准。一个常见的启动方式是使用它提供的docker run命令把工作目录挂载进去并把模型相关的环境变量传进去。docker run -it --rm \ --pullalways \ -e SANDBOX_RUNTIME_CONTAINER_IMAGEdocker.all-hands.dev/all-hands-ai/runtime:latest-nikolaik \ -e LOG_ALL_EVENTStrue \ -v /var/run/docker.sock:/var/run/docker.sock \ -v ~/.openhands:/.openhands \ -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进入 OpenHands 的 Web 界面。第一次进入需要在设置里填写模型信息。2.3 配置模型请求地址在 OpenHands 的设置页面里找到 LLM 配置部分。需要填写的关键字段包括Model你要使用的模型 ID例如某个支持长上下文和工具调用的模型Base URLhttps://taotoken.net/apiAPI Key上一步创建的 TaoToken Key。如果使用环境变量方式启动可以这样传docker run -it --rm \ --pullalways \ -e SANDBOX_RUNTIME_CONTAINER_IMAGEdocker.all-hands.dev/all-hands-ai/runtime:latest-nikolaik \ -e LOG_ALL_EVENTStrue \ -e LLM_API_KEY$TAOTOKEN_API_KEY \ -e LLM_BASE_URLhttps://taotoken.net/api \ -e LLM_MODEL你的模型ID \ -v /var/run/docker.sock:/var/run/docker.sock \ -v ~/.openhands:/.openhands \ -p 3000:3000 \ --add-host host.docker.internal:host-gateway \ --name openhands-app \ docker.all-hands.dev/all-hands-ai/openhands:latest这里的关键点是OpenHands 会把所有模型请求发到LLM_BASE_URL也就是 TaoToken 的 API 地址。Token 消耗发生在两个阶段——Agent 推理阶段读代码、规划修改、生成 patch和测试阶段运行测试后读取输出、判断是否通过、决定是否继续修。因此一个复杂 issue 的 Token 消耗可能远高于一次普通对话。2.4 选定 SWE-bench Verified instanceSWE-bench Verified 是 SWE-bench 的一个子集由人工筛选过issue 描述更清晰、测试更可靠。本文选取一个 Python 仓库的 instance 作为演示。为了不编造具体数据这里不声称某个 instance 的“标准难度”或“历史通过率”只说明选取原则仓库是 Python 项目issue 有明确的失败测试或可运行的测试命令修改范围不涉及大规模重构适合单次 Agent 会话完成。假设我们选定的 instance ID 形如django__django-11099实际使用时请从 SWE-bench Verified 数据集中选择一个你本地能拉到对应仓库和 commit 的 instance。把仓库 clone 到 OpenHands 的工作目录并 checkout 到 issue 对应的 base commit。git clone https://github.com/django/django.git cd django git checkout base_commit2.5 给 OpenHands 的任务描述在 OpenHands 界面里新建一个会话把工作目录指向 clone 下来的仓库然后输入任务。任务描述要包含三部分issue 内容、期望行为、测试命令。你是一个仓库级修复 Agent。当前仓库是 Django已 checkout 到指定 commit。 Issue 把 SWE-bench Verified 中该 instance 的 problem_statement 粘贴到这里 要求 1. 阅读相关源码定位问题根因 2. 修改代码使问题修复 3. 运行以下测试命令确认通过 python -m pytest 相关测试文件::相关测试类::相关测试方法 -x 4. 输出最终 patchgit diff 格式和测试输出。 不要修改测试文件来让测试通过。如果测试本身依赖环境请先说明。这段描述里最重要的一句是“不要修改测试文件来让测试通过”。SWE-bench 的评估逻辑会检查 patch 是否只改了源码如果 Agent 通过改测试来“通过”结果没有意义。2.6 启动命令汇总把上面的步骤整理成一条可复现的启动流程# 1. 设置 TaoToken Key export TAOTOKEN_API_KEYsk-你的Key # 2. 启动 OpenHands docker run -it --rm \ --pullalways \ -e SANDBOX_RUNTIME_CONTAINER_IMAGEdocker.all-hands.dev/all-hands-ai/runtime:latest-nikolaik \ -e LOG_ALL_EVENTStrue \ -e LLM_API_KEY$TAOTOKEN_API_KEY \ -e LLM_BASE_URLhttps://taotoken.net/api \ -e LLM_MODEL你的模型ID \ -v /var/run/docker.sock:/var/run/docker.sock \ -v ~/.openhands:/.openhands \ -p 3000:3000 \ --add-host host.docker.internal:host-gateway \ --name openhands-app \ docker.all-hands.dev/all-hands-ai/openhands:latest # 3. 浏览器打开 http://localhost:3000新建会话指向仓库目录粘贴任务描述3. TaoToken 接入与配置OpenHands、Claude Code、Codex 的差异TaoToken 作为模型请求通道在不同工具里的接入方式不一样。OpenHands 用的是 OpenAI 兼容接口配置项是LLM_BASE_URL和LLM_API_KEY。如果你同时还在用 Claude Code 或 Codex配置位置不同不要混用。3.1 OpenHandsOpenHands 的模型配置可以在 Web 界面里改也可以用环境变量注入。核心是三个值LLM_MODEL你的模型ID LLM_BASE_URLhttps://taotoken.net/api LLM_API_KEYsk-你的Key如果 OpenHands 版本要求 Base URL 带/v1写成https://taotoken.net/api/v1。具体以你当前 OpenHands 版本的文档为准。出现 401 时优先检查 Key 是否复制完整、是否有多余空格出现 404 时优先检查 Base URL 路径。3.2 Claude CodeClaude Code 使用 Anthropic 风格的接口配置写在settings.json里涉及ANTHROPIC_*系列环境变量或配置项。典型配置形态是{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key } }具体字段名以 Claude Code 当前版本为准。TaoToken 的 Claude Code 接入文档在 https://taotoken.net/doc 里面有当前推荐的配置方式。3.3 CodexCodex 使用config.toml配置模型供应商。典型结构是model 你的模型ID model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY同样字段名和层级以 Codex 当前版本为准。不要直接把 OpenHands 的环境变量照搬到 Codex两者的配置加载机制不同。3.4 CC Switch 三件套如果你用 CC Switch 管理多个模型供应商需要配置三件套供应商名称、Base URL、API Key。把 TaoToken 作为一个供应商加入Base URL 填https://taotoken.net/apiKey 填 TaoToken 创建的 Key。这样在切换供应商时不需要每次改配置文件。3.5 配置检查清单在启动 OpenHands 之前按这个清单过一遍Key 是否已创建并复制完整Base URL 是否写成https://taotoken.net/api模型 ID 是否是你账号下可用的模型Docker 是否已启动端口 3000 是否被占用工作目录是否挂载正确仓库是否已 checkout 到 base commit。4. 可验证结果与失败分支4.1 预期产物一次成功的 OpenHands 会话结束后你应该能看到Agent 的思考轨迹它读了哪些文件、执行了哪些命令一个git diff形式的 patch测试命令的输出显示相关测试通过。patch 的形态大致如下示意非真实 Django 修复diff --git a/django/utils/text.py b/django/utils/text.py index 1234567..89abcde 100644 --- a/django/utils/text.py b/django/utils/text.py -10,7 10,7 def slugify(value, allow_unicodeFalse): Convert to ASCII if allow_unicode is False. value str(value) - if allow_unicode: if allow_unicode: value unicodedata.normalize(NFKC, value) else: value (测试输出形态$ python -m pytest tests/utils_tests/test_text.py::TestUtilsText::test_slugify -x test session starts platform linux -- Python 3.11.x, pytest-7.x.x collected 1 item tests/utils_tests/test_text.py . [100%] 1 passed in 0.12s 注意上面的 diff 和测试输出是格式示意不是本文实际跑出的结果。本文不声称某个 instance 一定通过也不提供任何通过率数字。实际结果取决于你选的 instance、模型能力、OpenHands 版本和仓库环境。4.2 失败分支Agent 跑 SWE-bench 类任务时失败是常态。常见的失败分支包括分支一模型请求失败。表现为 OpenHands 界面报错日志里出现 401 或 404。401 通常是 Key 问题404 通常是 Base URL 路径问题。检查LLM_BASE_URL是否写成https://taotoken.net/api以及是否需要补/v1。分支二Agent 找不到相关文件。表现为它反复搜索、读了很多无关文件最后给出一个不相关的修改。这通常和 issue 描述不够具体、或模型上下文窗口不足有关。可以尝试换一个上下文更长的模型或在任务描述里给出更明确的文件线索。分支三patch 改了测试文件。如果 Agent 通过修改测试来让测试通过这个 patch 在 SWE-bench 评估里是无效的。需要在任务描述里明确禁止并在检查 patch 时人工确认。分支四测试环境跑不起来。Django 等项目的测试可能依赖特定 Python 版本、数据库或依赖包。如果测试命令本身在容器里跑不通Agent 再强也无法验证。建议先在容器里手动跑一次测试命令确认环境可用。分支五Token 消耗超预期。仓库级任务里Agent 可能读几十个文件、跑多次测试Token 消耗远高于普通对话。如果发现消耗过快可以缩短任务范围、换更便宜的模型或限制 Agent 的最大迭代次数。4.3 结果验证方式不要只看 Agent 说“已修复”。验证要落到命令上# 查看 patch git diff # 确认没有改测试文件 git diff --name-only | grep -i test # 手动跑测试 python -m pytest 测试命令 -x如果git diff --name-only里出现了测试文件需要人工判断这个修改是否合理。SWE-bench 的评估会区分源码修改和测试修改测试文件被改通常意味着 patch 无效。5. 限制、成本与模型选择5.1 本文的边界本文演示的是单实例、本地复现流程不是完整评测。SWE-bench Verified 的官方榜单由 SWE-bench 团队维护不同 scaffold、不同模型、不同时间的结果不可直接比较。本文不引用任何榜单分数也不声称 TaoToken 或 OpenHands 在某个榜单上的名次。如果你需要看公开排行请以 SWE-bench 官方页面为准并注意榜单日期和评测条件。TaoToken 不是榜单参赛方。它是一个模型请求通道负责把你的请求转发到对应模型。模型能力、上下文长度、工具调用支持程度取决于你选择的模型本身而不是 TaoToken。Artificial Analysis 等第三方页面上的标价是模型供应商的标价不等于 TaoToken 的售价TaoToken 的实际计费以官网和控制台为准。Hugging Face 上的热度指标是下载量或点赞数不是跑分不能用来判断模型在 SWE-bench 上的表现。5.2 成本构成这个流程的成本主要来自三块模型推理 TokenAgent 读代码、规划、生成 patch 时消耗测试执行 TokenAgent 读取测试输出、判断是否继续修时消耗本地计算资源Docker 容器、仓库 clone、测试运行消耗的 CPU 和内存。其中模型推理 Token 是大头。仓库级任务的输入 Token 可能包含大量源码文件输出 Token 包含 patch 和解释。如果模型支持 prompt caching重复读取同一批文件时可以降低成本但具体是否支持、如何计费以模型供应商和 TaoToken 官网说明为准。5.3 模型选择建议SWE-bench 类任务对模型的要求比普通对话高主要体现在长上下文仓库级任务需要读多个文件上下文窗口太小会频繁截断工具调用OpenHands 依赖模型调用文件读写、命令执行等工具代码理解需要理解 Python 项目的结构、测试框架和 issue 语义。选择模型时不要只看“参数大不大”要看它在代码任务上的实际表现和工具调用支持。具体可用模型列表和计费以 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_generateutm_mediumcsdnutm_campaigngenerate 和控制台为准。模型 ID 的写法、是否支持/v1路径、是否支持流式输出也以官网文档为准。5.4 进一步接入如果你想把 OpenHands 接到更多模型或者同时管理 Claude Code、Codex 的配置可以看 TaoToken 的接入文档https://taotoken.net/doc 。API Key 管理在控制台https://taotoken.net/console 。模型对话入口在 https://taotoken.net/chat Coding Plan 在 https://taotoken.net/coding-plan Claude Code 相关配置在 https://taotoken.net/claudecode-anthropic 。最后提醒一句SWE-bench Verified 的 instance 选择、仓库环境、测试命令都会影响最终结果。本文给的是流程和配置方法不是“保证通过”的承诺。先把环境跑通再逐步换更难的 instance比一上来就挑战复杂仓库更实际。 告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度