Roo Code 实战:TaoToken 跑通 Python 仓库的失败用例修复链
2026/9/18 11:32:13 网站建设 项目流程

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

1. 把 Roo Code 接进一个真实会红的 Python 仓库

Roo Code 这类 Agent 工具最容易被高估的地方,是它在空仓库里写个hello world很顺;最容易被低估的地方,是它面对一个已经存在、测试已经红了的 Python 仓库时,能不能按失败用例一条条改到绿。这次我拿一个刻意留了 bug 的小仓库做实验,让 Roo Code 当执行者,TaoToken 当默认供应商,用一把 Key 把请求打到 https://taotoken.net/api,看它能不能把pytest从 5 failed 跑到 0 failed。注册和创建 Key 在 TaoToken 完成,后面所有配置都围绕这条通道展开。

先说清楚角色分工:被评测的是 Roo Code 这个 Agent 的修复链能力,TaoToken 不是被评测对象,它是 Key、Base URL 和对照基线。Roo Code 负责读文件、改代码、跑命令;TaoToken 负责把模型调用稳定地送出去。这个区分很重要,因为一旦把供应商当成被测产品,文章就会变成「谁家 API 更快」的口水账,而不是「Agent 能不能把测试改绿」的工程记录。

我用的仓库叫invoice-kata,一个处理发票金额计算的小项目,故意在折扣、税费、四舍五入三个地方埋了错。目录树如下:

invoice-kata/ ├── pyproject.toml ├── README.md ├── src/ │ └── invoice_kata/ │ ├── __init__.py │ ├── discount.py │ ├── tax.py │ └── rounding.py └── tests/ ├── test_discount.py ├── test_tax.py └── test_rounding.py

pyproject.toml里声明了pytestpytest-cov,源码用src布局,测试通过pythonpath指向src。这样 Roo Code 在改代码时不会误改测试文件,除非它明确判断测试本身写错了——这次实验里测试是对的,错在实现。

从零到能跑,命令序列是这样的:

cd invoice-kata python -m venv .venv source .venv/bin/activate pip install -e ".[dev]" pytest -q

第一次pytest -q的输出是 5 个失败,分布在三个测试文件里。这个「红」的状态就是 Roo Code 的起点。如果一上来就是绿的,Agent 没有可修的目标,整个实验就失去意义。所以我在写这篇文章前,特意确认了失败用例的数量和分布,后面 Agent 的每一步都要对着这些失败走。

Roo Code 的安装不复杂,VS Code 扩展市场搜 Roo Code 装上即可。真正要配的是供应商。Roo Code 支持 OpenAI Compatible 模式,这意味着只要有一个兼容 OpenAI 协议、能返回标准chat/completions结构的端点,就能接进来。TaoToken 的 Base URL 是https://taotoken.net/api,注意末尾不带/v1,这一点在配置时容易写错。模型 ID 以模型广场为准,不要凭记忆填一个不存在的名字。

配置路径是 Roo Code 设置里的 API Provider 选 OpenAI Compatible,然后填三样东西:Base URL、API Key、Model ID。API Key 用YOUR_API_KEY占位,实际值从控制台创建。填完之后 Roo Code 会做一次连通性检查,如果 401,多半是 Key 没复制全或者带了多余空格;如果 404,多半是 Base URL 多写了/v1或者模型 ID 不存在。

这一步做完,Roo Code 就有了一个能对话、能读文件、能执行命令的后端。接下来才是真正的修复链:让它按失败用例逐个改,每改一处就重跑pytest,直到全绿。这个循环听起来简单,但实际跑起来会遇到上下文管理、命令权限、失败信息回传三个坑,后面几节会逐个拆。

2. Roo Code 的 Harness 配置与失败用例修复循环

Roo Code 在这个任务里扮演的是 Harness 角色:它把「读文件、改代码、跑命令、看输出」串成一个循环。要让这个循环转起来,得先理解它的工具集和权限模型。Roo Code 默认会请求文件读写和终端执行权限,第一次跑命令时会弹确认。如果每次都手动点,修复链会被打断,所以我在设置里把终端命令的自动批准打开,但只限pytestpython开头的命令。这样既不会让它乱跑rm,也不会让每次重跑都卡在确认框上。

Harness 的配置分三块:模型、工具、上下文。

