ACP 不是 MCP 的平替:拆解 Claude Code 的子进程 Agent 架构——与 OpenClaw、Hermes 的三角对照

三角对照:OpenClaw Gateway → Hermes 单循环 → Claude Code 子进程

TL;DR

Claude Code 是 Anthropic 官方推出的 CLI Agent,npm 全局安装后通过 claude 命令运行。它与 OpenClaw 和 Hermes Agent 解决同一个问题------让 AI 自主执行编程任务------但架构哲学走出了第三条路:子进程隔离模型

OpenClaw 用 Gateway hub-and-spoke 把 25+ 通道和 14+ 子 Agent 串在一起;Hermes 用 Python 单循环 run_conversation() 在进程内完成一切;Claude Code 则把 Agent Runtime、MCP Server、子 Agent 全部跑在独立子进程 里,通过 Node.js child_process.spawn() 和 ACP 协议(JSON-RPC over stdio)通信。

本文从源码级拆解 Claude Code 的子进程架构、ACP 协议实现、Session 模型、多 Agent 协作和安全机制,并在每个维度与 OpenClaw CLI Runner 和 Hermes delegate_task 做三角对照。


一、先看全貌:Claude Code 的进程模型

1.1 启动链路

python 复制代码
用户执行 claude 命令
  → npm global bin: claude.cmd / claude
    → Node.js 主进程启动
      → 加载 CLI 参数(--print / --model / --allowedTools...)
        → 初始化 Session(新会话或 --continue/--resume)
          → 进入 Agent Loop

Claude Code 本身是一个 Node.js CLI 应用 (npm 包 @anthropic-ai/claude-code),没有独立的 Gateway 进程。主进程承担三个角色:

角色 说明
CLI 入口 解析命令行参数、环境变量、Settings 文件
Agent Runtime 执行 Agent Loop:组装 System Prompt → 模型调用 → 工具分发
进程管理器 通过 child_process.spawn() 管理 MCP Server、子 Agent、浏览器 Daemon

1.2 与 OpenClaw / Hermes 的第一层差异

维度 OpenClaw Hermes Agent Claude Code
语言 TypeScript (Node.js) Python TypeScript (Node.js)
架构模型 Gateway hub-and-spoke 单进程直接循环 主进程 + 子进程树
入口 Gateway 进程绑定端口 run_conversation() claude CLI 命令
多会话 Lane Queue 原生并发 单会话,多次调用 单会话,可 resume
通道 25+ 内置(Telegram/Discord...) Telegram + WebUI 终端 TUI + ACP

关键差异:OpenClaw 的 Gateway 是持久化服务 ,7×24 运行;Claude Code 和 Hermes 都是一次性会话------执行完退出,无需守护进程。


二、子进程模型:为什么 Claude Code 不用单循环?

2.1 Node.js child_process 四大原语

Claude Code 的进程管理全部建立在 Node.js child_process 模块之上:

scss 复制代码
child_process.spawn()    → 创建 MCP Server 子进程(stdio pipe 通信)
child_process.fork()     → 创建子 Agent(IPC 通道 + 独立 V8 实例)
child_process.exec()     → 执行一次性 Shell 命令(Bash 工具)
child_process.execFile() → 执行指定二进制文件

spawn vs fork 的区别

  • spawn:启动任意可执行文件,通过 stdin/stdout/stderr pipe 通信。用于 MCP Server(外部进程)。
  • fork:启动新的 Node.js 进程,带 IPC 通道(process.send() / process.on('message'))。用于子 Agent(同语言、需要结构化消息)。

2.2 实际运行的进程树

一个典型 Claude Code 会话启动后的进程树:

scss 复制代码
claude (主进程, PID 12345)
  ├── node mcp-server-filesystem (MCP Server, PID 12346)
  ├── node mcp-server-github (MCP Server, PID 12347)
  ├── chrome-headless-shell (浏览器 Daemon, PID 12348)
  ├── claude --print (子 Agent "reviewer", PID 12349)
  └── claude --print (子 Agent "tester", PID 12350)

