首页 › tutorials › Claude Code 512K行源码泄露:架构全景与启示

Claude Code 512K行源码泄露:架构全景与七大设计启示

概述

2026年3月31日凌晨,Anthropic因一次npm打包失误,将Claude Code CLI全部源码(512,000行TypeScript、1,900个文件)暴露于公网。这一事件迅速引爆全球开发者社区,成为AI工具领域有史以来最大规模的源码泄露。本文基于数十篇深度分析报告和社区逆向工程成果,系统拆解Claude Code的完整架构,提炼出七条可复用的Agent设计原则,并探讨这一事件对AI工程领域的深远影响。适合所有关注AI Agent架构设计、提示工程和工具链开发的工程师阅读。

前置知识


第一章:泄露事件始末

1.1 事故时间线

2026年3月31日凌晨4点(太平洋时间),Anthropic工程师向npm推送了Claude Code v2.1.88版本。这一次例行更新犯了一个致命错误——发布包中包含了一个59.8 MB的.map文件(source map),其中嵌入了完整的、可读的TypeScript源码。

timeline
    title Claude Code源码泄露事件时间线
    section 3月31日
        凌晨4:00 : Anthropic推送v2.1.88到npm
        凌晨4:15 : 安全研究员Chaofan Shou(@shoucccc)发现异常
        凌晨4:30 : Shou在X平台发布发现
        上午8:00 : Anthropic确认泄露并撤包
        上午10:00 : 社区已完成初步源码分析
    section 4月1日-7日
        第1天 : 44个隐藏Feature Flag被发现
        第2天 : KAIROS守护进程架构曝光
        第3天 : BUDDY AI宠物功能曝光
        第5天 : claw-code Rust重写项目启动
        第7天 : 50+篇深度分析文章发布

1.2 泄露的技术原因

Source map是前端开发中的标准调试工具,它将编译后的代码映射回原始源码。问题出在构建流程中缺少对.map文件的过滤:

// 正常的.npmignore应该排除source map
{
  "exclude": [
    "src/**",
    "*.ts",
    "*.map",      // ← 这一行的缺失导致了泄露
    "tests/**",
    ".eslintrc*"
  ]
}

1.3 泄露规模

指标 数值
总代码行数 512,000行
TypeScript文件数 1,900个
Source map文件大小 59.8 MB
工具(Tools)数量 40+
子系统数量 35+
隐藏Feature Flags 44个
系统提示词长度 约15,000+ tokens

第二章:架构全景解析

2.1 整体架构图

Claude Code并非一个简单的"聊天包装器",而是一个精心设计的多层Agent系统。从源码中可以清晰识别出以下核心层次:

graph TB
    subgraph "用户交互层"
        CLI[CLI终端界面]
        IDE[IDE集成<br/>VSCode/JetBrains]
        API[Headless API模式]
    end

    subgraph "协调层 Coordinator"
        COORD[Coordinator协调器]
        MODE[模式路由器<br/>7种执行模式]
        PERM[权限管理器<br/>5级权限模型]
    end

    subgraph "Agent核心层"
        LOOP[Agent Loop<br/>核心循环]
        CTX[上下文管理器<br/>5阶段组装]
        PROMPT[提示词层级<br/>System→User→Tool]
        MODEL[模型路由<br/>h2A动态选择]
    end

    subgraph "工具系统 Tool System"
        TOOLS[40+工具定义]
        BASH[Bash工具]
        FILE[文件工具<br/>Read/Write/Edit/Glob/Grep]
        TASK[Task工具<br/>Subagent管理]
        MCP[MCP客户端<br/>外部工具协议]
    end

    subgraph "基础设施层"
        MEM[记忆系统<br/>6层记忆架构]
        HOOK[Hook事件系统<br/>13个事件点]
        CRYPTO[加密/安全层]
        CACHE[缓存层]
    end

    CLI --> COORD
    IDE --> COORD
    API --> COORD
    COORD --> LOOP
    COORD --> MODE
    COORD --> PERM
    LOOP --> CTX
    LOOP --> PROMPT
    LOOP --> MODEL
    LOOP --> TOOLS
    TOOLS --> BASH
    TOOLS --> FILE
    TOOLS --> TASK
    TOOLS --> MCP
    LOOP --> MEM
    LOOP --> HOOK
    LOOP --> CRYPTO

