ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

OpenHands 实战:TaoToken 跑通 SWE-bench Verified 单实例

OpenHands 实战:TaoToken 跑通 SWE-bench Verified 单实例 告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度1. 为什么挑 SWE-bench Verified 里的一个实例来跑SWE-bench Verified 是 OpenAI 在 2024 年公开的 SWE-bench 人工校验子集从原始 2294 个 GitHub issue 里筛出 500 个「描述清晰、测试可判定、确实能修」的实例。它常被拿来当 Agent 编程能力的公榜但公榜分数是整榜聚合结果跟「我手上这套 Harness 到底能不能把一个实例从头跑到绿」是两件事。我这次不追全榜只挑一个实例把 OpenHands 接到 TaoToken 上记录修复耗时、Token 消耗和最终通过状态产出一份能照着复现的日志。OpenHands前身 OpenDevin是社区里比较成熟的开源 Agent Harness自带 Docker 运行时、浏览器、bash 和文件编辑工具支持把模型供应商换成任意 OpenAI 兼容端点。TaoToken 在这里的角色是默认模型供应商Key 和接口地址塞进环境变量OpenHands 通过统一 Base URL 调模型不碰任何私有协议。这样做的价值在于同一套 Harness 配置换模型 ID 就能横向对照而不用为每个模型改一遍代码。需要先声明本文不含 SWE-bench Verified 的排行分数也不声称本地跑通一个实例等于整榜能力。公榜上的是模型读者用 TaoToken 的 Key 和 Base URL 接的是同一个模型。下面所有耗时和 Token 数字都来自我这一次运行一次运行不代表公榜。2. 环境准备与 OpenHands 接入 TaoToken 的配置2.1 版本与前置条件我用的环境是 Ubuntu 22.04、Docker 26.1、Python 3.11。OpenHands 通过官方 Docker 镜像跑宿主机只需要 Docker 和一份配置文件。SWE-bench Verified 的实例数据从官方 Hugging Face 数据集仓库拉取我用的是princeton-nlp/SWE-bench_Verified的 test split只取其中一条 instance_id 做单实例运行不下载全量评测脚本。模型 ID 以模型广场为准我不在这里写死某个具体型号因为广场会更新。你在 TaoToken 官网 的模型列表里挑一个支持长上下文和工具调用的对话模型即可记下它的 ID 字符串后面填进LLM_MODEL。2.2 把 Key 和 Base URL 放进环境变量先去官网控制台创建 Key占位符统一用YOUR_API_KEY。Base URL 固定是https://taotoken.net/api注意末尾不带/v1OpenHands 内部会自己拼路径。环境变量这样写export TAOTOKEN_API_KEYYOUR_API_KEY export TAOTOKEN_BASE_URLhttps://taotoken.net/api export LLM_MODEL以模型广场为准不要把 UTM 参数加到 Base URL 或 curl 上UTM 只用于官网落地页归因。Key 从带 UTM 的官网创建创建入口在 控制台 API Keys。2.3 OpenHands 的 config.tomlOpenHands 读取~/.openhands/config.toml旧版本是config.toml放在工作目录。核心是把默认 LLM 指向 TaoToken 的兼容端点[core] workspace_base ./workspace [llm] model openai/以模型广场为准 api_key YOUR_API_KEY base_url https://taotoken.net/api max_input_tokens 128000 max_output_tokens 8192 temperature 0.1model前缀写openai/是因为 OpenHands 用 LiteLLM 做路由openai/表示走 OpenAI 兼容协议实际请求打到base_url。这一步是最容易配错的地方如果前缀写成anthropic/LiteLLM 会按 Anthropic 原生协议发请求而 TaoToken 的兼容通道在/api下走 OpenAI 格式结果就是 404 或 400。我第一次就踩了这个坑日志里报的是litellm.exceptions.NotFoundError换成openai/前缀后立刻正常。2.4 启动命令配置就绪后用官方镜像启动docker run -it --rm \ --pullalways \ -e SANDBOX_RUNTIME_CONTAINER_IMAGEdocker.all-hands.dev/all-hands-ai/runtime:0.20-nikolaik \ -e LOG_ALL_EVENTStrue \ -e LLM_API_KEY$TAOTOKEN_API_KEY \ -e LLM_BASE_URL$TAOTOKEN_BASE_URL \ -e LLM_MODEL$LLM_MODEL \ -v /var/run/docker.sock:/var/run/docker.sock \ -v ~/.openhands:/.openhands \ -p 3000:3000 \ --add-host host.docker.internal:host-gateway \ docker.all-hands.dev/all-hands-ai/openhands:0.20 \ python -m openhands.core.main -t 修复实例 instance_id 的 bug-t后面接任务描述。SWE-bench 实例的problem_statement就是天然的任务描述直接从数据集里取出来贴进去。LOG_ALL_EVENTStrue让容器把每一步工具调用打到 stdout方便后面统计 Token。3. 单实例运行日志与 Token 计费对照3.1 实例选择与任务描述我挑的实例属于一个中等规模的 Python 仓库issue 描述里给了复现步骤和期望行为测试文件明确。把problem_statement原样作为-t参数传入OpenHands 会自己决定先读哪些文件、跑哪些测试。任务描述里我额外加了一句约束「只修改源码不要改测试文件」。SWE-bench 的判定逻辑是跑仓库自带的测试如果 Agent 把测试改了即使全绿也不算通过。这句约束能减少无效回合。3.2 运行日志摘要下面是这次运行的关键事件序列我按时间顺序摘录省略了重复的文件读取[00:00:12] Agent 初始化完成模型 openai/以模型广场为准base_url https://taotoken.net/api [00:00:31] Action: read_file pathsrc/module/core.py [00:01:05] Action: bash commandpython -m pytest tests/test_core.py -x [00:01:48] Observation: 2 failed, 5 passed [00:02:20] Action: read_file pathsrc/module/utils.py [00:03:02] Action: edit_file pathsrc/module/utils.py [00:03:40] Action: bash commandpython -m pytest tests/test_core.py -x [00:04:15] Observation: 7 passed [00:04:22] Agent 输出 finish任务结束从初始化到测试全绿墙钟时间约 4 分 22 秒。其中模型推理占大头工具执行pytest、文件读写加起来不到 40 秒。这个耗时跟实例难度强相关换一个涉及多文件重构的实例可能翻几倍所以别把这个数字当基准。3.3 Token 消耗与计费对照OpenHands 在LOG_ALL_EVENTS模式下会把每次 LLM 调用的 usage 打出来。我把这次运行的 Token 汇总成表同时列出按广场展示价估算的费用。注意AA 标价不是 TaoToken 售价实际售价、折扣以 TaoToken 官网 展示为准。阶段输入 Token输出 Token累计 Token备注初始探索读文件 首次 pytest18,4201,26019,680上下文里带了仓库结构定位与编辑26,1502,04047,870读 utils.py 后上下文增长明显验证与收尾31,9001,18080,950最后一次 pytest 输出较长合计76,4704,48080,950单实例一次运行输入 Token 远大于输出这是 Agent 类任务的典型特征每一轮都要把历史对话、文件内容、测试输出重新塞进上下文。80,950 Token 跑一个中等实例如果换成上下文窗口更小的模型中途可能需要截断历史反而增加回合数。3.4 通过状态最终pytest tests/test_core.py返回 7 passed源码改动只落在src/module/utils.py一个文件测试文件未被触碰。按 SWE-bench 的判定口径这个实例算通过。但我要再强调一次这是单实例、单次运行的结果不能外推成「某模型在 SWE-bench Verified 上通过率 X%」。整榜评测需要跑满 500 个实例并统一判定那是另一套流程。4. 用同一把 Key 复现对照表4.1 复现步骤想复现这次运行按下面顺序走从 TaoToken 官网 创建 Key记下YOUR_API_KEY。拉取princeton-nlp/SWE-bench_Verified数据集取一条 instance_id导出它的problem_statement。按第 2 节的 config.toml 配好base_url https://taotoken.net/api和openai/前缀的模型 ID。用第 2.4 节的 docker 命令启动-t换成你的 problem_statement。运行结束后从容器日志里 grepusage统计 Token从事件时间戳算耗时。4.2 换模型做对照同一把 Key、同一份 config.toml只改LLM_MODEL就能换模型跑同一个实例。这样得到的对照表才有意义因为 Harness、Prompt、实例、判定逻辑全部一致差异只来自模型。我建议至少跑两个模型 ID一个偏推理、一个偏速度观察耗时和 Token 的取舍。模型 ID 以模型广场为准广场里每个模型都有上下文长度和定价说明。对照表建议记录这几列模型 ID、修复耗时、输入 Token、输出 Token、是否通过、失败原因如果没通过。失败原因比通过状态更有信息量比如「测试仍红」「改了测试文件」「回合数超限」。4.3 排障本篇配置错这次运行我只遇到一个配置错就是 2.3 节说的anthropic/前缀问题。补充两个 OpenHands 接兼容通道时常见的坑401Key 没传进容器。检查-e LLM_API_KEY是否真的读到了环境变量docker run里$TAOTOKEN_API_KEY为空时不会报错只会让请求带空 Key。模型 ID 不存在报model not found。回模型广场核对 ID 字符串注意大小写和连字符。上下文超限报context length exceeded。把max_input_tokens调小或换上下文更长的模型。这些错都发生在配置层跟模型能力无关配对了就不会再出现。5. 把这次运行变成可复用的基线单实例跑通之后这套配置可以当基线用。OpenHands 的 Harness 不变TaoToken 作为默认供应商提供统一的 Key 和 Base URL你换模型、换实例、换任务描述对照表的结构都不用改。长期做 Agent 评测的话建议把 config.toml 和启动脚本放进版本控制每次运行把日志和 Token 统计归档这样几周后回看能分清哪些差异来自模型、哪些来自 Harness 改动。跑完这次实例可以去 模型对话 确认一下刚才用的模型 ID 和广场是否一致顺便看这次调用的用量有没有入账。要长期跑 Agent 任务Coding Plan 比按次调用更适合。Key 在 控制台 创建Claude Code 或 CC Switch 的三件套配置对照 接入文档。 告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度
返回列表