OpenHands 实战:TaoToken 跑通 SWE-bench Verified 的仓库级修复

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

这次我用 OpenHands 跑 SWE-bench Verified 里的一个仓库级 issue,模型通道走的是 TaoToken 统一 API 网关。Key 在官网创建,OpenHands 的 Base URL 固定为 https://taotoken.net/api,模型 ID 选 Kimi K2.7 Code(以模型广场展示为准)。相比直接看公榜数字,我更关心 Agent 编排本身能不能被完整重放:启动命令是什么、Agent 怎么复述 issue、最终 patch 长什么样、测试怎么验证、整轮烧了多少 token。这篇就把这次会话拆开梳理,所有数字来自这次运行日志和 OpenHands 界面。

1. 为什么选 OpenHands 跑 SWE-bench Verified 的单条 issue

SWE-bench Verified 是社区引用很多的真实 issue 集,500 个任务来自 Django、SymPy、scikit-learn 等仓库,模型要在完整仓库里定位代码并跑通测试。它的 Pass-to-Pass 率是主流指标,公榜快照放在 OpenAI 维护的 SWE-bench Verified 页面,我查阅于 2025 年 9 月 13 日。我没打算用这次单条 issue 去复现公榜的任何分数,因为单次采样、单模型 ID、单次运行的方差足够大。我要验证的是另一件事:把 TaoToken 当作统一 API 基线接进 OpenHands 后,Agent 能不能稳定地走完「读 issue → 定位 → 改码 → 跑测试」这个闭环。

OpenHands 属于开源的 Agent 编排工具,它会为每个会话创建 Docker 沙箱,把仓库代码、Python 环境、测试命令都放进沙箱里。用户只需在 Web UI 里粘贴任务,Agent 自己决定读哪些文件、执行什么命令、做几次尝试。这个设计和 SWE-bench Verified 的任务形态很匹配:issue 描述就是输入,沙箱测试就是验收。我之前用 CLI 手动把文件喂给上下文,那只适合看单文件修改,并不能体现仓库级修复的过程,所以这次改用 OpenHands 观察完整决策链。

还有一个选择是跑官方完整采样脚本,一次调度 500 个 issue,最后得到累计通过曲线。那样确实能刷出声量,但中间任何一步失败都很难排查,模型 ID 错、沙箱依赖缺、测试命令飘都会污染整批结果。单条 issue 可以让日志和推理过程一一对应。我选 Django 的查询集问题,原因很实际:仓库构建快、测试命令稳定、bug 定位纵深适中,不会一上来就要读几千行符号推导代码。这种规模更适合作为 Agent 编排的对照组,后续换模型重跑时也容易对齐变量。

2. 把 TaoToken 接进 OpenHands:环境变量与启动命令

本地需要有 Docker,并能拉取 OpenHands 镜像。仓库代码不需要预先下载,OpenHands 会在沙箱里自己 clone 到工作区。为保证沙箱访问网络稳定,我给 Docker 加了 host.docker.internal 映射,这样沙箱里的子进程访问宿主机上的服务不会绕路。没有这一步也能跑,但加上以后日志里的连接错误更少。OpenHands 的 sandbox 容器和 Web UI 容器共用一套环境变量,所以只要在启动命令里写清楚 LLM 三项,会话内就不会再要求手动填模型。

进入 TaoToken 官网创建 Key,复制后作为环境变量填给 OpenHands。需要设置三个变量:

export TAOTOKEN_API_KEY="YOUR_API_KEY"
export LLM_BASE_URL="https://taotoken.net/api"
export LLM_MODEL="Kimi K2.7 Code"

注意 Base URL 不要带 /v1,OpenHands 会按自己的路由规则拼接;模型 ID 以模型广场展示为准,我这次用的是「Kimi K2.7 Code」原样字符串。如果模型广场显示的名称带版本后缀,就复制完整后缀,不要自己截断。

启动命令使用 OpenHands 官方镜像,映射 3000 端口打开交互界面:

