1. 为什么要在 Claude Code 里给 DeepSeek-V4-pro 配一个代理测试工程师
Claude Code 本身是一个终端里的编码代理,能读文件、跑命令、改代码。但当你把底层模型换成 DeepSeek-V4-pro 之后,会发现一个很现实的问题:全栈开发里最耗上下文的往往不是写业务代码,而是测试。写一个接口要顺手补单测、补集成测试、补边界用例,主对话很快就被一堆断言、mock、fixture 塞满,等你回头想改业务逻辑时,前面聊过的设计意图已经被挤到上下文窗口边缘了。
subagents 就是解决这个问题的机制。你可以把它理解成 Claude Code 内部的一次“委派”:主代理把一块边界清晰的任务交给一个子代理,子代理有自己的角色定位、自己的上下文窗口、可以限制它能用哪些工具、还能挂一份单独的 system prompt。它干完活把结果带回来,主对话只拿到结论,不被中间过程污染。这跟“再开一个对话窗口”完全不是一回事,后者你得手动复制粘贴,前者是 Claude Code 的正式能力。
我这次要复现的场景很具体:用 Claude Code 接入 DeepSeek-V4-pro,然后定义一个叫 test-engineer 的 subagent,让它专门负责代理测试。所谓代理测试工程师,就是让这个子代理站在测试角色上,对主代理刚写完的全栈代码做一轮验证——跑测试命令、读失败输出、定位是断言写错还是实现有 bug、给出修复建议,必要时直接改测试文件。主代理负责写功能,子代理负责挑毛病,分工明确。
适合谁看?如果你已经在用 Claude Code 写项目,但每次测试都让主对话硬扛,上下文一长就变慢变贵,那这套 subagents 编排值得试。如果你还没配过 DeepSeek-V4-pro 的接入通道,下面第二节会先把 Key 和 Base URL 的事说清楚,再进配置。
subagents 和 Agent Teams 的区别也顺带提一句:subagents 是主 Claude 委派一个子任务、等结果回来;Agent Teams 是多个 Claude Code 实例协作、彼此独立上下文还能直接通信。对绝大多数场景,先把 subagents 用熟就够了,Agent Teams 目前还是实验性能力,复杂协作再考虑。
2. TaoToken 前置:给 Claude Code 准备统一 Key 与 API 通道
Claude Code 默认走 Anthropic 的接口,要让它调用 DeepSeek-V4-pro,中间需要一个兼容 Anthropic 协议的通道。TaoToken 提供的就是这个统一 Key / API 通道,你不用为每个模型单独维护一套鉴权,一个 Key 走通对话、编码、Agent 场景。
先拿 Key。打开官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,注册后在控制台里创建 API Key。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,进去之后左侧找 API Keys,新建一个,复制出来。这个 Key 后面要写进 Claude Code 的环境变量,别弄丢。
拿到 Key 之后,你需要记住两个地址:Base URL 用 https://taotoken.net/api ,注意这个不加 UTM 参数,直接写就行;模型 ID 这次用 DeepSeek-V4-pro。Claude Code 的接入方式是通过环境变量指定 Base URL 和 Key,它会把请求发到你配置的地址,由通道转发到对应模型。
这里有个容易踩的坑:Claude Code 读的是 ANTHROPIC_BASE_URL 和 ANTHROPIC_AUTH_TOKEN 这两个变量,不是 OPENAI 那套。很多人配惯了 OpenAI 兼容接口,顺手写成 OPENAI_API_KEY,结果 Claude Code 根本不认,报 401。所以下面配置片段里我会明确写这两个变量名。
另外,如果你同时用 Cline、Codex 或者 CC Switch 这类工具,建议把三件套统一记下来:Base URL 是 https://taotoken.net/api ,Key 是你在控制台建的那个,Model ID 是 DeepSeek-V4-pro。三件套对齐了,换工具时不用重新猜。
TaoToken 在这里的角色是通道,不是替代你的编辑器或 Claude Code 本身。Claude Code 还是那个终端代理,subagents 还是 Claude Code 的机制,TaoToken 只负责把请求稳定地送到 DeepSeek-V4-pro。理解这一点,后面排查问题时思路会清楚很多:配置错了是 Claude Code 侧的事,鉴权错了是 Key 的事,模型返回异常才可能是通道或模型侧的事。
3. 可复制配置:settings.json 与 test-engineer subagent 定义
这一节给两份可直接复制的配置。第一份是 Claude Code 的 settings,第二份是 test-engineer 这个 subagent 的定义文件。
先看 Claude Code 的 settings。它一般放在用户级目录 ~/.claude/settings.json ,项目级可以放 .claude/settings.json 。内容如下,把里面的 Key 换成你自己的:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "sk-你的TaoToken密钥", "ANTHROPIC_MODEL": "DeepSeek-V4-pro", "ANTHROPIC_SMALL_FAST_MODEL": "DeepSeek-V4-pro" } }这里 ANTHROPIC_MODEL 指定主模型,ANTHROPIC_SMALL_FAST_MODEL 是给一些轻量任务用的,统一填 DeepSeek-V4-pro 就行。保存后重启 Claude Code,它启动时会读这份配置。
接下来是 subagent 定义。subagents 的文件放哪,决定了它的作用域:项目级放 .claude/agents/ ,只对当前项目生效;用户级放 ~/.claude/agents/ ,对所有项目生效;plugin 自带的放 plugin 的 agents/ 目录。优先级上,CLI 临时用 --agents 定义的最高,只影响当前 session;然后是项目级 .claude/agents/ ;最后是用户级 ~/.claude/agents/ 。也就是说项目级会覆盖同名用户级。如果你在团队项目里发现本机有个同名 agent 但表现不一样,先查 .claude/agents/ 是不是把它盖掉了。
创建目录并放入定义文件:
mkdir -p .claude/agents然后新建 .claude/agents/test-engineer.md ,内容如下:
--- name: test-engineer description: 代理测试工程师,负责对刚完成的全栈代码做测试验证、定位失败原因并给出修复建议 tools: Read, Grep, Glob, Bash, Edit model: DeepSeek-V4-pro --- 你是一名代理测试工程师。你的职责不是写业务功能,而是验证别人写的代码是否正确。 工作流程: 1. 先读项目里的测试配置(package.json、pytest.ini、vitest.config 等),确认测试命令。 2. 运行测试命令,收集失败输出。 3. 对每个失败用例,判断是测试本身写错,还是实现有 bug。 4. 如果是测试写错,直接修改测试文件;如果是实现有 bug,给出最小复现和修复建议,不要擅自大改业务代码。 5. 最后输出一份简短报告:通过数、失败数、每个失败的根因、你做了什么修改。 约束: - 只动测试相关文件和必要的配置,业务逻辑改动必须先说明理由。 - 不要引入新的测试框架,沿用项目现有依赖。 - 命令输出里的敏感信息不要回显。这份定义里 tools 限制了它能用的工具:Read、Grep、Glob 用来读代码,Bash 用来跑测试命令,Edit 用来改测试文件。没有给它 WebFetch 之类的工具,避免它跑偏去查资料。model 指定 DeepSeek-V4-pro,跟主模型一致。
装好之后,在 Claude Code 里可以用 /agents 命令查看当前可用的 subagents,应该能看到 test-engineer。内置的还有 Explore、Plan、general-purpose 这几个,Explore 适合探索代码库,Plan 适合做规划,general-purpose 是通用兜底。
4. 验证请求:一次端到端代理测试编排
配置好了,来跑一次完整的验证。我准备了一个小项目:一个 Express 接口,带一个加法函数和它的单测。故意在实现里埋一个 bug,看 test-engineer 能不能抓出来。
项目结构大概是这样:
demo-app/ package.json src/ calc.js server.js test/ calc.test.jssrc/calc.js 里我写了:
function add(a, b) { return a - b; // 故意写错 } module.exports = { add };test/calc.test.js 里断言 add(2, 3) 等于 5。跑 npm test 会失败。
现在在 Claude Code 里,主代理先完成一个任务,比如“给 calc.js 加一个 multiply 函数并补测试”。主代理写完功能后,我让它委派 test-engineer 做验证。在对话里输入类似这样的指令:
请委派 test-engineer 子代理,对当前项目运行完整测试,定位所有失败用例的根因,并修复测试侧的问题。实现侧的 bug 给出修复建议即可。Claude Code 会把任务交给 test-engineer。子代理启动后,先读 package.json 确认测试命令是 npm test,然后跑:
npm test输出里会看到 calc.test.js 失败,断言期望 5 实际得到 -1。test-engineer 读 src/calc.js,发现 add 里写的是 a - b,判断这是实现 bug,不是测试写错。按定义里的约束,它不擅自改业务代码,而是输出报告:失败 1 个,根因是 add 实现用了减法,建议把 return a - b 改成 return a + b。
如果失败的是测试本身写错,比如断言写成了 add(2,3) 等于 6,test-engineer 会直接用 Edit 改测试文件。这就是工具隔离的价值:它只能动测试相关的东西,业务代码要改得先说明。
整个过程中,主对话只拿到最终报告,中间那一堆 npm 输出、文件读取、断言比对都没进主上下文。这就是 subagents 上下文隔离的实际效果。你可以对比一下:如果不委派,这些输出全堆在主对话里,聊几轮之后主代理就开始“忘事”。
验证成功的标志有三个:一是 test-engineer 被正确调用,二是它跑出了测试命令并读到失败输出,三是它给出的根因判断和你的预期一致。三个都满足,说明接入和编排都通了。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
配 subagents 和接入通道时,报错基本集中在几个地方。下面按真实报错对照排查。
401 鉴权失败。最常见的原因是 Key 写错或变量名写错。Claude Code 读 ANTHROPIC_AUTH_TOKEN,不是 OPENAI_API_KEY。检查 settings.json 里这个变量名对不对,Key 有没有多余空格,有没有把控制台里的 Key ID 当成 Key 本身。如果 Key 是对的还报 401,去控制台确认这个 Key 有没有被禁用或额度耗尽。
local proxy failed。这个通常出现在你本地还跑着别的代理工具,端口冲突或者环境变量指向了本地地址。检查 ANTHROPIC_BASE_URL 是不是被别的配置覆盖成了 localhost 之类。Claude Code 会读多份 settings,项目级会覆盖用户级,确认最终生效的是 https://taotoken.net/api 。
reading choices 相关报错。这类多半是模型返回格式和 Claude Code 预期不一致,常见于 Model ID 填错。确认 ANTHROPIC_MODEL 填的是 DeepSeek-V4-pro,没有拼写错误,也没有填成别的模型名。如果 Model ID 对但还报,检查是不是 Small Fast Model 那个变量填了不存在的模型。
OAuth 报错。Claude Code 有些版本会尝试走 OAuth 登录流程,如果你用的是 API Key 模式,需要在配置里明确走 token 鉴权。确认 settings.json 里没有残留的 OAuth 相关配置,环境变量以 ANTHROPIC_AUTH_TOKEN 为准。如果之前登录过 Anthropic 账号,清一下 ~/.claude 下的凭据缓存再重启。
还有一个隐蔽的坑:subagent 定义文件里的 frontmatter 格式。name、description、tools、model 这几个字段,冒号后面要有空格,tools 用逗号分隔。格式错了 Claude Code 会静默忽略这个 agent,你在 /agents 里看不到它,还以为是接入问题。用 YAML 校验一下最稳。
排查顺序建议:先确认 Key 和 Base URL 三件套(Base URL、Key、Model ID)对齐,再看 settings 变量名,最后看 subagent 文件格式。大部分问题在前两步就能定位。
6. 继续往下走:把代理测试接进你的日常编码流
跑通一次端到端验证之后,你可以把 test-engineer 固化进日常流程。比如每次主代理写完一个模块,就顺手委派它跑一轮测试;或者配一个 pre-commit 的约定,提交前让子代理过一遍。subagents 的可复用性就在这里,定义一次,团队共享。
如果你还想验证模型对话本身的表现,可以去模型对话页面直接试 https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite ,对比一下 DeepSeek-V4-pro 在不同 prompt 下的输出。长期做编码和 Agent 任务的话,Coding Plan 更适合 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,额度和通道都按编码场景配好了。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,遇到配置细节可以对着查。Key 管理还是回控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,API Keys 页面能建能删。
最后留一个实用技巧:test-engineer 的定义别写太死。tools 里给 Bash 是必须的,不然跑不了测试;但如果你项目里有危险命令,可以在 system prompt 里明确禁止,比如“不要执行 rm、drop、truncate 这类命令”。子代理的工具隔离是硬约束,prompt 约束是软约束,两层都加上更稳。等你把这一套跑顺,再考虑 Agent Teams 那种多实例协作也不迟。