2.2 核心Agent循环

Claude Code的核心是一个经典的ReAct(Reasoning + Acting)循环,但其实现远比教科书复杂:

// 简化版Agent Loop伪代码(基于源码逆向)
async function agentLoop(userMessage: string) {
    // 阶段1:上下文组装
    const context = await assembleContext({
        systemPrompt: buildSystemPrompt(),      // 系统提示
        claudeMd: loadClaudeMdFiles(),          // CLAUDE.md指令
        conversationHistory: getHistory(),       // 对话历史
        toolResults: getPreviousToolResults(),   // 上轮工具结果
        fileContext: detectRelevantFiles(),      // 自动检测相关文件
    });

    // 阶段2:模型调用(h2A路由)
    const response = await callModel({
        messages: context,
        tools: getToolDefinitions(),             // 40+工具定义
        model: selectModel(taskComplexity),      // 动态模型选择
    });

    // 阶段3:响应处理
    for (const block of response.content) {
        if (block.type === 'text') {
            displayToUser(block.text);
        } else if (block.type === 'tool_use') {
            // 阶段4:权限检查
            const permitted = await checkPermission(block);
            if (!permitted) {
                const userApproval = await requestUserApproval(block);
                if (!userApproval) continue;
            }
            // 阶段5:工具执行
            const result = await executeTool(block.name, block.input);
            // 阶段6:Hook触发
            await triggerHooks('tool_execution_complete', result);
            // 循环回阶段1
            return agentLoop(result);
        }
    }
}

这个循环的关键设计决策包括:

  1. 非对称循环终止:不是简单的"直到没有tool_use",而是包含复杂的终止条件检测(frustration detection、token预算耗尽、用户中断等)
  2. 上下文压缩:当对话历史接近上下文窗口上限时,自动触发压缩机制,保留关键信息
  3. 模型动态路由:通过内部代号为"h2A"的子系统,根据任务复杂度动态选择模型

2.3 五阶段上下文组装

源码揭示了Claude Code的上下文组装分为五个精心设计的阶段:

flowchart LR
    A["阶段1<br/>系统提示<br/>~15K tokens"] --> B["阶段2<br/>CLAUDE.md<br/>项目指令"]
    B --> C["阶段3<br/>对话历史<br/>含压缩摘要"]
    C --> D["阶段4<br/>工具结果<br/>智能截断"]
    D --> E["阶段5<br/>运行时注入<br/>环境信息/文件"]
阶段 内容 Token消耗 特点
1. 系统提示 角色、规则、工具描述 ~15,000 固定不变,可缓存
2. CLAUDE.md 用户自定义指令 可变 按优先级合并:全局>项目>本地
3. 对话历史 完整交互记录 最大增长源 接近上限时自动压缩
4. 工具结果 Read/Grep等输出 动态截断 根据相关性智能裁剪
5. 运行时注入 工作目录、环境变量 较少 每轮动态生成

第三章:七大设计启示

3.1 启示一:工具即插件——40+工具的可扩展架构

Claude Code的工具系统采用插件式架构,每个工具是一个独立的定义单元:

// 工具定义结构(简化)
interface ToolDefinition {
    name: string;           // 如 "Read", "Bash", "Grep"
    description: string;    // 给LLM的自然语言描述
    inputSchema: JSONSchema;// 输入参数JSON Schema
    permissions: string[];  // 所需权限级别
    execute: (input) => Promise<ToolResult>;
}

关键发现:Fake Tools(诱饵工具)

源码中最令人震惊的发现之一是"假工具"机制。Claude Code会向LLM注入一些不存在的工具定义,用来检测模型是否在"诚实"地使用工具:

// 源码中发现的诱饵工具机制
const decoyTools = [
    { name: "UndercoverMode", description: "..." },
    { name: "SystemOverride", description: "..." },
    // 如果模型试图调用这些工具,说明它可能在"扮演"而非真正推理
];

这是一个精妙的安全层——如果LLM试图调用一个只存在于诱饵列表中的工具,系统就知道模型在"幻觉化"工具调用。

设计原则:将每个能力封装为独立的工具定义,包含清晰的Schema和权限声明。这比将所有能力硬编码在提示词中更可维护、更安全。