模型这块,Roo Code 的 OpenAI Compatible 配置里,Base URL 填https://taotoken.net/api,API Key 填YOUR_API_KEY,Model ID 从模型广场选一个适合代码修复的。选模型时不要只看名字,要看它是否支持长上下文和工具调用。修复链里 Agent 需要反复读测试文件、读源码、读 pytest 输出,上下文会累积得很快。如果模型上下文窗口太小,跑到第三个失败用例时前面的信息就被挤掉了,Agent 会开始重复改同一个地方。

工具这块,Roo Code 的核心工具是read_filewrite_to_fileexecute_commandlist_files。修复链里最常用的是前三个。read_file读测试和源码,write_to_file改实现,execute_commandpytest。这里有个细节:Roo Code 执行命令时是在工作区根目录下跑的,所以pytest -q能直接找到pyproject.toml。如果仓库结构是嵌套的,需要在命令里cd到子目录,或者用pytest tests/ -q指定路径。

上下文这块,Roo Code 有一个「上下文窗口」的概念,它会自动把最近的文件读取和命令输出放进对话。修复链跑到后面,pytest 输出会越来越长,因为通过的用例也会打印。为了控制上下文,我在pyproject.toml里加了addopts = "-q --tb=short",让 pytest 只输出失败摘要和短回溯。这样 Agent 拿到的失败信息更聚焦,不会把通过的用例也塞进上下文。

配置完成后,我给了 Roo Code 第一条指令:

这个仓库的 pytest 有 5 个失败。请逐个修复,每次只改一个文件,改完立刻跑 pytest -q,确认失败数减少后再改下一个。不要修改 tests/ 下的文件。

这条指令的关键约束是「每次只改一个文件」和「不要修改测试」。前者防止 Agent 一次性大改导致失败原因混淆,后者防止它把测试改成通过而不是把实现改对。Roo Code 收到指令后,先list_files看目录,然后read_filetests/test_discount.py,再读src/invoice_kata/discount.py,接着write_to_file改实现,最后execute_commandpytest -q

第一次循环,它改了discount.py里的折扣计算。原来的实现是price * discount,正确应该是price * (1 - discount)。这个错误很典型:把折扣率直接乘上去,而不是乘剩余比例。Roo Code 从测试断言里推断出了正确语义,改完跑 pytest,失败数从 5 降到 4。

第二次循环,它读tests/test_tax.pytax.py。税费的错误是税率用反了,price * rate写成了price / rate。Roo Code 改完跑 pytest,失败数降到 3。

第三次循环,它读tests/test_rounding.pyrounding.py。四舍五入的错误是用了round()的银行家舍入,而测试期望的是标准四舍五入。Roo Code 把round(x, 2)改成了Decimalquantize配合ROUND_HALF_UP。改完跑 pytest,失败数降到 0。

整个循环跑了三轮,每轮都有明确的「读-改-跑」三步。这里能看出 Roo Code 的修复链是否可靠,取决于两件事:一是它能不能从 pytest 输出里准确提取失败原因,二是它能不能在改完后正确判断失败数是否减少。如果 pytest 输出被截断,或者 Agent 没看清失败数,它可能会误以为改对了,继续改下一个,结果错误累积。

为了验证它没有「假绿」,我在最后一轮之后手动跑了一次完整 pytest,确认 5 个用例全过。Agent 交出的 diff 如下:

diff --git a/src/invoice_kata/discount.py b/src/invoice_kata/discount.py --- a/src/invoice_kata/discount.py +++ b/src/invoice_kata/discount.py @@ -1,4 +1,4 @@ def apply_discount(price, discount): - return price * discount + return price * (1 - discount) diff --git a/src/invoice_kata/tax.py b/src/invoice_kata/tax.py --- a/src/invoice_kata/tax.py +++ b/src/invoice_kata/tax.py @@ -1,4 +1,4 @@ def apply_tax(price, rate): - return price / rate + return price * (1 + rate) diff --git a/src/invoice_kata/rounding.py b/src/invoice_kata/rounding.py --- a/src/invoice_kata/rounding.py +++ b/src/invoice_kata/rounding.py @@ -1,6 +1,8 @@ +from decimal import Decimal, ROUND_HALF_UP + def round_money(amount): - return round(amount, 2) + return float(Decimal(str(amount)).quantize(Decimal("0.01"), rounding=ROUND_HALF_UP))

最终 pytest 输出:

5 passed in 0.42s