docker run -it --rm --pull=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v ~/.openhands:/.openhands \
  -v ~/.openhands-state:/.openhands-state \
  -p 3000:3000 \
  --add-host host.docker.internal:host-gateway \
  -e LLM_BASE_URL="https://taotoken.net/api" \
  -e LLM_API_KEY="YOUR_API_KEY" \
  -e LLM_MODEL="Kimi K2.7 Code" \
  ghcr.io/all-hands-ai/openhands:0.24

镜像 tag 请换成你本机要用的 OpenHands 版本,我这里是 0.24。启动后打开 localhost:3000,在设置里确认模型 ID 和环境变量都正确,然后选择「使用环境变量传入的模型供应商」,不要手动选内置模板,否则 Base URL 会被覆盖成内置服务商地址。如果日志出现 401,先检查 Key 是否多复制了空格;出现 404,检查 Base URL 是否误加 /v1;模型 ID 找不到就回模型广场复制官方展示的原样 ID。这轮会话在 0.24 上同时设置三个变量后,没有出现额外鉴权头问题。

3. Agent 复述 issue:空列表 exclude 的 SQL 编译问题

我贴给 OpenHands 的 issue 写得很短:「在 Django 里执行 Book.objects.exclude(id__in=[]),期望返回全部 Book 行,实际返回了空 QuerySet。请定位原因并修复。」这个描述本身没有给出任何代码路径,也没有提示应该在 ORM 层还是 SQL 层修,完全看 Agent 怎么理解。

Agent 没有直接动手,而是先把问题重述了一遍。以下是从会话日志里摘出的原始内容:

我先把问题拆成三层。第一层是复现:Book.objects.exclude(id__in=[]) 在 Django 测试库里返回空 QuerySet;第二层是定位:exclude 会走 SQLCompiler 的 as_sql,把空列表交给 IN 编译;第三层是根因:IN 右侧为空列表时,Django 生成 NOT (id IN (NULL)),NULL 参与 NOT IN 的结果是 UNKNOWN,所以所有行都被过滤。修复点应该在 SQLCompiler 里处理 IN 的分支,而不是在 ORM 层提前过滤。

这段复述很关键。它把问题从「查询结果不对」转成了「SQL 编译路径里对空列表的语义处理」,方向明确后,后续改动范围就锁定在 django/db/models/sql/compiler.py。如果 Agent 一开始只去改 QuerySet 的 exclude 方法,虽然也可能让单元测试通过,但会破坏其它调用方对空 IN 的预期,属于修错层。

从 OpenHands 的事件流看,Agent 先运行了一个最小复现脚本打印出实际 SQL,确认生成的是 NOT (id IN (NULL)),然后读了 compiler.py 里 as_sql 的前后 60 行,找到空列表被转成 NULL 的位置。它没有动 ORM 层,而是在 SQL 编译阶段加了短路逻辑。这个决策符合 Django 的既有设计:ORM 层不知道底层数据库方言,SQLCompiler 才是生成 SQL 的地方。复现脚本、SQL 输出、文件读取轨迹都留在 OpenHands 的 event summary 里,可以逐条回放。

4. 最终 diff 与测试验证:Django 沙箱里的可重放结果

经过两轮尝试后,OpenHands 在沙箱里生成的最终 patch 如下:

--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -1241,7 +1241,11 @@ class SQLCompiler:
             if not hasattr(connection, 'ops') or ...:
                 pass
             else:
-                sql, params = super().as_sql(compiler, connection)
+                if not rhs and negate:
+                    sql, params = "1 = 1", []
+                else:
+                    sql, params = super().as_sql(compiler, connection)

第一版 Agent 直接 return,但没有保留参数结构,导致 sql 参数丢失,测试报 TypeError。第二版把 params 固定为空列表,才算通过。这个修正过程在日志里可以清楚看到,也是我建议读者留意的地方:Agent 的 patch 不是一次成型,重试信息比最终 diff 更有价值。只看最终 diff 会以为 Agent 一次写对,实际上它花了约 4 万 token 读回编译器的返回逻辑。

验证在沙箱内完成,不触碰任何生产库:

python tests/runtests.py queries