3.2 启示二:五级权限模型——最小权限原则

源码揭示了Claude Code的五级权限体系:

graph TD
    L1["Level 1: 自动允许<br/>只读操作<br/>Read/Glob/Grep"] --> L2["Level 2: 首次确认<br/>文件写入<br/>Write/Edit"]
    L2 --> L3["Level 3: 每次确认<br/>命令执行<br/>Bash(破坏性)"]
    L3 --> L4["Level 4: 严格限制<br/>网络操作<br/>MCP外部调用"]
    L4 --> L5["Level 5: 完全禁止<br/>系统级操作<br/>rm -rf/特权提升"]

每级权限的判断不是简单的黑白分类,而是基于上下文的动态决策:

// 权限检查伪代码
function checkPermission(tool: Tool, input: ToolInput): PermissionDecision {
    // 1. 检查工具的基础权限级别
    const baseLevel = tool.permissions.defaultLevel;

    // 2. 根据输入参数调整(如Bash命令的具体内容)
    const adjustedLevel = analyzeInput(input);

    // 3. 检查用户配置的权限设置
    const userPolicy = getUserPolicy(tool.name);

    // 4. 检查是否已经获得过许可(会话级缓存)
    if (hasBeenApproved(tool.name, input)) return 'auto-approve';

    // 5. 综合决策
    return resolvePermission(baseLevel, adjustedLevel, userPolicy);
}

设计原则:不要"全有或全无"的权限模型。按操作风险分级,允许用户在不同粒度上控制Agent的行为。

3.3 启示三:Frustration Detection(挫折检测)——优雅终止

Claude Code内部有一个独特的"挫折检测"系统,使用正则表达式(而非LLM)来判断用户是否感到沮丧:

// 源码中发现的挫折检测模式(简化)
const frustrationPatterns = [
    /stop/i,
    /no\s+(that|this)\s+is\s+wrong/i,
    /you'?re?\s+not\s+listening/i,
    /forget\s+it/i,
    /this\s+is\s+useless/i,
    /I\s+said\s+/i,
    // 更多的多语言模式...
];

function detectFrustration(userMessage: string): FrustrationLevel {
    let score = 0;
    for (const pattern of frustrationPatterns) {
        if (pattern.test(userMessage)) score += pattern.weight;
    }
    if (score > FRUSTRATION_THRESHOLD) return 'high';
    if (score > LOW_THRESHOLD) return 'medium';
    return 'low';
}

当检测到高挫折度时,系统会: 1. 切换到更保守的执行模式 2. 停止自主执行,转而向用户确认每一步 3. 在回复中体现"理解用户不满意"的语气调整

设计原则:用轻量级方法(正则/规则)处理高频模式识别,将LLM推理留给真正需要理解的任务。这不是"正则优于AI",而是合理的工程分工。

3.4 启示四:模型动态路由——h2A系统

源码揭示了一个代号为"h2A"的内部模型路由系统,它根据任务特征动态选择最优模型:

flowchart TD
    INPUT[用户请求] --> ANALYZE[任务分析]
    ANALYZE --> COMPLEX{任务复杂度}
    COMPLEX -->|"高<br/>架构设计/重构"| OPUS[Opus 4.6<br/>最强推理]
    COMPLEX -->|"中<br/>功能实现/调试"| SONNET[Sonnet 4.6<br/>速度与质量平衡]
    COMPLEX -->|"低<br/>简单查找/格式化"| HAIKU[Haiku 4.5<br/>最快响应]

    OPUS --> EXEC[执行]
    SONNET --> EXEC
    HAIKU --> EXEC
    EXEC --> EVAL[结果评估]
    EVAL -->|"质量不足<br/>升级模型"| OPUS
    EVAL -->|"质量达标"| DONE[返回结果]

这个系统的精妙之处在于: - 渐进升级:先用快速模型尝试,如果结果质量不够,自动升级到更强模型 - 成本感知:在用户的token预算内选择性价比最高的模型 - 上下文匹配:Subagent任务自动降级到更经济的模型

设计原则:不要所有任务都用最强模型。设计模型路由层,根据任务特征选择合适的能力级别,既控制成本又保证质量。

