找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3834

积分

0

好友

538

主题
发表于 13 小时前 | 查看: 2| 回复: 0

OpenClaw是什么?

OpenClaw是一个功能强大的自托管(self-hosted)AI Agent框架,它允许你在自己的服务器或本地硬件上部署并运行。与简单的聊天机器人不同,它以类Agent的方式自动执行复杂任务。

它的核心特点包括:

  • 多模型支持:能集成多种主流大模型,如Claude、GPT、Gemini等。
  • 多渠道交互:可通过WhatsApp、Telegram、iMessage等消息平台与你交互。
  • 高可靠性:具备自动重启、自我修复能力。
  • 可扩展性:通过插件扩展(Skill)机制不断增强能力。

简单来说,OpenClaw就像一个部署在你本地环境中的自动化、可执行任务版的智能助手操作系统。

OpenClaw的架构设计

总体来看,OpenClaw是一个“常驻 Gateway + 多会话 Agent + Skills/Tools + 多端接入”的系统。

你可以把它理解为你机器上的Agent OS,外部通过适配好的IM软件作为“聊天入口”来操控。其核心是Gateway(常驻服务),负责将 消息 → 会话 → 模型推理 → 工具执行 → 回复 这一整条链路串联起来。

整体架构视图

┌──────────────────────────────────────────────────────────┐
│                      User / External World                │
│        (Telegram / Discord / CLI / HTTP / Webhook)        │
└───────────────────────────▲──────────────────────────────┘
                            │
                            │ inbound messages / events
                            │
┌───────────────────────────┴──────────────────────────────┐
│                         Gateway                           │
│  ──────────────────────────────────────────────────────  │
│  • Channel adapters (tg / dc / http / cli …)              │
│  • bindings  (peer / accountId → agentId)                 │
│  • agent registry (agents.list)                           │
│  • auth profiles / secrets                                │
│  • sandbox & tool policy enforcement                      │
└───────────────────────────▲──────────────────────────────┘
                            │ route to agent
                            │
┌───────────────────────────┴──────────────────────────────┐
│                      Agent Runtime                        │
│  (per agent, isolated workspace + persona)                │
│                                                           │
│  ┌────────────────────────────────────────────────────┐  │
│  │  Workspace (agent local universe)                  │  │
│  │                                                     │  │
│  │  IDENTITY.md   → 我是谁(角色 / 边界)               │  │
│  │  SOUL.md       → 行为哲学 / 推理风格                │  │
│  │  AGENTS.md     → ⭐ 多 agent 编排规则               │  │
│  │  TOOLS.md      → 工具使用协议                      │  │
│  │  BOOTSTRAP.md  → 启动注入上下文                    │  │
│  │  USER.md       → 用户画像                          │  │
│  │  HEARTBEAT.md  → 周期性守护 / 自检                 │  │
│  │                                                     │  │
│  │  memory/       → 长期 / 短期记忆                   │  │
│  │  skills/       → 能力描述(函数 / MCP 客户端)      │  │
│  └────────────────────────────────────────────────────┘  │
│                                                           │
│  ──────────────── Tool Invocation Layer ───────────────  │
│  • exec / apply_patch / web / fs                          │
│  • sessions_spawn (sub-agents)                            │
│  • MCP calls                                              │
└───────────────────────────▲──────────────────────────────┘
                            │
                            │ spawn / call
                            │
┌───────────────────────────┴──────────────────────────────┐
│                     Sub-Agent Sessions                    │
│  (research / coder / reviewer / ops …)                    │
│                                                           │
│  • 独立 agentId / workspace / tools                      │
│  • 独立 sandbox 权限                                      │
│  • 异步执行 → result announce 回主 agent                 │
└───────────────────────────▲──────────────────────────────┘
                            │
                            │ tool reminding / execution
                            │
┌───────────────────────────┴──────────────────────────────┐
│                    Tool & MCP Ecosystem                   │
│                                                           │
│  • Built-in tools (exec, patch, web, fs)                  │
│  • MCP Servers (ADB / Frida / Git / Scanner / CI)         │
│  • External services (cloud, repos, infra)                │
└──────────────────────────────────────────────────────────┘

Workspace目录结构:Agent的“人格”与运行态

