跳转至

Coding Agent:Claude Code 深度剖析 + 开源生态

更新日期:2026-04-15

本文目标:深入理解 Claude Code 的完整内部架构(tool loop、subagents、hooks、skills、MCP、memory、permission、compaction),对比主流开源 Coding Agent(Cline/Roo Code/OpenHands/Aider/Continue/OpenCode/Codex CLI),能据此选型或自建。

一、Coding Agent 生态全景

flowchart LR
    subgraph cli["CLI / 终端"]
        cc["Claude Code"]
        codex["Codex CLI"]
        opencode["OpenCode"]
        aider["Aider"]
    end
    subgraph ide["IDE 插件"]
        cline["Cline / Roo"]
        cont["Continue"]
        cur["Cursor"]
    end
    subgraph platform["平台 / SaaS"]
        oh["OpenHands"]
        devin["Devin"]
        copilot["Copilot Workspace"]
    end

    classDef stage fill:#fff,stroke:#cc785c,color:#1a1a1a;
    class cc,codex,opencode,aider,cline,cont,cur,oh,devin,copilot stage
类型 代表 部署形态 自主性
CLI Claude Code, Codex CLI, OpenCode, Aider 终端 + 工程目录 高(agentic loop)
IDE Cline, Roo, Continue, Cursor 编辑器内嵌 中(依赖人 review)
平台 Devin, OpenHands, Copilot Workspace 云端容器 高(沙箱中独立运行)

二、Claude Code 完整架构

2.1 分层视图

flowchart LR
    ui["UI 层<br/>CLI / IDE / Web"]
    loop["Agent Loop<br/>tool call + hooks"]
    tools["工具层<br/>Read/Write/Bash/Task<br/>MCP / Subagents"]
    memory["上下文层<br/>CLAUDE.md / Memory<br/>Compaction"]
    api["模型层<br/>Claude API"]

    ui --> loop --> tools
    loop --> memory
    loop --> api

    classDef stage fill:#fff,stroke:#cc785c,color:#1a1a1a;
    class ui,loop,tools,memory,api stage

2.2 核心循环(Agentic Loop)

Claude Code 不是聊天机器人,而是 Agentic Loop:模型输出 → 解析工具调用 → 执行工具 → 结果回喂 → 继续生成,直到模型主动停止。参考 Inside Claude Code Architecture

# Claude Code 的核心循环(简化伪代码)
async def agentic_loop(user_input, session):
    session.messages.append({"role": "user", "content": user_input})

    # 1. 触发 UserPromptSubmit hook
    for hook in hooks.get("UserPromptSubmit"):
        result = await hook.run(user_input, session)
        if result.blocked: return result.reason

    while True:
        # 2. 构建完整请求
        system_prompt = build_system_prompt(session)  # 见 §2.3
        tools_schema = collect_tools_schema(session)  # 见 §2.4

        # 3. 调用 Claude API (streaming)
        response = await claude_api.messages.stream(
            model=session.model,
            system=system_prompt,
            messages=session.messages,
            tools=tools_schema,
            max_tokens=8192,
        )

        # 4. 流式解析: text / tool_use / thinking blocks
        async for event in response:
            if event.type == "text_delta":
                print(event.text, end="")        # 实时显示
            elif event.type == "tool_use":
                tool_call = event.tool_use       # 累积完整 tool call
            elif event.type == "message_stop":
                break

        session.messages.append(response.to_message())

        # 5. 如果没有 tool call 就结束
        if response.stop_reason == "end_turn":
            return

        # 6. 执行工具调用
        for tool_call in response.tool_calls:
            # PreToolUse hook - 可拒绝/修改参数
            pre_result = await run_hook("PreToolUse", tool_call, session)
            if pre_result.blocked:
                tool_result = pre_result.reason
            else:
                tool_call = pre_result.modified or tool_call
                tool_result = await execute_tool(tool_call, session)

            # PostToolUse hook
            await run_hook("PostToolUse", tool_call, tool_result, session)

            session.messages.append({
                "role": "user",
                "content": [{
                    "type": "tool_result",
                    "tool_use_id": tool_call.id,
                    "content": str(tool_result)
                }]
            })

        # 7. Context 管理: 超限则 compaction
        if session.token_count > THRESHOLD:
            await compact(session)

    # 循环直到模型 end_turn 或达到 max_steps

2.3 System Prompt 构建(多层组合)

Claude Code 的 system prompt 不是一个固定字符串,而是动态组合。参考 How Claude Code Builds a System Prompt

2.4 CLAUDE.md 层级合并

搜索顺序(从上到下, 后者覆盖/补充前者):

1. 内置系统级 (写死在代码里)
2. 企业级 ~/.claude.json (managed deployment)
3. 用户级 ~/.claude/CLAUDE.md
4. 用户本地 ~/.claude/CLAUDE.local.md (gitignored)
5. 项目根 ./CLAUDE.md
6. 项目本地 ./CLAUDE.local.md (gitignored)
7. 子目录 ./src/CLAUDE.md (按 CWD 动态加载)
8. 规则模块 ~/.claude/rules/*.md (按需加载)

三、内置工具完整清单

Claude Code 有 ~24 个内置工具。这些工具的描述文本本身就是 system prompt 的一部分,影响模型何时调用它们。参考 claude-code-system-prompts (Piebald-AI)

3.1 文件操作工具

3.2 代码搜索工具

3.3 执行工具

3.4 编排工具

3.5 Web 工具

3.6 工具加载优化(deferred loading)

关键优化:MCP 工具可能有几十上百个,如果全部 schema 都放进 system prompt,会吃掉大量上下文。Claude Code 采用 deferred loading:system prompt 只列出工具名字,完整 schema 在需要时通过 ToolSearch 按需加载。

# System prompt 只看到:
"Available MCP tools: mcp__slack__send_message, mcp__jira__create_ticket, ..."

# 当模型想用 slack__send_message 时:
ToolSearch({
  "query": "select:mcp__slack__send_message"
})
# 返回完整 schema,然后才能调用

# 可节省 50%+ 的 context(当有 50+ 工具时)



上级 · H4. Coding Agent:Claude Code / Cursor / Devin / OpenClaw