【claude code实践】用 Subagents 做代码审查:主代理开发,审查代理把关
发布时间:2026/10/13 3:32:01 锦皓数字建站

1. 为什么主代理自己审自己的代码总是不靠谱如果你用 Claude Code 写过稍具规模的功能大概率遇到过这种别扭主代理刚把src/payment/下的改动写完你让它“顺手 review 一下”它回你一句“代码看起来没问题逻辑清晰”然后你手动翻 diff发现processor.js第 42 行硬编码了一个测试用的 secretvalidator.js里用户输入直接拼进了 SQL。它不是故意糊弄而是同一个会话里“构建模式”和“批判模式”互相打架——刚写完代码的上下文里全是“我为什么这么写”的自我合理化让它挑自己的错等于让作者给自己的作文打分。这个问题的根子不在模型能力而在工作流。人类开发早就把“写”和“审”拆成两个角色作者不审自己的 PR是软件工程几十年的共识。Claude Code 的 Subagents 机制恰好能把这条规则搬到 AI 工作流里主代理负责功能开发审查代理以独立上下文、独立系统提示、独立工具权限进入项目只看 diff 和项目规范不看主代理的推理过程。写的人不管审审的人不管写信息隔离逼出更客观的判断。这篇面向的是已经在用 Claude Code 做日常开发、但还没把审查职责拆出来的团队。我会给出可直接复制的 subagent 配置片段、触发规则、一次真实 PR 的审查流程以及验证请求是否真正走通的命令。全程围绕 Claude Code Subagents 代码审查这个落地场景不空谈概念。TaoToken 在这里的角色是统一 Key/API 通道——不管你用 Claude Code、Codex 还是 Cline模型调用都走同一个入口省得每个工具配一遍。先说清楚 Subagent 到底是什么避免后面配置时概念混淆。它是一个拥有独立上下文窗口、独立工具集、独立系统指令的临时代理实例由主代理按需创建、任务完成后销毁。它看不到主代理的对话历史只能基于委派时收到的任务描述和它能访问的文件工作。代码审查是它的典型场景不需要知道代码为什么这么写只需要基于代码本身和项目规范做判断。它不是多线程Subagent 之间不共享状态也不是多个模型同时跑通常复用同一个底层模型靠不同的系统提示和工具权限模拟出不同角色。理解这一点后面的配置才不会跑偏。2. TaoToken 前置统一 Key 与 API 通道怎么配在写 subagent 配置之前得先把模型调用通道打通。Claude Code 默认走 Anthropic 官方端点但团队里往往同时有 Codex、Cline、Cursor 多个工具每个都配一遍 Key 和 Base URL 很烦。TaoToken 提供统一 Key/API 通道官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 这个地址不加 UTM直接用于配置。你需要先拿到一个 API Key。登录后进控制台在 API Keys 页面创建一个复制出来形如sk-xxxxxxxx。这个 Key 后面会同时填进 Claude Code 的环境变量和 subagent 的模型配置里。注意Subagent 本身不单独配 Key它复用主代理的模型通道所以只要主代理能正常调用模型Subagent 就能跑。Claude Code 的接入方式是在项目根目录或用户目录下配置环境变量。最直接的做法是在 shell 里导出或者写进~/.claude/settings.json。我实测下来用 settings.json 更稳因为 Claude Code 启动时会读它。配置片段如下路径和字段名保持和官方一致{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的TaoToken密钥 } }如果你用的是 Codex它读的是~/.codex/auth.json格式不同需要写全三件套 Base URL、Key、Model ID{ base_url: https://taotoken.net/api, api_key: sk-你的TaoToken密钥, model: claude-sonnet-4-20250514 }Cline 或 CC Switch 这类工具则在图形界面里填 Base URL 和 KeyModel ID 选claude-sonnet-4-20250514或你账号可用的其他模型。三件套缺一不可尤其是 Model ID填错了会直接报模型不存在。配完之后先别急着写 subagent用一条最小请求验证通道是否通。Claude Code 里直接输入一句“列出当前目录文件”如果它能正常调用工具并返回结果说明 Base URL 和 Key 都生效了。如果报 401多半是 Key 复制时带了空格如果报连接失败检查 Base URL 是不是写成了带路径的完整地址——这里只需要https://taotoken.net/api不要在后面加/v1之类。有一点要提醒Subagent 的模型调用会计入你的 API 用量每个 Subagent 独立计费。审查代理如果配了强模型、又频繁触发成本会上去。所以后面配置里我会建议审查代理用中等模型深度审查再手动升级。3. 可复制的 Subagent 配置与触发规则Claude Code 的 Subagent 通过 Markdown 文件定义放在项目的.claude/agents/目录下或者用户级的~/.claude/agents/。文件名就是 agent 的标识比如code-reviewer.md。文件由 YAML frontmatter 和正文指令两部分组成。下面是一个可以直接复制使用的代码审查 Subagent 配置我把它放在.claude/agents/code-reviewer.md--- name: code-reviewer description: 代码审查专家用于 review PR、检查代码规范和安全问题。当主代理完成功能开发或用户要求审查改动时触发。 model: claude-sonnet-4-20250514 tools: - Read - Grep - Glob - Bash permissions: read-only --- 你是一个专注代码评审的子代理。你的职责是独立审查代码改动不参与代码生成。 工作流程 1. 先用 Bash 执行 git diff --stat 和 git diff 确认本次改动范围 2. 用 Read 读取改动的完整文件用 Grep 搜索敏感模式password、secret、eval、exec、innerHTML 等 3. 按以下维度逐项检查 - 安全性硬编码凭证、注入风险、未验证输入、敏感信息泄露 - 正确性边界条件、错误处理、空值判断、并发问题 - 规范性命名、注释、项目既有风格一致性 - 性能明显的低效循环、重复 IO、未释放资源 4. 每条问题必须注明文件路径和行号并给出严重程度严重/警告/建议 5. 末尾给出 1-5 的总体评分和一句话结论 约束 - 你只有读权限不要尝试修改任何文件 - 如果读不到某个文件直接说明读不到不要猜测内容 - 不要评价代码的业务逻辑是否合理那不是你的职责 - 输出用中文结构清晰不要客套话关键字段逐个说。tools限制了审查代理只能用 Read、Grep、Glob、Bash 这四个其中 Bash 是为了跑git diff但permissions: read-only确保它不会写文件。model指定了具体模型你可以换成账号里更便宜或更强的模型。description很重要主代理靠它判断什么时候该委派任务——写得太模糊主代理可能不触发。触发规则有两种。一种是自然语言触发你在 Claude Code 里说“用 code-reviewer 审查 src/payment/ 的改动”主代理会匹配到 description 并创建 Subagent。另一种是自动触发在项目的CLAUDE.md里写规则比如## 工作流规则 - 每完成一个功能模块的开发必须调用 code-reviewer 子代理审查改动 - 审查未通过存在严重问题时不得进入下一个任务 - 审查代理只读修改由主代理在用户确认后执行这样主代理在完成开发后会主动委派审查形成质量门禁。我试过在CLAUDE.md里加这条规则后主代理确实会在写完代码后自动调起审查代理不需要每次手动喊。如果你用的是 Cline 的 MCP 模式配置思路类似但 Subagent 定义放在 MCP server 的配置里Base URL、Key、Model ID 三件套同样要写全。CC Switch 则是在切换配置时把这三项一起切避免手动改多个文件。配置写完后用/agents命令在 Claude Code 里查看已注册的 Subagent 列表确认code-reviewer出现在里面。如果没出现检查文件路径和 frontmatter 格式——YAML 的缩进错了会导致解析失败。4. 验证请求与一次真实 PR 审查流程配置好之后得验证审查代理真的能跑起来、真的在独立上下文里工作。最直接的验证是发起一次审查请求观察返回结果是否包含文件路径和行号。下面用一次真实的支付模块 PR 走一遍。假设你在src/payment/下刚用主代理写完三个文件processor.js、validator.js、routes.js。改动已经git add但没提交。在 Claude Code 里输入用 code-reviewer 审查 src/payment/ 目录下本次的所有改动重点关注安全问题主代理识别到审查任务创建 Subagent 并委派。审查代理启动后第一步跑git diff --stat看到三个文件共 87 行改动。然后跑git diff拿到具体内容用 Grep 搜索password|secret|eval|exec等模式。接着用 Read 读取三个完整文件。它返回的报告结构大致如下## 代码审查报告src/payment/ ### 严重问题 - src/payment/processor.js:42 - 硬编码 API secretconst SECRET sk-test-12345应改为从环境变量读取 - src/payment/validator.js:18 - 用户输入未做参数化处理存在 SQL 注入风险db.query(SELECT * FROM users WHERE id userId) ### 警告 - src/payment/processor.js:67 - 使用了已弃用的 crypto.createCipher建议迁移到 createCipheriv - src/payment/routes.js:23 - 支付回调接口缺少速率限制可能被刷 ### 建议 - src/payment/utils.js:12 - let total 未重新赋值建议改 const ### 总体评分3/5 存在两个严重安全问题修复后可提升至 4/5。拿到报告后你确认processor.js:42的硬编码确实存在让主代理改成process.env.PAYMENT_SECRET。validator.js:18改成参数化查询。修改完再次发起审查这次审查代理只看到改动后的代码重新评估后给出 4/5。这里有个验证动作很关键审查代理报告里每条问题都带文件路径和行号你逐条打开对应位置核对。如果发现某条问题指向的行号根本不存在对应代码说明审查代理产生了幻觉需要在它的系统提示里加强“读不到就说读不到”的约束。我实测下来加了这条约束后幻觉明显减少。另一个验证点是确认审查代理真的独立。你可以在审查过程中观察主代理的上下文——它只收到最终报告看不到审查代理的中间推理。如果你在报告里看到审查代理引用了主代理的对话内容说明隔离没生效检查 Subagent 配置是否被主代理的上下文污染。对于团队协作可以把审查代理接进 CI。在 GitHub Actions 里跑 Claude Code 的 headless 模式对每个 PR 自动触发审查把报告作为 PR 评论贴出来。注意审查结果只作为参考不要配置自动合并——最终决策必须由人做。5. 本篇常见报错排查配置和运行过程中最容易撞上的是几类固定报错。下面按真实错误信息对照排查。401 Unauthorized。这个最常见出现在主代理调用模型时。原因通常是 API Key 复制时带了首尾空格或者 Key 已过期。检查settings.json里的ANTHROPIC_API_KEY字段确保是完整的sk-开头字符串没有换行。如果用的是 Codex 的auth.json确认api_key字段名拼写正确不是apikey或api-key。local proxy failed / connection refused。这个报错说明 Claude Code 尝试连接的 Base URL 不通。检查ANTHROPIC_BASE_URL是否写成了https://taotoken.net/api不要多加/v1或结尾斜杠。如果你在本地开了其他网络工具先关掉再试避免端口冲突。这个报错和网络环境有关但不要尝试用任何非正规手段绕过直接检查配置地址即可。reading choices / unexpected response format。这个报错通常出现在模型返回格式不符合预期时比如你配的 Model ID 不存在或不被支持。检查model字段是否写成了账号可用的模型名比如claude-sonnet-4-20250514。如果 Model ID 拼错API 会返回一个错误结构Claude Code 解析时就会报 reading choices 失败。OAuth error / authentication failed。如果你之前用 Anthropic 官方账号登录过 Claude Code它可能缓存了 OAuth token和新的 API Key 冲突。解决办法是清除~/.claude/下的缓存文件或者显式在 settings.json 里设置 API Key 覆盖 OAuth。Codex 的auth.json如果同时存在 OAuth 字段和 api_key 字段也可能冲突删掉 OAuth 相关字段只留三件套。Subagent 不触发。你喊了“审查代码”但主代理没创建 Subagent。检查.claude/agents/code-reviewer.md的description字段是否包含触发关键词比如“审查”“review”“代码规范”。description 写得太窄主代理匹配不到。另外确认文件放在正确目录项目级是.claude/agents/用户级是~/.claude/agents/。审查代理报权限错误。如果审查代理尝试写文件被拒说明permissions: read-only生效了这是预期行为。但如果你希望它能跑测试需要给它 Bash 权限同时确保它不会执行破坏性命令。可以在系统提示里明确“只允许执行 git diff、git log、npm test 等只读或测试命令”。模型调用计费异常。Subagent 每次调用独立计费如果发现用量飙升检查是不是自动触发规则太激进每个小改动都调审查。可以在CLAUDE.md里把触发条件收紧到“完成一个完整功能模块后”而不是每次文件保存都触发。排查时有个通用思路先确认主代理能正常调用模型发一句简单对话再确认 Subagent 能被识别/agents列表最后确认审查任务能跑通。三层逐层验证比一上来就调 Subagent 容易定位问题。6. 把审查职责拆出去之后主代理开发、审查代理把关这个模式真正改变的不是谁在写代码而是审查发生在什么时候、由谁来做。过去 AI 生成的代码要等你手动翻 diff 才发现问题现在代码写完的当下就有一个独立视角的代理过一遍把硬编码密钥、注入风险、弃用 API 这类基础问题挡在你看到之前。你省下的时间花在真正需要人类判断的地方——业务逻辑是否合理、架构选型是否合适、这个改动值不值得上。配置上核心就是三件事一个放在.claude/agents/下的 Markdown 定义文件一份写全 Base URL、Key、Model ID 的通道配置一条在CLAUDE.md里的触发规则。审查代理只读、独立上下文、带行号反馈这三点保证了它的判断不受主代理偏见影响。验证时逐条核对文件路径和行号发现幻觉就在系统提示里加约束。如果你还没配通道可以从 https://taotoken.net/api-keys 拿一个 Key接入文档在 https://taotoken.net/doc 有各工具的详细步骤。想先验证模型对话是否通用 https://taotoken.net/chat 发一条消息试试。团队长期做编码和 Agent 工作流的话Coding Plan 在 https://taotoken.net/coding-plan 有更划算的用量方案。Claude Code 的 Anthropic 兼容接入细节在 https://taotoken.net/claudecode-anthropic 有说明。最后留一个实用技巧审查代理的评分不要设成通过/不通过二值用 1-5 分更灵活。3 分以上可以继续3 分以下先修严重问题再进下一步。这样既不会因为一个建议卡住流程也不会放过真正的风险。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。