这个结果说明 Roo Code 在这个任务上的修复链是通的。但要注意,这是一次运行,不代表它在所有仓库上都能这样。失败用例的复杂度、测试断言的清晰度、模型对 Python 语义的理解,都会影响结果。下一节讲怎么用同一把 Key 复现这个对照表。

3. 用同一把 Key 复现修复链对照表

复现这件事,最怕的是「我这边能跑,你那边跑不起来」。所以这一节把环境、命令、配置都写死,你照着做应该能得到接近的结果。先声明:下面的对照表是一次运行的结果,不是公榜分数,也不代表模型在 SWE-bench 这类榜单上的表现。公榜上的是模型,读者用 TaoToken 的 Key 和 Base URL 接的是同一个模型,但本地跑出来的数字只对这次任务负责。

环境准备:

cd invoice-kata python -m venv .venv source .venv/bin/activate pip install -e ".[dev]" pytest -q

确认初始状态是 5 failed。如果不是,说明仓库版本或依赖版本有差异,先对齐pyproject.toml里的依赖。

Roo Code 配置:

{ "apiProvider": "openai-compatible", "baseUrl": "https://taotoken.net/api", "apiKey": "YOUR_API_KEY", "modelId": "以模型广场为准" }

注意baseUrl末尾不带/v1modelId不要凭记忆填。填完后在 Roo Code 里发一条测试消息,确认能收到回复。如果 401,检查 Key;如果 404,检查 Base URL 和模型 ID。

修复链指令:

这个仓库的 pytest 有 5 个失败。请逐个修复,每次只改一个文件,改完立刻跑 pytest -q,确认失败数减少后再改下一个。不要修改 tests/ 下的文件。

然后观察 Roo Code 的执行过程。它应该会先列文件、读测试、读源码、改实现、跑 pytest,重复三轮。每轮结束后,失败数应该从 5 降到 4、3、0。

对照表如下,记录的是这次运行的关键指标:

阶段失败数改动文件pytest 耗时备注
初始50.38s确认红
第一轮4discount.py0.40s折扣语义修正
第二轮3tax.py0.41s税率方向修正
第三轮0rounding.py0.42s舍入模式修正

这张表里没有 Token 消耗数字,因为我没有在 Roo Code 里开用量统计,也不想凭感觉编一个。如果你要看 Token 用量,可以在 TaoToken 控制台看这次调用的入账记录。控制台入口在 TaoToken,创建 Key 也在那里。

复现时容易遇到的偏差:

第一,模型 ID 不同,修复链的轮数可能不同。有的模型一次就能改对三个文件,有的模型需要多轮试探。轮数少不代表模型强,可能只是它一次改得多,风险也更大。

第二,pytest 输出格式不同,Agent 提取失败信息的能力会受影响。--tb=short比默认回溯更友好,建议保留。

第三,Roo Code 的自动批准设置不同,交互节奏会变。如果每次命令都要手动确认,修复链会变成「半自动」,耗时统计就没意义了。

第四,仓库初始状态不同。如果你拿到的仓库已经是绿的,或者失败数不是 5,对照表就对不上。复现的前提是初始状态一致。

这张对照表的价值不在于数字本身,而在于它把「Agent 修复链」拆成了可观察的步骤。你能看到它每一步改了什么、失败数怎么变、最终 diff 长什么样。这比只看一个「5 passed」的结论有用得多。

如果你想让对照更完整,可以换一个模型 ID 再跑一遍,把两张表放在一起看。但要注意,换模型 ID 时 Base URL 和 Key 不变,这样变量只有一个。TaoToken 在这里的作用就是提供统一的通道,让你换模型时不用换 Key、不用换 Base URL,只改一个 Model ID 就行。

4. 排障:Roo Code 接 TaoToken 时最容易错的几处

排障这一节只写本篇配置相关的错误,不写泛泛的「网络问题」。Roo Code 接 TaoToken 时,错误基本集中在四个地方:Base URL、API Key、模型 ID、命令权限。

Base URL 最常见的错是加了/v1。TaoToken 的 Base URL 是https://taotoken.net/api,末尾不带/v1。如果你写成https://taotoken.net/api/v1,Roo Code 请求的路径会变成/api/v1/chat/completions,而正确的路径是/api/chat/completions。结果就是 404。这个错很隐蔽,因为很多 OpenAI 兼容端点确实带/v1,但 TaoToken 的写法是不带。改的时候直接把/v1删掉。