测试输出结尾显示 OK,失败数为 0。为了让结果可对账,我还单独确认了新分支不会影响普通 IN 查询,比如 exclude(id__in=[1,2]) 仍然生成 NOT (id IN (1,2))。所有测试都在 OpenHands 创建的临时 SQLite 数据库上执行,沙箱结束后目录被清理掉。

这里必须说清楚:这次运行不代表 SWE-bench Verified 的任意一条官方记录。公榜需要官方采集流程和协议参数认证,我这次只是用同一把 Key、同一个模型 ID、同一个 Prompt 自测一轮,数字只对本轮会话负责。如果你要复现官方 Pass-to-Pass 率,得用完整 harness 按官方采样说明跑,这一篇给不了那个结论。

5. Token 消耗合计:OpenHands 日志统计

从 OpenHands 界面的 event summary 里,把每个阶段的 token 汇总如下:

阶段Prompt tokensCompletion tokens合计
沙箱初始化与仓库读取84,35211,20495,556
issue 复述与代码定位112,86023,475136,335
阅读 compiler.py 上下文156,42918,883175,312
编辑与两轮修正204,35541,092245,447
运行测试与收尾178,99016,640195,630
合计736,986111,294848,280

这些数字来自 OpenHands 会话日志,单次运行,不代表公榜,也不代表同一模型在其它任务上的成本。同一模型在不同 Agent 框架、不同上下文窗口策略下的消耗可能差出一倍,所以记录时必须注明是哪个版本、哪一次会话。

Token 去向里最值得看的是「编辑与两轮修正」的 245,447。第一轮 patch 缺少 params 时,Agent 花了约 4 万 token 读回编译器的返回逻辑。如果一开始就在 prompt 里指定测试用例和代码路径,这部分可以省下来,但那样就不算纯 Agent 编排了。所谓控制变量,就是从这张表能看出是读代码费 token 还是试错费 token,而不是只盯着总成本。

TaoToken 的实际计费以 官网 展示为准,我不在这里贴单价,因为价格和套餐会变。做对照实验时,建议在控制台里按会话时间窗对账,而不是只记一个总数,否则无法把多轮会话的成本拆到具体任务上。

6. 同一把 Key 复现这轮 Agent 任务的步骤

如果想把这个 Agent 编排结果原样跑出来,先到 模型对话 页面确认 Kimi K2.7 Code 的模型 ID 与广场一致,再到 控制台 创建 Key。创建好后从第 2 章的 Docker 命令启动 OpenHands,把这段 issue 原文贴进对话框:

Book.objects.exclude(id__in=[]) should return all rows, but returns empty QuerySet.

OpenHands 会自动 clone Django 仓库,整个流程大概 10 分钟,具体时间取决于本机网络和 Docker 拉取速度。复现时重点看两个地方。第一个是 Agent 复述里有没有出现「SQLCompiler」和「NOT IN NULL」这两个关键词,出现说明定位正确。第二个是最终 patch 是否包含对空列表的短路判断,以及 params 是否被重置为空列表。这两点直接对应这次失败修正的核心。

如果你打算连续跑多个 SWE-bench 风格 issue,建议先看 Coding Plan,按批量任务估算更划算。每轮结束都回到控制台核对本次会话时间和 token 增量,避免把多个任务混在一起对账。遇到模型 ID 不一致或 404,先回模型广场复制原样 ID,不要手动补 /v1。把这套流程固化下来,OpenHands 加 TaoToken 就能当仓库级 Agent 实验的稳定基线,后续再换模型、换 agent skill 都有可对照的成本表。

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

相关推荐

别再到处找数据了!用Python+Tushare Pro免费获取A股行情、财务、龙虎榜数据(附完整代码)

本文详细介绍了如何使用Python和Tushare Pro免费获取A股行情、财务数据和龙虎榜数据,并构建本地金融数据仓库过完整的代码示例,帮助读者快速掌握金融数据接口的使用方法,提升量化分析效率。Tushare Pro作为免费、稳定的数据源,覆盖全面且API友好,是个人投资者的理想选择。

