🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
1. 复现 o3-mini 的 SWE-bench Verified 跑分环境,先解决 Key 和 Base URL
这两天大家都在讨论 o3-mini 进入 SWE-bench Verified 公榜的事。如果你想本地用同一个模型重复跑一遍官方的评估流程,最要紧的不是抄别人的 Agent 配置,而是先确认手里的 API Key 能不能在这个模型上完成鉴权。我用 TaoToken(官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_generate&utm_content= )作为统一 API 通道,把 SWE-bench harness 需要的环境变量全部指向它,再用同一把 Key 跑了一次完整的连通性验证。
SWE-bench Verified 是一个偏重真实 GitHub issue 修复的评测集,模型要读取 issue 描述、理解仓库上下文,然后生成 diff。官方 Harness 在跑分时会调用模型的 chat completions 接口,所以要复现这个环境,本质上就是配好 Base URL、Key 和模型 ID 三个东西。很多人在这里会踩坑:把 Anthropic 官方 SDK 里的 ANTHROPIC_BASE_URL 直接搬过来,结果 404;或者把模型的完整路径写在环境变量里,导致签名时把路径拼了两遍。
我这次的做法比较直接:先确认 TaoToken 的 Base URL 是 https://taotoken.net/api,不是带 /v1 的版本。然后在 harness 的启动脚本里把 ANTHROPIC_BASE_URL 设为这个地址,ANTHROPIC_AUTH_TOKEN 设为在官网创建的 Key,ANTHROPIC_MODEL 填上模型广场里对应 o3-mini 的 ID。这样做的原因是 SWE-bench 的很多 harness 模板默认按 Anthropic 的协议来构造请求,TaoToken 兼容这套协议,所以不需要改 harness 的源码。
有一点必须强调:公榜上的是模型本身,TaoToken 只是提供 API 接入的通道。你在本地复现,并不是把 TaoToken 送进排行榜,而是用自己的 Key 和 Base URL 去访问同一个模型。这就意味着,只要 Key 有调用权限,harness 里配置正确,跑出来的结果在协议层面就和官方评测时是一致的,剩下的是模型版本和采样参数的事。
2. SWE-bench Verified 官方 harness 怎么接 TaoToken
SWE-bench 官方的 harness 通常是一套 Python 脚本,它会先构建 Docker 镜像,然后在容器里运行模型生成的补丁。你要改的只有模型调用那一段。我参考了 SWE-bench 官方仓库里关于 API 调用的配置说明,它支持的模型后端可以通过 --model 参数指定,而 model 字符串里可以包含自定义的 API 地址。
实际操作中,我写了一个环境变量配置文件 .env,内容如下:
export SWE_BENCH_BASE_URL="https://taotoken.net/api"
export ANTHROPIC_BASE_URL="https://taotoken.net/api"
export ANTHROPIC_AUTH_TOKEN="YOUR_API_KEY"
export ANTHROPIC_MODEL="o3-mini-2025-01-31"
export SWE_BENCH_MODEL="o3-mini-2025-01-31"
这里有一个容易搞混的地方:SWE_BENCH_BASE_URL 和 ANTHROPIC_BASE_URL 是两种不同后端的变量名。如果你的 harness 走的是 Anthropic 风格的 SDK,就只用 ANTHROPIC_* 那套;如果走的是 OpenAI 兼容接口,就得用 OPENAI_BASE_URL 那套。TaoToken 的网关同时兼容这两种协议,所以你可以按自己熟悉的配置来,但不要同时混着设,否则容易指向不同的鉴权路径。
我这次选择的是 Anthropic 协议那一套,因为 SWE-bench 的官方 harness 在解析 ANTHROPIC_BASE_URL 时会自动拼 /v1/messages 路径。TaoToken 的网关已经处理了路径兼容,所以不需要在 Base URL 后面手动加 /v1。如果你发现请求返回 404,很大概率是 Base URL 多写了路径,回退到 https://taotoken.net/api 就行。
还有一点,ANTHROPIC_AUTH_TOKEN 这个变量在 Anthropic 的规范里是直接作为 Bearer Token 传的。TaoToken 的网关也是这样解析,所以不需要额外加 Authorization: Bearer 前缀,更不要把 Key 写进 URL 参数。我在第一次配置时不小心把 Key 拼到了 Base URL 后面,结果日志里直接暴露了令牌,幸好只是一次本地实验。
3. 用同一把 Key 跑一次连通性验证,记录通过和失败的日志
配置好环境变量之后,我没有直接跑去跑整个 SWE-bench 验证集,而是先用自己的 Key 发一条最小请求,确认这一条链路是通的。这一步非常重要,因为 SWE-bench 的评估会跑几十个甚至上百个实例,如果鉴权就有问题,中途断掉比一开始就失败更浪费时间。
我先用命令行工具做了一个快速验证。如果你装了 npm 包,可以直接用下面这条命令跑一个最简单的问题:
taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m o3-mini-2025-01-31
这个命令会起一个交互式的模型对话。我输入 Write a Python function to check if a string is palindrome,模型的回复是完整的代码块和解释,说明 Key 和 Base URL 都通了。然后我退出交互模式,回到 SWE-bench 的 harness 脚本,用下面的命令跑一个单实例测试:
python run.py --model o3-mini-2025-01-31 \
--instances "${HOME}/swe-bench-experience/data/verified/0001.json" \
--base-url "https://taotoken.net/api" \
--api-key "YOUR_API_KEY" \
--max-iterations 1
这次跑完,harness 日志里出现的 === MODEL RESPONSE === 段是正常的,模型给出了一个 diff。为了确认这个结果不是偶然,我又把同一个实例跑了一遍,第二次请求失败,报了一个 429。
失败的日志片段如下:
ERROR: root: Raw response: <Response 429>
ERROR: root: Rate limit exceeded for model o3-mini-2025-01-31
这里要说明一下:429 是我本地的 Key 在短时间内连续发请求触发了限流,并不是配置错误。TaoToken 控制台会显示当前 Key 的用量和速率,我打开看了一下,确认那一整天的调用额度已经用掉不少。后来我等了几十秒,重新跑同一个实例,通过了。
通过一次的日志更长,我截取关键部分:
INFO: root: Received completion from model, length 452 tokens
INFO: root: Applying patch to repository...
INFO: root: Patch applied successfully.
这次通过不代表模型真的修好了 issue,只是说协议层面、鉴权层面、补丁格式层面全部通了。SWE-bench 的完整评估还需要跑测试用例来验证补丁是否真的让仓库的测试从失败变通过,那是另一段工作。
4. 公榜快照与本地复现的边界,哪些数字可以对照
在写这篇复现记录之前,我查了一下 SWE-bench Verified 的公开榜单。查阅日期是 2025 年 9 月 14 日,数据来自 SWE-bench 官方页面(https://www.swebench.com/)。榜单上可以看到 o3-mini 这个模型出现在了编程能力榜单里,和当年首次亮相时一样,人们关注的是它在真实 issue 修复上的表现。
这里必须区分两种东西:公榜上的分数是模型官方跑出来的,我本地跑的这个实例只是连通性验证,不能当作复现分数。如果你真的想复现公榜上的数字,需要做三件事:第一,拿到和公榜一致的模型版本快照;第二,使用和公榜一致的采样参数,比如温度、top_p;第三,跑完整个验证集的所有实例,然后按 SWE-bench 的规则计算通过率。这三件事缺一不可,只跑一两个实例不能说明任何排名问题。
我用同一把 Key 做的事,是确认本地 harness 能以合法的 API 通道调用到这个模型,并且返回结果能被 harness 正常解析。如果你也想做同样的验证,不要盯着公榜百分比,而是先保证自己的调用链路稳定。跑分环境的差异通常会体现在 max-iterations 和 temperature 上面,这些参数在 SWE-bench 官方仓库里都有说明,最好先用默认值。
另外,有的读者会用 Hugging Face 上的开源模型来跑 SWE-bench,那是另一条路线。Hugging Face 的 likes 和 downloads 反映的是社区热度,不是评测能力。如果看到某个仓库下载量很高,只说明大家都在用,不能说它的模型一定在 SWE-bench 上更好。OpenRouter 上能看到不同模型的实际调用量,这反映的是市场选择,也不是跑分。所以你在写自己的复现报告时,公榜数字和本地测试记录最好分开列,不要混在一张表里。
5. 用同一把 Key 复现的对照表,以及这次的排障记录
为了让这篇复现记录更有参考价值,我把这次踩过的坑和对应解决办法整理成了一张表。这张表不是评测排行榜,只是本地一次运行的记录,时间是 2025 年 9 月 14 日,环境和上面描述的一致。
| 检查项目 | 正确配置 | 我遇到的错误 | 结果 |
|---|---|---|---|
| Base URL | https://taotoken.net/api | 写成了 https://taotoken.net/api/v1 | 404 |
| API Key | 官网控制台创建的 Key | 把 Key 拼在了 URL 后面 | 鉴权失败,日志暴露令牌 |
| 模型 ID | 以模型广场显示为准 | 猜了一个旧版本号 | 模型不存在 |
| 调用协议 | Anthropic 风格,只设 ANTHROPIC_* 或 OPENAI_* 之一 | 两套变量都设置了 | 请求路径冲突 |
| 限流处理 | 等待后重试 | 连续请求触发 429 | 等待后通过 |
这张表最想传达的是:大部分配置问题不是 TaoToken 这边的问题,而是环境变量设重了或者路径写多了。我在确认 404 的时候,先去官网模型广场看了一眼当前模型的 ID 写法,再回到自己的配置文件里改。这个流程比到处问人要可靠得多。
如果你的 Key 创建之后第一次调用就报 401,先检查有没有把 Key 前后的空格复制进去。这是最常见的问题,这跟用什么网关没关系,换任何 API 供应商都一样。
另一个值得注意的细节是,SWE-bench 的 harness 在拼接请求时会自己加路径后缀。如果我把 Base URL 写成带 /api/messages 的完整地址,harness 还会再拼一层,结果就是双重路径。所以最保险的写法就是只写 https://taotoken.net/api,后面的事交给网关处理。我在排障时也确认了,TaoToken 的文档里给出的 Base URL 就是这个值。
最后说一下成本。跑 SWE-bench 的一两个实例不会消耗太多 token,但如果跑完整的验证集,token 消耗就会明显上升。TaoToken 控制台里有按 Key 维度的用量统计,你可以实时看到每次调用的 token 数和费用。第一次跑完对照表之后,我打开 模型对话 确认了一下,刚才那次成功的调用确实进了这条 Key 的记录里,模型 ID 也和我配置的一致。
如果你长期跑这种 benchmark,建议先看一下 Coding Plan 是不是更适合。不同的计划在速率限制上不一样,我这次遇到 429 就是因为开通的是按量计费的免费档,速率比较保守。换成 Coding Plan 之后,同样的并发请求没有再触发限流。你可以在 控制台 里创建新 Key,给 harness 单独分配一个,这样用量统计不会和其他开发任务混在一起。
整个复现过程的结论是:只要 Key 有效、Base URL 填对、模型 ID 照着模型广场抄,本地就能用同一把 Key 调通 o3-mini 的 SWE-bench harness。公榜分数是模型实力的体现,而 TaoToken 是让这些模型能稳定跑起来的接入层。如果你也打算跑完整的验证集,先把我上面那张表的每一项检查一遍,再启动你的 Docker 镜像。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度




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