每个子进程完全独立------独立的内存空间、独立的 V8 实例、独立的错误边界。一个 MCP Server 崩溃不会影响主 Agent Loop

2.3 三角对照:进程隔离哲学

OpenClaw CLI Runner Hermes delegate_task Claude Code
子任务执行方式 独立子进程,ACP 协议 独立子进程,Hermes 内部调度 独立子进程,ACP 协议
进程隔离 ✅ 完全隔离 ✅ 完全隔离 ✅ 完全隔离
通信协议 ACP (JSON-RPC over stdio) Hermes 内部 RPC ACP (JSON-RPC over stdio)
子进程管理 Gateway 负责 spawn + 生命周期 delegate_task 工具负责 主进程直接 spawn
崩溃恢复 Gateway 检测 + 重启 超时 + 重试 父进程捕获 exit code

共同点 :三者都选择了子进程隔离执行高风险任务------没有人让 Agent 在同一个进程里跑 rm -rf

差异:OpenClaw 把子进程管理抽象为 Gateway 层,Hermes 抽象为工具层,Claude Code 直接在 CLI 层 spawn------抽象层级逐级下移。


三、ACP 协议:Agent 与 IDE 的标准通信层

3.1 ACP 是什么

ACP(Agent Client Protocol)由 Zed Industries 主导,2025 年 9 月发布。它是一个开放标准,定义了编辑器(Client)与 AI Agent(Server)之间的 JSON-RPC 通信规范

理解 ACP 最好的类比是 LSP(Language Server Protocol)------LSP 让所有编辑器都能接入任何语言的智能提示,ACP 让所有编辑器都能接入任何 AI Agent。

3.2 ACP 角色:Client / Server(命名与直觉相反)

bash 复制代码
编辑器(ACP Client)           Agent(ACP Server)
     │                              │
     │  session/new ───────────────→│  创建会话
     │  session/load ──────────────→│  恢复会话
     │  session/set_mode ──────────→│  切换模式
     │                              │
     │←─ terminal/create ──────────│  请求执行命令
     │←─ terminal/wait_for_exit ───│  等待命令完成
     │←─ session/request_permission│  请求用户授权
     │←─ session/update ──────────│  流式输出进度

关键理解:Agent 是 Server,编辑器是 Client。Agent 主动向编辑器请求权限、创建终端、推送更新------不是编辑器"调用"Agent,而是 Agent"驱动"编辑器。

3.3 Claude Code 的 ACP 实现

Claude Code 通过 --acp 模式启动为 ACP Server:

bash 复制代码
# 以 ACP Server 模式启动,通过 stdio 与编辑器通信
claude --acp

通信方式:JSON-RPC over stdio------Agent 进程的 stdin/stdout 承载所有协议消息。这与 LSP 完全一致,不需要网络端口、不需要 HTTP Server。

3.4 ACP vs MCP:两个协议的分工

MCP (Model Context Protocol) ACP (Agent Client Protocol)
解决什么问题 Model ↔ Tool 通信 Editor ↔ Agent 通信
谁定义的 Anthropic Zed Industries
谁调用谁 Agent 调用 MCP Server Editor 连接 Agent(ACP Server)
通信方向 Agent → MCP Server(单向) Editor ↔ Agent(双向)
类比 工具注册表 IDE 插件协议

ACP 和 MCP 在协议层面相互独立------ACP Agent 可以同时是 MCP Host(调用 MCP 工具),但 ACP 协议本身不感知 MCP。

3.5 三角对照:通信协议设计

OpenClaw Hermes Agent Claude Code
主通信协议 ACP(CLI Runner)+ Channel Plugin 无标准协议,直接工具调用 ACP(原生支持)
MCP 支持 ✅ MCP Client ❌ 无内置 ✅ MCP Client
协议标准化 高(ACP + MCP 双协议) 低(自研工具注册表) 高(ACP + MCP 双协议)
编辑器集成 ACP 可接入 Zed/VS Code 无标准编辑器集成 ACP 可接入 Zed/VS Code

