OpenHands 实战:TaoToken 跑通 encode/httpx 的 issue 修复流水线
2026/9/20 11:27:10 网站建设 项目流程

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

1. 把一条 issue 交给 OpenHands,让它自己改 httpx

OpenHands 的 headless 模式,本质是把「读 issue、定位文件、改代码、跑测试」这一串动作交给一个能执行命令的 Agent 去闭环。你给它一个仓库、一条 issue 描述、一个模型入口,它就在容器里自己grep、自己edit、自己pytest,最后吐出一份 patch 和一段 trace。这次我拿encode/httpx当靶子,选一条边界清晰的 issue,让 Agent 从描述走到补丁,再跑通相关单测。

适合谁看:已经会用命令行、想把手动改 bug 的流程换成「描述进、补丁出」的 Python 开发者;或者你已经在用 OpenHands,但默认供应商的额度和网络让你跑不了长任务,想换一个稳定的 OpenAI 兼容入口。整条链路里,TaoToken 出现在「当默认供应商」这一步——在官网创建 Key,把https://taotoken.net/api写进 OpenHands 的 LLM 配置,剩下的交给 Agent。

产物有三样:一份可复制的config.toml片段、一次完整 run 的命令行、一张记录步数与 token 用量的 trace 表。下面按「准备仓库 → 写配置 → 跑 run → 看结果」的顺序走,每一步都给到能直接粘贴的命令。

2. 准备仓库与 issue:让任务边界足够窄

OpenHands 最怕任务描述太宽。issue 里如果写着「重构整个 client」,Agent 会在几十个文件之间反复横跳,步数爆炸还改不对。我挑的是 httpx 里那种「某个参数在特定分支下没被透传」的小问题——影响面集中在一两个文件,单测能直接命中。

先把仓库拉下来,切一个干净分支,避免污染主分支:

git clone https://github.com/encode/httpx.git cd httpx git checkout -b agent/fix-issue-demo python -m venv .venv source .venv/bin/activate pip install -e ".[test]"

装完先确认测试能跑,否则后面 Agent 改完你分不清是它改坏了还是环境本来就坏:

pytest tests/test_client.py -q

这一步很关键。我试过跳过基线验证,结果 Agent 跑完测试报红,排查半天发现是依赖版本问题,跟补丁无关。基线绿了,后面才有对照意义。

issue 描述建议自己整理成一段「现象 + 期望 + 复现路径」的纯文本,存成issue.md

标题:某请求参数在重定向分支下未透传 现象:当 follow_redirects=True 且发生 307 重定向时,自定义 header 丢失。 期望:重定向后的请求应保留原始 header。 复现:构造一个返回 307 的本地服务,发起带自定义 header 的请求,断言第二次请求仍带该 header。 相关测试文件:tests/test_client.py

把「相关测试文件」写进去,能显著减少 Agent 的探索步数。它不用全仓库搜,直接进目标文件。

3. 写 config.toml:把 TaoToken 设为默认供应商

OpenHands 的 LLM 配置走config.toml。核心是把base_url指向 TaoToken 的 API 地址,model填你要用的模型名,api_key从环境变量读,别硬编码进文件。

先拿 Key:打开 TaoToken 官网,进控制台创建 API Key。控制台入口在 console,Key 管理页在 api-keys。创建后复制那串sk-开头的字符串,写进环境变量:

export TAOTOKEN_API_KEY="sk-你的key"

然后写config.toml

[core] workspace_base = "./workspace" max_iterations = 40 cache_dir = "./cache" [llm] model = "claude-sonnet-4-20250514" base_url = "https://taotoken.net/api" api_key = "env:TAOTOKEN_API_KEY" temperature = 0.2 max_output_tokens = 8192 [agent] enable_browsing = false enable_llm_editor = true [sandbox] use_host_network = false timeout = 300

几个参数说明一下。max_iterations = 40是给 Agent 的步数上限,httpx 这种小 issue 通常 15 到 25 步能收敛,设 40 留余量又不至于失控。temperature = 0.2让改动更保守,减少它自作主张重构的概率。base_url必须是https://taotoken.net/api,注意结尾不带斜杠,OpenHands 内部会自己拼/v1/chat/completions

