File size: 19,109 Bytes
f468102 96f34e3 f468102 96f34e3 f468102 96f34e3 f468102 96f34e3 f468102 96f34e3 f468102 96f34e3 f468102 96f34e3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 | # 设计哲学与架构原则
> 本文档综合自 Dive into Claude Code (arXiv:2604.14228v1) 的架构分析以及 Codev
> 源代码的实际实现模式,旨在为面试准备和系统设计讨论提供参考。
>
> Claude Code 的设计哲学源于五个核心人类价值,通过十三条设计原则转化为具体的架构决策。
> Codev 在此基础上进行了多 Provider 和 Friend VRM 等扩展。
---
## 1. 五大核心价值 (Core Values)
Claude Code 的系统架构由五个根本性的人类价值驱动。这些价值不是事后总结,而是在架构设计
之初就被确立为优先级排序的依据。
### 1.1 人类决策权威 (Human Decision Authority)
人类保留对所有系统行为的最终决定权。这一价值通过 **主体层级结构 (principal hierarchy)**
来实现:Anthropic(作为模型开发者)→ operators(组织管理员)→ users(终端用户)。
架构含义:
- 人类可以**实时观察**系统行为、**批准或拒绝**提议的操作、**中断**进行中的操作、并在
事后**审计**所有操作记录。
- 当 Anthropic 发现用户批准 93% 的权限提示时,他们的反应不是增加更多警告,而是重新
构建问题:通过在明确定义的边界(沙箱、auto-mode 分类器)内让代理自由工作,而非
依赖用户逐操作审批(因为一旦习惯化,用户就会不加审查地批准)。
- 对应源文件:`src/utils/permissions/permissions.ts`、`src/utils/permissions/PermissionMode.ts`
### 1.2 安全、安全与隐私 (Safety, Security, and Privacy)
系统有义务保护人类、代码、数据和基础设施,**即使人类疏忽或犯错**。这与人类决策权威
有本质区别:权威是关于人类的**选择权**,而安全是关于系统的**保护义务**。
架构含义:
- 威胁模型涵盖四种风险:过度热心行为、诚实错误、提示注入和模型失准。
- 实现为**多层重叠安全机制**(拒绝优先、分类器、沙箱、钩子),任何一层都能独立阻止
危险操作。
- 对应源文件:`src/utils/permissions/yoloClassifier.ts`、`src/tools/BashTool/shouldUseSandbox.ts`
### 1.3 可靠执行 (Reliable Execution)
代理正确执行用户的实际意图,在长时间内保持一致性,并支持在执行完成前验证工作。
架构含义:
- 涵盖单轮正确性和长周期可靠性(跨上下文窗口边界、会话恢复、多代理委派)。
- 实现了 5 层压缩管道、优雅恢复机制(max_output_tokens 升级重试、auto-compact、
reactive compact)和自动断路器。
- 对应源文件:`src/query.ts`(queryLoop)、`src/services/compact/autoCompact.ts`
### 1.4 能力放大 (Capability Amplification)
系统显著提升开发者单位时间/成本的产出效率。Anthropic 内部调查显示约 27% 的任务属于
"如果没有工具就不会尝试的工作"——架构使**全新的工作流**成为可能,而不仅仅是加速
现有流程。
架构含义:
- 系统的创造者将其描述为 "Unix 工具而非传统产品"——由最小、有用、可理解和可扩展的
构建块组成。
- 投资于**确定性基础设施**(上下文管理、工具路由、恢复机制)而非决策框架(显式
规划器或状态图),前提是日益强大的模型更受益于丰富的操作环境而非约束性框架。
- 对应源文件:`src/tools/tools.ts`(assembleToolPool)、`src/query.ts`(~88 行主循环)
### 1.5 上下文适应性 (Contextual Adaptability)
系统适配用户的特定上下文(项目、工具、约定、技能水平),并且关系随时间改善。
架构含义:
- 扩展架构(CLAUDE.md、skills、MCP、hooks、plugins)提供多层级可配置性,每层具有
不同的上下文成本。
- 纵向数据显示人机关系是演化的:自动批准率从 <50 会话的 ~20% 增长到 750+ 会话的
>40%。信任是"由模型、用户和产品共同构建的"。
- 对应源文件:`src/context.ts`、`src/services/mcp/`、`src/utils/hooks/`
---
## 2. 十三条设计原则 (Design Principles)
五大价值通过十三条设计原则可操作化。每条原则回答一个生产级编码代理必须解决的
重复性问题。下表总结了每条原则、其服务的价值、设计问题以及关键实现文件。
| # | 原则 | 服务价值 | 设计问题 | 关键实现 |
|---|------|---------|---------|---------|
| 1 | **拒绝优先,人类升级** (Deny-first with human escalation) | Authority, Safety | 未识别的操作应被允许、阻止还是升级给人类? | `permissions.ts` (deny 规则优先于 allow 规则) |
| 2 | **渐进信任光谱** (Graduated trust spectrum) | Authority, Adaptability | 固定权限层级还是随时间演进的光谱? | `PermissionMode.ts` (7 个模式: plan → default → acceptEdits → auto → dontAsk → bypassPermissions → bubble) |
| 3 | **深度防御,分层机制** (Defense in depth with layered mechanisms) | Safety, Authority, Reliability | 单一安全边界还是多个重叠的? | 7 层独立机制 (pre-filter + deny-first + modes + classifier + sandbox + no-restore + hooks) |
| 4 | **外化可编程策略** (Externalized programmable policy) | Safety, Authority, Adaptability | 硬编码策略还是外化配置? | `CLAUDE.md` 层级, `hooks` 生命周期, `PermissionRule` |
| 5 | **上下文作为稀缺资源,渐进管理** (Context as scarce resource with progressive management) | Reliability, Capability | 绑定资源约束是什么?如何分级管理? | 5 层压缩管道 (budget → snip → microcompact → collapse → auto-compact), `query.ts:365-453` |
| 6 | **追加式持久状态** (Append-only durable state) | Reliability, Authority | 可变状态、快照还是追加日志? | JSONL 会话转录 (`sessionStorage.ts`), 侧链文件 |
| 7 | **最小脚手架,最大操作平台** (Minimal scaffolding, maximal operational harness) | Capability, Reliability | 投资于推理侧框架还是操作基础设施? | ~88 行 queryLoop; ~98.4% 的代码为确定性基础设施 |
| 8 | **价值观优于规则** (Values over rules) | Capability, Authority | 僵化的决策程序还是上下文的判断? | 系统提示设计基于原则而非穷举规则 |
| 9 | **可组合的多机制扩展** (Composable multi-mechanism extensibility) | Capability, Adaptability | 统一扩展 API 还是分层机制? | MCP + Plugins + Skills + Hooks 四种机制,上下文成本递增 |
| 10 | **可逆性加权风险评估** (Reversibility-weighted risk assessment) | Capability, Safety | 所有操作相同监督还是更轻的只读/可逆操作? | read-only 工具并行执行, 写操作串行化 |
| 11 | **透明的基于文件的配置与记忆** (Transparent file-based configuration and memory) | Adaptability, Authority | 不透明数据库、嵌入检索还是用户可见的文件? | `CLAUDE.md` 层级, auto-memory 文件, git 版本可控 |
| 12 | **隔离的子代理边界** (Isolated subagent boundaries) | Reliability, Safety, Capability | 子代理共享父上下文还是隔离运行? | `AgentTool.tsx`, `runAgent.ts`, 侧链转录, 独立上下文窗口 |
| 13 | **优雅恢复与韧性** (Graceful recovery and resilience) | Reliability, Capability | 错误时硬失败还是静默恢复? | max_output_tokens 升级 (3次)、reactive compact、fallback model、断路器 |
### 2.1 原则的可选设计家族
这些原则可以通过对比三种主流替代设计家族来理解:
- **基于规则的编排**:LangGraph 等框架将决策逻辑编码为显式状态图(typed edges),选择
脚手架而非最小平台。
- **容器隔离执行**:SWE-Agent 和 OpenHands 依赖 Docker 隔离而非分层策略执行。
- **版本控制即安全**:Aider 使用 Git 回滚作为主要安全机制而非拒绝优先评估。
Claude Code 的原则组合的独特之处在于:最小决策脚手架 + 分层策略执行 + 基于价值观的
判断 + 拒绝优先默认 + 渐进上下文管理 + 可组合扩展。
### 2.2 值-原则-架构 映射
每条价值通过其原则追踪到特定的架构决策:
| 价值 | 驱动的原则 | 架构体现 |
|------|-----------|---------|
| 人类决策权威 | 拒绝优先、渐进信任、追加状态、外部化策略、价值观优于规则 | 权限系统、审计日志、CLAUDE.md |
| 安全与隐私 | 深度防御、拒绝优先、可逆性加权、外部化策略、隔离子代理 | 7 层安全、沙箱、分类器 |
| 可靠执行 | 稀缺上下文、追加状态、优雅恢复、隔离子代理、深度防御 | 压缩管道、JSONL 转录、断路器 |
| 能力放大 | 最小脚手架、可组合扩展、可逆性加权、上下文管理、优雅恢复 | queryLoop、MCP、speculative 执行 |
| 上下文适应性 | 透明文件记忆、可组合扩展、渐进信任、外部化策略 | CLAUDE.md 层级、skills、hooks |
---
## 3. 架构权衡 (Architectural Trade-offs)
### 3.1 安全 vs 自主权 (Safety vs. Autonomy)
系统中最核心的张力:更高的自主权意味着更少的人类干预,但也意味着更大的风险。
- **Claude Code 的选择**:通过渐进信任光谱来管理这种张力。用户从 `plan` 或 `default`
模式开始,随着时间向 `acceptEdits` → `auto` → `bypassPermissions` 演进。
- **权衡的体现**:当命令超过 50 个子命令时,权限系统退回到通用审批提示而非逐子命令
检查,因为逐子命令解析会导致 UI 冻结。这是安全与性能之间结构性张力的实例。
- **相关代码**:`src/utils/permissions/getNextPermissionMode.ts`、
`src/utils/permissions/PermissionMode.ts`
### 3.2 上下文效率 vs 透明度 (Context Efficiency vs. Transparency)
压缩节省上下文但降低人类可读性。
- **Claude Code 的选择**:5 层压缩管道,从轻量级(budget reduction、snip)到重量级
(auto-compact),每层在成本和效果之间做出不同权衡。
- **权衡的体现**:auto-compact 使用模型生成摘要来替代原始对话,但摘要丢失了原始
细节。上下文折叠 (context collapse) 作为只读投影避免了这个问题,但增加了实现
复杂度。追加式 JSONL 日志虽然保留完整可审计历史,但在恢复时不还原权限状态,
牺牲了便利性以换取安全性。
- **相关代码**:`src/services/compact/`(整个目录)、`src/utils/sessionStorage.ts`
### 3.3 简单 vs 可扩展 (Simplicity vs. Extensibility)
核心循环应该简单,但系统需要适应各种用例。
- **Claude Code 的选择**:`queryLoop()` 是 ~88 行的 while-true 循环。~98.4% 的代码
存在于周围的子系统中:安全、扩展、上下文管理、委派和持久化。
- **权衡的体现**:为什么有四种扩展机制(MCP、plugins、skills、hooks)而不是一种?
因为每种机制服务于不同的抽象级别和上下文成本。MCP 提供外部工具集成,plugins 打包
组件,skills 注入领域指令,hooks 拦截生命周期。这种分层增加了概念复杂性,但允许
在不同场景下使用适当的工具。
- **相关代码**:`src/query.ts`、`src/services/mcp/`、`src/plugins/`、`src/skills/`、
`src/utils/hooks/`
### 3.4 对抗条件下的权限模型 (Permission Model Under Adversarial Conditions)
当用户(或劫持用户的提示注入)主动尝试规避安全措施时。
- **Claude Code 的应对**:拒绝优先 + 深度防御的组合否认了单点失效。即使一个安全层
被绕过(例如用户批准了恶意命令),其他层(沙箱、分类器、钩子)仍然可以拦截。
- **关键弱点**:共享实现约束导致安全层之间存在共性失效模式。例如,权限系统和 UI
渲染共享主线程,当规则评估导致 UI 冻结时,两者同时失效。
- **相关代码**:`src/utils/permissions/permissions.ts`、
`src/utils/permissions/yoloClassifier.ts`
---
## 4. Codev 与 Claude Code 的差异
Codev 以 Claude Code 为上游基础,进行了以下主要变更和扩展:
### 4.1 多 Provider 支持
- Claude Code 内置仅支持 Anthropic API,而 Codev 通过 Provider 代理架构
支持 OpenAI、Groq、DeepSeek 以及所有兼容 OpenAI 的 API。
- **实现模式**:`src/server/proxy/handler.ts` 实现双路由决策——
- 1P Anthropic 路径:直接调用 Anthropic SDK
- 3P Provider 路径:通过协议转换器(`anthropicToOpenaiChat.ts` → upstream API →
`openaiChatToAnthropic.ts`)
- **架构影响**:代理层引入额外的延迟和错误处理复杂度,但使得系统不受单一供应商限制。
### 4.2 Friend VRM 系统
- 同进程 VRM 伴侣服务,使用 3D 虚拟角色(VRM 格式)作为交互界面。
- **实现模式**:`src/friend/FriendService.ts` 是单例服务,与 React 组件通过
`subscribe()` / `subscribeToInbound()` 模式同步。使用 SSE 广播将表情/TTS 推送到
VRM 前端。
- **关键组件**:
- Silero VAD:WASM 推理(`src/friend/voice/vad-service.ts`),通过 onnxruntime-web
实现机器学习级语音活动检测
- 进程内音频捕获:cpal Rust 库(替代传统的 arecord/parecord 子进程)
- TTS 引擎:Edge TTS(默认)和 Qwen TTS(DashScope API)
- **架构意义**:展示了如何将 Claude Code 的扩展机制(钩子 + 工具)用于非开发场景,
将编码代理转变为通用对话代理。
### 4.3 移除 ant-internal 模块
- 移除了 Anthropic 内部使用的模块(feature flags、内部 API),使代码对社区完全可用。
- `src/query/transitions.ts` 等文件使用代理桩 (proxy stub) 替代缺少的内部模块,
通过 `bun:bundle` 的 DCE 在构建时消除。
### 4.4 社区贡献
- **onnxruntime-web WASM VAD**:首个在生产级 CLI 工具中集成基于 ML 的语音活动检测。
- **同进程 Friend 服务**:无需独立后台服务器子进程,简化了部署架构。
---
## 5. 关键架构模式 (Key Architecture Patterns)
### 5.1 单一主循环模式 (Single Main Loop)
**实现**:`queryLoop()` 是 `src/query.ts` 中的 AsyncGenerator,约 88 行核心控制逻辑
(while-true),周围 ~98.4% 的代码是确定性基础设施。
**循环结构**(简化的伪代码):
```
while (true) {
1. 解构状态 (destructure state)
2. 压缩管道 (5 shapers: budget → snip → microcompact → collapse → auto-compact)
3. 调用模型 (for await over deps.callModel)
4. 工具派发 (StreamingToolExecutor 或 runTools)
5. 收集结果 → 更新状态 → 继续或终止
}
```
**架构意义**:
- 生成器模式实现了流式输出,同时保持单一同步控制流。
- 七个"继续点"(continue sites)各自通过一次整体对象赋值(而不是逐个字段变更)
来更新状态,保持了不变性的简单性。
- 所有入口(交互式 CLI、headless CLI、SDK、IDE 集成)汇聚到同一个 queryLoop,
只有 UI/渲染层不同。
### 5.2 追加日志模式 (Append-Only Log Pattern)
**实现**:`src/utils/sessionStorage.ts` 将会话转录存储为 JSONL 文件(每行一个 JSON
事件)。
**核心选择**:
- 状态变更使用**追加写入**而非原地修改
- 子代理对话存储在单独的**侧链文件**中(`sessionStorage.ts:247`),避免膨胀父上下文
- 恢复/复刻操作从事务重建会话状态(`conversationRecovery.ts`)
**架构意义**:
- 写前日志 (Write-Ahead Log) 风格使得审计、调试和恢复成为一等公民。
- 但不在恢复时还原会话级权限——这是一个有意的设计选择,牺牲便利以换取安全
(防止权限状态被意外恢复)。
### 5.3 分层安全模式 (Layered Security Pattern)
**实现**:7 层独立安全机制:
| 层 | 机制 | 源文件 | 作用时机 |
|----|------|--------|---------|
| 1 | 工具预过滤 | `tools.ts` (filterToolsByDenyRules) | 模型调用前 |
| 2 | 拒绝优先规则 | `permissions.ts` (toolMatchesRule) | 工具派发时 |
| 3 | 权限模式约束 | `PermissionMode.ts` | 模式切换时 |
| 4 | Auto-mode 分类器 | `yoloClassifier.ts` | auto 模式下 |
| 5 | Shell 沙箱 | `shouldUseSandbox.ts` | Bash 执行前 |
| 6 | 恢复时不恢复权限 | `conversationRecovery.ts` | 会话恢复时 |
| 7 | Hook 拦截 | `types/hooks.ts` | 工具生命周期各点 |
**架构意义**:
- 任何单层都不能完全信任——深度防御假设每层都可能失效,但多层同时失效的概率降低。
- 层之间共享实现约束(例如,超过 50 个子命令的命令退回到通用审批,因为逐子命令
解析导致 UI 冻结)。
### 5.4 渐进式上下文管理 (Progressive Context Management)
**实现**:5 层压缩管道,每层有不同成本效益比:
```
Budget Reduction (工具结果大小限制)
→ Snip (轻量级历史修剪)
→ Microcompact (细粒度缓存感知压缩)
→ Context Collapse (只读投影,不改变存储)
→ Auto-compact (模型生成的语义摘要,最后手段)
```
**决策顺序**:更早、更轻量的层先运行。只有当前置层不足以将上下文降到阈值以下时,
才触发更重的层。
**架构意义**:
- 没有单一压缩策略能应对所有类型的上下文压力。
- Budget 针对单个工具输出溢出;Snip 处理时间深度;Microcompact 应对缓存开销;
Context Collapse 管理超长历史;Auto-compact 执行语义压缩。
- 同样的稀缺性思维体现在其他子系统:CLAUDE.md 懒加载、延迟工具模式、子代理仅返回
摘要。
### 5.5 流式工具执行 (Streaming Tool Execution)
**实现**:`src/services/tools/StreamingToolExecutor.ts`
- 工具在模型流式响应时就开始执行(不是等待完整响应)
- 只读操作可以并行执行;写操作(如 Bash 命令)串行化
- 兄弟终止控制器:当任何 Bash 工具出错时立即终止其他进行中的子进程
- 结果按工具发出顺序缓冲和发射,即使并行执行也保持顺序一致性
**架构意义**:
- 介于完全串行派发和激进推测执行(如 PASTE)之间的中间方案
- 在延迟降低和实现简单性之间取得平衡
---
## 6. 延伸阅读
- **Dive into Claude Code** (arXiv:2604.14228v1): 对本文档所基于的原始架构分析论文
- **Anthropic Safe Agents Framework**: 安全代理设计的原则文档
- **Claude Code 官方文档**: [https://code.claude.com/docs/](https://code.claude.com/docs/)
- **Codev 源代码**: `/home/yuki/Code/Agent/Codev/src/`
- 核心循环: `src/query.ts`
- 权限系统: `src/utils/permissions/`
- 压缩管道: `src/services/compact/`
- 扩展机制: `src/services/mcp/`, `src/utils/hooks/`
- 状态持久化: `src/utils/sessionStorage.ts`
- 多 Provider: `src/server/proxy/`
- Friend VRM: `src/friend/`
---
> **文档版本**: v1.0 — 2026-06-22
> **作者**: 基于 Claude Code 设计哲学论文和 Codev 源代码综合分析
|