Claude Code 和 OpenClaw 都选了 ACP + MCP 双协议------ACP 负责 Agent ↔ 编辑器通信,MCP 负责 Agent ↔ 工具通信。Hermes 走自研路线,所有通信都在同一个 Python 进程内通过 ToolRegistry 完成。


四、Session 模型:JSON 文件 vs 数据库

4.1 Claude Code 的 Session 持久化

Claude Code 的会话以 JSON 文件 形式持久化在 ~/.claude/projects/<project-hash>/ 下:

ruby 复制代码
~/.claude/projects/
  └── a1b2c3d4/          # 项目 hash
      ├── sessions/
      │   ├── abc-123.json  # 会话 1
      │   └── def-456.json  # 会话 2
      └── memory/           # Auto-memory(≤25KB / ≤200行)

每个 Session JSON 包含完整对话历史、工具调用记录、token 用量。恢复机制:

bash 复制代码
claude --continue           # 恢复当前目录最近会话
claude --resume <session-id> # 恢复指定会话
claude -c                   # 简写,等同 --continue

4.2 Auto-Memory:Agent 自管理记忆

Claude Code 有一个独特的自动记忆 机制:Agent 在会话中自主判断哪些信息值得跨会话保留,写入 ~/.claude/projects/<hash>/memory/。限制 25KB / 200 行------这意味着 Agent 必须做选择性记忆,不是全量日志。

这与 Hermes 的 Hindsight 自动 retain 理念类似,但实现方式完全不同:Claude Code 靠 Agent 自己判断,Hermes 靠独立的记忆引擎(SQL 模板 + pgvector)。

4.3 三角对照:Session 与记忆

OpenClaw Hermes Agent Claude Code
Session 存储 JSONL 按行追加文件 Session DB (SQLite) + Hindsight PG JSON 文件
语义搜索 ❌ 无(靠 grep) ✅ pgvector 472ms 召回 ❌ 无
跨会话记忆 Daily Markdown(Agent 自管理) Hindsight PG(独立引擎) Auto-Memory(Agent 自管理)
记忆上限 无硬限制(文件系统) PG 无上限 25KB / 200 行

Claude Code 和 OpenClaw 都选择了Agent 自管理记忆 ------让 Agent 决定记什么。Hermes 选择了独立记忆引擎------Hindsight 在 Agent Loop 之外运行,不受 Agent 的判断力限制。这是三个框架在记忆哲学上最根本的分歧。


五、多 Agent 协作:子 Agent 与 Task Tool

5.1 Claude Code 的子 Agent 模型

Claude Code 支持三种子 Agent 创建方式:

方式 1:静态定义(.claude/agents/)

markdown 复制代码
# .claude/agents/security-reviewer.md
---
name: security-reviewer
description: Security-focused code review
model: opus
tools: [Read, Bash]
---
你是一个资深安全工程师。审查代码中的注入漏洞、认证缺陷、密钥泄露。

使用时在对话中 @security-reviewer review the auth module

方式 2:动态 CLI flag

bash 复制代码
claude --agents '{"reviewer":{"description":"Reviews code","prompt":"You are a code reviewer"}}' -p 'Use @reviewer to check auth.py'

方式 3:Task Tool 自动 spawn

Agent 在 Agent Loop 中自主判断任务复杂度,需要并行处理时通过 Task Tool 创建子 Agent------与 OpenClaw 的 sessions_spawn 理念一致。

5.2 子 Agent 的进程模型

每个子 Agent 通过 child_process.fork()child_process.spawn() 启动------完全独立的 Node.js 进程。这意味着:

  • 独立的内存空间(不会污染主 Agent 的上下文)
  • 独立的模型调用(可以指定不同 model)
  • 独立的工具权限(可以 restrict 工具列表)
  • 崩溃不传播(子 Agent OOM 不影响主 Agent)

5.3 三角对照:多 Agent 实现