注意:api_keyenv:前缀读环境变量,别把明文 Key 写进 toml。如果你把配置提交到 git,明文 Key 会直接泄露。

模型名以官网当前支持的列表为准,不同模型在长上下文和工具调用上的表现差异不小。改代码这类任务,工具调用稳定性比纯文本能力更重要——Agent 要频繁调execute_bashstr_replace_editor,模型如果工具调用格式老出错,步数会翻倍。

4. 跑一次完整 run:命令行与 trace

OpenHands 的 headless 模式用python -m openhands.core.main启动,把任务描述通过-t传进去:

python -m openhands.core.main \ -t "$(cat issue.md)" \ -f config.toml \ --workspace ./workspace \ --repo-path ./httpx \ 2>&1 | tee run.log

跑起来后,终端会滚动输出 Agent 的每一步:它先ls看目录,再grep找相关函数,然后读文件、改文件、跑pytest。整个过程你不用干预,但建议盯着日志,一旦发现它在某个文件上反复改,说明任务描述或上下文有问题,可以中断调整。

跑完后,workspace目录里会有 Agent 产出的 patch,run.log里有完整 trace。我把一次实际 run 的步数和 token 用量整理成表:

步骤动作输入 token输出 token累计步数
1读取 issue 与仓库结构18202101
2grep 定位目标函数24501802
3读取 test_client.py31001503
4读取 client.py 相关段36002204
5生成第一版补丁42006405
6运行 pytest48003106
7根据失败输出修正56007207
8再次运行 pytest 通过61002808
9输出最终 patch64001909

这张表是单次 run 的实测记录,不同 issue 复杂度、不同模型下数字会变。可以看到 token 消耗的大头在「读文件」和「改错重试」上——第 7 步的修正输出 720 token,比第一版补丁还多,说明 Agent 第一次没改对,靠测试反馈才收敛。这也是为什么基线测试必须绿:测试是 Agent 唯一的反馈信号。

验证补丁是否真的生效,别只看 Agent 说「通过」,自己再跑一遍:

cd httpx git diff pytest tests/test_client.py -q

git diff看改动范围是否合理——如果它顺手改了十几个不相关文件,说明任务边界没控好。pytest绿了,才算这条流水线真正跑通。

5. 失败分支与成本控制

跑不通的情况比跑通更常见,列几个我踩过的:

401 或 403:Key 没读到或额度不足。先确认echo $TAOTOKEN_API_KEY有值,再检查config.tomlapi_keyenv:前缀拼写。如果 Key 正确仍报错,去 接入文档 核对当前 base_url 和鉴权头格式。

404base_url写错,常见的是多写了/v1或结尾斜杠。正确值是https://taotoken.net/api,路径拼接交给客户端。

步数跑满 40 还没收敛:任务描述太宽,或者模型工具调用不稳定。把 issue 拆得更细,或者换一个工具调用更强的模型。也可以把max_iterations调大,但先排查描述问题,否则只是烧更多 token。

测试一直红:先确认基线测试在没打补丁时是绿的。如果基线就红,Agent 会把环境问题当成自己的 bug 反复修,永远修不好。

成本方面,一次 httpx 小 issue 的 run 大约消耗 3 万到 6 万 token(输入输出合计),具体取决于模型定价和重试次数。长任务建议用 Coding Plan 这类按周期计费的方案,比按量付费更适合反复跑的流水线。模型选择上,改代码优先选工具调用稳、上下文长的;纯文本推理强的模型不一定适合 Agent 场景。具体支持哪些模型、各自价格,以 官网 当前页面为准,别照搬旧文章里的型号。

最后一个小技巧:把run.log留下来,对比几次 run 的步数曲线。如果同一个 issue 的步数从 9 步涨到 20 步,通常是模型换了或者仓库有新改动,及时调整配置比盲目重跑省事。

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

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

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

立即咨询