一个Workspace可以理解为一个对应的“数字人”。这个“人”有ID、有大脑(思考逻辑)、有记忆、有行为规则、有工具箱,并且定义了可以与其他哪些数字人进行交互。

默认路径在 ~/.openclaw/workspace,其典型结构如下:

AGENTS.md    BOOTSTRAP.md HEARTBEAT.md IDENTITY.md  memory       skills       SOUL.md      TOOLS.md     USER.md

这些文件构成了OpenClaw Agent Runtime的角色分工接口。你可以把Workspace看作一个「Agent的可执行人格与运行态目录」,每个文件对应不同的“通道”:

  • IDENTITY.md —— “我是谁”,定义Agent的身份、定位和边界。
  • SOUL.md —— “我怎么思考 & 行事”,定义Agent的性格、思维方式和价值排序。
  • AGENTS.md —— 多Agent编排的核心,定义如何调用或派发其他Agent。
  • TOOLS.md —— 工具使用协议,描述何时使用何工具、何时禁用、使用前后的注意事项。
  • skills/ —— 能力实现层(具体的函数/MCP/插件)。
  • BOOTSTRAP.md —— 启动注入,一次性执行的上下文。
  • USER.md —— 用户画像/偏好,描述用户是谁以及如何协作。
  • memory/ —— 长期 & 短期记忆存储。
  • HEARTBEAT.md —— 周期性自检/守护逻辑。

这种基于文件系统的设计,使得Agent的“人格”、记忆和能力都变得可版本化、可备份、可移植,极大地提升了人工智能Agent系统的可运维性。对这类前沿技术框架的实践和讨论,也欢迎你来云栈社区交流分享。

部署OpenClaw

部署非常简单,使用官方的一键安装脚本即可:

curl -fsSL https://openclaw.bot/install.sh | bash

安装完成后,首次运行通常会引导你安装缺失的技能依赖,界面类似下图:
OpenClaw技能依赖安装列表截图

特殊配置:解决网络代理问题

许多大模型需要特殊的网络环境才能访问。需要注意的是,Node.js运行环境中的 fetch(通常是Node 18+内置的 undici fetch)默认不会读取 HTTP_PROXY/HTTPS_PROXY 环境变量。因此,即使你设置了这些变量,请求也不会走代理。

解决方法是对OpenClaw进行一个小改动,强制其使用代理:

  1. 安装 undici 包:
    npm install undici
  2. 创建一个代理启动脚本,例如放在 ~/.config/openclaw/proxy-bootstrap.mjs

    import { setGlobalDispatcher, ProxyAgent } from "undici";
    
    const proxy = process.env.OC_PROXY || process.env.HTTP_PROXY || process.env.HTTTPS_PROXY;
    if (!proxy) {
      console.error("[proxy-bootstrap] no proxy set");
    } else {
      setGlobalDispatcher(new ProxyAgent(proxy));
      console.error("[proxy-bootstrap] undici proxy =", proxy);
    }
  3. 设置环境变量,让OpenClaw启动时加载这个脚本:
    export OC_PROXY="http://127.0.0.1:8080"
    export NODE_OPTIONS="--import ~/.config/openclaw/proxy-bootstrap.mjs"

    这样,所有通过 undici 发出的请求都会经过你指定的代理。

完成部署和配置后,你可以在浏览器中打开 http://127.0.0.1:18789/ 访问本地管理界面,并与刚上线的AI助手进行交互:
OpenClaw Web聊天界面截图

添加自定义Skills(技能)

OpenClaw的Skill本质上是一个可被LLM调用的工具目录。其核心构成是:描述文件(SKILL.md) + 可执行入口(脚本/程序) + 可选权限声明

Skill的默认目录在 ~/.openclaw/workspace/skills/,每个Skill一个子目录。例如,一个简单的HTTP请求Skill结构可能如下:

~/.openclaw/workspace/skills/
└── my-http-fetch/
    ├── SKILL.md
    ├── fetch.sh
    └── fetch.py

一个更复杂的、用于Android开发的Skill目录结构示例:

