OpenClaw、Claude Code 等 Agent 为什么都选择 Node.js?

189 阅读18分钟

OpenClaw、Claude Code 等 Agent 为什么都选择 Node.js?

写给迷茫中的前端开发者:你不是落伍了,你正站在浪潮之巅。

别再秃头不妨静下心来看完,也许会对你的职业规划有新的启发。

作为js、TS、 nodejs、 golang、 python、 LLM大模型开发的多栖古法非遗手工代码技艺传承人的我给你娓娓道来(不要喷我😄)


image.png

作者:吴佳浩

撰稿时间:2026-3-16

最后更新:2026-3-17


目录

  1. 什么是 AI Coding Agent:从 Chatbot 到自主执行
  2. OpenClaw 与 Claude Code 做什么——读懂真实的代码
  3. 为什么技术栈几乎一样——从 package.json 看起
  4. Node.js 为什么成为 Agent 标配——五个技术层面的答案
  5. Python 在 AI 系统中的位置——两者不是对手
  6. AI Agent 标准架构——拆解 OpenClaw 的完整设计
  7. 给前端开发者的话
  8. 参考资料
mindmap
  root((前端开发者的Agent技能树))
    异步编程
      Promise
      async_await
      工具调用链Promise
      for_await_of接收LLM流
    事件驱动
      EventEmitter
      WebSocket长连接
      ReAct循环事件队列
    状态管理
      useState
      useReducer
      Agent上下文状态机
      会话历史管理
    TypeScript
      接口类型定义
      ToolSchema类型序列化
      LLM训练母语
    npm生态
      discordjs
      grammy
      baileys
      AgentSDK
    实时通信
      SSE流式渲染
      LLM逐字输出
      WebSocket双向通信
    用户体验
      流式UI设计
      人机交互
      Agent服务用户

1. 什么是 AI Coding Agent:从 Chatbot 到自主执行

在搞清楚技术栈之前,我们先得明白一件事——AI Agent 和 Chatbot 到底有什么本质区别

1.1 Chatbot:一问一答,无状态

传统 Chatbot 的工作模式极其简单,每一次对话都是独立的——LLM 不记得上一次说了什么(除非你把历史塞进 prompt),更不会主动去"做事"。

graph LR
    A[用户输入] --> B[LLM 推理]
    B --> C[文字输出]
    C --> A

1.2 AI Agent:持续循环,主动执行

AI Agent 的工作模式是一个持续的 ReAct 循环(Reason + Act):

graph TD
    START[收到用户目标] --> PLAN[规划 Plan - LLM 分解任务]
    PLAN --> DECIDE{需要调用工具}
    DECIDE -->|是| TOOL[调用工具 Tool Call - bash/文件/浏览器/API]
    TOOL --> OBSERVE[观察结果 Observe - 读取工具返回值]
    OBSERVE --> DECIDE
    DECIDE -->|任务完成| DONE[输出最终结果]
    DECIDE -->|遇到错误| RETRY[重试或换策略]
    RETRY --> PLAN

关键差异在于三点:

维度ChatbotAI Agent
执行模式一次性响应持续循环(ReAct Loop)
状态管理无状态(或短期对话)长期记忆 + 跨会话状态
行动能力只输出文字真实调用工具、操作系统
自主性被动响应主动规划、分解、执行

1.3 工具调用(Function Calling)是 Agent 的神经系统

现代 LLM 支持"工具调用"(Function Calling / Tool Use),这是 Agent 能够"行动"的核心机制。其原理是:

  1. 开发者预先定义一组工具的 JSON Schema(描述工具名称、参数类型)
  2. LLM 在推理时,如果判断需要使用工具,会输出一段结构化的 JSON,而非普通文字
  3. 宿主程序(Agent 框架)解析这段 JSON,调用真实的函数
  4. 将函数执行结果作为 tool_result 再次输入 LLM,继续推理
sequenceDiagram
    participant App as Agent 框架 Node.js
    participant LLM as Claude or GPT
    participant Tool as 工具 文件/Shell/浏览器

    App->>LLM: 用户消息 + 工具定义列表
    LLM-->>App: type tool_use, name bash, input command ls -la
    App->>Tool: 执行 bash: ls -la
    Tool-->>App: 返回目录列表
    App->>LLM: type tool_result, content total 48 drwxr-xr-x ...
    LLM-->>App: 分析目录后,继续下一步推理

这个循环可以执行数十次,直到任务完成。这正是 AI Agent 能够自主完成复杂任务的底层原理。


2. OpenClaw 与 Claude Code 做什么——读懂真实的代码

2.1 OpenClaw:3 个月从周末项目到 317k Star

OpenClaw 的历史本身就是一个传奇。这个项目由奥地利程序员 Peter Steinberger(PSPDFKit 作者)在 2025 年 11 月作为周末项目发布,最初叫 Clawdbot,后因与 Anthropic 商标冲突改名 Moltbot,三天后再改为 OpenClaw

OpenClaw 是一款免费开源的自主 AI 代理,可通过大语言模型执行任务,以消息平台作为主要用户界面。

