OpenHands 实战:用 TaoToken Key 跑 SWE-bench Verified 的 Django 修复实例
2026/9/20 22:55:54 网站建设 项目流程

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

1. 先把目标定清楚:让 OpenHands 自己修一个 Django 的 bug

SWE-bench Verified 是从真实开源仓库里筛出来的一批可复现 issue,Django 是其中占比很高的一类。它的价值在于:issue 描述、仓库快照、测试命令都是固定的,你跑出来的 pass/fail 可以跟公开榜单对照,而不是自己编一个“看起来能跑”的 demo。

这篇要做的是一件具体的事:从 SWE-bench Verified 里挑一个 Django 修复实例,交给 OpenHands 这个 Agent Harness 去读 issue、定位代码、生成补丁、跑测试,最后拿到一个明确的 pass 或 fail。OpenHands 负责“动手”,TaoToken 负责“供模型”,两者通过一个 Base URL 和一个 Key 接上。

适合谁看:已经会用 Python 和 Docker、想跑 Agent 评测但不想折腾多家模型账号的人;或者你已经在用 OpenHands,想把它接到一个统一入口上。整条链路里,模型调用走 TaoToken 的 API,地址是https://taotoken.net/api,Key 在官网创建。

我试过把 provider 配错一次,Agent 会在第一步就卡在“无法连接模型”,所以下面会把配置顺序写清楚,避免你重复踩。

2. 环境准备与 OpenHands 启动

2.1 依赖与目录

OpenHands 官方推荐用 Docker 跑 runtime,因为 Agent 执行命令、改文件都在容器里,隔离干净。你需要:

  • Python 3.11 或 3.12
  • Docker 已启动(docker ps能返回结果)
  • 一个能放工作目录的磁盘位置,SWE-bench 的仓库快照解压后不小

先建目录,把实例数据、日志、patch 分开放,后面排查方便:

mkdir -p ~/swe-openhands/{instances,logs,patches} cd ~/swe-openhands python -m venv .venv source .venv/bin/activate pip install --upgrade pip

2.2 安装 OpenHands

OpenHands 的包名是openhands-ai,用 pip 装即可。版本会更新,装完记一下版本号,写进你的实验记录:

pip install openhands-ai python -c "import openhands; print(openhands.__version__)"

如果你更习惯容器方式,也可以用官方镜像,但本文以 pip 安装 + 本地 Docker runtime 为主线,命令更透明。

2.3 拉取 SWE-bench Verified 的 Django 实例

SWE-bench 的数据集在 HuggingFace 上,用datasets拉。我们只筛 Django 且FAIL_TO_PASS非空的实例,这样才有明确的验证信号:

pip install datasets python - <<'PY' from datasets import load_dataset ds = load_dataset("princeton-nlp/SWE-bench_Verified", split="test") django = [x for x in ds if x["repo"] == "django/django"] print("django instances:", len(django)) for x in django[:5]: print(x["instance_id"], "|", x["problem_statement"][:80].replace("\n"," ")) PY

挑一个instance_id,比如形如django__django-XXXXX的条目。把它单独存成 JSON,OpenHands 读起来更省事:

python - <<'PY' import json from datasets import load_dataset ds = load_dataset("princeton-nlp/SWE-bench_Verified", split="test") target = [x for x in ds if x["repo"]=="django/django"][0] with open("instances/one.json","w") as f: json.dump(target, f, ensure_ascii=False, indent=2) print("saved:", target["instance_id"]) print("FAIL_TO_PASS:", target["FAIL_TO_PASS"][:3]) PY

FAIL_TO_PASS是关键:它列出了修复前失败、修复后应当通过的测试。Agent 跑完,我们就拿这个列表去核对。

3. 把 TaoToken 接进 OpenHands 的 LLM provider

3.1 创建 Key 并确认 Base URL

打开官网https://taotoken.net/?utm_source=taotoken_aicg_blog_end,注册后在控制台创建 API Key。创建时注意两点:一是 Key 只显示一次,复制到安全的地方;二是确认你的账户里有可用额度,否则 Agent 跑到一半会因为配额中断。

Base URL 填https://taotoken.net/api。这个地址是 OpenAI 兼容风格的入口,OpenHands 的 provider 配置里正好有对应的字段。模型名按你账户可用的填,比如常见的claude-3-5-sonnetgpt-4o系列,具体以官网模型列表为准,别照抄本文的示例名。

3.2 配置环境变量

OpenHands 读环境变量来初始化 LLM。把下面写进~/.bashrc或当前 shell:

export LLM_API_KEY="你的TaoToken Key" export LLM_BASE_URL="https://taotoken.net/api" export LLM_MODEL="claude-3-5-sonnet" export SANDBOX_RUNTIME_CONTAINER_IMAGE="docker.all-hands.dev/all-hands-ai/runtime:latest"