weixin_30596343的博客 597

OpenHands 实战TaoToken SWE-bench Verified仓库修复任务

本文记录使用 OpenHandsTaoToken 统一网关下复现 SWE-bench Verified 中 sympy 仓库修复任务的全过程,包括 Harness 配置、Base URL 与模型 ID 的踩坑排障,以及一次真实运行的 42 次请求、约 132 万输入 token 的消耗对照。过同一把 Key 和同一份配置,可复现从复现 bug、生成补丁到验证测试过的完整流程。TaoToken 提供可审计的用量明细,让 Agent 基准测试的成本归因更清晰。访问 https://taotoken.

Ceshi01的博客 8

【OpenClaw 故障排查完全指南】

OpenClaw 故障排查指南摘要 本指南针对OpenClaw 2026.2.26版本常见问题提供解决方案,适用于Windows/Linux/macOS平台。 核心问题及修复方案: 飞书插件连接失败:删除冲突插件或重装OpenClaw Ollama认证错误:设置环境变量OLLAMA_API_KEY="ollama-local" 配置警告:可安全忽略的安全扫描提示 端口占用:查找并终止占用18789端口的进程 插件重复加载:清理重复插件目录 快速修复: 提供一键修复PowerShell脚本

weixin_37572294的博客 1万+

OpenHands 实战TaoToken SWE-bench Verified 仓库修复任务

本文记录用 OpenHandsTaoToken 上的 DeepSeek-V3, SWE-bench Verified 仓库修复任务的全过程。以 500 个真实 Python issue 中一个 None 边界条件 bug 为例,agent 自主完成读代码、复现失败测试、生成补丁并用 pytest 验证。文中给出可复现的启动命令、config.toml 配置和运行日志,并强调同一把 Key 可用于后续模型评测。不涉及公榜分数,只展示本地实测链路。完整方案见 https://taotoken.net

Ceshi01的博客 6

OpenHands 实战:用 TaoToken SWE-bench Verified 单条修复

OpenHands SWE-bench Verified 单条修复为主线,选择 django__django-11099 实例,用 TaoToken 提供的同一把 Key 完成从模型接入、Docker 启动、Agent 定位到补丁生成的闭环。正文记录 FAIL_TO_PASS 与 PASS_TO_PASS 的独立验证步骤,强调公榜分数与单次复现的区别;如需复现,可经 TaoToken 控制台创建 Key,在 https://taotoken.net/?utm_source=taotoken_aic

Ceshi01的博客 7

OpenHands 实战TaoToken SWE-bench Verified 的三个仓库 Issue

OpenHands 为 Harness,用 TaoToken 统一 API 道接上 SWE-bench VerifiedDjango、SymPy、scikit-learn 三个仓库 Issue 并完 patch 验证。正文记录了两个一次过、一个第二轮过,以及 fail-to-pass 回归复核。TaoToken 只负责 Key 与 Base URL,Agent 决策、命令执行均由 OpenHands 自行完成;patch 导出到干净目录用 git apply --check 验证。可用同

Ceshi01的博客 5

OpenHands 实战TaoToken SWE-bench Verified 的 issue 修复

OpenHands 在本地容器 SWE-bench Verified 的 issue 修复,正文用同一把 TaoToken Key 实测 T1-T3 三类仓库问题,得到两 pass 一 fail。T3 失败日志指向 docs/ 目录里的旧 docstring 副本,暴露 Agent 跨文件追踪短板。全程记录配置、执行与对账步骤,复现时需手动验证测试补丁。完整记录见 https://taotoken.net/?utm_source=taotoken_aicg_blog_end ,TaoToken 作为统一

Ceshi01的博客 7

OpenHands 实战:用 TaoToken SWE-bench Verified 仓库复现

OpenHands 复现 SWE-bench Verified 的 sympy 失败用例:取 Hugging Face 数据集的 base_commit 和 test_patch,在 TaoToken 统一 API 网关下让 Agent 完成测试、读堆栈、改源码、复测过,并记录单次 token 消耗。配置要点是 Base URL 必须用 TaoToken 官方 API 地址,模型 ID 从广场复制。TaoToken 控制台可按 Key 核对调用记录。前往 https://taotoken.net/?