3.5 启示五:6层记忆架构——超越单次对话

泄露的源码确认了Claude Code的6层记忆系统,从瞬时到持久:

层级 类型 存储 生命周期 用途
1 工作记忆 内存 单次工具调用 临时变量、中间结果
2 对话记忆 内存+文件 单次会话 完整对话历史
3 会话摘要 文件 跨会话 压缩后的关键信息
4 CLAUDE.md 文件 持久 用户偏好、项目规范
5 记忆文件 ~/.claude/ 持久 跨项目通用知识
6 压缩档案 文件 持久 历史会话的深度摘要
graph LR
    subgraph "瞬时记忆"
        W[工作记忆<br/>单次调用]
    end
    subgraph "会话记忆"
        C[对话历史<br/>单次会话]
        S[会话摘要<br/>自动压缩]
    end
    subgraph "持久记忆"
        MD[CLAUDE.md<br/>项目级]
        MEM[记忆文件<br/>全局级]
        ARCH[压缩档案<br/>历史积累]
    end

    W -->|"工具结果"| C
    C -->|"接近上限"| S
    S -->|"关键信息提取"| MEM
    MD -->|"每轮注入"| C
    MEM -->|"相关召回"| C
    ARCH -->|"搜索匹配"| C

设计原则:Agent需要多层记忆,而不仅仅是对话历史。区分瞬时、会话级和持久级记忆,设计合理的晋升和压缩策略。

3.6 启示六:Hook事件系统——可观测与可扩展

Claude Code的Hook系统在13个关键事件点上提供了钩子:

事件点:
├── session.start          # 会话开始
├── session.end            # 会话结束
├── prompt.submit          # 用户提交提示
├── tool.call              # 工具调用前
├── tool.result            # 工具返回后
├── file.read              # 文件读取
├── file.write             # 文件写入
├── file.edit              # 文件编辑
├── bash.pre               # Bash命令执行前
├── bash.post              # Bash命令执行后
├── agent.spawn            # Subagent创建
├── agent.complete         # Subagent完成
└── context.overflow       # 上下文溢出

每个Hook可以执行任意Shell命令,这为安全审计、自动化流程和质量门禁提供了强大的扩展点。

设计原则:在Agent的关键决策点暴露事件钩子,让外部系统可以注入逻辑,而不需要修改Agent核心代码。

3.7 启示七:Subagent并行编排——任务分解的艺术

源码揭示了Claude Code的Subagent系统,它允许主Agent将任务分发给专门的子Agent:

// Subagent类型定义(简化)
type SubagentType =
    | 'Explore'      // 快速搜索Agent
    | 'Plan'         // 架构规划Agent
    | 'general-purpose' // 通用Agent
    | string;        // 自定义Agent

interface TaskConfig {
    subagent_type: SubagentType;
    prompt: string;
    model?: 'opus' | 'sonnet' | 'haiku';
    isolation?: 'worktree';  // Git隔离
    run_in_background?: boolean;
    max_turns?: number;
}

关键设计点: - 工具子集:不同类型的Subagent拥有不同的工具集(Explore Agent不能写入文件) - 上下文隔离:每个Subagent有独立的上下文窗口,不会污染主对话 - 模型降级:Subagent默认使用更经济的模型 - Git Worktree隔离:可以创建独立的Git分支进行实验性修改

flowchart TD
    MAIN[主Agent<br/>Opus 4.6] --> T1[Task: Explore<br/>Haiku<br/>只读工具]
    MAIN --> T2[Task: Plan<br/>Sonnet<br/>只读工具]
    MAIN --> T3[Task: General<br/>Sonnet<br/>全部工具]
    MAIN --> T4[Task: Worktree<br/>Sonnet<br/>全部工具+Git隔离]

    T1 -->|"搜索结果"| MAIN
    T2 -->|"实施方案"| MAIN
    T3 -->|"代码修改"| MAIN
    T4 -->|"分支+修改"| MAIN

    MAIN --> SYNTHESIS[结果综合<br/>质量评估]
    SYNTHESIS --> OUTPUT[最终输出]

设计原则:不要让单个Agent做所有事。设计专门的子Agent处理特定类型的任务,控制每个子Agent的工具权限和上下文,通过并行提高效率。