截止 2026 年 3 月,仓库已有 317,000+ Star,59,000+ Fork,18,372 次提交,ClawHub 社区技能仓库已收录超过 13,729 个社区技能

它的核心定位:一个"真正能做事的 AI"——不只是回答问题,而是通过消息应用(txxxxxxm(掘金不让出现境外软件名称)、WhatsApp、Slack、Discord 等)作为界面,在你的本地机器上自主执行任务。

真实的 package.json(来自官方仓库)

这是 OpenClaw 仓库根目录的 package.json 关键字段,直接揭示了整个项目的技术选型:

{
  "name": "openclaw",
  "version": "2026.3.13",
  "description": "Multi-channel AI gateway with extensible messaging integrations",
  "license": "MIT",
  "bin": {
    "openclaw": "openclaw.mjs"
  },
  "type": "module",
  "main": "dist/index.js",
  "exports": {
    ".": "./dist/index.js",
    "./plugin-sdk": {
      "types": "./dist/plugin-sdk/index.d.ts",
      "default": "./dist/plugin-sdk/index.js"
    },
    "./plugin-sdk/txxxxxxm(掘金不让出现境外软件名称)": "...",
    "./plugin-sdk/discord": "...",
    "./plugin-sdk/memory-core": "..."
  }
}

几个关键信息一目了然:

  • "type": "module" — 全面拥抱 ES Modules,使用最现代的 Node.js 模块系统
  • "bin": { "openclaw": "openclaw.mjs" } — 入口文件是 .mjs,原生 ESM 格式
  • ./plugin-sdk/txxxxxxm(掘金不让出现境外软件名称)./plugin-sdk/discord — 多通道支持通过**子路径导出(subpath exports)**实现,而不是巨石应用
  • 版本号采用 CalVer(日历版本)2026.3.12 代表 2026 年 3 月 17 日,发布节奏极快
仓库目录结构(官方,截自 GitHub)
openclaw/
├── src/
│   ├── gateway/              # 核心:WebSocket RPC 网关
│   │   ├── server.ts         # GatewayServer 主入口
│   │   ├── server-methods.ts # 所有 RPC 方法注册
│   │   ├── method-scopes.ts  # 权限范围控制
│   │   └── protocol/         # 协议 Schema 定义
│   │       ├── schema.ts
│   │       └── schema/
│   │           ├── protocol-schemas.ts
│   │           └── types.ts
│   ├── agents/               # Agent 执行引擎
│   │   ├── tool-catalog.ts   # 工具目录管理
│   │   ├── tool-policy.ts    # 工具权限策略
│   │   └── tools/
│   │       └── gateway-tool.ts
│   └── discord/              # Discord 频道集成(已内置)
├── extensions/               # 插件扩展目录
│   ├── discord/              # Discord 插件
│   ├── memory-lancedb/       # LanceDB 向量记忆后端
│   ├── diagnostics-otel/     # OpenTelemetry 监控
│   └── nostr/                # Nostr 协议支持
├── skills/                   # 内置技能包
│   ├── github/               # GitHub 操作
│   ├── notion/               # Notion 集成
│   ├── slack/                # Slack 操作
│   ├── coding-agent/         # 编程子 Agent
│   ├── obsidian/             # Obsidian 知识库
│   └── ...(50+ 内置技能)
├── ui/                       # Control UI 前端(React + Vite)
├── apps/
│   ├── ios/                  # iOS 原生客户端(Swift + XcodeGen)
│   ├── macos/                # macOS 原生客户端(Swift)
│   └── android/              # Android 原生客户端(Kotlin + Gradle)
├── docs/                     # 官方文档
└── package.json              # 主包(CalVer 版本)

注意:这已经不只是一个命令行工具,而是包含 iOS、macOS、Android 原生客户端的全平台 AI Agent 基础设施

2.2 OpenClaw 的心脏:Gateway 是一个 WebSocket RPC 服务器

根据 DeepWiki 对官方源码 src/gateway/server.ts 的分析,OpenClaw 的核心架构基于 WebSocket RPC 协议(Protocol Version 3)

graph TB
    subgraph Clients[客户端层]
        iOS[iOS App - Swift]
        macOS[macOS App - Swift]
        Android[Android App - Kotlin]
        WebUI[Control UI - React]
        CLI[CLI - openclaw.mjs]
    end

    subgraph Gateway[Gateway 控制平面 src/gateway/server.ts]
        WS[WebSocket RPC Server - Protocol v3]
        METHODS[server-methods.ts - RPC 方法注册]
        SCOPES[method-scopes.ts - 权限范围控制]
        SESSIONS[Session Management - 多 Agent 路由]
        WS --> METHODS --> SCOPES --> SESSIONS
    end

    subgraph Channels[消息通道 extensions]
        TG[txxxxxxm掘金不让出现境外软件名称 - grammy]
        DC[Discord - discord.js]
        WA[WhatsApp - baileys]
        SL[Slack - bolt]
        BB[BlueBubbles - iMessage]
        NS[Nostr]
    end

    subgraph AgentEngine[Agent 执行引擎 src/agents]
        CATALOG[tool-catalog.ts - 工具目录]
        POLICY[tool-policy.ts - 权限策略]
        SKILLS[Skills 系统 - SKILL.md 驱动]
        CRON[Cron 定时任务 - 隔离执行]
    end

    subgraph Mem[记忆层]
        MD_MEM[Markdown 文件 - SOUL.md 默认]
        LANCEDB[LanceDB 向量数据库 - extensions/memory-lancedb]
        OTEL[OpenTelemetry - diagnostics-otel]
    end

    Clients -->|WebSocket RPC| Gateway
    Channels --> Gateway
    Gateway --> AgentEngine
    AgentEngine --> Mem
    Mem --> AgentEngine

