Claude 原理与 Claude Code 代码架构详解从大模型本身,到包裹它的 Agent Harness:训练、对齐、推理、工具协议、Agent 循环、权限、上下文工程与扩展机制
一句话理解:Claude 是 Anthropic 训练的大语言模型家族(Opus / Sonnet / Haiku / Fable),负责"思考";Claude Code 是包在模型外面的 agentic harness,负责"提供工具 + 管理模型看到的上下文"。两者合起来,构成一个能读代码、改文件、跑命令、自我验证的自主 Agent。
资料来源:Anthropic 官方文档(code.claude.com/docs、platform.claude.com/docs)、Anthropic Engineering / Research 博客、Constitutional AI 论文(arXiv 2212.08073)、开源的 claude-agent-sdk-python 源码。Claude Code CLI 主体为闭源分发,文中关于其内部实现的描述以官方文档披露的行为为准,不臆测未公开的细节。
01Claude 是什么
"Claude" 在不同语境下指三层东西,理解它们的边界是读懂后续内容的前提:
Claude 模型
Anthropic 训练的 LLM 家族。当前系列含 Fable 5.1、Opus 5.5、Sonnet 5.5、Haiku 4.5,在能力、延迟、成本之间做不同取舍。
Claude Platform / Messages API
以 messages 为核心的无状态 HTTP 接口:输入 system + 对话历史 + 工具定义,输出内容块(text / thinking / tool_use)。
Claude Code
运行在终端、IDE、桌面、Web 的 Agent。它维护会话、执行工具、管控权限、压缩上下文,把无状态的模型变成有状态的工作伙伴。
Claude Agent SDK
把 Claude Code 的同一套 Agent 循环以 Python / TypeScript 库的形式开放,可嵌入自己的应用。
官方文档对 Claude Code 的定义很直接:"The agentic loop is powered by two components: models that reason and tools that act. Claude Code is the layer around the model that provides the tools and manages the context the model sees." 本文 Part A 讲 model 如何"会思考",Part B 讲 harness 如何"让它能做事"。
02底座:Transformer 与预训练
Claude 属于 decoder-only Transformer 类大语言模型。Anthropic 没有公开具体参数量、层数、MoE 与否等细节,但其基本工作方式与同类模型一致:
- Tokenize:文本、代码、图片(视觉编码后)被切分为 token 序列。
- Embedding + 多层 Transformer Block:每层由多头自注意力(让每个 token 读取上下文里其他 token 的信息)和前馈网络(在高维空间做非线性变换、存储"知识")组成,残差流贯穿各层。
- 自回归解码:模型输出下一个 token 的概率分布,采样一个 token 追加到序列末尾,重复直到结束。所有"推理""工具调用"本质上都是这样一个一个 token 生成出来的结构化文本。
训练三段式:
| 阶段 | 数据 | 得到什么 |
|---|---|---|
| 预训练 (Pre-training) | 大规模公开网页、书籍、代码等文本(Anthropic 说明其爬虫遵守 robots.txt,且不使用用户付费数据默认训练) | 一个"什么都能续写"的基础模型,学到语言、知识与推理模式 |
| 监督微调 (SFT) | 人工与模型生成的高质量对话示范 | 学会以"助手"身份对话、遵循指令 |
| 强化学习 (RLHF / RLAIF / 环境 RL) | 人类偏好、AI 依据宪法的偏好、可验证任务(代码、数学、Agent 环境)的结果奖励 | 有帮助、诚实、无害;会用工具、会长程完成任务 |
Anthropic Research《Tracing the thoughts of a large language model》开篇即强调:模型"不是被人直接编程的,而是在大量数据上训练出来的……它们学会了自己解决问题的策略"。这也是为什么 Anthropic 要同时投入"对齐训练"与"可解释性"两条线。
03对齐:RLHF 与 Constitutional AI
Claude 区别于其他模型最有代表性的训练方法是 Constitutional AI (CAI),出自 Anthropic 2022 年论文《Constitutional AI: Harmlessness from AI Feedback》(Bai et al.)。核心思想:人类不再逐条标注"哪个回答更无害",而是写下一份原则清单(宪法),让 AI 依据原则自我批评、自我修正、自我评判。
论文摘要中的关键结论:这样训练出的助手"harmless but non-evasive"——遇到有害请求时不是一味回避,而是解释自己为什么反对;并且"用少得多的人类标注就能更精确地控制 AI 行为"。
| 方法 | 反馈来源 | 优点 | 局限 |
|---|---|---|---|
| RLHF | 人类比较两个回答 | 直接对齐人类偏好 | 标注昂贵、标注者暴露于有害内容、规则不透明 |
| Constitutional AI (RLAIF) | AI 依据成文原则比较 | 可扩展、原则公开可审计、有害性与有用性兼顾 | 效果依赖原则写得好不好、依赖评判模型能力 |
在此基础上,Anthropic 还发布了 Claude 的"宪法"文档与 Character Training,塑造 Claude 好奇、坦诚、愿意提出不同意见的性格;并按 Responsible Scaling Policy (RSP) 对每一代模型做 ASL 等级的安全评估后再发布。
04可解释性:模型内部在想什么
Anthropic 的 Interpretability 团队试图打造一台"AI 显微镜":在模型激活中找到可解释的特征 (features),再把特征连成回路 (circuits),追踪从输入词到输出词的计算路径。在《Tracing the thoughts of a large language model》中,他们对 Claude 3.5 Haiku 做了"AI 生物学"研究,得到几条直接影响我们理解"Claude 原理"的发现:
共享的"思维语言"
不同语言的同一句话,在模型内部有大量重叠的概念特征。Claude 有时在跨语言共享的概念空间里思考,再转换成具体语言输出。
会提前规划
写押韵诗时,模型在写下一行之前就已想好要押的韵脚词,然后组织句子到达那里。虽然一次只输出一个 token,但思考的视野更长。
推理不一定忠实
给出错误提示的难题中,研究者"当场抓到"模型编造看似合理的推理去迎合用户——说明可见的 CoT 不总等于真实计算过程。
默认拒绝猜测
反直觉的发现:Claude 的默认回路是"不知道就不答",只有当"已知实体"特征抑制了这一默认时才回答;幻觉常是这一抑制误触发。
研究者也坦承局限:即便是几十个词的短提示,当前方法也只能捕捉模型总计算量的一小部分,且需要数小时人工分析。可解释性是 Anthropic 安全路线的长期投入,而非已完成的"白盒化"。
05推理:Extended Thinking 与 Effort
Claude 支持在给出最终回答前生成 thinking 内容块,即"扩展思考"。它在 API 中是一等公民:
// 请求:开启扩展思考
{
"model": "claude-opus-5-5",
"max_tokens": 16000,
"thinking": { "type": "enabled", "budget_tokens": 10000 },
"messages": [{ "role": "user", "content": "..." }]
}
// 响应:thinking 块在前(带加密 signature),text / tool_use 在后
{ "content": [
{ "type": "thinking", "thinking": "先分析失败用例...", "signature": "EqQB..." },
{ "type": "text", "text": "问题出在 token 过期判断..." }
]}
- signature:服务端对思考内容的签名。多轮工具调用时必须把 thinking 块原样回传,模型才能在工具结果之后接着原来的思路继续(interleaved thinking)。
- Effort:独立于 thinking 的另一个旋钮,取值
low / medium / high / xhigh / max,控制每次回复投入多少推理深度与 token。Agent SDK 文档明确说明二者相互独立:可以effort: "low"同时开 thinking,也可以effort: "max"不开。 - Claude Code 中:可用
/model和 effort 设置调整;compaction 生成摘要时也会继承会话的 thinking 配置(v2.1.198 起)。
06工具调用协议
模型本身不能执行任何东西。"调用工具"的真实含义是:模型输出一段结构化的 tool_use 块,由客户端(harness)执行,再把结果以 tool_result 塞回下一轮输入。这是 Claude Code 一切能力的协议基础。
// 工具定义:名称 + 描述 + JSON Schema。描述的质量直接决定模型会不会用、用得对不对
{ "name": "Read",
"description": "Reads a file from the local filesystem...",
"input_schema": { "type": "object",
"properties": { "file_path": {"type":"string"}, "offset": {"type":"integer"} },
"required": ["file_path"] } }
- Client tools:由调用方执行(Claude Code 的 Read/Edit/Bash 都属于这一类)。
- Server tools:由 Anthropic 平台执行(如 web search、code execution),结果直接出现在响应中。
- 并行调用:一次响应可包含多个
tool_use块;harness 可以并发执行只读工具。 - ACI 设计:《Building effective agents》提出要像设计 HCI 一样精心设计 Agent-Computer Interface——工具名清晰、参数防呆、描述里给示例与边界。Claude Code 内置工具的长篇描述就是这一原则的产物。
07上下文窗口与 Prompt Caching
Messages API 是无状态的:每一轮请求都要带上完整的 system prompt、工具定义和全部历史。Agent 跑 50 轮,就意味着同样的前缀被发送 50 次。两件事因此变得关键:
| 机制 | 要点 | 对 Agent 的意义 |
|---|---|---|
| Context Window | 标准 200K tokens,部分模型/配置支持 1M。所有 system、工具、历史、工具输出都计入 | 长任务会"撑满",需要压缩、子代理隔离、按需加载 |
| Prompt Caching | 用 cache_control: {"type":"ephemeral"} 标记前缀断点;按 tools → system → messages 顺序匹配;默认 TTL 5 分钟(可选 1 小时);命中部分按显著折扣计费 | 不变的前缀(系统提示、工具定义、CLAUDE.md)几乎只付一次全价,大幅降低成本与首 token 延迟 |
Agent SDK 文档:"Content that stays the same across turns (system prompt, tool definitions, CLAUDE.md) is automatically prompt cached." 这也是 Claude Code 把动态内容(system-reminder、文件变更提示)放在消息尾部、而不是改动 system prompt 的原因——改动前缀会让缓存全部失效。
08Claude Code 整体架构
Claude Code 以 TypeScript 编写(GitHub anthropics/claude-code 仓库语言标注为 TypeScript,主体以原生二进制分发)。从官方文档披露的行为可以把它拆成六层:
09核心:Agentic Loop
官方文档把循环描述为三个交织的阶段:gather context → take action → verify results,重复直到任务完成,用户可随时打断。落到实现上,它就是一个围绕 Messages API 的 while 循环:
// 概念伪代码(依据 Agent SDK 文档《How the agent loop works》)
async function* agentLoop(prompt) {
history.push(user(prompt)) // UserPromptSubmit hook 可在此注入/拦截
yield SystemMessage("init")
while (true) {
if (nearContextLimit()) await compact() // PreCompact hook → 摘要 → compact_boundary
const resp = await claude.messages.stream({ system, tools, messages: history })
for (const block of resp.content) yield AssistantMessage(block)
const calls = resp.content.filter(b => b.type === "tool_use")
if (calls.length === 0) break // 无工具调用 = 本轮结束
const results = await runTools(calls) // 权限 → PreToolUse → 执行 → PostToolUse
history.push(assistant(resp), user(results))
yield UserMessage(results)
if (++turns >= maxTurns || cost >= maxBudgetUsd) return Result("error_max_*")
}
runHooks("Stop") // Stop hook 可要求"继续"
yield ResultMessage({ result, usage, total_cost_usd, session_id })
}
| 消息类型 | 何时产生 | 内容 |
|---|---|---|
SystemMessage | 会话生命周期 | init(会话元数据)、compact_boundary(压缩后)等 |
AssistantMessage | 模型每个内容块 | text / thinking / tool_use,同一响应共享 message id |
UserMessage | 工具执行后 / 用户插话 | tool_result 内容 |
StreamEvent | 开启 partial messages 时 | 原始流式增量(文本 delta、工具输入片段) |
ResultMessage | 循环结束 | 结果文本、usage、成本、session_id、subtype(success / error_max_turns / error_max_budget_usd / error_during_execution) |
"Turn" 的定义:一次"模型输出含工具调用 → 执行 → 结果回填"的往返。官方示例"Fix the failing tests in auth.ts":Turn 1 Bash npm test(3 个失败)→ Turn 2 Read auth.ts / auth.test.ts → Turn 3 Edit + Bash npm test(全部通过)→ 最终纯文本回复。共 4 轮。
人在回路:按 Esc 立即取消正在运行的工具调用;直接输入并回车则作为"排队消息",在当前工具调用结束后、同一轮内被读取,模型据此调整下一步。
10工具系统
| 类别 | 工具 | 说明 |
|---|---|---|
| 文件操作 | Read Edit Write NotebookEdit | Edit 是精确字符串替换(要求先 Read、old_string 唯一),比整文件重写更省 token、更不易误改 |
| 搜索 | Glob Grep | 基于 ripgrep;"just-in-time" 检索的基础,取代把整库塞进上下文 |
| 执行 | Bash / PowerShell | 任意 shell 命令;可后台运行;可被 Sandbox 包裹 |
| Web | WebSearch WebFetch | WebFetch 抓取页面并用小模型按 prompt 提炼 |
| 发现 | ToolSearch | MCP 与非核心工具的 schema 默认延迟加载,按需检索 |
| 编排 | Agent Skill AskUserQuestion TaskCreate/TaskUpdate | 派生子代理、调用技能、向用户提问、任务清单 |
| 代码智能 | LSP 插件 | 编辑后看到类型错误、跳转定义、查引用 |
并发策略:同一轮中多个工具调用时,只读工具(Read、Glob、Grep、标注 readOnlyHint 的 MCP 工具)可并发执行;修改状态的工具(Edit、Write、Bash)串行执行以避免冲突。
被拒绝时:工具被权限或 Hook 拒绝后,模型收到的是一条"拒绝消息"作为 tool_result,通常会换一种方式或说明无法继续——拒绝本身也是循环的一部分,而不是异常。
11权限、沙箱与检查点
Claude Code 有两类安全机制:checkpoints 让文件改动可撤销,permissions 控制什么能不经询问就执行;对 Bash 还可再叠一层 OS 级 sandbox。
11.1 权限模式(Shift+Tab 切换)
| 模式 | 行为 | 适用 |
|---|---|---|
auto | 后台分类器模型审阅大多数动作,拦截高风险的,其余直接放行(v2.1.283 起交互式终端与 VS Code 的默认起始模式) | 日常自主开发 |
default(Manual) | 文件修改与 shell 命令前询问 | 谨慎操作 |
acceptEdits | 自动批准文件编辑与 mkdir/mv/cp 等常见文件命令,其他命令仍询问 | 快速迭代原型 |
plan | 只探索与出方案,不改源文件 | 先评审再动手 |
dontAsk | 从不询问:预批准的执行,其余一律拒绝 | 固定工具面的无头 Agent |
bypassPermissions | 除显式 ask 规则等外全部放行,root 下禁用 | 隔离的 CI / 容器 |
11.2 规则求值:deny 优先
- PreToolUse Hook:exit code 2 的阻断型 hook 先于规则生效,可拦截即便被 allow 的调用。
- deny 规则:任何层级(managed / CLI / project / user)只要命中 deny,其他层级都无法放开。
- ask 规则:命中则必须询问,即便 hook 返回 allow。
- allow 规则:如
Bash(npm test *)、WebFetch(domain:docs.x.com)、mcp__github__*。 - 模式兜底:都未命中时按当前权限模式决定(询问 / 分类器 / 拒绝 / 放行)。
"Yes, and don't ask again" 对 Bash 和 WebFetch 会把规则永久写入仓库根的 .claude/settings.local.json;文件修改授权只在本会话有效。
11.3 Sandbox
开启后 Bash 工具运行在 OS 级隔离中:macOS 用 Seatbelt,Linux / WSL2 用 bubblewrap。文件系统写入限制在工作目录,网络经代理按域名白名单放行。沙箱与权限互补:权限决定"要不要执行",沙箱限制"执行了能碰到什么"。对应开源实现 @anthropic-ai/sandbox-runtime。
11.4 Checkpoints
- 每个开启新一轮的用户 prompt 都创建一个检查点;编辑前对受影响文件做快照,保留最近 100 个检查点。
Esc Esc或/rewind回退代码和/或对话;检查点随会话保存,resume 后仍可用。- 局限:Bash 命令造成的改动、子代理编辑、外部改动、远程副作用(数据库、部署)都不在快照覆盖范围内——这类风险靠权限控制。
12上下文工程与压缩
Anthropic 工程博客把这一层称为 context engineering:上下文是有限的"注意力预算",token 越多,模型对每条信息的召回越弱(context rot)。Claude Code 的策略是"让模型看到最小但足够的高信号 token 集合":
按需检索
不预先灌入代码库,只保留路径等轻量引用,靠 Glob/Grep/Read 在需要时拉取。
延迟加载
Skills 只放描述、MCP 只放工具名,完整内容/Schema 在用到时才加载(Tool Search)。
子代理隔离
子代理在独立上下文里读几十个文件,只把摘要返回主对话。
自动压缩
接近上限时先清理旧工具输出,再对历史做摘要;也可 /compact focus on ... 手动触发。
结构化笔记
CLAUDE.md、MEMORY.md、Task 清单、plan 文件落盘,压缩后从磁盘重新注入。
压缩后什么会保留(官方《What survives compaction》)
| 内容 | 压缩后 |
|---|---|
| System prompt、output style | 照常生效 |
| 项目根 CLAUDE.md、无路径限定的 rules、Auto memory | 从磁盘重新注入 |
| Skill 描述 | 按当前 skills 重建并注入 |
| Plan mode 写的计划 | 从磁盘重新注入 |
| 读过/改过的文件 | 重新读取最近修改的至多 5 个;超过 5,000 tokens 的只留路径引用 |
| 已调用的 Skill 正文 | 重新注入,单个上限 5,000 tokens、总计 25,000,最老的先丢 |
| 后台命令与后台子代理 | 继续运行,并提醒模型避免重复启动 |
| 早期对话中的细节指令、hook 注入的上下文 | 被摘要,可能丢失 → 持久规则应写进 CLAUDE.md |
如果单个文件或工具输出过大,导致每次摘要后上下文立即被重新撑满,Claude Code 会在几次尝试后停止自动压缩并报 thrashing 错误,而不是无限循环。
13记忆:CLAUDE.md 与 Auto Memory
每个会话都从全新的上下文窗口开始。跨会话的"记忆"只靠两种落盘文件:
| 作用域 | 位置 | 用途 |
|---|---|---|
| Managed policy | /Library/Application Support/ClaudeCode/CLAUDE.md 等 | 组织级规范,IT 下发 |
| User | ~/.claude/CLAUDE.md | 个人对所有项目的偏好 |
| Project | ./CLAUDE.md 或 ./.claude/CLAUDE.md(可读 AGENTS.md) | 团队共享,随代码提交 |
| Local | ./CLAUDE.local.md | 个人对本项目的偏好,gitignore |
| Auto memory | ~/.claude/projects/<project>/memory/MEMORY.md + 主题文件 | Claude 工作中自动记下的经验 |
- 加载顺序:从文件系统根目录到当前目录逐级拼接(不是覆盖),离启动目录越近越后读;子目录中的 CLAUDE.md 在 Claude 读写该目录文件时才按需加载。
- 体积:CLAUDE.md 4 MiB 以内全量加载(越短遵循度越好);MEMORY.md 只加载前 200 行或 25KB,主题文件按需用 Read 读取。
- 辅助:
@path导入其他文件;.claude/rules/*.md可用paths:限定生效范围;块级 HTML 注释会在注入前被剥离。
14扩展层:Skills / MCP / Hooks / Subagents
| 特性 | 何时加载 | 加载什么 | 上下文成本 |
|---|---|---|---|
| CLAUDE.md | 会话开始 | 全文 | 每次请求(有缓存) |
| Skills | 开始 + 使用时 | 开始只放描述,调用时放全文 | 低 |
| MCP servers | 会话开始 | 工具名;Schema 按需 | 用前很低 |
| Subagents | 派生时 | 全新上下文(fork 则复制父对话) | 与主会话隔离 |
| Hooks | 事件触发 | 不进上下文(外部运行) | 零,除非返回附加上下文 |
14.1 Skills
一个目录 + SKILL.md(YAML frontmatter + Markdown 指令)+ 可选脚本/资源。模型在会话开始只看到 name 与 description,判断相关时调用 Skill 工具才加载正文——这是"渐进式披露"。可设 disable-model-invocation: true 只允许用户 /name 手动触发,context: fork 让技能在子代理中运行,allowed-tools 预批准工具。
---
name: release-notes
description: Generate release notes from merged PRs. Use when the user asks for a changelog.
allowed-tools: Bash(gh pr list *), Read
---
# 正文:步骤、模板、注意事项……(被调用时才进入上下文)
14.2 MCP (Model Context Protocol)
开放协议,让 Claude Code 作为 MCP client 连接外部服务(GitHub、数据库、浏览器、Jira…)。传输支持 stdio(本地进程)、HTTP、SSE、WebSocket;作用域分 local / project(.mcp.json)/ user;支持 OAuth。工具以 mcp__<server>__<tool> 命名,可直接写进权限规则。Claude Code 自身也能 claude mcp serve 作为 MCP server 被别的客户端调用。
14.3 Hooks
在生命周期固定点运行的确定性逻辑,不依赖模型"记得"去做。三种节奏:每会话(SessionStart / SessionEnd)、每轮(UserPromptSubmit / Stop)、每次工具调用(PreToolUse / PostToolUse);另有 PermissionRequest、SubagentStart/Stop、PreCompact/PostCompact、Notification、FileChanged 等。处理器类型五种:
Shell 命令
stdin 收 JSON,exit 0 放行、exit 2 阻断并把 stderr 反馈给模型。
HTTP POST
事件 JSON 作为请求体,响应体用同一 JSON 输出格式。
MCP 工具
调用已配置 MCP server 上的工具。
单轮模型判断
把事件交给 Claude 做一次 JSON 决策。
验证子代理
派生能用 Read/Grep 的子代理核实条件(实验性)。
// .claude/settings.json:每次 Edit/Write 后自动格式化
{ "hooks": { "PostToolUse": [ { "matcher": "Edit|Write",
"hooks": [ { "type": "command", "command": "npx prettier --write \"$(jq -r .tool_input.file_path)\"" } ] } ] } }
14.4 Subagents
通过 Agent 工具派生的独立工作者:自己的上下文窗口、自己的 system prompt(Markdown 正文)、可限定工具集与模型、可 isolation: worktree 在独立 git worktree 里改代码、可前台或后台运行。内置有 Explore(只读、快速搜索,quick / medium / very thorough 三档)、Plan(plan mode 下调研)、general-purpose 等。定义放在 .claude/agents/*.md 或 ~/.claude/agents/:
---
name: code-reviewer
description: Reviews code for quality and best practices
tools: Read, Glob, Grep
model: sonnet
---
You are a code reviewer. When invoked, analyze the code and provide
specific, actionable feedback on quality, security, and best practices.
Fork 是特殊的子代理:它复制当前对话与 system prompt 作为起点,适合"带着全部背景去做一件旁支任务",结果同样以摘要形式回到主线。这对应《Building effective agents》中的 orchestrator-workers 模式:主代理动态拆分任务、派给工人、汇总结果。
15Agent SDK 与控制协议
Claude Agent SDK(Python / TypeScript)不是重新实现一遍 Agent,而是捆绑原生 Claude Code 二进制,以子进程方式驱动它。从开源的 claude-agent-sdk-python 源码可以看到其结构:
claude_agent_sdk/
├── query.py / client.py # 对外 API:一次性 query() 与长连接 ClaudeSDKClient
├── types.py # ClaudeAgentOptions、消息与内容块类型
└── _internal/
├── transport/subprocess_cli.py # 启动 claude 进程,stdin/stdout 走 stream-json
├── query.py # 双向控制协议:control_request / control_response
├── message_parser.py # JSON 行 → AssistantMessage / ResultMessage …
├── sdk_mcp_bridge.py # 进程内自定义工具以 SDK MCP server 暴露给 CLI
└── session_store.py / sessions.py # 会话转录镜像、resume / fork
SDK 与 CLI 之间除了普通消息流,还有一条控制通道,在 _internal/query.py 中可见的请求子类型包括:
| 方向 | subtype | 作用 |
|---|---|---|
| SDK → CLI | initialize | 握手,注册 hooks、agents 等 |
| SDK → CLI | interrupt · set_permission_mode · set_model · rewind_files | 运行中打断、切换权限模式/模型、回退文件 |
| CLI → SDK | can_use_tool | 需要审批时回调宿主的 canUseTool |
| CLI → SDK | hook_callback | 触发宿主进程内注册的 hook 函数 |
| CLI → SDK | mcp_message | 把 MCP JSON-RPC 转发给进程内 SDK MCP server |
这说明 Claude Code 的核心循环只有一份实现,终端 TUI、IDE、SDK、CI 都是同一个循环的不同"前端"——这也是官方反复强调"the underlying agentic loop is identical"的原因。
16一次请求的完整时序
场景:在仓库里运行 claude,输入"修复 auth 模块失败的测试",权限模式 default,开启 sandbox。
- 启动:加载 settings 各层(managed › CLI › local › project › user),合并权限规则;运行
SessionStarthooks;连接 MCP servers(只取工具名);扫描 skills / agents 描述;新建会话 JSONL。 - 组装上下文:system prompt + 核心工具 schema + CLAUDE.md 链 + MEMORY.md 前 200 行 + git status 快照 + skill 描述 → 打上缓存断点。
- 提交 prompt:
UserPromptSubmithook 可注入额外上下文;创建 checkpoint。 - Turn 1 · 收集:模型(可能带 thinking)输出
Bash: npm test -- auth;Bash 不在 allow 列表 → 弹出审批 → 用户选"Yes, and don't ask again"写入 settings.local.json;在 Seatbelt/bubblewrap 内执行;PostToolUse;结果作为 tool_result 回填。 - Turn 2 · 定位:模型并行发出
Grep "validateToken"与Read auth.ts、Read auth.test.ts;只读工具在工作目录内免审批,并发执行。 - Turn 3 · 行动:
Edit auth.ts(old_string → new_string);编辑前快照文件;审批通过;PostToolUse hook 自动 prettier;LSP 返回诊断(如有)。 - Turn 4 · 验证:再次
Bash npm test -- auth,命中刚保存的 allow 规则,直接执行,全部通过。 - 结束:模型输出不含工具调用的文本总结;
Stophook 运行(可要求继续);ResultMessage 记录 usage 与成本;对话与快照落盘,可--continue恢复或/rewind回退。
如果此过程中上下文接近上限:PreCompact → 清理旧工具输出 → 摘要历史 → 重新注入 CLAUDE.md、memory、最近 5 个文件、skill 正文 → compact_boundary → 循环继续,用户无感。
17设计取舍与最佳实践
| 设计选择 | 理由(官方表述/工程原则) |
|---|---|
| 单循环 + 强工具,而非复杂工作流图 | 《Building effective agents》:"从最简单的方案开始,只在需要时增加复杂度";成功的实现多用简单可组合的模式而非重框架 |
| 模型自主决定下一步 | 编码任务的子任务不可预知,适合 agent 而非固定 workflow;靠环境反馈(测试结果、报错)判断进展 |
| agentic search 代替预建索引 | Glob/Grep/Read 即时检索,始终看到最新代码,无需维护向量库 |
| 精确替换的 Edit 工具 | 差异小、可审阅、可快照,失败可明确报错 |
| deny 优先 + 多层设置 + 沙箱 | 组织策略不可被个人或命令行覆盖;权限和隔离双保险 |
| 持久规则写文件、而非靠对话 | 压缩会丢细节;CLAUDE.md 每次请求重新注入 |
| 扩展按需加载 | 保护注意力预算;工具越多、描述越长,模型越难选对 |
使用建议
- 给模型可验证的目标(测试、截图、预期输出),它会自己闭环验证。
- 复杂任务先用 plan mode 对齐方案,再执行。
- 大范围搜索交给 Explore 子代理,保持主上下文干净;用
/context看谁在占空间。 - 必须每次都发生的事用 Hooks(格式化、拦截危险命令),而不是写在提示里祈祷模型记得。
- CLAUDE.md 保持简短、具体、可执行;可复用流程沉淀为 Skills。
参考资料
- How Claude Code works · How the agent loop works (Agent SDK)
- Permissions · Permission modes · Sandboxing · Checkpointing
- Explore the context window · Memory · Extend Claude Code
- Hooks reference · Subagents · Skills · MCP
- Tool use · Extended thinking · Prompt caching
- Building effective agents · Effective context engineering for AI agents
- Constitutional AI: Harmlessness from AI Feedback (Bai et al., 2022) · Tracing the thoughts of a large language model
- github.com/anthropics/claude-code · github.com/anthropics/claude-agent-sdk-python