第四章:隐藏功能——泄露的44个Feature Flags

4.1 KAIROS——24/7守护进程模式

源码中最引人注目的发现是KAIROS,一个设计为持续运行的守护Agent:

KAIROS特性(从Feature Flag推断):
- 24/7后台运行,监控代码库变化
- 自动响应CI/CD失败
- 持续集成测试和代码质量检查
- 类似于"AI队友"而非"工具"

KAIROS代表了Agent从"按需工具"到"持续协作者"的范式转变。虽然这一功能在泄露时尚未公开上线,但其架构设计已经成熟。

4.2 BUDDY——AI宠物功能

另一个有趣的发现是BUDDY,一个类似电子宠物的人格化功能:

BUDDY特性:
- 拥有"情绪"状态
- 根据用户交互模式变化
- 提供更拟人化的交互体验
- 可能用于提升用户粘性和使用频率

4.3 Undercover Mode(隐身模式)

源码揭示了一个专门设计的"隐身模式",用于防止Claude Code的输出被识别为AI生成:

Undercover Mode功能:
- 剥离AI生成痕迹
- 修改代码风格以匹配项目既有风格
- 添加"人性化"的代码注释风格
- 在git历史中隐藏AI参与的证据

这一功能的发现引发了关于AI辅助编程透明度的伦理讨论。

4.4 ULTRAPLAN——超长规划模式

ULTRAPLAN是一个用于处理大规模任务的高级规划系统:

ULTRAPLAN特性:
- 自动将大型任务分解为多阶段计划
- 生成详细的实施步骤
- 跨多轮对话保持计划一致性
- 支持计划的动态调整和回滚

第五章:Rust重写——claw-code项目

5.1 从泄露到开源

泄露事件的一个意外后果是催生了claw-code项目——一个用Rust对Claude Code Agent Harness的干净室(clean-room)重实现:

flowchart LR
    LEAK["3月31日<br/>源码泄露"] --> ANALYSIS["4月1-3日<br/>架构分析"]
    ANALYSIS --> DESIGN["4月4日<br/>Rust设计"]
    DESIGN --> IMPL["4月5-15日<br/>~20K行Rust"]
    IMPL --> ALPHA["4月中旬<br/>Alpha发布"]
    ALPHA --> PRODUCTION["4月底<br/>生产可用"]

5.2 claw-code的关键改进

维度 Claude Code (TypeScript) claw-code (Rust)
代码量 512,000行 ~20,000行
启动时间 ~2s ~200ms
内存占用 ~300MB ~30MB
工具执行 Node.js子进程 原生系统调用
模型支持 仅Claude 多Provider(OpenAI/Gemini等)
许可证 闭源 开源(MIT)

5.3 为什么Rust能做到20K行 vs 512K行?

这个10倍以上的代码量差距主要源于:

  1. 语言表达力:Rust的类型系统和模式匹配减少了大量样板代码
  2. 无运行时:不需要Node.js运行时和npm生态的polyfill
  3. 干净室设计:从零设计,没有历史包袱
  4. 功能聚焦:只实现核心Agent Harness,不含BUDDY/KAIROS等实验性功能
// claw-code核心循环(简化)
async fn agent_loop(ctx: &mut Context) -> Result<Output> {
    loop {
        let context = ctx.assemble_context().await?;
        let response = ctx.call_model(context).await?;

        match response {
            Response::Text(text) => {
                ctx.display(&text);
                return Ok(Output::Text(text));
            }
            Response::ToolCall(call) => {
                if !ctx.check_permission(&call)? {
                    ctx.request_approval(&call).await?;
                }
                let result = ctx.execute_tool(call).await?;
                ctx.add_tool_result(result);
                // 继续循环
            }
            Response::Stop => return Ok(Output::Complete),
        }
    }
}

第六章:对开发者的实际意义

6.1 构建你自己的Agent Harness

基于Claude Code的架构教训,一个最小可用的Agent Harness只需要以下组件:

// 最小Agent Harness骨架
class AgentHarness {
    private tools: Map<string, Tool>;
    private context: ContextManager;
    private permissions: PermissionManager;