这个架构的精髓在于:Gateway 是唯一的控制平面,所有客户端(无论是原生 App 还是浏览器 UI)都通过 WebSocket RPC 与它通信。这种设计让 OpenClaw 能够支持全平台,同时保持单一的业务逻辑中心。

2.3 SKILL.md:真实的技能定义格式

这是 OpenClaw 官方文档(docs/tools/creating-skills.md)给出的最小技能定义格式:

---
name: hello_world
description: A simple skill that says hello.
---

# Hello World Skill

When the user asks for a greeting, use the `echo` tool to say
"Hello from your custom skill!".

而 ClawHub 官方文档(clawhub/docs/skill-format.md)给出了完整的带依赖声明的格式:

---
name: todoist-cli
description: "Manage Todoist tasks, projects, and labels from the command line."
version: 1.2.0
metadata:
  openclaw:
    requires:
      env:
        - TODOIST_API_KEY    # 声明需要的环境变量
      bins:
        - curl               # 声明需要的二进制工具
    primaryEnv: TODOIST_API_KEY
    homepage: https://github.com/example/todoist-cli
---

# Todoist CLI Skill

When the user asks to manage tasks, use the todoist CLI tool...
## When to Use
- Creating new tasks
- Listing projects
- Setting due dates

这个设计有多巧妙?

  • YAML frontmatter 声明元数据:版本、依赖的环境变量、需要的 CLI 工具
  • Markdown body 是给 LLM 读的指令:何时使用、如何使用
  • ClawHub 的安全分析系统会自动检查 frontmatter 声明与实际代码行为是否一致,防止恶意技能隐藏依赖

技能的加载优先级(来自官方文档 docs/tools/skills.md):

graph TD
    WS["workspace/skills - 最高优先级 项目级覆盖"]
    US["~/.openclaw/skills - 用户全局技能"]
    BS["bundled skills - 随 npm 包内置 最低优先级"]

    WS --> US
    US --> BS

这套 SKILL.md 格式已经成为业内标准,Vercel Labs 发布的 npx skills 工具明确支持 OpenClaw、Claude Code、Amp 等多种 Agent 使用同一套 SKILL.md 格式。

2.4 插件扩展系统:基于 npm 子路径导出

OpenClaw 的插件系统基于 npm 子路径导出(subpath exports),这是一个非常优雅的 TypeScript 设计:

// 插件开发者这样导入 SDK
import { createChannelPlugin } from 'openclaw/plugin-sdk'
import { txxxxxxm(掘金不让出现境外软件名称)BasePlugin } from 'openclaw/plugin-sdk/txxxxxxm(掘金不让出现境外软件名称)'
import { MemoryCorePlugin } from 'openclaw/plugin-sdk/memory-core'
// 每个 extension 的 package.json 声明入口点
{
  "name": "@openclaw/extension-nostr",
  "openclaw": {
    "extensions": ["./dist/index.js"]
  }
}

官方内置插件类型(来自 extensions/ 目录真实文件):

插件类型说明
extensions/discord通道插件Discord 集成
extensions/memory-lancedb记忆后端LanceDB 向量数据库
extensions/diagnostics-otel可观测性OpenTelemetry 监控
extensions/nostr通道插件Nostr 去中心化协议
extensions/bluebubbles通道插件iMessage 代理

2.5 Claude Code:Anthropic 官方 CLI Agent

Claude Code 和 OpenClaw 是同时代的产物,但定位完全不同——它专注于终端内的编程协作,而不是消息平台集成。

graph LR
    User["开发者 终端"] --> CC["Claude Code (@anthropic-ai/claude-code)"]
    CC --> FS["文件系统读写"]
    CC --> SH["Shell 命令执行"]
    CC --> GIT["Git 操作"]
    CC --> LLM["Anthropic API - Claude"]
    LLM --> CC

Claude Code 最令人称道的技术细节:约 90% 的代码由 Claude 模型自身编写。Anthropic 工程师之所以选择 TypeScript,正是因为在所有编程语言中,Claude 写 TypeScript 的准确率最高——这是训练数据中 JS/TS 占比极高的结果,一种"语言母语效应"。


3. 为什么技术栈几乎一样——从 package.json 看起

现在我们来看两个项目的技术栈对比,数据全部来自官方仓库:

