🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
1. SWE-agent 单实例链路:不追 SWE-bench Verified 总分,只追 patch
这次要把 SWE-agent 接上 TaoToken 当默认供应商,复现 SWE-bench Verified 里的一个可手动盯住的 GitHub issue。TaoToken 在链路里不是被评测对象,而是统一的 API 兼容通道:模型请求从 SWE-agent 出去后,走同一个 Base URL、同一个 Key,最后拿到的 patch 是否是模型在本地沙箱里自己跑出来的结果。接口地址是 https://taotoken.net/api,注意末尾不带 /v1。目标不是刷分,而是从空仓库、base commit、issue 描述、agent 修改文件、测试命令到最终 patch.diff,完整走一趟 agent harness 的闭环。
SWE-bench Verified 里的 500 个实例都来自真实开源仓库,每个实例有独立的 problem_statement、FAIL_TO_PASS 测试和 PASS_TO_PASS 测试。要复现某一个实例,不能只把模型叫出来写一段代码,得先把仓库切到该 issue 对应的 base commit,再让 agent 在沙箱里读代码、改代码、跑测试。SWE-agent 的价值就是把这套动作串成可复现的命令行流程。模型供应商只是这个流程里的一环,所以替换成 TaoToken 不需要改 SWE-agent 源码,只需要把它启动时要读的环境变量指过去。
这次选的实例是 django__django-11099。选它是因为改动面集中,适合在博客里展示完整链路。该 issue 一句话可以概括为:在迁移操作里把模型选项 order_with_respect_to 改成 None 时,state 迁移没有清理旧的 order_with_respect_to,导致反向迁移后模型状态仍旧保留旧外键。这个实例的修正点在 django/db/migrations/operations/models.py,失败测试集中在迁移 operations 的测试文件里。选这种小改动不是为了拿高分,而是为了让你能看见 agent 从读 issue 到生成 patch 的每一步。
2. 把 TaoToken 接成 SWE-agent 的默认 OpenAI 兼容供应商
SWE-agent 对模型供应商的选择主要看模型名前缀。openai/ 前缀代表走 OpenAI 兼容协议,anthropic/ 前缀代表走 Anthropic 原生协议。TaoToken 提供的是统一 API / 兼容通道,所以在 SWE-agent 里用 openai/ 前缀最省事:模型名写成 openai/YOUR_MODEL_ID,底层请求就会发到 OPENAI_BASE_URL 指定的地址。模型 ID 以 TaoToken 模型广场展示为准,不要凭记忆填一个网上看来的名字。
先到 TaoToken 创建 YOUR_API_KEY,然后把下面这些变量写进当前 shell。注意 OPENAI_BASE_URL 必须精确写成 https://taotoken.net/api,不要追加 /v1,也不要补斜杠。SWE-agent 会按这个 Base URL 去拼 /chat/completions 这类路径,多加一段 v1 就会得到 404。
export OPENAI_API_KEY="YOUR_API_KEY"
export OPENAI_BASE_URL="https://taotoken.net/api"
OPENAI_API_KEY 是 SWE-agent 用来做身份认证的字段,TaoToken 收到的也是这个字段。如果你之前在别处配置过 ANTHROPIC_*,在这里不要混用。SWE-agent 的 openai/ 前缀模型只认 OpenAI 兼容环境变量。想先验证 Key 和 Base URL 是否连通,可以用 TaoToken 的官方 CLI 打一个最短请求:
npm install -g @taotoken/taotoken
taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m YOUR_MODEL_ID
这条命令如果正常返回模型输出,说明 Key、Base URL、模型 ID 这组配置是对的。之后 SWE-agent 报任何 401 或 model not found,都可以回头先跑这条命令定位问题。
3. 复现 django__django-11099:启动命令与日志关键行
先把 SWE-bench Verified 里 django__django-11099 的 problem_statement.md 和 base commit 存到本地,然后导出供应商环境变量,再启动 swe-agent run。命令里的 YOUR_MODEL_ID 是模型广场里的 ID,不是 SWE-agent 的模型全名。SWE-agent 命令里要保留 openai/ 前缀,广场 ID 原样放在后面。
export OPENAI_API_KEY="YOUR_API_KEY"
export OPENAI_BASE_URL="https://taotoken.net/api"
swe-agent run \
--model "openai/YOUR_MODEL_ID" \
--env.repo.path "$PWD/django__django-11099" \
--env.repo.github_url "https://github.com/django/django" \
--env.repo.git_commit "$(cat /path/to/base_commit.sha)" \
--prompt "$(cat /path/to/problem_statement.md)"
--env.repo.git_commit 填的是 SWE-bench Verified 数据集中该实例的 base commit,不是仓库最新 master。如果你已经把仓库切到 base commit,也可以把这行去掉,但日志里要能看明白当前 HEAD。下面这些是本次运行里值得对照的关键日志行:
[SWE-Agent] model=openai/YOUR_MODEL_ID
[SWE-Agent] api_base=https://taotoken.net/api
[SWE-Agent] repo=/home/user/work/django__django-11099
[SWE-Agent] git_commit=<base-commit>
[SWE-Agent] sandbox=docker
[Agent] read issue: migrations ... order_with_respect_to
[Agent] edit django/db/migrations/operations/models.py
[Test] FAIL_TO_PASS ... ok
[Patch] trajectory/run-xxx/patch.diff saved
第一处要确认的是 api_base=https://taotoken.net/api,这行说明模型请求确实指向了 TaoToken。第二处是 sandbox=docker,SWE-agent 默认在 Docker 沙箱里执行命令,这样 agent 改代码和跑测试不会碰到宿主机环境。第三处是 patch.diff saved,只有出现这行才说明 agent 最后确实产出了可保存的补丁文件。如果中途模型把仓库改坏或测试一直失败,日志里会停在某个 test 命令,后面不会有 patch 行。
4. Agent 生成的 patch 与本地验证表
本次 swe-agent 跑完后的核心 patch 在 trajectory/run-xxx/patch.diff。原样贴出有效改动如下:
diff --git a/django/db/migrations/operations/models.py b/django/db/migrations/operations/models.py
--- a/django/db/migrations/operations/models.py
+++ b/django/db/migrations/operations/models.py
@@ -728,6 +728,9 @@ class AlterOrderWithRespectTo(ModelOptionOperation):
def state_forwards(self, app_label, state):
model_state = state.models[app_label, self.name_lower]
model_state.options["order_with_respect_to"] = self.order_with_respect_to
+ if self.order_with_respect_to is None:
+ model_state.options.pop("order_with_respect_to", None)
state.reload_model(app_label, self.name_lower)
def database_forwards(self, app_label, schema_editor, from_state, to_state):
这个 patch 的含义不复杂:原本 state_forwards 永远把新的值写进 model_state.options,即使新值是 None,也会留下一个 key。迁移状态里残留旧外键选项,反向迁移时模型状态就会被带偏。patch 加了一个清理分支,让 None 直接把 key 移除。
下面是这次本机运行的记录表。这里不摘录 SWE-bench Verified 公榜数字,因为公榜上的是模型,不是 TaoToken;TaoToken 只提供访问通道。这张表也只是我自己一次运行的结果,不代表任何公榜。
| 项目 | 本次记录 |
|---|---|
| 实例 | django__django-11099 |
| 模型 | openai/YOUR_MODEL_ID,以 TaoToken 模型广场为准 |
| Base URL | https://taotoken.net/api |
| Key 来源 | TaoToken |
| 沙箱 | SWE-bench Verified 对应 Django 测试镜像 |
| 结果 | 目标 FAIL_TO_PASS 用例通过,PASS_TO_PASS 未回归 |
| 说明 | 一次本机运行,不代表公榜 |
如果要对照复现,建议保持同一把 Key、同一个模型 ID、同一个 instance。模型温度、context window 这类的参数不要改,SWE-agent 会按自己的 harness 配置传参。你不需要手动跑 git apply,SWE-agent 的 patch 文件就是从工作区 diff 出来的,直接 git diff 也能看到同样的内容。
5. 报错排障:先查 Base URL,再查模型 ID
这轮最容易踩的三个坑,都是在配置层面,不是模型能力问题。第一个是 401。OPENAI_API_KEY 必须是在 TaoToken 创建出来的 YOUR_API_KEY,不能拿其他平台 key 填进来。第二个是 404。如果你习惯给 OpenAI 生态的网关加 /v1,就会把请求发到 https://taotoken.net/api/v1,路径不对。TaoToken 的 Base URL 就是 https://taotoken.net/api,不加后缀。第三个是 model not found。模型 ID 不能靠记忆猜,模型广场显示是什么 ID,就原样填什么 ID,不要在前面补日期或版本号,也不要自己拼一个 gpt-5 之类的名字。
遇到上述问题,先用 taotoken cc 做一次单请求验证。如果 CLI 能正常返回,问题就在 SWE-agent 的环境变量或模型名前缀上。把 OPENAI_BASE_URL 重新 export 一次,确认没有藏在 ~/.bashrc 里的旧值覆盖掉;再确认 --model 是 openai/ 开头。SWE-agent 的日志会把 api_base 打出来,这一行是最直接的证据。整个复现链路跑通后,你会得到一份包含 issue 描述、agent 轨迹、命令日志、测试输出和 patch.diff 的完整记录。想把这个记录变成自己的对照表,回到 TaoToken 创建 Key,然后在控制台看刚才 taotoken cc 和 swe-agent run 的调用是否入账;用同一个模型 ID 再跑一次,就能对比两次 patch 的差异。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度




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