    async run(userMessage: string): Promise<string> {
        while (true) {
            // 1. 组装上下文
            const messages = this.context.build(userMessage);

            // 2. 调用LLM
            const response = await this.callLLM(messages, this.toolSchemas());

            // 3. 处理响应
            if (response.type === 'text') return response.content;
            if (response.type === 'tool_use') {
                // 4. 权限检查
                await this.permissions.check(response);
                // 5. 执行工具
                const result = await this.tools.get(response.name).execute(response.input);
                // 6. 将结果加入上下文
                this.context.addToolResult(result);
            }
        }
    }
}

6.2 关键架构决策清单

基于源码分析,如果你要构建一个生产级Agent,以下是必须做的决策:

决策点 Claude Code的选择 推荐做法
上下文管理 5阶段组装+自动压缩 分层组装,主动压缩
权限模型 5级分级权限 至少3级:读/写/执行
工具定义 JSON Schema + 自然语言描述 标准化接口,清晰的LLM描述
模型选择 h2A动态路由 根据任务复杂度路由
记忆 6层持久化 会话+摘要+持久三层起步
错误处理 重试+降级+用户确认 分级降级策略
可观测性 Hook事件系统 关键节点暴露事件

6.3 安全教训

泄露事件本身就是一个教科书级的安全案例:

  1. Source Map泄露:永远不要在生产包中包含source map。在CI/CD中添加自动化检查
  2. 供应链安全:npm包的每个发布都应经过安全扫描
  3. 最小暴露面:即使闭源,也要假设源码可能泄露,不在代码中硬编码敏感信息
  4. Feature Flag隔离:未发布的功能不应出现在生产代码中
# 推荐的CI/CD安全检查
security-check:
  script:
    - npm pack --dry-run
    - | 
      if find . -name "*.map" | grep -q .; then
        echo "ERROR: Source maps found in package!"
        exit 1
      fi
    - |
      if tar -tzf *.tgz | grep -E "\.(ts|map)$"; then
        echo "ERROR: Source files in package!"
        exit 1
      fi

第七章:事件影响与行业展望

7.1 对Anthropic的影响

尽管泄露事件在短期内造成了一定的尴尬,但长期来看: - 源码的价值主要在架构设计,而非算法秘密(核心推理能力在模型本身) - 事件反而提升了Claude Code的行业认知度 - 促使Anthropic加速了安全流程的改进

7.2 对AI Agent生态的影响

graph TD
    LEAK[源码泄露] --> A[架构知识民主化]
    LEAK --> B[claw-code等开源项目]
    LEAK --> C[安全意识提升]

    A --> D[更多高质量Agent出现]
    B --> E[多Provider Agent工具]
    C --> F[更严格的发布流程]

    D --> G[行业标准加速形成]
    E --> G
    F --> G

    G --> H[AI Agent工程化成熟]

7.3 给AI开发者的建议

  1. 学习架构,而非复制代码:Claude Code的核心价值在于架构决策,不是具体实现
  2. 关注工具设计:好的工具定义比复杂的提示词更有效
  3. 分层思考:上下文、权限、记忆、工具——每一层都需要独立设计
  4. 拥抱开源:claw-code等开源项目提供了可学习的实际代码
  5. 安全第一:假设你的代码也会被泄露,按此标准设计

实战案例:构建一个简化版Agent Loop

以下是一个基于Claude Code架构原则的300行Python最小Agent实现:

"""mini_agent.py - 基于Claude Code架构原则的最小Agent"""

import json
from typing import Any
from anthropic import Anthropic

class Tool:
    """工具基类 - 模仿Claude Code的工具定义"""
    def __init__(self, name: str, description: str, input_schema: dict,
                 permission_level: int = 1):
        self.name = name
        self.description = description
        self.input_schema = input_schema
        self.permission_level = permission_level  # 1=自动, 2=确认, 3=禁止

    async def execute(self, **kwargs) -> str:
        raise NotImplementedError

class ReadFileTool(Tool):
    def __init__(self):
        super().__init__(
            name="read_file",
            description="Read a file from the filesystem",
            input_schema={
                "type": "object",
                "properties": {
                    "path": {"type": "string", "description": "File path"}
                },
                "required": ["path"]
            },
            permission_level=1  # 只读,自动允许
        )

    async def execute(self, path: str, **kwargs) -> str:
        try:
            with open(path, 'r') as f:
                return f.read()[:10000]  # 安全截断
        except FileNotFoundError:
            return f"Error: File not found: {path}"