➜  workspace git:(master) ✗ tree
.
├── AGENTS.md
├── BOOTSTRAP.md
├── HEARTBEAT.md
├── IDENTITY.md
├── memory
│   └── 2026-01-31-0712.md
├── skills
│   └── claude-android-skill
│       ├── assets
│       │   └── templates
│       │       ├── libs.versions.toml.template
│       │       └── settings.gradle.kts.template
│       ├── LICENSE
│       ├── README.md
│       ├── references
│       │   ├── architecture.md
│       │   ├── compose-patterns.md
│       │   ├── gradle-setup.md
│       │   ├── modularization.md
│       │   └── testing.md
│       ├── scripts
│       │   └── generate_feature.py
│       └── SKILL.md

添加Skill后,执行 openclaw skills list 命令,可以看到配置的Skill已生效,并能清晰了解其功能描述和触发条件:
OpenClaw Skill列表与功能描述截图

通过查看Skill代码,你会发现Skill的核心是对能力的详细描述:能做什么、不能做什么、需要什么权限、在什么场景下使用。编写一个完善的Skill确实需要考虑很多细节,不过你可以利用LLM来辅助你完成这项工作,这也是开源实战中常见的高效方式。

总结一下Skill与Tool的关系:

  • Skill能力接口与使用语义的声明层。
  • Tool / MCP Server能力的执行实现层。
  • Agent(LLM) 负责在运行时把 目标 → Skill → Tool/MCP 串联起来。

有了Skill这一层抽象,就能以最少的Token消耗实现与各种Tools、MCP服务的高效互调。

Agent之间如何互相调用?

在OpenClaw中,“多个Agent互相调用”的主流实现方式不是让Agent直接导入或引用彼此,而是通过一组名为 sessions_* 的工具进行跨会话消息编排。其模式是:一个Agent把任务发给另一个Agent的会话,对方处理完毕后,再将结果通过消息传回。

核心工具:sessions_*(Agent-to-Agent通信骨架)

OpenClaw内置了一组专门为“Agent-to-Agent”协作设计的小工具:

  • sessions_list:列出当前有哪些活跃会话(包含Agent、通道、元数据)。
  • sessions_history:获取某个特定会话的对话历史(用于“读取结果”)。
  • sessions_send:向另一个会话发送消息(用于“派发任务”)。
  • sessions_spawn:创建/拉起一个新会话(用于“启动一个子Agent/子会话”)。

这套工具的设计目标是“少而精,不易误用”,使Agent能够发现其他会话、发送消息、获取结果。

典型协作模式:Coordinator(主控)→ Worker(执行者)

  1. 主控发现可用Worker
    主控Agent调用 sessions_list,找到目标Worker的 sessionId

  2. 主控派发任务
    使用 sessions_send 将任务描述发送给Worker。例如:“去总结一下今天的日志”、“去执行一次adb设备检查”、“去做一次关于XXX的网页调研(如果该Agent有浏览权限)”。

  3. 收集结果

    • 被动接收:让Worker在处理完成后,直接发送一条消息回传给主控Agent。
    • 主动拉取:主控Agent使用 sessions_history 主动拉取Worker会话最近的输出,然后从中提取关键要点。

实用技巧:定义回执协议

为了更可靠地解析结果,建议将“回执协议”写入System Prompt或协作规范中。例如:

  • Coordinator发给Worker的消息都以 TASK: 开头,并附带 REPLY_TO_SESSION=<id> 指明回复目标。
  • Worker的输出必须包含:
    • RESULT: (任务结果摘要)
    • ARTIFACTS: (产生的文件路径或链接)
    • NEXT: (是否需要主控进一步追问或指示)

这样,Coordinator在用 sessions_history 抓取结果时,就能清晰、稳定地解析出所需信息,避免被会话中的闲聊或过程性思考所干扰。

如何编排多个Agent?

在OpenClaw中,编排多个Agent通常分为两层来实现:入口路由(决定由哪个Agent接收消息)和任务分解(一个主Agent如何拉起多个子Agent协同工作)。

入口层:用 agents.list + bindings 实现消息路由

你可以在同一个Gateway中配置多个完全隔离的Agent(它们拥有各自独立的Workspace、agentDir、会话存储和认证配置),然后通过 bindings 规则将不同平台、账号或群聊的入站消息映射到不同的Agent。

  • agents.list:用于定义多个Agent(指定其workspace路径、使用的模型、工具/沙箱策略等)。
  • bindings:用于将入站通道的“来源”(如账号ID、群ID、对端用户ID)绑定到特定的Agent。

执行层:用 sessions_spawn 拆分复杂任务

