🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度
1. 为什么拿 Continue 做这次 Python CLI 重构评测
Continue 是 VS Code 和 JetBrains 里都能装的 AI 编程插件,它的定位不是「一键生成整个项目」,而是把补全、对话、编辑、Agent 几种模式拆开,让开发者按需调用。这次我选它做评测,原因很直接:它支持自定义 OpenAI 兼容供应商,能填 Base URL 和模型 ID,这意味着可以用 TaoToken 作为默认供应商,把 Qwen3.7 Flash 接进来,然后在一个真实的重构任务上记录完成轮次、人工介入次数和 Token 消耗。
任务本身不复杂,但足够暴露工具的真实能力边界:把一个 Python CLI 的 argparse 解析从「一个文件里堆十几个 add_argument」重构成子命令结构,同时保留原有测试全部通过。这个任务有几个特点——它需要理解现有代码结构、需要做跨文件的编辑、需要保证重构后行为不变、还需要跑测试验证。Continue 的 Agent 模式和 Edit 模式在这种任务上表现差异很大,正好可以对比。
评测环境如下:VS Code 1.96,Continue 扩展版本以插件市场当前版本为准,Python 3.12,pytest 8.x。模型用 Qwen3.7 Flash,模型 ID 以 TaoToken 模型广场 展示为准。API Key 在同一个页面创建,Base URL 填https://taotoken.net/api。整篇文章不含任何公榜排行分数,所有数字都来自我这一次本地运行的记录,一次运行不代表公榜。
1.1 被重构的 CLI 长什么样
原始代码是一个单文件cli.py,大约 180 行,用 argparse 定义了这些参数:
# 重构前:cli.py 片段 parser = argparse.ArgumentParser(description="Task runner") parser.add_argument("--list", action="store_true", help="列出所有任务") parser.add_argument("--add", type=str, help="添加任务") parser.add_argument("--done", type=int, help="标记任务完成") parser.add_argument("--remove", type=int, help="删除任务") parser.add_argument("--priority", type=str, choices=["low", "mid", "high"]) parser.add_argument("--tag", type=str, action="append") parser.add_argument("--json", action="store_true", help="JSON 输出")测试文件test_cli.py有 12 个用例,覆盖了 list、add、done、remove、priority、tag、json 输出这些路径。重构目标是把上面这种扁平参数改成子命令:
python cli.py list --json python cli.py add "写周报" --priority high --tag work python cli.py done 3 python cli.py remove 5要求是:原有 12 个测试全部通过,不能改测试断言,只能改被测代码和必要的测试导入路径。
1.2 为什么用 TaoToken 做默认供应商
Continue 默认走 OpenAI 或 Anthropic 的官方端点,但模型选择受限于它内置的 provider 列表。要接 Qwen3.7 Flash,最干净的方式是走 OpenAI 兼容通道。TaoToken 在这里的角色是统一 API 基线:一把 Key、一个 Base URL,模型 ID 从广场选。Continue 的 config 里把 provider 设为openai,apiBase 填https://taotoken.net/api,apiKey 填YOUR_API_KEY,model 填广场上的 Qwen3.7 Flash ID。
这样配的好处是,后面如果想把模型换成别的 Flash 系列,只改 model 字段,Base URL 和 Key 不动。评测的可复现性也来自这里——读者拿同一把 Key、同一个 Base URL、同一个模型 ID,就能跑同一套任务。
2. Continue 接入 TaoToken 的完整配置
Continue 的配置文件在 VS Code 里是~/.continue/config.json(新版可能拆成config.yaml,以插件当前文档为准)。下面这份配置可以直接复制,把YOUR_API_KEY换成你在 TaoToken 控制台 创建的 Key。
{ "models": [ { "title": "Qwen3.7 Flash via TaoToken", "provider": "openai", "model": "以模型广场为准", "apiKey": "YOUR_API_KEY", "apiBase": "https://taotoken.net/api" } ], "tabAutocompleteModel": { "title": "Qwen3.7 Flash Autocomplete", "provider": "openai", "model": "以模型广场为准", "apiKey": "YOUR_API_KEY", "apiBase": "https://taotoken.net/api" }, "allowAnonymousTelemetry": false }几个容易踩的点:
第一,apiBase末尾不要加/v1。Continue 的 openai provider 会自己拼/v1/chat/completions,如果你填了https://taotoken.net/api/v1,实际请求会变成/api/v1/v1/chat/completions,直接 404。这一点和很多其他工具不一样,配的时候注意。
第二,model字段必须和模型广场上的 ID 完全一致,大小写、连字符都不能差。填错的表现是 400 或 404,Continue 的报错面板里会显示model not found。
第三,如果你同时用 tab 补全和对话,建议把tabAutocompleteModel单独配一份,补全用同一个 Flash 模型即可。补全请求频率高,Token 消耗要单独看。
第四,Continue 的 Agent 模式需要模型支持 function calling。Qwen3.7 Flash 在 TaoToken 通道上是支持的,但如果你在 Continue 里发现 Agent 模式不触发工具调用,先检查 config 里有没有开"contextProviders"或"systemMessage"覆盖了默认行为。
配好之后重启 VS Code,在 Continue 侧边栏的模型下拉里应该能看到「Qwen3.7 Flash via TaoToken」。选中它,发一条ping,能正常回复就说明通道通了。
2.1 验证通道是否真的走 TaoToken
一个简单的验证方法:在 Continue 对话框里问「你是什么模型」,Flash 的回答不一定准确,所以更可靠的方式是看 TaoToken 控制台的用量页面。发一条消息后刷新 控制台用量,如果看到对应时间点的调用记录和 Token 数,说明请求确实走了 TaoToken 通道。
这一步很重要,因为 Continue 的配置如果 provider 写错,它可能静默 fallback 到别的模型。用量页面是唯一可靠的确认方式。
2.2 重构任务清单
在开始之前,我把任务拆成 6 个可检查的步骤,每步都记录 Continue 的完成轮次和人工介入:
| 步骤 | 任务内容 | 检查标准 |
|---|---|---|
| 1 | 读取 cli.py 和 test_cli.py,输出当前参数结构 | 能列出全部 7 个参数及其类型 |
| 2 | 设计子命令映射方案 | 给出 list/add/done/remove 四个子命令的参数表 |
| 3 | 改写 cli.py 为子命令结构 | 文件能 import,无语法错误 |
| 4 | 调整测试导入路径(不改断言) | pytest 能收集到 12 个用例 |
| 5 | 跑 pytest,修复失败用例 | 12 passed |
| 6 | 检查 --json 和 --tag 的边界行为 | 与原行为一致 |
这个清单的作用是让「完成轮次」和「人工介入次数」有明确的计数点。每完成一步算一轮,每次我手动改代码或手动跑命令算一次介入。
3. 实测过程:Qwen3.7 Flash 在 Continue 里的表现
3.1 第一步到第三步:理解与改写
第一步我直接把两个文件的内容贴进 Continue 对话框,让它输出参数结构。Flash 用了大约 8 秒返回,列出了 7 个参数,但把--tag的action="append"漏了,只写了type=str。这是一次人工介入:我手动补了一句「--tag 是 append 行为,可以多次传入」。
第二步设计子命令映射,Flash 给出的方案基本合理:list 保留--json,add 接收位置参数title加--priority和--tag,done 和 remove 接收位置参数id。这里没有介入。
第三步改写 cli.py,这是消耗最大的一步。Flash 在 Agent 模式下尝试直接编辑文件,但第一次编辑只改了 parser 定义部分,没有改后面的args.list判断逻辑,导致代码引用了不存在的属性。我手动指出「args.list 现在应该是 args.command == 'list'」,Flash 在第二轮修正了。这一步用了 2 轮,1 次介入。
3.2 第四步到第五步:测试与修复
第四步调整测试导入路径。原测试是from cli import main,重构后 main 函数签名没变,所以理论上不用改。但 Flash 主动建议把测试里的main(["--list"])改成main(["list"]),这是对的,因为子命令结构下参数列表变了。这一步 Flash 一次做对,0 次介入。
第五步跑 pytest。第一次跑挂了 3 个用例,都是--json相关的。原因是 Flash 在改写时把--json只加到了 list 子命令,但原测试里 add 也支持--json。我手动把--json加到 add 子命令,再跑,12 passed。这一步 2 轮,1 次介入。
3.3 第六步:边界检查
最后检查--tag的 append 行为和--json的输出格式。Flash 在这里表现不错,主动指出--tag在子命令里应该用action="append"并且default=[],避免 None 导致的迭代错误。这一步 1 轮,0 次介入。
3.4 实测记录表
下面是这次运行的完整记录。所有数字来自我这一次本地运行,环境是同一把 Key、同一个 Prompt、2025 年 1 月某次运行,一次运行不代表公榜。
| 步骤 | 完成轮次 | 人工介入次数 | 输入 Token(估) | 输出 Token(估) | 是否完成 |
|---|---|---|---|---|---|
| 1 读取结构 | 2 | 1 | ~1200 | ~400 | 是 |
| 2 设计映射 | 1 | 0 | ~800 | ~500 | 是 |
| 3 改写 cli.py | 2 | 1 | ~2500 | ~1800 | 是 |
| 4 调整测试 | 1 | 0 | ~600 | ~300 | 是 |
| 5 跑 pytest 修复 | 2 | 1 | ~1500 | ~900 | 是 |
| 6 边界检查 | 1 | 0 | ~700 | ~400 | 是 |
| 合计 | 9 | 3 | ~7300 | ~4300 | 12 passed |
Token 数是估算,因为 Continue 的用量面板显示的是请求次数,精确 Token 数要看 TaoToken 控制台的用量记录。建议读者在复现时直接以控制台数字为准,把上表的「估」换成实际值。
3.5 这次评测暴露的三个问题
第一个问题是 Agent 模式的编辑范围控制。Flash 在第三步只改了 parser 定义,没改下游的args.xxx引用,说明它在做跨段落编辑时容易「改一半」。这不是模型能力问题,而是 Continue 的 Agent 模式在文件编辑时给的上下文窗口有限,模型看不到完整文件的下游依赖。解决办法是在 Prompt 里明确说「改完后检查所有 args. 引用」。
第二个问题是测试路径的隐式依赖。原测试用main(["--list"])这种列表传参,重构后必须改成main(["list"])。Flash 主动发现了这一点,但如果测试文件更大,这种隐式依赖容易漏。建议在任务清单里单独列一步「检查所有测试的调用方式」。
第三个问题是--json的作用域。原代码里--json是全局参数,重构后 Flash 把它只放到了 list 子命令。这其实是一个设计决策——子命令结构下,全局参数和子命令参数的边界需要明确。我在介入时选择了「每个子命令各自支持 --json」,但也可以做成全局参数。这个决策点值得在评测时记录,因为它影响后续的测试改动量。
4. 可复现的 Token 消耗记录模板
上面那张表是这次运行的结果,但读者复现时数字会不同。下面给一个空白模板,按这个格式记录,方便横向对比不同模型或不同工具。
## 复现记录 - 日期: - 工具:Continue(版本:) - 模型:Qwen3.7 Flash(模型 ID:) - Base URL:https://taotoken.net/api - 任务:argparse 重构为子命令 | 步骤 | 完成轮次 | 人工介入 | 输入 Token | 输出 Token | 完成 | |------|----------|----------|------------|------------|------| | 1 读取结构 | | | | | | | 2 设计映射 | | | | | | | 3 改写主文件 | | | | | | | 4 调整测试 | | | | | | | 5 跑测试修复 | | | | | | | 6 边界检查 | | | | | | | 合计 | | | | | | - 最终测试结果:__ passed - 备注:Token 数从 TaoToken 控制台 的用量页面读取,按请求时间对应到步骤。如果一次对话跨多个步骤,按消息条数分摊。
这个模板的价值在于:它把「完成轮次」「人工介入」「Token 消耗」三个字段固定下来,换模型或换工具时只改表头,数字直接对比。比如你想对比 Qwen3.7 Flash 和另一个 Flash 模型在同一个任务上的表现,用同一份模板跑两遍,差异一目了然。
4.1 怎么读这三个字段
完成轮次反映的是模型一次做对的概率。轮次越少,说明模型对任务的理解越完整。但轮次少不一定代表好——如果模型一次改太多导致测试挂掉,轮次少反而意味着返工成本高。
人工介入次数反映的是模型输出与预期之间的偏差。介入多说明 Prompt 需要更明确,或者模型对这类任务不熟。介入少但轮次多,说明模型在自我修正,这也是可接受的。
Token 消耗反映的是成本。输入 Token 高说明上下文长,输出 Token 高说明模型在生成大量代码。重构任务里输出 Token 通常比输入高,因为要写新代码。
三个字段要一起看。比如这次运行 9 轮 3 介入,Token 合计约 11600,属于中等水平。如果换个模型跑出 6 轮 1 介入但 Token 翻倍,那就要权衡时间成本和费用。
4.2 复现时的注意事项
第一,Prompt 要固定。我这次用的 Prompt 是分步发的,每步一条消息。如果你一次性把整个任务贴进去,轮次和 Token 会完全不同。建议按任务清单分步发,这样记录才有可比性。
第二,测试文件不要改断言。这是任务约束,改了断言就失去对比意义。如果模型建议改断言,要拒绝并让它改被测代码。
第三,Token 数从控制台读,不要用 Continue 面板的估算。Continue 面板显示的是请求次数和粗略 Token,精确值以 TaoToken 控制台为准。
第四,记录环境。Python 版本、pytest 版本、Continue 版本都会影响结果。特别是 pytest 版本,不同版本的收集行为可能不同。
5. 排障:这次配置里踩过的坑
5.1 404:apiBase 多写了 /v1
最常见的错误。Continue 的 openai provider 会自动拼/v1/chat/completions,所以 apiBase 只能填到https://taotoken.net/api。如果你填了https://taotoken.net/api/v1,实际请求路径变成/api/v1/v1/chat/completions,返回 404。改回不带/v1即可。
5.2 401:Key 没填对或没生效
401 通常是 Key 问题。检查三件事:Key 是否从 TaoToken 控制台 创建、是否复制完整、config.json 里有没有多余空格。如果 Key 没问题,检查 Continue 是否重启过——改 config 后不重启,插件可能还在用旧配置。
5.3 模型 ID 不匹配
400 或model not found通常是模型 ID 写错。Qwen3.7 Flash 的 ID 以模型广场为准,不要凭记忆写。广场上的 ID 可能带版本号或前缀,复制粘贴最稳妥。
5.4 Agent 模式不触发工具调用
如果 Continue 的 Agent 模式只聊天不编辑文件,检查 config 里有没有覆盖systemMessage。有些用户会自定义 system message,把工具调用指令覆盖掉了。删掉自定义 system message,用默认的即可。
5.5 补全和对话抢配额
如果同时开了 tab 补全和对话,补全请求会消耗大量 Token。建议在评测期间关掉 tab 补全,只留对话,这样 Token 记录更干净。补全的 Token 消耗单独测。
6. 这次评测的结论和下一步
Qwen3.7 Flash 在 Continue 里跑这个 Python CLI 重构任务,9 轮完成,3 次人工介入,12 个测试全过。这个结果说明 Flash 级别的模型在结构化重构任务上是可用的,但需要把任务拆细,并且在 Prompt 里明确检查点。Continue 的 Agent 模式在跨段落编辑时容易「改一半」,这是工具层面的限制,不是模型问题。
如果你要复现这个评测,建议按第 4 节的模板记录,把 Token 数从控制台读出来填进去。跑完之后可以打开 模型对话 确认 Qwen3.7 Flash 的模型 ID 和广场一致,长期做这类重构可以看 Coding Plan。Key 在 控制台 创建,Claude Code 或 CC Switch 的接入方式对照 接入文档。
下一步我打算用同一套任务清单和记录模板,换一个模型跑一遍,对比完成轮次和 Token 消耗。如果你也跑了,欢迎把记录表贴出来对照。
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度