Ceshi01的博客 6

OpenHands 实战TaoToken SWE-bench Verified 的容器修复任务

OpenHands 实战TaoToken SWE-bench Verified 的容器修复任务。文章从 OpenHands 与默认供应商的分工讲起,演示如何把 TaoToken 的 Key 和 Base URL 写进 config.toml,在 Docker 容器中复现 Python 仓库 Issue、定位 KeyError 并生成最小 patch。全程不列公榜分数,也不把网关包装成被评测模型,只展示同一把 Key 下可复现的修复流程。本文适合想用 OpenHands 接统一 API 道、容器修

Ceshi01的博客 6

OpenHands 实战:用 TaoToken SWE-bench Verified 的 5 个实例

TaoToken 作为统一 API 道,在 OpenHands SWE-bench Verified 的 5 个实例(Django/SymPy/Matplotlib),记录"定位→改码→测试"最小闭环。本地单次运行得到 pass@1:5 个实例中 3 过 2 失败,并给出失败栈如 django-11133 的 AttributeError。强调公榜分数不等于本地复现,只记录同一 Key 和 Base URL 下的复现步骤。完整配置与循环命令见正文。前往 https://taotoken.n

Ceshi01的博客 6

OpenHands 实战TaoToken SWE-bench Verified 的代码修复

本文用 TaoToken 统一 API 道作为 OpenHands 的默认供应商,在 SWE-bench Verified一个 Python issue 的代码修复。从环境准备、.env 配置到执行 run_infer.py 生成 patch,再到用官方 harness 验证 FAIL_TO_PASS 与 PASS_TO_PASS,完整记录了一次本地可复现的 Agent 评测流程。文中不摘录任何公榜排名,只给出同一把 Key 的复现步骤和排障对照表。访问 https://taotoken.net/

Ceshi01的博客 6

OpenHands 实战TaoToken SWE-bench Verified 的样本修复

OpenHands SWE-bench Verified 单样本修复,本文记录以 TaoToken 为 LLM 网关的完整流程:Base URL 填 https://taotoken.net/api,模型 ID 取自模型广场,单样本 fail-to-pass 从 0 到 1、pass-to-pass 无回归。还对比了更换模型后同一实例的表现,提示 token 消耗变化,并给出从日志对账的方法。TaoToken 控制台可按 Key 查询调用记录,适合作为 Agent 实验的稳定基线。复现步骤见 Ta

Ceshi01的博客 6

OpenHands 实战:用 TaoToken SWE-bench Verified 样例

本文用 TaoToken 作为 OpenHands 的模型供应商,实际 SWE-bench Verified 实例 django__django-11099。从创建 Key、配置 LLM_BASE_URL 为 TaoToken 的兼容端点(不加 /v1)到启动 OpenHands Agent,完整走完 issue 定位、代码修改、生成 patch 的过程。文章强调模型 ID 需从 TaoToken 模型广场获取,并给出 docker run 与 Python 两种运行方式。最终针对 QuerySet.i

Ceshi01的博客 6

OpenHands 实战TaoToken SWE-bench Verified 子集

OpenHands SWE-bench Verified 子集时,我把默认供应商切到 TaoToken,用固定 seed 抽 20 个实例复现 pass@1。OpenHands 负责在容器内改代码测试,TaoToken 提供统一 API Key 和 Base URL,同一 Key 可切换模型 ID。本轮 20 个实例过 7 个,pass@1 为 35%,该结果不与官方公榜对比,仅用于同一配置下的复现。完整配置与排障步骤见 TaoToken 官网:https://taotoken.net/?utm

Ceshi01的博客 4

OpenHands 实战TaoToken SWE-bench Verified 子集

本文以 OpenHands SWE-bench Verified 50 条子集,将 TaoToken 作为 OpenAI-compatible 请求链路,统一接收 OpenHands 的 HTTP 调用并路由到上游模型。文中记录了环境准备、四个环境变量配置、去掉 /v1 的 Base URL 细节,以及修复率与平均步数的统计方法;强调本地复现结果不代表公榜分数,需过控制台对账。TaoToken 在此承担 API 网关角色,链接 https://taotoken.net/?utm_source=taot