OpenClaw Hermes Agent Claude Code
创建方式 sessions_spawn 工具 delegate_task 工具 @agent-name + Task Tool
进程模型 CLI Runner(子进程) 子进程 子进程(fork/spawn)
配置独立性 ✅ 独立 SOUL.md + 模型 ✅ 独立 toolsets + 模型 ✅ 独立 prompt + 模型 + 工具
通信方式 ACP Hermes 内部 RPC IPC / stdio
并行上限 无硬限制 5(delegate_task) 无硬限制
编排复杂度 高(需自己设计 Agent 协作) 中(Kanban 模式) 中(@agent-name 简单直观)

Claude Code 的独特优势@agent-name 语法极其简洁------在对话中像 @某人一样调用子 Agent,不需要写工具调用代码。这是三个框架中对开发者最友好的多 Agent 接口。


六、安全模型:Permission 分级 + Hooks 拦截

6.1 五级 Permission Mode

arduino 复制代码
default       → 标准模式:危险操作弹确认
acceptEdits   → 自动接受编辑,其他弹确认
plan          → 只读规划模式,不允许写
auto          → 自动批准(谨慎使用)
bypassPermissions → 完全跳过权限检查

通过 Shift+Tab 在 TUI 中实时切换,或通过 --permission-mode CLI 参数指定。

6.2 工具白名单/黑名单

bash 复制代码
# 只允许读文件和 git 操作
claude --allowedTools "Read,Bash(git *)" -p "review the code"

# 禁止读写 .env 文件
claude --disallowedTools "Read(.env),Write(.env)" -p "refactor"

工具名支持 glob 模式:Bash(npm run lint:*) 只允许特定 npm 脚本。

6.3 Hooks 系统:8 种拦截点

Hooks 是 Claude Code 安全模型的核心创新------在 8 个关键时刻执行自定义脚本:

Hook 触发时机 典型用途
UserPromptSubmit 用户发送消息前 输入验证
PreToolUse 工具执行前 拦截危险命令(exit 2 = 阻止)
PostToolUse 工具执行后 自动格式化代码
Notification 权限请求时 桌面通知
Stop Agent 响应完成 完成日志
SubagentStop 子 Agent 完成 编排逻辑
PreCompact 上下文压缩前 备份会话
SessionStart 会话开始时 加载开发环境

安全 Hook 示例

json 复制代码
{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Bash",
      "hooks": [{
        "type": "command",
        "command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -qE 'rm -rf|git push.*--force'; then echo 'Blocked!' && exit 2; fi"
      }]
    }]
  }
}

6.4 三角对照:安全模型

OpenClaw Hermes Agent Claude Code
权限模型 ToolPolicy(confirm + sandbox) 四层防御(Prompt→Policy→Terminal→Vault) 五级 Permission Mode + 工具白名单
用户确认 ✅ 危险操作弹确认 ❌ 靠 Prompt 规则约束 ✅ 按 Permission Mode 分级
Prompt Injection 防御 ❌ 无内置 ✅ threat_patterns.py ❌ 无内置
凭据管理 环境变量 AES-256-CBC Vault 环境变量 / apiKeyHelper
沙箱 Docker(CLI Runner) execute_code 沙箱 子进程隔离(非沙箱)
Hook/拦截点 ❌ 无 ❌ 无 ✅ 8 种 Hook 类型

核心差异 :Claude Code 把安全防线设在用户交互层 ------通过 Permission Mode 让用户控制 Agent 能做多危险的事。Hermes 把防线设在系统层------Prompt Injection 检测 + Vault 加密 + 爆炸半径评估。OpenClaw 居中------ToolPolicy 精细但无自动拦截。


七、Settings 层级:四层配置覆盖

Claude Code 的配置层级设计值得单独一节------它比 OpenClaw 和 Hermes 都更精细:

markdown 复制代码
优先级从高到低:
1. CLI flags               → 覆盖一切
2. .claude/settings.local.json  → 个人项目配置(gitignored)
3. .claude/settings.json        → 团队共享项目配置(git-tracked)
4. ~/.claude/settings.json      → 全局用户配置

对应的 Context 文件也分三层:

objectivec 复制代码
~/.claude/CLAUDE.md              → 全局(所有项目生效)
./CLAUDE.md                      → 项目级(git-tracked)
.claude/CLAUDE.local.md          → 个人项目覆盖(gitignored)