LLM_BASE_URL就是 TaoToken 的 API 地址,LLM_API_KEY是刚创建的 Key。如果你用的是 OpenHands 的配置文件方式,等价写法是:

[llm] model = "claude-3-5-sonnet" api_key = "你的TaoToken Key" base_url = "https://taotoken.net/api"

注意:base_url末尾不要多加/v1或斜杠,OpenHands 会自己拼接路径。多写一层是最常见的 404 来源。

3.3 启动一次 run

OpenHands 有 CLI 模式,适合脚本化。用--task把 issue 描述喂进去,让它自己规划:

openhands run \ --task "$(python -c "import json;print(json.load(open('instances/one.json'))['problem_statement'])")" \ --workspace ./workspace \ --log-file ./logs/run.log

第一次跑会拉 runtime 镜像,耐心等。启动后你会看到 Agent 的思考、命令执行、文件编辑都打在日志里。如果 provider 配错,日志开头就会出现连接失败或 401,这时候回到 3.2 检查 Key 和 Base URL。

4. 生成补丁、跑测试、记录 pass/fail

4.1 拿到 patch 文件

Agent 改完代码后,工作区里的改动就是补丁。用 git diff 导出:

cd workspace/django git diff > ../../patches/django_fix.patch cd ../.. head -40 patches/django_fix.patch

一个正常的补丁会包含被修改的文件路径、@@上下文和具体的增删行。如果 patch 是空的,说明 Agent 没真正改文件,常见原因是任务描述太长被截断,或者模型在规划阶段就停了。

4.2 跑 FAIL_TO_PASS 测试

把实例里的测试命令取出来执行。SWE-bench 的 Django 实例通常用./tests/runtests.py

cd workspace/django python -c " import json d=json.load(open('../../instances/one.json')) print('\n'.join(d['FAIL_TO_PASS'])) " > /tmp/tests.txt cat /tmp/tests.txt

然后逐条跑,或者用 SWE-bench 官方的 harness 脚本跑,后者更规范:

pip install swebench python -m swebench.harness.run_evaluation \ --predictions_path ../../patches/preds.jsonl \ --instance_ids $(python -c "import json;print(json.load(open('../../instances/one.json'))['instance_id'])") \ --run_id django_check

preds.jsonl每行是{"instance_id": "...", "model_patch": "..."},把 patch 内容塞进去即可。

4.3 记录结果

跑完你会得到每个测试的通过情况。把它整理成一张表,写进实验记录:

字段
instance_iddjango__django-XXXXX
模型claude-3-5-sonnet(经 TaoToken)
patch 行数例如 37
FAIL_TO_PASS 通过数例如 3/3
状态pass 或 fail
日志路径logs/run.log

状态判定很简单:FAIL_TO_PASS全部通过就是 pass,有一条没过就是 fail。别用“看起来对了”代替测试结果。

4.4 失败分支怎么处理

跑出 fail 是常态,不是事故。按这个顺序排查:

  • patch 为空:检查任务描述是否完整传入,日志里搜no changes
  • 测试报 import 错误:工作区可能没装依赖,进容器pip install -e .再跑。
  • 测试超时:Django 全量测试很慢,只跑FAIL_TO_PASS里的用例,别跑整个 suite。
  • 模型中途停:看日志里是否有context length或配额提示,换更长的上下文模型或缩短任务描述。

如果 provider 层报错,先确认https://taotoken.net/api可达,再确认 Key 没过期。接入文档里有各语言的调用示例,排障时可以对照。

5. 成本、模型选择与边界

一次 Django 实例的 Agent run,token 消耗主要在三块:读 issue 和仓库结构、多轮工具调用、生成补丁。SWE-bench 的仓库不小,上下文很容易到几万 token。所以模型选择上,长上下文能力比单纯便宜更重要,否则 Agent 会在中途丢信息。

成本估算按官网的计费页为准,不同模型单价差异大,本文不给具体数字,避免过期。你可以先用一个小实例试跑,看日志里的 token 统计,再决定用哪个模型跑批量。

几个边界要清楚:

  • OpenHands 的 runtime 在 Docker 里执行命令,宿主机权限要控制好,别把敏感目录挂进去。
  • SWE-bench Verified 的实例是固定快照,你的结果可以跟公开榜单对照,但榜单分数是特定配置下的,别直接拿单实例结果去比。
  • TaoToken 在这里是模型入口,不是评测对象,本文不含排行分数。
  • 模型名、可用列表、计费都以官网为准,示例里的名字只是占位。

想批量跑的话,把 3.3 的启动命令包一层循环,每个实例一个 workspace 和 log,patch 统一收集到patches/。跑完用 4.3 的表格汇总,pass/fail 一目了然。需要长期跑 Agent 任务的话,Coding Plan 比按次调用更省心,具体在官网看。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询