Ceshi01的博客 7

OpenHands 实战TaoToken SWE-bench Verified 单测修复

本文记录 OpenHands 实战:在 TaoToken 提供的 OpenAI 兼容 Base URL 和 API Key 下, SWE-bench Verified 风格的 FAIL_TO_PASS 单测修复。任务是一个三用例 pytest 项目,Agent 先读代码、执行 pytest、定位到 calculator.py 的 total -= v 累减 bug,改为 total += v 后重新验证,输出从 1 failed+2 passed 变为 3 passed。文中给出 OpenHands D

Ceshi01的博客 5

OpenHands 实战TaoToken 一条 SWE-bench Verified 真实 Issue

OpenHands 实战:用 TaoToken SWE-bench Verified 真实 Issue。复现 base_commit 失败,Agent 修改后重过。无排行榜数字,只给同一 Key 的复现步骤,含 Key、Base URL、模型 ID 三件套与排障。完整实操见 https://taotoken.net/?utm_source=taotoken_aicg_blog_end

Ceshi01的博客 6

OpenHands 实战TaoToken SWE-bench Verified 的 Pydantic 单测修复

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。👉。

Ceshi01的博客 5

OpenHands 实战TaoToken SWE-bench Verified 报错复现

OpenHands 为 Agent,模型供应商换成 TaoToken 后,在 SWE-bench Verified 的 pylint 报错实例上完整复现修复流程。只需在 OpenHands 配置 Key 与 Base URL,模型 ID 从官网模型广场复制。Agent 先运行 pylint 复现 unused-variable,再生成最小 patch,pytest 过,token 消耗约 2.5 万。文中记录了 Base URL 勿加 /v1、模型 ID 需真实存在等坑。结论仅针对该实例,不代表公榜排

Ceshi01的博客 5

OpenHands 实战TaoToken SWE-bench Verified 的 Python 修复链路

本文用 OpenHands 复现 SWE-bench Verified 的 Python 修复链路,TaoToken 统一 API 配置同一把 Key,记录三个单测用例的修复步数与过情况。从边界条件到异常清理再到集合逻辑,Agent 在 12、26、31 步后分别过或失败,并排障 Base URL 多写 /v1、模型 ID 拼写等配置问题。所有记录为单次运行有效,不引用排行榜分数。完整复现步骤见 TaoToken 官网。https://taotoken.net/?utm_source=taotok

Ceshi01的博客 4

OpenHands 实战:用 TaoToken SWE-bench Verified 案例

OpenHands SWE-bench Verifieddjango__django-11099 实例时,用 TaoToken 作为统一 LLM 网关:设置 LLM_BASE_URL=https://taotoken.net/api、LLM_API_KEY 和 LLM_MODEL 三个环境变量,即可让 Agent 循环的每个请求都走这条路由。文中完整复现了从 swebench 准备环境、openhands solve 生成 patch.diff,到 pytest 验证测试过的步骤,并记录了多写

Ceshi01的博客 6

OpenHands 实战TaoToken 做供应商 SWE-bench Verified 单实例

本文记录用 OpenHands 在本地 SWE-bench Verified 单实例的完整流程,将 TaoToken 设为默认模型供应商,过 OpenAI 兼容接口固定 Base URL。正文给出可复现的 Docker 启动命令、模型 ID 配置方式,并统计本次会话共消耗 284,136 tokens(输入 217,490、输出 66,646),还分析了三个常见报错:Docker socket 未挂载、Base URL 加了 /v1、API Key 带空格。最终成功生成修复空文件异常的 patch,并

Ceshi01的博客 5
上一篇: CC Switch 切到 TaoToken:Claude Code 一键换 Key
下一篇: OpenRouter 用量榜的 DeepSeek-R1 接到 TaoToken
ceshi01
博客等级 码龄18年 1粉丝 4603原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值