从 Claude Code 源码中提炼出 10 个关键工程设计模式,可直接应用到自建 Agent 系统的架构设计中。
while(true) 主循环配合多路退出,比递归调用更易管理状态,也更容易扩展新的终止条件。
系统提示词由 10+ 个函数段组成,每段独立维护,通过 BOUNDARY 分离缓存域,大幅降低 prompt 工程复杂度。
12 步顺序决策,越安全的检查越靠前,免疫绕过的安全检查硬编码在不可绕过的层级。
React Compact / Max Tokens 恢复 / 模型 Fallback,三条独立的错误恢复路径,大多数错误用户无感知。
for await...of 消费内层产出的消息流。yield* 传递消息,内层的每个 yield 都会透传到 SDK 调用者。这让内层可以独立测试,外层可以专注于状态管理。
isConcurrencySafe() 判断哪些工具可以并发:读操作(文件读/搜索/MCP)并发执行,写操作(文件写/Bash)串行执行。这通常可以节省数百毫秒的延迟。
isConcurrencySafe: boolean,主循环维护一个执行槽位:空槽 → 立即执行;槽满且不安全 → 等待。读类工具几乎总是安全的,写类工具需要严格串行。
systemPromptSection(name, fn) 注册到注册表,由框架统一调用并缓存。静态段(角色定义、行为规范)走全局 Prompt Cache,动态段(环境信息、MCP 指令)每轮重新计算。BOUNDARY 标记精确分隔缓存域。
git status,禁止 git push)。
mcp__服务器名__工具名 前缀命名空间,避免冲突。服务器连接状态有明确的状态机(connected/pending/failed/needs-auth/disabled),UI 实时反映。工具发现通过 ListTools RPC,结果被 memoize 缓存。Agent 的 MCP 配置支持继承(子 Agent 获得父 Agent 的所有 MCP clients)和扩展(Agent 定义文件中声明专属 MCP 服务器)。
plugin__toolName),避免冲突。提供清晰的工具注册 API(工具名、描述、JSON Schema、执行函数),让第三方工具与内置工具完全等价。连接状态的可见性对调试至关重要。
pre-tool-use(工具调用前,可修改输入或拒绝)、post-tool-use(工具完成后,可检查输出)、user-prompt-submit(用户提交前)、stop(助手消息完成后,可阻止 Agent 继续)。Hooks 以 shell 命令形式配置,通过 stdin/stdout 交互,语言无关。
| 机制 | 核心文件 | 关键函数/类 | 行数 |
|---|---|---|---|
| Agent 主循环 | src/query.ts | queryLoop() | 1729 |
| SDK 会话管理 | src/QueryEngine.ts | QueryEngine.submitMessage() | 1295 |
| 系统提示词构建 | src/constants/prompts.ts | getSystemPrompt() | 914 |
| 提示词覆盖优先级 | src/utils/systemPrompt.ts | buildEffectiveSystemPrompt() | 123 |
| 权限决策管道 | src/utils/permissions/permissions.ts | hasPermissionsToUseToolInner() | 1500+ |
| Bash 规则匹配 | src/tools/BashTool/bashPermissions.ts | bashToolHasPermission() | 1400+ |
| 并发工具执行 | src/services/tools/toolOrchestration.ts | runTools(), partitionToolCalls() | 188 |
| 流式工具执行器 | src/services/tools/StreamingToolExecutor.ts | addTool(), getCompletedResults() | 530+ |
| Coordinator 模式 | src/coordinator/coordinatorMode.ts | getCoordinatorSystemPrompt() | 300+ |
| Agent 派生执行 | src/tools/AgentTool/runAgent.ts | runAgent() | 200+ |
| MCP 客户端 | src/services/mcp/client.ts | connectToServer(), listTools() | 3348 |
| Mailbox 通信 | src/utils/teammateMailbox.ts | writeToMailbox(), readMailbox() | 200+ |