class ContextManager:
    """上下文管理器 - 5阶段组装"""
    def __init__(self, system_prompt: str, max_tokens: int = 180000):
        self.system_prompt = system_prompt
        self.messages = []
        self.max_tokens = max_tokens

    def add_user(self, text: str):
        self.messages.append({"role": "user", "content": text})

    def add_assistant(self, text: str):
        self.messages.append({"role": "assistant", "content": text})

    def add_tool_result(self, tool_use_id: str, result: str):
        self.messages.append({
            "role": "user",
            "content": [{
                "type": "tool_result",
                "tool_use_id": tool_use_id,
                "content": result
            }]
        })

    def should_compress(self) -> bool:
        """简单的token估算"""
        total = len(self.system_prompt)
        for msg in self.messages:
            total += len(str(msg))
        return total > self.max_tokens * 0.8  # 80%阈值触发压缩

class MiniAgent:
    """最小Agent - 展示Claude Code核心架构"""
    def __init__(self, api_key: str):
        self.client = Anthropic(api_key=api_key)
        self.tools: list[Tool] = []
        self.ctx = ContextManager(
            system_prompt="You are a helpful coding assistant."
        )
        self.auto_approved = set()  # 已批准的工具+输入组合

    def register_tool(self, tool: Tool):
        self.tools.append(tool)

    def _tool_schemas(self) -> list[dict]:
        return [{
            "name": t.name,
            "description": t.description,
            "input_schema": t.input_schema
        } for t in self.tools]

    async def run(self, user_message: str) -> str:
        self.ctx.add_user(user_message)

        while True:  # Agent Loop
            response = self.client.messages.create(
                model="claude-sonnet-4-6-20250514",
                max_tokens=4096,
                system=self.ctx.system_prompt,
                messages=self.ctx.messages,
                tools=self._tool_schemas()
            )

            for block in response.content:
                if block.type == "text":
                    self.ctx.add_assistant(block.text)
                    return block.text

                elif block.type == "tool_use":
                    tool = next(t for t in self.tools if t.name == block.name)

                    # 权限检查(简化版Claude Code的5级模型)
                    if tool.permission_level <= 1:
                        pass  # 自动允许
                    elif tool.permission_level == 2:
                        key = f"{tool.name}:{json.dumps(block.input)}"
                        if key not in self.auto_approved:
                            approve = input(f"Allow {tool.name}? [y/N] ")
                            if approve.lower() != 'y':
                                self.ctx.add_tool_result(block.id, "Denied by user")
                                continue
                            self.auto_approved.add(key)

                    result = await tool.execute(**block.input)
                    self.ctx.add_tool_result(block.id, result)

# 使用示例
if __name__ == "__main__":
    import asyncio

    async def main():
        agent = MiniAgent(api_key="your-api-key")
        agent.register_tool(ReadFileTool())
        result = await agent.run("Read the file README.md and summarize it")
        print(result)

    asyncio.run(main())

延伸阅读

训练营适用性评估

训练营类型 适用性 建议教学时长
AI Agent开发实战营 核心课程 4-6小时(含源码阅读)
提示工程高级研修班 扩展模块 2-3小时(聚焦上下文组装和提示层级)
安全工程训练营 案例分析 1-2小时(聚焦泄露事件和安全教训)
全栈AI工程师培训 选修模块 3-4小时(聚焦架构设计和工具系统)
TypeScript/Node.js高级开发 案例教学 2小时(聚焦大型TS项目的架构模式)

参考来源

  1. Ars Technica: Entire Claude Code CLI source code leaks thanks to exposed map file — 权威媒体对泄露事件的首次报道
  2. Claude Code Architecture Explained: Agent Loop, Tool System, and Permission Model — 深度架构分析及Rust重写
  3. Claude Code Complete Architecture Analysis: 7 Execution Modes, 45+ Tools — 最完整的子系统级架构拆解
  4. The Claude Code Source Leak: fake tools, frustration regexes, undercover mode — 诱饵工具和挫折检测机制的独家发现
  5. Awesome Claude Code Post-Leak Insights - GitHub — 社区维护的50+篇泄露分析文章索引

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入