拆解 Claude Code 内核:ReAct 循环、分层子 Agent 与多层安全体系

📅 发布时间:2026/10/11 3:25:10
拆解 Claude Code 内核:ReAct 循环、分层子 Agent 与多层安全体系
1. 从一次“AI 突然变笨”说起ReAct 循环到底在循环什么如果你用 Claude Code 写过稍大一点的项目大概率遇到过这种场景前半小时它还能准确改对文件聊到后面突然开始重复读同一个文件、忘记你之前定的命名规范甚至把已经改好的代码又改回去。很多人第一反应是“模型不行了”但拆开它的 TypeScript 内核你会发现问题往往出在 ReAct 循环的上下文管理上而不是模型本身。Claude Code 的核心骨架其实非常朴素就是一个不断重复「推理 → 行动 → 观察」的 while 循环。模型拿到当前对话历史判断下一步该做什么Reasoning决定调用哪个工具Acting工具执行完把结果塞回上下文Observation然后进入下一轮。停止条件不是写死的“调用 5 次就停”而是模型自己判断任务完成、输出纯文本时跳出循环。这个设计的关键在于编程任务天然是多步骤的。你说“帮我修这个 bug”它得先 Grep 搜相关代码、Read 读文件、Edit 改代码、Bash 跑测试中间任何一步失败都要回头调整。每一步都是循环里的一次迭代而每次迭代都会往上下文里塞入工具返回结果。这就是为什么对话久了会“失忆”——不是模型变笨是上下文被压缩机制截断了。我实测下来一个中等复杂度的重构任务ReAct 循环跑 30 到 50 轮很常见每轮 Read 一个 500 行文件就是 3000 到 5000 Token几轮下来上下文占用就逼近阈值。理解这个循环是理解后面子 Agent 分层和安全体系的前提。本文会从循环机制切入逐层拆到子 Agent 调度和多层安全拦截并给出可复制的配置片段和验证步骤让你在本地复现核心链路。适合谁看已经用过 Claude Code 或类似编程 Agent、想搞懂内部机制的开发者正在自研 Agent、需要参考工程化设计的同学以及被“AI 越用越笨”困扰、想从根上理解上下文压缩的人。2. 前置准备TaoToken 接入与 Claude Code 环境配置在复现内核链路之前得先把模型调用通道打通。Claude Code 本身是客户端真正干活的是背后的模型 API。这里我用 TaoToken 作为统一接入层它兼容 Anthropic 的接口协议配置方式和官方一致省去自己维护多套 Key 的麻烦。先说清楚 TaoToken 是什么它是一个大模型 API 聚合接入服务提供统一的 Base URL 和 Key 管理支持 Claude 系列模型的对话与编码场景。对 Claude Code 来说你只需要把 Base URL 指向它、填上 Key就能正常跑通 ReAct 循环。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 端点是 https://taotoken.net/api 注意 API 地址不带 UTM 参数。第一步去控制台创建 API Key。打开 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 登录后在 API Keys 页面新建一个 Key复制保存。这个 Key 就是后面所有配置里的ANTHROPIC_AUTH_TOKEN。第二步确认你要用的模型 ID。Claude Code 场景下常用的是 Claude 系列具体模型名以控制台或文档为准。你可以先在模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 发一条消息确认 Key 和模型都能正常工作再去配客户端。第三步环境变量配置。Claude Code 读取的是 Anthropic 风格的环境变量在~/.zshrc或~/.bashrc里加上export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_AUTH_TOKENsk-你的Key export ANTHROPIC_MODELclaude-sonnet-4-5改完执行source ~/.zshrc生效。这里有个坑要注意ANTHROPIC_BASE_URL后面不要带/v1Claude Code 会自己拼接路径多写一层会 404。如果你用的是 Claude Code 的 settings 文件方式可以在~/.claude/settings.json里写{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的Key, ANTHROPIC_MODEL: claude-sonnet-4-5 } }这个 JSON 片段就是 §3 要讲的可复制配置的核心路径和字段名保持和官方一致直接改 Key 就能用。配置完成后Claude Code 的每一次 ReAct 循环请求都会走 TaoToken 转发到模型你在控制台的用量页面能看到对应的 Token 消耗方便对照后面讲的压缩机制观察成本变化。3. 可复制配置把 ReAct 循环、子 Agent 与安全规则落到文件这一节给你三份可以直接抄的配置分别对应循环行为、子 Agent 调度和安全权限。它们都是 Claude Code 实际读取的文件格式路径和字段名保持一致。3.1 settings.json控制循环与模型分层Claude Code 的全局配置在~/.claude/settings.json项目级在项目根目录的.claude/settings.json。下面这份配置同时设置了接入通道、模型分层和权限规则{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的Key, ANTHROPIC_MODEL: claude-sonnet-4-5, ANTHROPIC_SMALL_FAST_MODEL: claude-haiku-4-5 }, permissions: { allow: [ Read, Glob, Grep ], ask: [ Bash(git push:*), Bash(rm:*) ], deny: [ Read(./.env), Read(./secrets/**), Bash(curl:*) ] } }这里ANTHROPIC_SMALL_FAST_MODEL就是子 Agent 和权限初筛用的小模型对应 Haiku 级别。permissions里的三段就是后面要讲的 deny ask allow 优先级模型顺序不能乱。3.2 子 Agent 定义Explore 与 Plan 的分工子 Agent 在 Claude Code 里通过 Agent 工具启动类型由参数决定。你可以在项目里放一个.claude/agents/目录来固化常用子 Agent 的提示词。比如explore.md--- name: explore model: claude-haiku-4-5 tools: [Read, Glob, Grep] --- 你是一个只读探索 Agent。任务是在代码库中快速定位与用户问题相关的文件和代码片段。 约束 - 只能使用 Read、Glob、Grep 三个工具 - 不允许修改任何文件 - 最终只返回不超过 2000 Token 的摘要包含文件路径、关键函数名、行号 - 不要返回完整文件内容plan.md则继承主模型、同样只读负责梳理实现路径。这两个文件对应了内核里“用最便宜的模型干最脏的活”的设计Explore 用 Haiku 跑几十次搜索最后只把摘要喂回主模型。3.3 CLAUDE.md项目级规则注入项目根目录的CLAUDE.md不是系统提示词而是作为用户消息注入优先级低于官方安全规则但高于普通对话。写一份精简的# 项目约定 - 技术栈TypeScript Node 20包管理用 pnpm - 测试命令pnpm test - 构建命令pnpm build - 禁止直接修改 dist/ 目录 - 提交信息用 conventional commits 格式这份文件每次新对话自动加载相当于给 AI 一份项目说明书。注意它和系统提示词是分开的这也是安全设计的一部分——用户自定义内容不能覆盖官方红线。三份配置放好后Claude Code 启动时会依次读取settings.json 定通道和权限CLAUDE.md 注入项目上下文Agent 定义决定子 Agent 行为。接下来就可以验证循环是否真的跑起来了。4. 验证请求观察 ReAct 循环、子 Agent 与安全拦截的实际效果配置写完得用真实请求验证每一层是否生效。我按“循环 → 子 Agent → 安全拦截”的顺序给你三步验证法。4.1 验证 ReAct 循环在跑在项目目录下启动 Claude Code输入一个需要多步操作的任务比如“找出所有调用 fetchUser 的地方并告诉我每个调用点的文件路径”。正常的话你会看到它连续执行 Grep → Read → 输出摘要而不是一次性回答。这就是 ReAct 循环在迭代Grep 是 Acting返回的匹配结果是 Observation模型据此决定下一步 Read 哪个文件。想更直观地看循环次数可以开启 verbose 模式claude --verbose输出里会打印每一轮的工具调用和 Token 消耗。你会注意到读文件那几轮的输入 Token 增长很快这正是后面压缩机制要处理的部分。4.2 验证子 Agent 分层输入一个探索型任务“用 Explore 子 Agent 扫描 src/ 目录列出所有导出的 React 组件及其文件路径”。如果配置生效你会看到它启动了一个只读子 Agent用的是 Haiku 模型过程中不会弹权限框因为 Read/Glob/Grep 在 allow 列表里最后返回一份精炼摘要。对照验证把.claude/agents/explore.md里的tools改成包含Edit再跑一次你会发现权限系统会拦截——因为子 Agent 的只读约束和全局权限规则叠加生效了。这一步能直观看到“子 Agent 上下文隔离 权限继承”的双重约束。4.3 验证安全拦截这是最能体现多层安全体系的一步。依次输入三个命令观察不同反应第一个输入“读取 .env 文件的内容”。因为deny里有Read(./.env)它会直接拒绝不弹框、不询问这就是 deny 优先级最高的表现。第二个输入“执行 git push origin main”。ask里有Bash(git push:*)它会弹框让你确认你点拒绝后操作终止。这验证了 ask 层的拦截。第三个输入“用 curl 请求一下这个接口”。deny里有Bash(curl:*)直接拒绝。你可以把这条从 deny 挪到 ask重启后再试就会变成弹框询问——这验证了规则优先级同一条规则放在不同层级行为完全不同。跑完这三步你应该能清楚看到ReAct 循环负责“怎么一步步做”子 Agent 负责“谁来分担上下文”安全体系负责“哪些能做、哪些要问、哪些绝对不行”。三层各司其职缺一层都会出问题。5. 常见报错排查401、local proxy failed 与 OAuth 报错怎么解配置和验证过程中最容易卡在几个固定报错上。我把真实遇到过的整理成对照表方便你按现象定位。5.1 401 Unauthorized现象启动 Claude Code 后第一次请求就返回 401提示 authentication failed。原因通常是 Key 没生效或 Base URL 写错。排查顺序先确认ANTHROPIC_AUTH_TOKEN是不是完整复制了有没有多余空格再确认ANTHROPIC_BASE_URL是https://taotoken.net/api末尾没有/v1最后检查环境变量有没有被 settings.json 里的env覆盖——两处都配了的话settings.json 优先级更高改错地方等于没改。修复在终端执行echo $ANTHROPIC_AUTH_TOKEN确认值正确然后echo $ANTHROPIC_BASE_URL确认地址。如果用的是 settings.json直接改文件里的 Key重启 Claude Code。5.2 local proxy failed现象请求发不出去报local proxy failed或连接被拒绝。这个报错一般和本地网络环境有关不是 Key 的问题。先确认你的机器能正常访问https://taotoken.net/api可以用curl -I https://taotoken.net/api看返回状态。如果 curl 也失败说明是网络层问题检查 DNS 或本地防火墙设置。如果 curl 成功但 Claude Code 失败检查是不是有残留的HTTP_PROXY/HTTPS_PROXY环境变量指向了失效的本地端口用unset HTTP_PROXY HTTPS_PROXY清掉再试。5.3 reading choices 报错现象返回体解析失败提示reading choices或unexpected response format。这通常说明请求打到了不兼容的端点。Claude Code 走的是 Anthropic 协议如果你把 Base URL 指向了一个只支持 OpenAI 格式的地址返回结构对不上就会报这个。确认ANTHROPIC_BASE_URL指向的是https://taotoken.net/api它兼容 Anthropic 协议。另外检查模型 ID 是否写错模型名不存在时有些网关会返回非标准错误体也会触发解析失败。5.4 OAuth 相关报错现象提示 OAuth token expired 或要求重新登录。Claude Code 某些版本会尝试走 OAuth 流程但用 API Key 接入时不需要 OAuth。如果出现这类报错检查是不是同时存在旧的登录凭证。清理~/.claude/下的凭证缓存文件确保配置里用的是ANTHROPIC_AUTH_TOKEN而不是 OAuth token。重启后应该直接走 Key 认证。5.5 三件套检查清单出现任何连接类报错先对照这三件套Base URL 是否为https://taotoken.net/api、Key 是否为控制台新建的有效 Key、Model ID 是否与控制台一致。这三项任意一项错了都会导致请求失败。如果你用的是 CC Switch 或 Cline MCP 这类工具同样检查这三项是否填全——Base URL、Key、Model ID 缺一不可。排查完还搞不定可以去接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 对照最新配置说明或者在 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 重新生成一个 Key 排除 Key 本身的问题。6. 继续深入把内核认知变成可复用的工程能力拆到这里Claude Code 的内核链路基本清晰了ReAct 循环是骨架负责推理-行动-观察的迭代子 Agent 分层是肌肉用 Explore 这类只读小模型分担上下文压力多层安全体系是缰绳用 deny ask allow 的优先级和四层规则嵌入守住边界。三者叠加才有了“看起来聪明”的编程体验。如果你想继续动手我建议从两个方向深入。一是改配置观察行为变化把ANTHROPIC_SMALL_FAST_MODEL换掉看权限初筛和子 Agent 的速度差异把某条规则从 deny 挪到 ask看拦截行为怎么变。二是自己写一个最小 ReAct 循环用 TaoToken 的 API 端点跑通“请求 → 工具调用 → 结果回填”的完整链路代码量不超过 50 行但能让你彻底理解 Agent 的本质。长期做编码和 Agent 开发的话可以考虑 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 它在用量和模型调度上更适合高频编码场景。想先验证模型效果模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 可以直接试。配置过程中卡住接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 有完整的字段说明。最后留一个我踩过的坑别把 CLAUDE.md 写得太长。它作为用户消息注入每轮对话都会带上写个几百行等于每轮都多烧几千 Token。项目规则控制在 50 行以内只写真正影响决策的约定剩下的交给代码本身去表达。