设计理念 :团队共享 settings.json + CLAUDE.md,个人通过 .local 文件覆盖,不会被 git 追踪导致冲突。

三角对照:配置管理

OpenClaw Hermes Agent Claude Code
配置文件 openclaw.json + SOUL.md config.yaml + SOUL.md + skills/ settings.json ×3 + CLAUDE.md ×3
层级 2 层(全局 + 项目) 2 层(全局 + Profile) 4 层(CLI > local > project > global)
团队协作 ❌ 单一项目文件 ❌ 无团队共享机制 .local 分离团队/个人
热加载 需重启 需重启 需重启

八、终局对照:五维选型矩阵

维度 OpenClaw Hermes Agent Claude Code
最佳场景 多通道 AI 助手平台 深度定制 Agent 运行时 终端编程助手
进程模型 Gateway 持久化服务 Python 单循环 Node.js 子进程树
通信标准 ACP + MCP ✅ 自研 ✅ ACP + MCP ✅
多 Agent sessions_spawn(第一公民) delegate_task(工具层) @agent-name(对话层)
语义记忆 ❌ grep 文件 ✅ pgvector 472ms ❌ Agent 自管理
安全防线 用户确认 系统拦截 分级权限
配置管理 2 层 2 层 4 层
编辑器集成 ACP → Zed/VS Code ACP → Zed/VS Code
学习曲线 高(Gateway + Channel Plugin) 中(Python 生态) 低(npm install 即用)
社区规模 380K GitHub Stars 快速增长

九、总结:三条路线,一个趋势

OpenClaw:平台路线。 Gateway 是内核,Channel Plugin 是驱动,ACP + MCP 双协议让 Agent 融入开发生态。380K Star 的社区飞轮驱动生态繁荣。代价是复杂度高、调试门槛高。

Hermes Agent:深度路线。 Python 单循环 + Hindsight PG 语义记忆 + 四层安全防御。不做平台做深度------当需要从近万条历史事实中 472ms 语义召回时,只有 Hermes 能做到。代价是通道少、多 Agent 是后来者。

Claude Code:务实路线。 Node.js 子进程模型 + 最友好的多 Agent 接口(@agent-name)+ 最精细的权限分级。不追求平台效应,专注做好一件事:让开发者在终端里用 AI 写代码。代价是记忆系统薄弱(无语义搜索)、无多通道支持。

共同趋势 :三个框架都选择了子进程隔离执行高风险任务------没有人让 Agent 在同一进程里跑不可信代码。ACP 协议正在成为 Agent ↔ 编辑器的标准通信层,Claude Code 和 OpenClaw 都已接入。

下一篇预告 :Codex CLI 源码拆解------OpenAI 的 Python Agent 框架如何用子进程模型与 Claude Code 正面对标,以及与 Hermes 的 delegate_task 形成三角对照。

相关推荐
starrysky8105 天前
被忽视的Django生产陷阱:为什么ALLOWED_HOSTS通配符救不了你——DisallowedHost根因排查与中间件修复
angular.js
starrysky8106 天前
Hermes Agent 的 70+ 工具不是硬编码的:一套自注册的注册表引擎 [04]
angular.js
巴勒个啦8 天前
Pinia 源码解析:响应式状态管理是如何工作的
angular.js
starrysky8109 天前
拆开 Hermes Agent 的引擎盖:八大子系统、37 个模块,一张地图讲清楚——底层系列开篇
angular.js
巴勒个啦11 天前
esbuild 插件实战:5个真实场景带你自定义构建流水线
前端·angular.js
李浚泽11 天前
Angular9 NG-ZORRO 9 复选框组合最佳实践
angular.js
starrysky81013 天前
AI 助手调试踩坑:5 轮瞎猜定位 4s budget 兜底路径(含 Hindsight 反思账本使用指南)
angular.js
LiuJun2Son13 天前
Angular 快速入门:服务和依赖注入
前端·javascript·angular.js
weixin_li152********14 天前
《Angular 中优雅地处理枚举值:Map + *ngIf as 替代多次 *ngIf》
javascript·vue.js·angular.js