
告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度1. 先把目标定清楚让 OpenHands 自己修一个 Django 的 bugSWE-bench Verified 是从真实开源仓库里筛出来的一批可复现 issueDjango 是其中占比很高的一类。它的价值在于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/apiKey 在官网创建。我试过把 provider 配错一次Agent 会在第一步就卡在“无法连接模型”所以下面会把配置顺序写清楚避免你重复踩。2. 环境准备与 OpenHands 启动2.1 依赖与目录OpenHands 官方推荐用 Docker 跑 runtime因为 Agent 执行命令、改文件都在容器里隔离干净。你需要Python 3.11 或 3.12Docker 已启动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 pip2.2 安装 OpenHandsOpenHands 的包名是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, splittest) 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的条目。把它单独存成 JSONOpenHands 读起来更省事python - PY import json from datasets import load_dataset ds load_dataset(princeton-nlp/SWE-bench_Verified, splittest) 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_asciiFalse, indent2) print(saved:, target[instance_id]) print(FAIL_TO_PASS:, target[FAIL_TO_PASS][:3]) PYFAIL_TO_PASS是关键它列出了修复前失败、修复后应当通过的测试。Agent 跑完我们就拿这个列表去核对。3. 把 TaoToken 接进 OpenHands 的 LLM provider3.1 创建 Key 并确认 Base URL打开官网https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end注册后在控制台创建 API Key。创建时注意两点一是 Key 只显示一次复制到安全的地方二是确认你的账户里有可用额度否则 Agent 跑到一半会因为配额中断。Base URL 填https://taotoken.net/api。这个地址是 OpenAI 兼容风格的入口OpenHands 的 provider 配置里正好有对应的字段。模型名按你账户可用的填比如常见的claude-3-5-sonnet或gpt-4o系列具体以官网模型列表为准别照抄本文的示例名。3.2 配置环境变量OpenHands 读环境变量来初始化 LLM。把下面写进~/.bashrc或当前 shellexport LLM_API_KEY你的TaoToken Key export LLM_BASE_URLhttps://taotoken.net/api export LLM_MODELclaude-3-5-sonnet export SANDBOX_RUNTIME_CONTAINER_IMAGEdocker.all-hands.dev/all-hands-ai/runtime:latestLLM_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 启动一次 runOpenHands 有 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/fail4.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.pycd workspace/django python -c import json djson.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_checkpreds.jsonl每行是{instance_id: ..., model_patch: ...}把 patch 内容塞进去即可。4.3 记录结果跑完你会得到每个测试的通过情况。把它整理成一张表写进实验记录字段值instance_iddjango__django-XXXXX模型claude-3-5-sonnet经 TaoTokenpatch 行数例如 37FAIL_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 runtoken 消耗主要在三块读 issue 和仓库结构、多轮工具调用、生成补丁。SWE-bench 的仓库不小上下文很容易到几万 token。所以模型选择上长上下文能力比单纯便宜更重要否则 Agent 会在中途丢信息。成本估算按官网的计费页为准不同模型单价差异大本文不给具体数字避免过期。你可以先用一个小实例试跑看日志里的 token 统计再决定用哪个模型跑批量。几个边界要清楚OpenHands 的 runtime 在 Docker 里执行命令宿主机权限要控制好别把敏感目录挂进去。SWE-bench Verified 的实例是固定快照你的结果可以跟公开榜单对照但榜单分数是特定配置下的别直接拿单实例结果去比。TaoToken 在这里是模型入口不是评测对象本文不含排行分数。模型名、可用列表、计费都以官网为准示例里的名字只是占位。想批量跑的话把 3.3 的启动命令包一层循环每个实例一个 workspace 和 logpatch 统一收集到patches/。跑完用 4.3 的表格汇总pass/fail 一目了然。需要长期跑 Agent 任务的话Coding Plan 比按次调用更省心具体在官网看。 告别海外账号与网络限制稳定直连全球优质大模型限时半价接入中。 点击领取海量免费额度