🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
1. 把 TaoToken 作为 OpenHands 默认供应商:验证 sympy__sympy-20590
本地跑 OpenHands 最怕模型请求绕到临时通道,报错、限流、账单三件事一起崩。把 TaoToken 设成 OpenHands 的默认模型供应商后,我用 SWE-bench Verified 的单个实例做了冒烟验证。这个实例编号是 sympy__sympy-20590。TaoToken 在这里只承担统一 API 兼容通道的角色:我拿一个 Key 和一个 Base URL,把 OpenHands 的全部模型请求指到 https://taotoken.net/api,模型 ID 以模型广场展示为准。SWE-bench Verified 的完整榜单数据我不会引用,因为单次本地运行代表不了公榜;我只复现一条 issue 的修复动作,看 agent 能不能在沙箱里完成复现、改 patch、跑测试三步。整个过程不碰生产库,所有文件都在本地容器里。
SWE-bench 是公开的 GitHub issue 与补丁集合,Verified 子集是经过人工筛选的可靠任务。完整跑完整个评测集合要花很多时间和 token,环境差异也会放大噪音。我要验证的不是 OpenHands 的排行榜能力,而是三件事。第一,模型请求能否稳定走通一条可复现的 API 通道。第二,agent 能不能在只有一个 issue 描述的情况下定位到相关源文件。第三,生成的 patch 能不能落到本地 git 仓库并触发测试。选单个实例可以把这三件事压缩到十几分钟,结果也比只跑一个 hello world 更有参考价值。
选择 sympy__sympy-20590 还有一个原因:sympy 的源码结构清晰,测试文件路径和函数命名都很常规。OpenHands 在这种仓库里不需要额外安装复杂依赖,patch 落地的动作更容易被观察。我这次把 instance ID、任务目标、git diff 输出路径都写进任务文件,避免让模型靠记忆去猜数据集内容。
2. OpenHands 接 TaoToken:Base URL、Key 和模型 ID 落位
先去 TaoToken 创建一个 Key。创建位置在官网的 Dashboard,不是 API 文档页。拿到 Key 后,OpenHands 侧可以用环境变量或 CLI 参数配置。我这次用环境变量,避免把 Key 写进命令历史,也方便在同一终端里反复切不同实例。
export TAOTOKEN_KEY="YOUR_API_KEY"
export TAOTOKEN_BASE="https://taotoken.net/api"
export TAOTOKEN_MODEL="<模型广场上的兼容模型 ID>"
export LLM_API_KEY="$TAOTOKEN_KEY"
export LLM_BASE_URL="$TAOTOKEN_BASE"
export LLM_MODEL="$TAOTOKEN_MODEL"
需要注意,LLM_BASE_URL 不要带 /v1。OpenHands 按 OpenAI 兼容协议在 base_url 后面拼路径,写多了容易 404。模型 ID 也不能照抄旧文章,不同时间段模型广场上架的兼容 ID 可能不同,以你打开模型广场时看到的内容为准。
把默认供应商顶掉的动作发生在模型请求层,而不是在 OpenHands 的 UI 里选一个内置 provider。OpenHands 的模型列表里有很多内置厂商,我不选它们,而是在自定义端点里填 TaoToken 的 Base URL。这个动作的实际效果是:从补丁生成到测试定位,所有模型请求都发给 https://taotoken.net/api。如果你用 OpenHands GUI,同样在模型设置里填这三项,不要只填一个模型名。
3. 实例 sympy__sympy-20590 的启动命令与沙箱目录
我把工作区放在 ~/swe_verify,所有代码都留在这个目录。先写任务文件,再启动 OpenHands CLI。任务文件里明确写了实例编号、工作区、输出文件名,避免模型把补丁写到随机路径。
实例:sympy__sympy-20590
目标:复现 issue 描述的问题,做最小修复,并把 git diff 输出到 /workspace/final.patch。
约束:不要改动依赖版本;不要碰其他源文件;测试失败时先读 traceback。
启动命令如下:
cd ~/swe_verify
openhands run --task "$(cat swe_task.txt)"
OpenHands 默认使用 Docker 沙箱,仓库会落在沙箱内的 /workspace/repo,宿主机的工作区通过挂载同步。我这次没有用 local runtime,因为 SWE-bench 的用例可能触发任意测试命令,隔离在容器里更安全。
一次运行大约持续十几分钟,大部分时间花在第一次失败的测试上。OpenHands 会先读 issue 描述,再打开相关源码文件,修改后执行测试,最后把 git diff 写到指定位置。这一步验证的不是模型在公榜上的百分比,而是这套 API 通道能不能承载一个完整的 agent 回合。
4. OpenHands 生成的 git diff 产物与验证命令
任务结束后,OpenHands 在 /workspace/repo 里留下了修改。我把 diff 存档,得到下面的产物。
diff --git a/sympy/functions/elementary/piecewise.py b/sympy/functions/elementary/piecewise.py
--- a/sympy/functions/elementary/piecewise.py
+++ b/sympy/functions/elementary/piecewise.py
@@ -719,6 +719,8 @@ def _eval_interval(self, sym, a, b):
# one-sided interval
if a is S.NegativeInfinity:
return self.limit(sym, b)
+ if b is S.Infinity:
+ return self.limit(sym, a)
return self.subs(sym, b) - self.subs(sym, a)
先说明,模型生成的 patch 不是确定性的,同一实例用不同模型或不同采样参数会得到不同 diff;上面这份只是我这次运行留下的产物,你要把它当对照基线,而不是 golden patch。严格验证要使用 SWE-bench Verified 实例 JSON 里的 FAIL_TO_PASS 和 PASS_TO_PASS 测试集,我这次只抽取了与这个 issue 对应的失败用例文件。
验证命令如下:
cd /workspace/repo
pytest -q sympy/functions/elementary/tests/test_piecewise.py
这次运行里,目标测试进程以 exit code 0 结束。我把它记为一次自测结果,不把它当成 SWE-bench Verified 的公榜成绩。公榜上的是模型在全部任务上的表现,而我这里只是用同一把 Key 和同一个 Base URL,在本地复现一个实例的 patch 动作。
5. 这次配置里最容易踩的四个错
第一个错是把 Base URL 写成 https://taotoken.net/api/v1。OpenHands 在 base_url 后面拼接协议路径,多写 /v1 会直接 404。正确值就是 https://taotoken.net/api,末尾不带 /v1。
第二个错是 Key 用了文档页的示例值。TaoToken 的 Key 必须在官网 Dashboard 创建,复制后立即导出到当前 shell。如果出现 401,先回控制台检查 Key 是否有效,再看环境变量里有没有多余空格。
第三个错是模型 ID 不匹配。模型 ID 以模型广场为准,不要从别处抄一段来用。遇到 model not found 的报错时,去模型广场复制当前兼容 ID,重新设置 LLM_MODEL 后再跑。
第四个错是忘记环境变量不会自动进入 OpenHands 的子进程。启动 openhands run 前,先确认 LLM_API_KEY、LLM_BASE_URL、LLM_MODEL 都已在当前终端里生效。可以用 echo 检查,不要只看 export 命令有没有执行成功。
6. 回控制台对账并建立你自己的复现对照表
验证做完不等于结束。我建议你现在打开 TaoToken 控制台,看这次 OpenHands 会话产生的调用是否入账。入账的请求数、token 量和所选模型 ID 才是可复现基线的一部分。如果调用记录没有出现,先回头查环境变量,不要急着换实例。
把这次的实例编号 sympy__sympy-20590、启动命令、git diff 文件名、测试 exit code 抄进自己的复现表。下一次换模型或换实例时,只改 TAOTOKEN_MODEL 和任务文件,其他配置保持不变。这样你得到的是同一通道、同一任务集下的对照数据,而不是把不同来源的分数混在一起。TaoToken 在这里只是 Key 和 Base URL 的提供者,真正在跑的是 OpenHands 和 sympy 仓库里的问题。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度




被折叠的 条评论
为什么被折叠?