API Key 最常见的错是复制时带了空格或换行。Roo Code 的 Key 输入框不会自动 trim,如果你从控制台复制时多选了一个换行,Key 就会变成YOUR_API_KEY\n,请求时 401。解决办法是粘贴后手动检查一遍,或者先在文本编辑器里过一道。另外,Key 创建后如果没复制,控制台不会再显示完整值,只能重新创建。所以创建时就要存好。

模型 ID 最常见的错是凭记忆填。比如你记得某个模型叫gpt-5,但广场上根本没有这个 ID,请求就会 404 或者返回模型不存在。正确做法是打开模型广场,复制准确的 ID。模型 ID 以模型广场为准,不要自己拼。如果你不确定哪个模型适合代码修复,可以先在模型对话里试一条,确认能正常返回再填进 Roo Code。

命令权限的错是自动批准没开,或者开得太大。没开的话,每次pytest都要手动确认,修复链断断续续。开得太大,比如允许所有命令,Agent 可能跑一些你没预期的操作。建议只批准pytestpython开头的命令,这样既流畅又安全。

还有一个错是工作区路径不对。Roo Code 默认在工作区根目录执行命令,如果你的pyproject.toml在子目录,pytest -q会找不到配置。解决办法是在 Roo Code 里把工作区设到invoice-kata根目录,或者在指令里明确写cd invoice-kata && pytest -q

最后一个是上下文溢出。修复链跑到第三轮时,对话里已经累积了三次文件读取和三次 pytest 输出。如果模型上下文窗口小,前面的失败信息会被挤掉,Agent 可能忘记已经改过discount.py,又去改一遍。解决办法是开--tb=short减少输出,或者在每轮结束后让 Roo Code 总结一下当前状态。Roo Code 有一个「压缩对话」的功能,可以在上下文快满时手动触发。

这些错我都踩过至少一个。最耽误时间的是 Base URL 多写/v1,因为 404 的报错信息不会直接告诉你路径错了,只会说模型不存在。后来我养成了一个习惯:配置完先发一条最简单的消息,确认通道通了,再开始修复链。这样能把配置错误和 Agent 能力问题分开。

排障的顺序建议是:先确认 Key 能创建、能复制;再确认 Base URL 不带/v1;再确认模型 ID 从广场复制;最后确认命令权限和工作区路径。这四步都对了,修复链跑不起来才可能是 Agent 本身的问题。

5. 修复链跑通之后,怎么把这次调用对账

修复链跑通、pytest 全绿之后,还有一件事值得做:确认这次调用在控制台里入了账。这不是为了看数字好看,而是为了确认你用的通道是正规的、可对账的。临时通道最麻烦的地方就是调用完了查不到记录,出了问题找不到人。TaoToken 的控制台能看到调用记录和用量,这对长期跑 Agent 的人来说很重要。

对账的路径是:打开 TaoToken,进控制台,看这次修复链的调用是否出现。如果出现了,说明 Key 和 Base URL 都配对了。如果没出现,回去检查 Roo Code 的配置,多半是请求没打到https://taotoken.net/api

对账之后,如果你打算长期用 Roo Code 跑修复链,可以看两个东西。一个是 模型对话,用来确认模型 ID 和广场一致,避免填错。另一个是 Coding Plan,适合长期开发场景。Key 在 控制台 创建,Claude Code 和 CC Switch 的接入对照 接入文档。

这次实验的结论是:Roo Code 在一个有明确失败用例的 Python 仓库里,能按「读-改-跑」的循环把测试改绿。TaoToken 在这里提供的是稳定的 Key 和 Base URL,让这个循环不因为通道问题中断。修复链本身的能力取决于模型和 Harness 的配合,通道只负责把请求送出去、把结果带回来。

如果你要复现,建议从 5 个失败用例的小仓库开始,不要一上来就找大项目。失败用例越清晰,Agent 的修复链越容易观察。等你熟悉了「读-改-跑」的节奏,再换更复杂的仓库,那时候你就能判断哪些失败是 Agent 能修的,哪些需要人先拆解。

最后提醒一句:AI 工具不能直连你的生产库或生产机执行操作。Roo Code 生成的命令和 diff,应该由你在本地或测试环境执行,确认无误后再上生产。这次实验全程在本地虚拟环境里跑,没有碰任何线上资源。

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

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

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

立即咨询