当同一个入口Agent需要处理并行或需要分工的复杂任务时,就需要用到Subagents(子Agent)机制。

  1. 主Agent首先使用 agents_list 工具查看当前会话允许生成哪些子Agent(这受到其配置中 subagents.allowAgents 列表的限制)。
  2. 然后使用 sessions_spawn 工具启动一个子会话,让特定的子Agent去执行一个明确的任务。子Agent完成任务后,会将结果返回给主Agent。

多Agent编排配置示例

下面是一个典型的多Agent协作网关配置示例,默认应放置在 ~/.openclaw/gateway/config.json。这个配置定义了一个主协调器(Orchestrator)和三个不同职责的工作Agent(Research, Coder, Reviewer),并通过bindings进行消息路由。

{
  "agents": {
    "defaults": {
      "workspace": "~/.openclaw/workspace-main",
      // 默认模型(可在每个agent的list条目中覆盖)
      "model": "openai/gpt-4o",
      // 沙箱默认配置
      "sandbox": {
        "mode": "non-main",
        "workspaceAccess": "rw",
        "scope": "session"
      },
      // 子会话默认配置(可选)
      "subagents": {
        "archiveAfterMinutes": 60
      }
    },
    // ====== 多Agent定义与路由配置 ======
    "list": [
      {
        "id": "main",
        "default": true,
        "name": "Orchestrator",
        "workspace": "~/.openclaw/workspace-main",
        "agentDir": "~/.openclaw/agents/main/agent",
        // 关键:允许主Agent生成以下ID的子Agent
        "subagents": {
          "allowAgents": ["research", "coder", "reviewer"]
        },
        // 协调器通常只需要 sessions_spawn 和最少的运行时工具
        "tools": {
          "profile": "default",
          "allow": ["sessions_spawn", "agents_list"],
          "deny": []
        },
        "sandbox": {
          "mode": "non-main",
          "workspaceAccess": "rw",
          "scope": "session"
        }
      },
      {
        "id": "research",
        "name": "Research Worker",
        "workspace": "~/.openclaw/workspace-research",
        "agentDir": "~/.openclaw/agents/research/agent",
        // 研究Agent:可以浏览网页,但无Shell或文件写入权限
        "sandbox": {
          "mode": "all",
          "workspaceAccess": "ro",
          "scope": "session"
        },
        "tools": {
          "profile": "default",
          "allow": ["web_search", "web_fetch"],
          "deny": ["exec", "apply_patch"]
        }
      },
      {
        "id": "coder",
        "name": "Coding Worker",
        "workspace": "~/.openclaw/workspace-coder",
        "agentDir": "~/.openclaw/agents/coder/agent",
        // 编码Agent:需要读写Workspace和应用补丁的工具,但仍受沙箱限制
        "sandbox": {
          "mode": "all",
          "workspaceAccess": "rw",
          "scope": "session"
        },
        "tools": {
          "profile": "default",
          "allow": ["apply_patch", "exec"],
          "deny": []
        }
      },
      {
        "id": "reviewer",
        "name": "Review Worker",
        "workspace": "~/.openclaw/workspace-reviewer",
        "agentDir": "~/.openclaw/agents/reviewer/agent",
        // 评审Agent:只读Workspace,无Shell,专注于阅读和推理
        "sandbox": {
          "mode": "all",
          "workspaceAccess": "ro",
          "scope": "session"
        },
        "tools": {
          "profile": "default",
          "allow": [],
          "deny": ["exec", "apply_patch"]
        }
      }
    ]
  },
  // ====== Bindings: 将入站消息路由到指定Agent ======
  "bindings": [
    // 示例:将特定用户的对端ID消息路由给主协调器
    {"match": {"peer": "your-peer-id-here"}, "agent": "main"},
    // 回退规则:将所有其他来源的消息路由给主协调器
    {"match": {"accountId": "*"}, "agent": "main"}
  ]
}

通过这样清晰的配置,你就能构建出一个职责分明、安全可控的多Node.js智能体协同系统,真正实现将AI Agent当作“操作系统进程”一样进行管理和编排。




上一篇:Java高并发进阶:原子原语实现无锁栈,详解CAS、ABA问题与性能对比
下一篇:深夜的那个GitHub更新,终于填平了中国IM的AI接入鸿沟
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-27 19:26 , Processed in 0.386558 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表