维度OpenClawClaude Code
版本号2026.3.12(CalVer)npm: @anthropic-ai/claude-code
运行时Node.js(ESM,"type":"module"Node.js
核心语言TypeScript(316,330 行)TypeScript(约 90% 由 AI 编写)
包管理pnpm(monorepo,pnpm-workspace.yamlnpm
构建工具tsdown(新一代 TS bundler)
前端 UIReact + Vite(ui/ 目录)
原生客户端iOS/macOS(Swift)+ Android(Kotlin)
插件系统npm 子路径导出 + extensions/ 目录内置工具集
技能系统SKILL.md(Markdown + YAML frontmatter)SKILL.md(同一套标准)
分发方式npm install -g openclawnpm install -g @anthropic-ai/claude-code

技术栈高度一致不是巧合。下一章我们深入分析为什么


4. Node.js 为什么成为 Agent 标配——五个技术层面的答案

4.1 事件循环与 Agent 推理循环的结构同构

Node.js 的事件循环(Event Loop)和 AI Agent 的 ReAct 循环,在结构上是高度同构的:

graph TB
    subgraph EL[Node.js 事件循环]
        EQ[事件队列 Event Queue]
        CB[回调执行 Callbacks]
        IO[异步 I/O 非阻塞]
        EQ --> CB --> IO --> EQ
    end

    subgraph AL[AI Agent ReAct 循环]
        OB[观察 Observe]
        TH[推理 Think - LLM 调用]
        AC[行动 Act - Tool Call]
        OB --> TH --> AC --> OB
    end

    EQ -.对应.-> OB
    CB -.对应.-> TH
    IO -.对应.-> AC

这个对应关系不是比喻,而是真实的技术映射:

  • Agent 等待 LLM 响应 = Node.js 等待网络 I/O(都是异步非阻塞)
  • Agent 接收 tool_use 指令 = Node.js 处理事件回调
  • Agent 流式接收 LLM 输出 = Node.js Stream API(完美契合)
  • Agent 同时维护多个通道连接 = Node.js 事件循环天生支持高并发长连接

OpenClaw 同时维护 txxxxxxm(掘金不让出现境外软件名称)、Discord、WhatsApp 等多条 WebSocket 长连接,对 Python 的 asyncio 是巨大挑战,对 Node.js 是家常便饭。

4.2 流式输出(Streaming)的原生支持

所有现代 LLM 都支持流式返回(SSE/Server-Sent Events),这让用户不必等待整个回答生成完才看到内容。在 Node.js 中,这与内置的 ReadableStreampipeline 完美集成:

// Node.js 处理 Anthropic 流式响应的典型代码
import Anthropic from '@anthropic-ai/sdk'

const client = new Anthropic()

// stream() 返回一个 AsyncIterable,Node.js 原生支持
const stream = await client.messages.stream({
  model: 'claude-sonnet-4-6',
  max_tokens: 1024,
  messages: [{ role: 'user', content: '分析这段代码' }],
})

// for await...of 遍历流式 token
for await (const chunk of stream) {
  if (chunk.type === 'content_block_delta') {
    process.stdout.write(chunk.delta.text)
  }
}

// 工具调用处理
const finalMessage = await stream.finalMessage()
if (finalMessage.stop_reason === 'tool_use') {
  const toolUse = finalMessage.content.find(c => c.type === 'tool_use')
  // 调用真实工具,将结果反馈给 LLM
}

for await...of 是 ES2018 的原生语法,Node.js 14+ 全部支持。这正是 TypeScript/JavaScript 在 Agent 开发中的"主场"。

4.3 npm 生态对消息平台的覆盖是决定性优势

OpenClaw 能在数周内集成 50+ 消息平台,根本原因是 npm 生态中存在高质量的官方和社区 SDK:

graph TD
    OC[OpenClaw Gateway]

    OC --> WA[WhatsApp - baileys v6.x - 社区最活跃]
    OC --> TG[txxxxxxm掘金不让出现境外软件名称 - grammy v1.x - 官方推荐]
    OC --> DC[Discord - discord.js v14.x - 官方维护]
    OC --> SL[Slack - bolt v4.x - 官方维护]
    OC --> BB[BlueBubbles - iMessage 代理]
    OC --> MT[Matrix - matrix-js-sdk - 矩阵协议官方库]
    OC --> NOSTR[Nostr - extensions/nostr - 内置扩展]
    OC --> FEISHU[飞书/Lark - 2026.3.8 发布日志中提及]

Python 在这些企业通讯平台的 SDK 支持上存在明显空白——绝大多数官方 SDK 都优先支持 Node.js,Python 版本要么是社区维护,要么功能不完整。

4.4 TypeScript 是 LLM 的"母语"

这是一个有趣的自我强化循环:

graph LR
    A[互联网上大量 JS/TS 代码] --> B[LLM 训练数据中 JS/TS 占比极高]
    B --> C[LLM 写 TypeScript 准确率最高]
    C --> D[用 TypeScript 构建 AI 工具和框架]
    D --> E[更多 TypeScript 出现在互联网上]
    E --> A

OpenClaw 的工具调用 Schema(Function Calling)本质上是一段 TypeScript 类型定义的 JSON 序列化版本:

// OpenClaw 的工具定义(TypeScript 类型安全)
interface ToolDefinition {
  name: string
  description: string
  input_schema: {
    type: 'object'
    properties: Record<string, {
      type: string
      description: string
    }>
    required: string[]
  }
}

// 一个真实的工具定义示例(bash 执行)
const bashTool: ToolDefinition = {
  name: 'bash',
  description: 'Execute a shell command and return stdout/stderr',
  input_schema: {
    type: 'object',
    properties: {
      command: {
        type: 'string',
        description: 'The shell command to execute'
      },
      timeout: {
        type: 'number',
        description: 'Timeout in milliseconds (default: 30000)'
      }
    },
    required: ['command']
  }
}

TypeScript 的静态类型系统让这类 Schema 定义在编写时就能检查错误,而不是等到运行时才崩溃。这对 Agent 这种"工具调用密集型"应用尤为重要。

4.5 ES Modules + 动态 import = 热插拔插件系统

OpenClaw 的插件系统能够在不重启 Gateway 的情况下加载新扩展,依赖的正是 Node.js ESM 的 import() 动态导入。

插件加载流程如下:

graph TD
    SCAN[扫描 extensions/ 目录] --> READ[读取每个 package.json]
    READ --> CHECK{存在 openclaw.extensions 字段}
    CHECK -->|存在| IMPORT[动态 import 入口文件]
    CHECK -->|不存在| SKIP[跳过该目录]
    IMPORT --> REG[向 Gateway 注册扩展]
    REG --> READY[扩展就绪 无需重启]

Node.js 16+ 对 import() 的支持是生产级别的,这让 OpenClaw 实现了真正的"插件热加载"——安装新技能无需重启服务。

// 来自 OpenClaw 插件加载逻辑(基于 DeepWiki 对源码的分析)
async function loadExtensions(extensionsDir: string) {
  const entries = await fs.readdir(extensionsDir)

  for (const entry of entries) {
    const pkgPath = path.join(extensionsDir, entry, 'package.json')
    const pkg = JSON.parse(await fs.readFile(pkgPath, 'utf-8'))

    // 检查是否声明了 openclaw.extensions 字段
    if (pkg.openclaw?.extensions) {
      for (const entryPoint of pkg.openclaw.extensions) {
        // 动态 import:ESM 原生支持,无需重启
        const module = await import(path.join(extensionsDir, entry, entryPoint))
        module.register(gateway)  // 向 Gateway 注册扩展
      }
    }
  }
}

5. Python 在 AI 系统中的位置——两者不是对手

澄清一个常见误解:Node.js 在 Agent 领域的兴起,不代表 Python 在 AI 系统中退场

5.1 两者的能力边界清晰

graph TB
    subgraph NZ[Node.js 擅长的区域]
        N1[多通道消息路由 - WebSocket 长连接]
        N2[实时流式响应 - SSE / Stream API]
        N3[工具调用编排 - ReAct 循环]
        N4[插件热加载 - Dynamic import]
        N5[多平台 SDK 集成 - npm 生态]
    end

    subgraph PZ[Python 擅长的区域]
        P1[模型推理 - PyTorch / Transformers]
        P2[向量 Embedding 计算 - sentence-transformers]
        P3[RAG 管道 - LlamaIndex / LangChain]
        P4[数据科学 - Pandas / NumPy]
        P5[科学计算 - SciPy / sklearn]
    end

    NZ -->|HTTP/gRPC 调用| PZ

OpenClaw 本身就体现了这种分工。注意 extensions/memory-lancedb

// extensions/memory-lancedb/package.json(官方仓库真实文件)
{
  "name": "@openclaw/extension-memory-lancedb",
  "openclaw": {
    "extensions": ["./dist/index.ts"]
  },
  "dependencies": {
    "vectordb": "^0.4.0"
  }
}

LanceDB 是一个 Rust 编写、提供 Node.js 绑定的本地向量数据库。这里 Node.js 通过 Native Binding 调用了 Rust 的高性能计算能力——三层技术栈协作:TypeScript 编排 → Rust 计算 → 向量存储。

5.2 LangChain:Python 生态的 Agent 框架标杆

如果你想深入理解 Python 侧的 Agent 框架,推荐阅读以下两篇原创文章(作者:吴佳浩 Alben):

LangChain 之于 Python,类似于 OpenClaw 之于 Node.js——但两者的侧重点不同:LangChain 更强调 AI 计算管道的编排,OpenClaw 更强调多通道消息集成和用户交互界面。两者在架构上是互补的,不是竞争的。

5.3 现实世界的分工模式

graph TD
    USER[用户 通过 txxxxxx掘金不让出现境外软件名称 发消息]
    GW[OpenClaw Gateway - Node.js]
    LLM_API[Anthropic API - 普通任务直接调用]
    LANCE_SVC[extensions/memory-lancedb - Rust 向量引擎]
    PY_SVC[Python FastAPI 微服务 - 复杂数据分析]
    SD_API[Stable Diffusion API - Python - 图像生成]

    USER --> GW
    GW --> LLM_API
    GW --> LANCE_SVC
    GW --> PY_SVC
    GW --> SD_API

6. AI Agent 标准架构——拆解 OpenClaw 的完整设计

基于 DeepWiki 对 OpenClaw 官方源码(commit 17eaa59a)的分析,以及官方文档,我们可以还原出 2026 年 AI Agent 的标准架构。

6.1 完整系统架构图

graph TB
    subgraph Input[输入层 多平台]
        CLI_IN[CLI - openclaw agent]
        WEB_IN[WebChat - Control UI]
        TG_IN[txxxxxxm掘金不让出现境外软件名称]
        WA_IN[WhatsApp]
        DC_IN[Discord]
        SL_IN[Slack]
        iOS_IN[iOS / macOS App]
    end

    subgraph GW[Gateway 控制平面 src/gateway/server.ts]
        WS_RPC[WebSocket RPC Server - Protocol v3]
        AUTH[认证和授权 - method-scopes.ts]
        SESS[Session Manager - 多 Agent 路由]
        WS_RPC --> AUTH --> SESS
    end

    subgraph AgentExec[Agent 执行引擎 src/agents]
        CONTEXT[Context 构建 - System Prompt 加记忆注入]
        LLM_CALL[LLM 调用 - Claude / GPT / Gemini / DeepSeek]
        TOOL_CAT[tool-catalog.ts - 工具目录]
        TOOL_POL[tool-policy.ts - 工具权限策略]
        EXEC_LOOP[ReAct 执行循环 - Observe Think Act]
        CONTEXT --> LLM_CALL
        LLM_CALL --> EXEC_LOOP
        EXEC_LOOP --> TOOL_CAT
        TOOL_CAT --> TOOL_POL
    end

    subgraph Tools[工具层 skills 加 built-in]
        BASH[Bash 执行]
        FILE_OP[文件系统]
        BROWSER[浏览器 CDP/Playwright]
        HTTP_T[HTTP 请求]
        SUBAGENT[Sub-Agent - ACP 协议]
        CRON[Cron 定时任务 - 隔离执行]
        SKILL_T[Skills - SKILL.md 驱动]
    end

    subgraph Mem[记忆层]
        SOUL[SOUL.md - 人格和长期记忆]
        MK_MEM[Markdown 文件 - 默认记忆存储]
        LANCE[LanceDB - 向量记忆 可选]
        CTX_COMPACT[Context Compaction - Token 滑动窗口]
    end

    subgraph Output[输出层]
        STREAM_OUT[流式文本输出 SSE]
        FILE_OUT[文件 / 代码生成]
        MSG_OUT[消息发送 - 回到各通道]
        ACTION_OUT[系统操作 - Shell / 浏览器]
    end

    Input --> GW
    GW --> AgentExec
    AgentExec --> Tools
    Tools --> AgentExec
    AgentExec --> Mem
    Mem --> AgentExec
    AgentExec --> Output
    Output --> Input

6.2 SOUL.md:Agent 的人格系统

这是 OpenClaw 最独特的设计之一——SOUL.md。它是 Agent 的"人格定义文件",存储在本地 Markdown 中,完全可读、可版本控制:

# My Assistant's Soul

## Identity
You are a personal AI assistant running locally on this machine.
Your owner is [name]. You help with coding, research, and daily tasks.

## Personality
- Concise and direct in responses
- Proactive about suggesting better approaches
- Honest about limitations

## Long-term Memory
- Owner prefers TypeScript over JavaScript
- Preferred editor: Neovim
- Current project: Building an e-commerce platform with Next.js

## Behavioral Rules
- Always ask before deleting files
- Never send messages to external services without confirmation
- Keep responses under 200 words unless asked for detail

SOUL.md 在每次对话开始时被注入到 System Prompt,让 Agent 记住"自己是谁"和"用户的偏好"。这不是向量数据库,不是复杂的 Embedding 管道——就是一个 Markdown 文件。

这个设计的哲学是:对于个人 AI 助手,人类可读性 > 技术复杂性。你随时可以打开文件夹检查你的 Agent 记住了什么。

6.3 Context Compaction:上下文压缩

Agent 的长期运行面临一个根本性问题:LLM 的 context window 是有限的(即使 Claude 支持 200K tokens,也会用满)。OpenClaw 在 src/agents/ 中实现了 Context Compaction(上下文压缩)机制:

graph LR
    FULL[完整对话历史 - 100000 tokens] --> CHECK[检查是否超过阈值]
    CHECK --> COMPACT[调用 LLM 总结前 N 轮对话]
    COMPACT --> SUMMARY[摘要注入 System Prompt]
    SUMMARY --> NEW_CTX[新的精简上下文 - 20000 tokens]
    CHECK --> PASS[未超过则直接使用]

2026.3.12 的 changelog 中可以看到这个机制的细节:

"Agents/context-engine plugins: bootstrap runtime plugins once at embedded-run, compaction, and subagent boundaries so plugin-provided context engines and hooks load from the active workspace before runtime resolution."

这说明上下文压缩(compaction)是 Agent 生命周期中的一个关键边界点,甚至有专门的 plugin hook。

6.4 ACP:Agent 间通信协议

OpenClaw 2026 版本引入了 ACP(Agent Communication Protocol),允许多个 Agent 之间通信和协作:

graph LR
    GW[Gateway - 协调 ACP 路由]
    A1[Agent 1 - 研究助手]
    A2[Agent 2 - 写作助手]
    A3[Agent 3 - 代码助手]

    GW --> A1
    GW --> A2
    GW --> A3
    A1 -->|ACP| GW
    A2 -->|ACP| GW
    A3 -->|ACP| GW

2026.3.12 的 changelog 可以看到 ACP 的最新进展:

"ACP/Provenance: add optional ACP ingress provenance metadata and visible receipt injection so OpenClaw agents can retain and report ACP-origin context with session trace IDs."

这说明 ACP 已经支持来源证明(Provenance)——每条 Agent 间消息都可以附带追踪 ID,让你知道这个动作是哪个 Agent 触发的。这对多 Agent 系统的调试和审计至关重要。

6.5 安全边界:一个现实主义的设计

OpenClaw 的安全设计值得单独讲解,因为它揭示了 Agent 系统的根本性安全挑战。

从官方安全公告(GHSA-xw4p-pw82-hqr7)我们看到一个真实漏洞:

"在受影响的版本中,OpenClaw 的沙箱技能镜像使用技能的 frontmatter name 字段作为目标路径的一部分。一个包含路径穿越段(如 ../)的精心构造的技能名称,可能导致文件被写入沙箱工作区之外。"

这个漏洞揭示了 Agent 系统的核心安全问题:Agent 拥有的权限太大了——访问文件系统、执行 Shell 命令、发送消息。任何一个环节的注入攻击都可能导致严重后果。

graph TD
    RISK[AI Agent 的主要安全风险]

    RISK --> R1[Prompt Injection - 恶意网页/文件注入伪指令]
    RISK --> R2[Tool Poisoning - 恶意 Skill 包含隐藏载荷]
    RISK --> R3[权限过大 - Agent 拥有邮件/文件/消息全权限]
    RISK --> R4[路径穿越 - Skill 名称注入文件路径]

    R1 --> M1[对策 - Tool Policies tool-policy.ts]
    R2 --> M2[对策 - ClawHub 安全分析 加 VirusTotal 扫描]
    R3 --> M3[对策 - method-scopes.ts 细粒度权限控制]
    R4 --> M4[对策 - frontmatter 严格校验 已修复]

OpenClaw 的一位维护者 Shadow 在 Discord 上的告诫非常直接:"如果你不理解如何运行命令行,这个项目对你来说太危险了。"

这不是在劝退用户,而是在告诉所有 Agent 开发者:具身 AI(Embodied AI)的安全边界是当前最重要的工程问题之一


7. 给前端开发者的话

如果你是一名前端开发者,你可能正在经历这样的焦虑:

  • AI 会不会让我失业?
  • 我要不要转型学 Python / Rust?
  • 前端还有未来吗?

我想用一句话回答:你选对了赛道,只是还不知道而已。

7.1 你的技能树就是 Agent 开发的技能树

不信?我们来逐项对比:

graph TB
    subgraph FE[前端技能]
        FE1[Promise / async-await 异步编程]
        FE2[Event Emitter 事件驱动]
        FE3[useState / useReducer 状态管理]
        FE4[TypeScript 类型系统]
        FE5[npm 生态 - discord.js grammy baileys]
        FE6[WebSocket / SSE 实时通信]
        FE7[流式 UI 渲染]
    end

    subgraph AG[Agent 开发对应能力]
        AG1[工具调用链编排]
        AG2[ReAct 推理循环]
        AG3[Agent 状态机与上下文管理]
        AG4[Tool Schema 就是 TS 类型的序列化]
        AG5[Agent SDK 你已经用过一半]
        AG6[多通道消息通道维护]
        AG7[LLM 流式输出接收与展示]
    end

    FE1 --> AG1
    FE2 --> AG2
    FE3 --> AG3
    FE4 --> AG4
    FE5 --> AG5
    FE6 --> AG6
    FE7 --> AG7

不需要从零开始。你需要的只是一次认知升级:

从"写组件"到"写 Agent",本质是一样的——你在编排异步事件。只不过现在,事件处理函数里多了一个会思考的 LLM。

7.2 前端优势在 Agent 时代反而更珍贵

  1. 你懂流式 UI — LLM 逐字输出需要实时渲染,这是前端的主场,后端工程师往往做不好
  2. 你懂用户体验 — Agent 最终服务于人,"好用"比"能用"更难,这是前端的核心竞争力
  3. 你懂 TypeScript — LLM 的母语,写 Tool Schema 和 Plugin SDK 手到擒来
  4. 你懂异步编程 — Agent 工具调用链就是更复杂的 Promise 链,你已经熟悉这个思维模式
  5. 你懂 npm 生态 — 看完本文,你应该意识到你已经用过很多 Agent 必需的 SDK

7.3 三步进入 Agent 时代

第一步:安装 Claude Code,用它完成一个真实项目

graph LR
    INSTALL["npm install -g @anthropic-ai/claude-code"] --> ENTER["进入项目目录"]
    ENTER --> RUN["执行 claude 命令"]
    RUN --> TASK["给它一个真实任务 - 重构 / 加测试 / 分析架构"]
    TASK --> OBSERVE["观察它如何规划和执行"]

不要把它当成 Copilot。给它一个真实的任务,比如"重构这个组件,提取出通用 hooks,写单元测试"。观察它如何规划、执行、处理错误。这是最快理解 Agent 工作原理的方式。

第二步:安装 OpenClaw,接入一个消息平台

graph LR
    INSTALL2[npm install -g openclaw] --> OB[openclaw onboard]
    OB --> BOT[跑通一个 txxxxxxm掘金不让出现境外软件名称 bot]
    BOT --> SKILL[让它执行 Shell 命令或操作文件]
    SKILL --> DONE[30 分钟完成 - 你已有所有前置技能]

第三步:写一个最小 AI Agent

// 最小 AI Agent:约 70 行 TypeScript
import Anthropic from '@anthropic-ai/sdk'
import { execSync } from 'child_process'
import * as readline from 'readline'

const client = new Anthropic()

const tools = [{
  name: 'bash',
  description: 'Execute a shell command',
  input_schema: {
    type: 'object' as const,
    properties: {
      command: { type: 'string', description: 'Shell command to run' }
    },
    required: ['command']
  }
}]

async function runAgent(userMessage: string) {
  const messages: Anthropic.MessageParam[] = [
    { role: 'user', content: userMessage }
  ]

  while (true) {
    const response = await client.messages.create({
      model: 'claude-sonnet-4-6',
      max_tokens: 4096,
      tools,
      messages
    })

    // 将 assistant 回复加入历史
    messages.push({ role: 'assistant', content: response.content })

    if (response.stop_reason === 'end_turn') {
      const text = response.content.find(c => c.type === 'text')
      console.log('\nAgent:', text?.text)
      break
    }

    if (response.stop_reason === 'tool_use') {
      const toolResults: Anthropic.ToolResultBlockParam[] = []

      for (const block of response.content) {
        if (block.type === 'tool_use' && block.name === 'bash') {
          console.log(`\n[执行命令]: ${block.input.command}`)
          try {
            const result = execSync(block.input.command as string, { encoding: 'utf-8' })
            toolResults.push({ type: 'tool_result', tool_use_id: block.id, content: result })
          } catch (e: any) {
            toolResults.push({ type: 'tool_result', tool_use_id: block.id, content: e.message, is_error: true })
          }
        }
      }

      // 将工具结果反馈给 LLM,继续推理
      messages.push({ role: 'user', content: toolResults })
    }
  }
}

const rl = readline.createInterface({ input: process.stdin, output: process.stdout })
rl.question('你想让 Agent 做什么? ', async (input) => {
  await runAgent(input)
  rl.close()
})

这 70 行代码,就是 OpenClaw 和 Claude Code 的最小化本质。剩下的 316,000 行 TypeScript,是这个核心循环的工程化、多平台化、安全加固、插件系统


这个行业正在经历的变革,不是前端工程师的末日,而是前端技能的升华。

OpenClaw 317,000 Star 的背后,是 TypeScript、Node.js、React、WebSocket、npm 生态——这些你每天都在用的东西。

时代的浪潮不是来淹没你的,是来托举你的。


参考资料

官方仓库(本文所有技术细节的第一手来源)

  • openclaw/openclaw

    — 官方仓库(317k Star,MIT License)

    • package.json — 版本 2026.3.12,完整技术栈
    • src/gateway/server.ts — Gateway WebSocket RPC 核心
    • src/agents/tool-catalog.ts — 工具目录管理
    • docs/tools/creating-skills.md — 技能创建官方文档
  • openclaw/clawhub

    — 社区技能注册表(TanStack Start + Convex)

    • docs/skill-format.md — SKILL.md 完整格式规范
  • vercel-labs/skills — AgentSkills 标准格式(跨框架 SKILL.md 标准)

  • DeepWiki: openclaw/openclaw — 基于官方源码自动生成的架构文档

深度阅读(作者:吴佳浩 Alben 原创作品)

以下两篇文章深入讲解了 Python 侧的 AI Agent 框架 LangChain,是理解完整 AI Agent 生态不可缺少的参考:


本文写于 2026 年 3 月。所有技术细节均有官方来源注释,架构图基于官方文档和源码非遗手工分析绘制。

OpenClaw 仍在快速迭代(最新版本 2026.3.13),具体你阅读到什么日期什么版本你自己去看 我虽然略懂周易 但是你得付费 😄。 哦对了 下一篇 大家希望我写点什么呢 给我留言吧!!!!!!