Skip to content

第四部分:工具与能力扩展

OpenClaw 的智能体不只是能聊天——它能执行命令、浏览网页、搜索信息、管理定时任务、响应事件。本部分详细讲解 OpenClaw 的工具体系、浏览器自动化、技能系统、Hook 钩子和定时任务。


第 11 章:内置工具体系

工具(Tools)是智能体与外部世界交互的手臂。OpenClaw 提供了一套丰富的内置工具,涵盖命令执行、文件操作、网络搜索、跨渠道通信等多个领域。

11.1 工具分类总览

OpenClaw 的内置工具按功能域划分为以下类别:

类别工具说明
执行与进程exec在工作区内运行 Shell 命令
process管理后台执行会话
apply_patch跨文件的结构化补丁修改
网络与信息web_search通过 Brave Search / Perplexity 搜索
web_fetch抓取 URL 内容并转为可读 Markdown
浏览器与 UIbrowser控制专属隔离浏览器
canvas驱动节点 Canvas 画布(演示、A2UI)
会话与通信sessions_list列出所有会话
sessions_history查看会话历史
sessions_send跨会话发送消息
sessions_spawn创建子会话
session_status查看会话状态
message跨渠道发送消息
agents_list枚举可用智能体
节点设备nodes发现节点、捕获摄像头/屏幕、发送通知
自动化cron管理网关定时任务
gateway重启或更新网关
记忆memory_search语义搜索记忆文件
memory_get按路径读取记忆文件
分析image使用配置的模型分析图像

11.2 工具组快捷语法

在配置工具策略时,你不必逐个列出工具名。OpenClaw 提供工具组(Group)快捷语法:

工具组包含的工具
group:runtimeexec, bash, process
group:fsread, write, edit, apply_patch
group:messagingmessage
group:webweb_search, web_fetch
group:uibrowser, canvas
group:automationcron, gateway
group:nodesnodes
group:sessionssessions_list, sessions_history, sessions_send, sessions_spawn
group:openclawOpenClaw 系统级工具

11.3 工具策略配置

工具策略决定了智能体能使用哪些工具。这是安全控制的核心机制之一。

内置策略模板

OpenClaw 提供四种预设模板,适用于不同信任级别的场景:

模板说明适用场景
minimal最少权限高安全要求的公开机器人
coding编码导向(文件读写 + 命令执行)开发辅助
messaging消息通信导向跨平台消息机器人
full全部工具开放个人私用的全能助手

允许/拒绝列表

通过 tools.allowtools.deny 精确控制:

json5
{
  tools: {
    allow: [
      "group:fs",        // 允许所有文件操作
      "web_search",      // 允许网络搜索
      "memory_search"    // 允许记忆搜索
    ],
    deny: [
      "exec",            // 禁止命令执行
      "browser",         // 禁止浏览器操作
      "group:messaging"  // 禁止跨渠道消息
    ]
  }
}

核心规则:deny 永远优先于 allow。 如果同一工具同时出现在 allow 和 deny 中,该工具会被拒绝。

如果 allow 列表非空,则不在列表中的所有工具都被视为阻止

工具策略层级

策略过滤按以下层级叠加,每一层只能进一步收紧——前面的拒绝无法被后面的层级翻转:

1. 工具模板 Profile
2. 提供商级别的工具 Profile
3. 全局工具策略(tools.allow/deny)
4. 提供商级别策略
5. 智能体级别策略(agents.list[].tools)
6. 智能体-提供商级别策略
7. 沙箱工具策略
8. 子智能体策略

多智能体差异化配置

不同智能体可以拥有不同的工具权限:

json5
{
  agents: {
    list: [
      {
        id: "personal",
        tools: {
          profile: "full"    // 个人助手:全部权限
        }
      },
      {
        id: "family-bot",
        tools: {
          profile: "messaging",  // 家庭机器人:仅消息
          deny: ["exec"]         // 额外禁止命令执行
        }
      }
    ]
  }
}

11.4 exec:命令执行工具

exec 是 OpenClaw 最强大也最需要谨慎使用的工具。它允许智能体在工作区内运行 Shell 命令。

执行模式

模式说明
前台执行命令完成后立即返回结果
后台执行通过 process 参数启动长运行命令
自动后台超过 yieldMs(默认 10 秒)自动转为后台

执行位置(Host)

位置说明审批要求
sandbox容器内执行(默认)沙箱关闭时无需审批
gateway网关宿主机上执行需要审批配置
node配对的节点设备上执行需要配对

重要提醒:沙箱默认关闭。如果沙箱未开启,host=sandbox 实际上直接在网关宿主机上运行,且不需要审批。这是一个需要特别注意的安全细节。

安全强制模式

模式行为
deny完全禁止执行
allowlist仅允许白名单中的命令,拒绝链式操作符(;, &&, ||)和重定向
full允许所有命令

审批机制

当命令需要审批时:

json5
{
  tools: {
    exec: {
      ask: "on-miss",  // "off" | "on-miss" | "always"
      approvalRunningNoticeMs: 10000  // 10 秒后提示用户审批
    }
  }
}

审批配置存储在 ~/.openclaw/exec-approvals.json

进程控制命令

对于后台进程,process 工具提供以下操作:

命令说明
send-keys发送键盘输入(tmux 风格记法)
paste粘贴文本(括号粘贴模式)
submit仅发送回车键
poll查询后台会话状态

PATH 管理

不同执行位置的 PATH 行为不同:

位置PATH 行为
Gateway合并登录 Shell 的 PATH;拒绝 env.PATH 覆盖
Sandbox通过内部变量前置目录(不支持插值)
Node仅接受前置 PATH(不允许替换)

安全考虑:Gateway 和 Node 执行时拒绝 env.PATH 和加载器覆盖(LD_* / DYLD_*),防止二进制劫持。

11.5 apply_patch:结构化补丁工具

apply_patch 适用于需要跨多文件、多区块编辑的场景,比单次 edit 调用更可靠。

补丁格式

*** Begin Patch
*** Update File: src/config.ts
@@
-const PORT = 3000;
+const PORT = 8080;
@@
-const HOST = "localhost";
+const HOST = "0.0.0.0";
*** Add File: src/utils/helper.ts
+export function formatDate(d: Date): string {
+  return d.toISOString().split('T')[0];
+}
*** Delete File: src/legacy/old-config.ts
*** End Patch

支持的操作:

  • Add File:创建新文件
  • Update File:修改现有文件(支持多个 @@ 区块)
  • Delete File:删除文件
  • Move to:重命名/移动文件

路径相对于工作区根目录解析。

限制:目前仅支持 OpenAI / OpenAI Codex 模型,需要显式启用 tools.exec.applyPatch.enabled

11.6 web_search:网络搜索工具

两种搜索提供商

提供商特点环境变量
Brave Search快速、结构化结果(标题/URL/摘要),有免费额度BRAVE_API_KEY
Perplexity SonarAI 合成答案 + 来源引用,适合复杂查询PERPLEXITY_API_KEY 或通过 OpenRouter

配置

json5
{
  tools: {
    web: {
      search: {
        provider: "brave",    // "brave" 或 "perplexity"
        resultCount: 5,        // 结果数量(1-10)
        timeoutMs: 10000,      // 超时
        cacheTtlMinutes: 15,   // 缓存过期时间
        country: "CN",         // 地区偏好
        language: "zh"         // 语言偏好
      }
    }
  }
}

Perplexity 模型变体

模型说明
perplexity/sonar快速查询
perplexity/sonar-pro复杂分析(默认)
perplexity/sonar-reasoning-pro链式推理深度调研

配置 API Key

bash
openclaw configure --section web

或者通过环境变量在 ~/.openclaw/.env 中设置。

11.7 web_fetch:网页抓取工具

web_fetch 获取 URL 内容并转换为可读的 Markdown 或纯文本格式。

关键限制:不执行 JavaScript——如果目标是 SPA(单页应用)或需要 JS 渲染的动态页面,应使用 browser 工具。

配置选项

json5
{
  tools: {
    web: {
      fetch: {
        maxChars: 50000,          // 响应大小上限
        maxRedirects: 5,          // 最大重定向次数
        userAgent: "OpenClaw/1.0", // 自定义 UA
        firecrawlFallback: true   // 启用 Firecrawl 备选提取
      }
    }
  }
}

处理优先级

  1. Readability 提取器(默认)
  2. Firecrawl 后备(如配置 FIRECRAWL_API_KEY

结果自动缓存 15 分钟。私有/内部主机名会被自动屏蔽。

11.8 message:跨渠道消息工具

message 工具让智能体能够向 Discord、Slack、Teams、Telegram、WhatsApp、Signal、iMessage、Google Chat 等平台发送消息。

这是一个主动发送工具——智能体可以在处理任务时主动通知你结果,而不是等你来问。

11.9 reactions:表情反应系统

OpenClaw 统一了跨平台的表情反应操作,但各平台行为有细微差异:

平台添加反应移除反应
Discord / Slack / Google Chatemoji 必填emoji="" 移除全部;remove: true 移除指定
Telegramemoji 必填设置 remove: true(仍需提供 emoji 值)
WhatsAppemoji 必填remove: true 映射为清空 emoji
Signalemoji 必填需启用 channels.signal.reactionNotifications

11.10 thinking:思考级别控制

控制模型的推理深度,直接影响回答质量和 Token 消耗。

六个思考级别

级别别名说明
off不启用扩展思考
minimal"think"轻度思考
low"think hard"低度思考
medium"think harder"中度思考
high"ultrathink"最大预算深度思考
xhigh"ultrathink+"仅 GPT-5.2 + Codex

使用方式

内联指令(仅对当前消息生效):

/think:high 帮我分析这段代码的性能瓶颈

会话级设置(发送纯指令消息):

/think:medium

系统回复:Thinking level set to medium.

查看当前设置

/think

解析优先级

内联指令 > 会话覆盖 > 全局配置默认值 > 后备值

后备值:支持推理的模型默认 low,不支持的默认 off

相关指令

指令说明
/verbose/v控制工具结果可见性:on / full / off
/reasoning控制思考块是否作为独立消息显示:on / off / stream

11.11 Slash 命令系统

OpenClaw 的命令系统分为两类:

命令(Commands)

/ 开头的独立消息,直接触发网关操作:

命令说明
/help帮助信息
/commands列出所有可用命令
/status查看状态
/whoami查看当前用户身份
/skill <name>调用技能
/context list|detail查看上下文详情
/config配置管理(需启用 commands.config: true
/debug调试信息
/usage用量查看
/tts文本转语音
/compact手动压缩
/new / /reset新建/重置会话
/stop中止当前运行
! <command>直接 Shell 执行(需启用 commands.bash: true

指令(Directives)

嵌入在消息中,在模型处理前被剥离:

指令说明
/think:<level>设置思考级别
/verbose控制输出详细度
/reasoning控制推理可见性
/elevated提权执行
/exec执行参数覆盖
/model <name>切换模型
/queue <mode>切换队列模式

指令行为规则:

  • 在纯指令消息中:设置会话级默认值,并发送确认回复
  • 在普通消息中:作为"内联提示",仅对当前消息生效,不持久化

授权控制

json5
{
  commands: {
    text: true,                // 启用 /... 解析(默认 true)
    native: "auto",            // 自动注册 Discord/Telegram 原生命令
    bash: false,               // 启用 ! <cmd> Shell 执行(默认 false)
    allowFrom: {
      whatsapp: ["+8613800138000"],  // 按渠道设置授权用户
      telegram: ["123456789"]
    }
  }
}

未授权用户看到的指令只是普通文本,不会被执行。


第 12 章:浏览器自动化

OpenClaw 提供了一个专属的隔离浏览器环境,让智能体能够浏览网页、填写表单、提取信息——真正实现"有眼有手"的自主操作。

12.1 两种控制模式

OpenClaw 托管浏览器(推荐)

系统管理一个独立的 Chromium 实例,与你的日常浏览器完全隔离。

特点:

  • 专属用户数据目录
  • 运行在回环端口(18800-18899 范围)
  • 完全由智能体控制,无需浏览器扩展
  • 适合自动化任务

Chrome 扩展中继

通过浏览器扩展将你的现有 Chrome 浏览器暴露给智能体。

特点:

  • 智能体控制你的活跃 Chrome 标签
  • 需要手动安装扩展并附加标签
  • 不创建额外浏览器实例
  • 适合需要利用已有登录态的场景

12.2 快速上手

bash
# 启动 OpenClaw 托管浏览器
openclaw browser --browser-profile openclaw start

# 打开一个网页
openclaw browser open https://example.com

# 获取 AI 快照(含数字 Ref)
openclaw browser snapshot

# 点击 Ref 编号为 12 的元素
openclaw browser click 12

# 在 Ref 编号为 23 的输入框中输入文本
openclaw browser type 23 "Hello World"

12.3 Ref 系统

Ref(引用)是智能体在页面上定位和操作元素的核心机制。OpenClaw 提供两种快照格式:

格式Ref 样式操作示例适用场景
AI 快照数字(12click 12, type 23 "text"通用页面交互
角色快照角色前缀(e12click e12精准定位交互元素

重要:Ref 在页面导航后不稳定。如果操作失败,重新运行 snapshot 获取最新 Ref。

12.4 浏览器操作全表

智能体通过 browser 工具执行以下操作:

操作说明
snapshot获取 AI 快照(含元素 Ref)
screenshot获取页面截图
navigate <url>导航到指定 URL
click <ref>点击元素
type <ref> "text"在输入框中输入文本
drag <from> <to>拖拽操作
select <ref> "option"选择下拉选项
evaluate <js>执行 JavaScript(可禁用)
wait --fn <js>等待条件满足

12.5 多 Profile 管理

你可以定义多个浏览器 Profile,用于不同目的:

json5
{
  tools: {
    browser: {
      enabled: true,
      defaultProfile: "openclaw",
      profiles: {
        openclaw: {
          // 默认的 OpenClaw 托管浏览器
        },
        work: {
          cdpPort: 18801  // 工作用独立实例
        },
        chrome: {
          // Chrome 扩展中继模式
        }
      }
    }
  }
}

还可以自定义 Chromium 路径以使用 Brave、Edge 等基于 Chromium 的浏览器:

json5
{
  tools: {
    browser: {
      executablePath: "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser"
    }
  }
}

12.6 远程 CDP 连接

OpenClaw 支持连接远程 Chrome DevTools Protocol (CDP) 端点,适用于 Browserless 或其他远程 Chromium 实例。

连接方式说明
本地默认网关在回环端口启动浏览器
节点代理操作路由到远程设备的浏览器
远程 CDP通过 cdpUrl 连接外部 Chromium
json5
{
  tools: {
    browser: {
      profiles: {
        remote: {
          cdpUrl: "ws://browserless.example.com:3000?token=${BROWSERLESS_TOKEN}"
        }
      }
    }
  }
}

安全:远程 CDP Token 应视为密钥,使用环境变量注入。

12.7 VPS 上部署浏览器

在 VPS(云服务器)上运行 OpenClaw 时,服务器通常没有图形界面(Headless 环境)。本节介绍如何在 VPS 上让智能体正常使用浏览器。

前提条件

  • 一台 Linux VPS(Ubuntu 20.04+ / Debian 11+ 推荐)
  • OpenClaw Gateway 已安装并运行
  • Root 或 sudo 权限

步骤一:安装 Chromium

bash
# Ubuntu / Debian
sudo apt update
sudo apt install -y chromium-browser

# 如果使用 Debian 最小镜像,可能需要额外依赖
sudo apt install -y \
  libnss3 libatk1.0-0 libatk-bridge2.0-0 \
  libcups2 libdrm2 libxdamage1 libxrandr2 \
  libgbm1 libasound2 libpangocairo-1.0-0 \
  libgtk-3-0 fonts-noto-cjk

# CentOS / RHEL
sudo yum install -y chromium

# 验证安装
chromium-browser --version

字体提示:安装 fonts-noto-cjk 确保中文页面正常渲染,否则截图和快照中中文可能显示为方块。

步骤二:配置 Headless 模式

VPS 没有显示器,Chromium 必须以 Headless 模式运行。OpenClaw 的托管浏览器默认使用 --headless=new 启动参数,因此通常无需额外配置

如果需要手动指定 Chromium 路径或添加启动参数:

json5
{
  tools: {
    browser: {
      enabled: true,
      executablePath: "/usr/bin/chromium-browser",
      launchArgs: [
        "--no-sandbox",          // Docker 或无特权用户时需要
        "--disable-gpu",         // 无 GPU 的 VPS
        "--disable-dev-shm-usage" // 防止 /dev/shm 空间不足
      ]
    }
  }
}

安全提醒--no-sandbox 会降低浏览器隔离性。仅在 Docker 容器内或明确了解风险时使用。在宿主机直接运行时,建议创建专用低权限用户代替。

步骤三:使用虚拟显示(可选)

某些网站会检测 Headless 模式并限制访问。使用 Xvfb(虚拟帧缓冲)可以模拟真实显示环境,绕过这类检测:

bash
# 安装 Xvfb
sudo apt install -y xvfb

# 启动虚拟显示
Xvfb :99 -screen 0 1920x1080x24 &
export DISPLAY=:99

# 在此环境下启动 OpenClaw Gateway
openclaw start

使用 systemd 持久化

ini
# /etc/systemd/system/xvfb.service
[Unit]
Description=Xvfb Virtual Display
After=network.target

[Service]
ExecStart=/usr/bin/Xvfb :99 -screen 0 1920x1080x24
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
bash
sudo systemctl enable --now xvfb

然后在 OpenClaw 的 systemd 服务或启动脚本中设置 Environment=DISPLAY=:99

步骤四:使用 Browserless(推荐生产方案)

对于生产环境,推荐使用 Browserless 容器——它专门为服务器端浏览器自动化设计,解决了依赖管理、资源限制、并发控制等问题:

bash
# 使用 Docker 启动 Browserless
docker run -d \
  --name browserless \
  --restart unless-stopped \
  -p 3000:3000 \
  -e "TOKEN=your-secure-token" \
  -e "MAX_CONCURRENT_SESSIONS=5" \
  -e "DEFAULT_LAUNCH_ARGS=[\"--disable-gpu\",\"--no-sandbox\"]" \
  --shm-size=2g \
  ghcr.io/browserless/chromium

然后在 OpenClaw 中配置远程 CDP 连接:

json5
{
  tools: {
    browser: {
      profiles: {
        vps: {
          cdpUrl: "ws://localhost:3000?token=${BROWSERLESS_TOKEN}"
        }
      },
      defaultProfile: "vps"
    }
  }
}

Browserless 的优势:

特性说明
自动依赖管理容器内包含所有系统依赖,无需手动安装
资源隔离通过 --shm-size 和并发限制防止内存溢出
自动清理超时的浏览器会话自动关闭,防止僵尸进程
健康检查内置 /health 端点,方便监控
会话录制支持录制浏览器操作用于调试

步骤五:VPS 资源规划

浏览器是资源密集型工具,VPS 规格直接影响使用体验:

配置最低要求推荐配置
内存1 GB(仅单标签页)2 GB+
CPU1 核2 核+
磁盘浏览器缓存约 500 MB预留 2 GB
Swap建议开启 1-2 GB
bash
# 检查当前内存
free -h

# 如未启用 Swap,临时创建
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 持久化(写入 fstab)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

常见问题排查

问题 1:浏览器启动失败,报缺少共享库

bash
# 查看缺少哪些库
ldd $(which chromium-browser) | grep "not found"

# 安装缺失依赖
sudo apt install -y --fix-broken

问题 2:截图/快照中文显示为方块

bash
# 安装中文字体
sudo apt install -y fonts-noto-cjk fonts-wqy-zenhei
# 刷新字体缓存
fc-cache -fv

问题 3:浏览器 OOM(内存不足)被 Kill

bash
# 检查 OOM 日志
dmesg | grep -i "oom\|killed"

# 解决方案:
# 1. 增加 Swap
# 2. 限制标签页数量
# 3. 使用 Browserless 的 MAX_CONCURRENT_SESSIONS 控制并发

问题 4:无法访问某些网站(被反爬封锁)

  • 使用 Xvfb 虚拟显示代替纯 Headless 模式
  • 手动登录浏览器 Profile 保持登录态(参考 12.9 登录最佳实践)
  • 设置合理的 User-Agent

完整 VPS 部署示例

以下是一个在全新 Ubuntu VPS 上部署 OpenClaw 浏览器的完整脚本:

bash
#!/bin/bash
# setup-browser.sh — VPS 浏览器环境一键部署

set -e

echo "=== 1. 安装系统依赖 ==="
sudo apt update
sudo apt install -y chromium-browser fonts-noto-cjk xvfb

echo "=== 2. 配置虚拟显示 ==="
sudo tee /etc/systemd/system/xvfb.service > /dev/null <<EOF
[Unit]
Description=Xvfb Virtual Display
After=network.target

[Service]
ExecStart=/usr/bin/Xvfb :99 -screen 0 1920x1080x24
Restart=always

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable --now xvfb

echo "=== 3. 配置 Swap(如果内存 < 2GB)==="
TOTAL_MEM=$(free -m | awk '/Mem:/{print $2}')
if [ "$TOTAL_MEM" -lt 2048 ]; then
  sudo fallocate -l 2G /swapfile
  sudo chmod 600 /swapfile
  sudo mkswap /swapfile
  sudo swapon /swapfile
  echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
  echo "Swap 已启用"
fi

echo "=== 4. 验证 ==="
DISPLAY=:99 chromium-browser --headless --dump-dom https://example.com > /dev/null 2>&1 \
  && echo "浏览器验证通过!" \
  || echo "浏览器验证失败,请检查日志"

echo "=== 完成 ==="
echo "请在 OpenClaw 配置中设置 DISPLAY=:99 环境变量"

12.8 沙箱中的浏览器

沙箱化的会话默认无法控制宿主机浏览器。如需在沙箱中使用宿主机浏览器(例如利用已有登录态):

json5
{
  agents: {
    defaults: {
      sandbox: {
        mode: "non-main",
        browser: {
          allowHostControl: true  // 允许沙箱会话控制宿主机浏览器
        }
      }
    }
  }
}

12.9 登录最佳实践

OpenClaw 强烈建议手动登录浏览器 Profile,而非让智能体处理认证凭据。

推荐流程:

  1. 启动 OpenClaw 浏览器:openclaw browser start
  2. 打开目标网站:openclaw browser open https://x.com
  3. 在弹出的浏览器窗口中手动完成登录
  4. 登录态保存在 Profile 中,后续智能体自动复用

为什么不让智能体登录?

  • 避免触发反机器人检测
  • 防止凭据暴露在会话记录中
  • 登录态持久化在 Profile 中,无需每次重复

安全建议:

  • 使用专用浏览器 Profile,不要用日常浏览器
  • 网关和节点仅通过 Tailnet 暴露
  • 不需要时禁用浏览器代理路由
  • 将节点配对视为管理员级别的访问权限

12.10 沙箱 vs 工具策略 vs 提权模式

三种执行控制机制各管一个维度:

机制控制什么核心问题
沙箱(Sandbox)工具在哪里执行Docker 容器 vs 宿主机
工具策略(Tool Policy)哪些工具可用允许/拒绝列表
提权模式(Elevated)exec 的宿主机逃逸沙箱中临时在宿主机执行

提权模式详解

提权模式仅在智能体处于沙箱中时有意义——非沙箱智能体本来就在宿主机上执行。

命令行为
/elevated onask在宿主机执行,保留审批机制
/elevated full在宿主机执行,自动审批所有命令
/elevated off关闭提权(恢复沙箱执行)

关键限制:

  • 提权不能绕过工具策略——如果 exec 本身被策略禁止,提权也无法使用
  • 仅影响 exec 工具,不影响其他工具

授权配置:

json5
{
  tools: {
    elevated: {
      enabled: true,
      allowFrom: {
        whatsapp: ["+8613800138000"],
        discord: ["user-id-123"]
      }
    }
  }
}

快速诊断:使用 openclaw sandbox explain 检查实际生效的执行策略。


第 13 章:技能(Skills)系统

技能是 OpenClaw 的可扩展指令模块——通过简单的文件夹结构教会智能体新能力,无需修改核心代码。

13.1 技能是什么

一个技能就是一个包含 SKILL.md 文件的目录。OpenClaw 使用 AgentSkills 兼容格式,每个技能文件夹定义了一组指令,告诉智能体如何使用特定工具或完成特定任务。

my-skill/
├── SKILL.md          # 必需:技能定义(YAML 前言 + Markdown 指令)
├── README.md         # 可选:技能说明文档
├── examples/         # 可选:使用示例
└── templates/        # 可选:模板文件

13.2 SKILL.md 文件格式

每个 SKILL.md 必须包含 YAML 前言和 Markdown 指令:

markdown
---
name: daily-report
description: 生成每日工作报告并发送到指定渠道
homepage: https://github.com/user/daily-report-skill
user-invocable: true
---

# 每日报告生成器

## 使用方法

当用户要求生成每日报告时:

1. 读取 memory/ 目录下今天的日志
2. 汇总完成的任务和待办事项
3. 按照以下模板格式化输出:

### 报告模板

**日期**:{today}

**已完成:**
- ...

**进行中:**
- ...

**明日计划:**
- ...

4. 通过 message 工具发送到配置的渠道

可选元数据字段

字段说明
name技能名称(必填)
description技能描述(必填)
homepage项目主页链接
user-invocable用户可以通过 /skill <name> 直接调用
disable-model-invocation禁止模型自主调用此技能
command-dispatch命令分发设置

13.3 三级加载优先级

OpenClaw 从三个位置加载技能,优先级从高到低:

1. 工作区技能(workspace/skills/)       ← 最高优先级
2. 托管技能(~/.openclaw/skills/)       ← 中间优先级
3. 内置技能(随安装包提供)              ← 最低优先级

规则:如果多个位置存在同名技能,高优先级的会覆盖低优先级的。

在多智能体场景中:

  • 每智能体技能放在各自工作区的 skills/ 目录
  • 共享技能放在 ~/.openclaw/skills/,对所有智能体可见

13.4 技能门控

技能可以声明前置条件,不满足时自动跳过:

yaml
---
name: git-helper
description: Git 操作助手
metadata:
  openclaw:
    requires:
      bins: ["git"]              # 需要 git 命令可用
      env: ["GITHUB_TOKEN"]      # 需要 GITHUB_TOKEN 环境变量
      config: ["tools.exec"]     # 需要 exec 工具已启用
    os: ["darwin", "linux"]       # 仅支持 macOS 和 Linux
---

门控检查发生在加载时——不满足条件的技能直接被过滤,不会出现在智能体的可用技能列表中。

13.5 ClawHub 公共注册表

ClawHub 是 OpenClaw 的公共技能注册表——所有技能公开、开放、可共享。

发现与安装

bash
# 安装 ClawHub CLI
npm install -g @openclaw/clawhub

# 搜索技能(支持自然语言,基于向量嵌入)
clawhub search "daily report automation"

# 安装技能
clawhub install daily-report

# 批量同步
clawhub sync

技能默认安装到 ./skills 目录,如果当前目录不是工作区,会自动回退到 OpenClaw 工作区配置路径。

发布技能

bash
# 发布当前目录的技能
clawhub publish ./my-skill

# 每次发布创建新版本,注册表保留完整版本历史

发布要求:GitHub 账号需注册满一周。

版本管理

  • 每次发布自动创建新版本(语义化版本)
  • latest 标签可重新定位用于回滚
  • 完整版本历史可供审计

社区功能

  • 点赞(Stars)
  • 评论
  • 下载量追踪
  • 基于使用信号的排名

13.6 技能配置

~/.openclaw/openclaw.jsonskills 部分管理技能:

json5
{
  skills: {
    // 限制内置技能白名单(留空则全部可用)
    allowBundled: ["web-search", "git-helper"],

    // 加载行为
    load: {
      extraDirs: ["~/my-shared-skills"],  // 额外扫描目录(最低优先级)
      watch: true,                         // 自动监控文件夹变化
      watchDebounceMs: 250                 // 监控防抖
    },

    // 安装偏好
    install: {
      preferBrew: true,                    // 优先使用 Homebrew 安装
      nodeManager: "bun"                   // npm | pnpm | yarn | bun
    },

    // 每技能覆盖
    entries: {
      "daily-report": {
        enabled: true,
        apiKey: "sk-xxx",                  // 技能需要的 API Key
        env: {                             // 注入的环境变量
          REPORT_CHANNEL: "telegram",
          REPORT_FORMAT: "markdown"
        },
        config: {                          // 自定义配置
          sendTime: "09:00"
        }
      },
      "untrusted-skill": {
        enabled: false                     // 禁用特定技能
      }
    }
  }
}

性能优化

OpenClaw 在会话启动时对合格技能创建快照,后续回合复用该快照。技能变更在下一个新会话时生效。

上下文经济学

技能以紧凑列表形式出现在系统提示中(仅名称、描述、位置)。完整的技能指令仅在被调用时通过 read 命令加载——这是一种延迟加载策略,有效控制 Token 消耗。

13.7 安全注意事项

  • 第三方技能应视为不可信代码
  • 通过 skills.entries.*.envskills.entries.*.apiKey 注入的密钥仅在该智能体回合的宿主进程中可见
  • 沙箱会话中的技能进程在 Docker 中运行时,全局环境变量不会自动透传
    • 解决方案:使用智能体特定的 Docker 环境配置,或将变量嵌入自定义沙箱镜像

第 14 章:Hooks 事件钩子

Hook 是 OpenClaw 的事件驱动自动化系统——当智能体命令或网关生命周期事件发生时,自动执行自定义脚本。

14.1 Hooks vs Webhooks

这两个概念容易混淆,但它们的方向完全不同:

HooksWebhooks
方向内部事件 → 自定义脚本外部系统 → OpenClaw
触发者智能体命令或网关事件外部 HTTP 请求
运行位置网关进程内网关 HTTP 端点
用途定制化内部行为接收外部通知

简而言之:Hook 是"当 X 发生时做 Y",Webhook 是"当外部系统通知我时做 Z"。

14.2 四个内置 Hook

OpenClaw 预装了四个实用 Hook:

session-memory:会话记忆保存

当用户发送 /new 开始新会话时,自动保存当前会话的上下文快照到记忆文件。

用途:确保重要信息不因会话重置而丢失。

command-logger:命令审计日志

记录所有命令执行到 ~/.openclaw/logs/commands.log

用途:安全审计、行为追踪、问题诊断。

boot-md:启动时执行

网关启动时读取并执行工作区中的 BOOT.md 文件指令。

用途:自动初始化环境、检查依赖、执行启动任务。

soul-evil:条件性内容替换

在特定时间段条件性替换 SOUL.md 的内容。

用途:节日彩蛋、特殊时段行为变更等趣味功能。

管理内置 Hook

bash
# 列出所有 Hook(包括状态)
openclaw hooks list

# 启用/禁用
openclaw hooks enable session-memory
openclaw hooks disable soul-evil

14.3 自定义 Hook 开发

目录结构

my-hook/
├── HOOK.md          # 元数据 + 文档(必需)
└── handler.ts       # 实现代码(必需)

HOOK.md 格式

markdown
---
name: deploy-notifier
description: 在部署相关操作完成后发送通知
emoji: 🚀
openclaw:
  events:
    - command:new
    - agent:bootstrap
  requires:
    bins: ["curl"]
---

# 部署通知器

当特定事件触发时,向 Slack 频道发送通知。

handler.ts 实现

typescript
export default async function handler(event: {
  type: string;
  action: string;
  sessionKey: string;
  timestamp: number;
  context: Record<string, unknown>;
}) {
  // 仅处理 command:new 事件
  if (event.type !== "command" || event.action !== "new") return;

  // 执行自定义逻辑
  console.log(`New session started: ${event.sessionKey}`);

  // 发送通知、记录日志、执行清理等...
}

可监听的事件类型

事件类别事件触发时机
命令事件command:new用户发送 /new
command:reset用户发送 /reset
command:stop用户发送 /stop
智能体事件agent:bootstrap智能体初始化
网关事件gateway:startup网关启动
插件 APItool_result_persist工具结果持久化时(可转换结果)

Hook 存放位置

位置说明
<workspace>/hooks/工作区级别,仅当前智能体可用
~/.openclaw/hooks/全局级别,所有智能体共享

14.4 Hook 配置

json5
{
  hooks: {
    entries: {
      "session-memory": { enabled: true },
      "command-logger": { enabled: true },
      "deploy-notifier": {
        enabled: true,
        env: {
          SLACK_WEBHOOK_URL: "https://hooks.slack.com/..."
        }
      }
    }
  }
}

14.5 最佳实践

  • 保持轻量:Handler 应快速执行,避免阻塞智能体流程
  • 异步处理:耗时操作使用异步方式
  • 尽早过滤:在 handler 开头检查事件类型,不匹配的直接返回
  • 优雅错误处理:不要抛出异常——Hook 内的错误不应导致主流程失败
  • 精确声明事件:在 HOOK.mdopenclaw.events 中精确列出需要的事件,提升效率

14.6 Webhook:外部系统集成

Webhook 让外部系统(GitHub、Slack、CI/CD 等)能够触发 OpenClaw 的智能体。

启用 Webhook

json5
{
  hooks: {
    enabled: true,
    token: "your-secure-webhook-token",  // 必须设置
    path: "/hooks",                       // 端点路径(默认)
    allowedAgentIds: ["main"]             // 可选:限制可路由的智能体
  }
}

认证方式

每个请求必须携带 Token:

bash
# 推荐方式
curl -X POST http://localhost:18789/hooks/wake \
  -H "Authorization: Bearer your-secure-webhook-token" \
  -H "Content-Type: application/json" \
  -d '{"text": "CI 构建完成,请检查测试结果"}'

核心端点

POST /hooks/wake — 唤醒主会话

json
{
  "text": "新的 GitHub Issue 需要处理",
  "mode": "now"  // "now" 或 "next-heartbeat"
}

返回 200。

POST /hooks/agent — 触发隔离智能体回合

json
{
  "message": "分析最新的错误日志并生成报告",
  "name": "error-analysis",
  "agentId": "ops-bot",
  "sessionKey": "incident-2026-02-11",
  "deliver": true,
  "channel": "slack",
  "to": "#ops-alerts",
  "model": "anthropic/claude-opus-4-6",
  "thinking": "high",
  "timeoutSeconds": 120
}

返回 202(异步开始)。

POST /hooks/<name> — 自定义映射

通过 hooks.mappings 将任意 Payload 转换为 wakeagent 动作:

json5
{
  hooks: {
    mappings: {
      "github-push": {
        action: "agent",
        transform: "({ message: `GitHub push to ${payload.ref}: ${payload.commits[0].message}` })"
      }
    }
  }
}

Webhook 安全建议

  • 将端点隔离在回环地址、VPN 或可信代理后
  • Webhook Token 与网关认证 Token 分开
  • 多智能体场景中使用 allowedAgentIds 限制路由
  • 默认对 Payload 进行安全包装;仅在可信内部源时设置 allowUnsafeExternalContent: true

第 15 章:定时任务(Cron)与心跳(Heartbeat)

OpenClaw 提供两种定时执行机制:Cron 定时任务和 Heartbeat 心跳。它们适用于不同场景,也可以组合使用。

15.1 Cron:精确定时任务

Cron 是 Gateway 内置的调度器,支持持久化的定时任务,在精确时间唤醒智能体。

三种调度方式

方式格式说明
atISO 8601 时间戳一次性任务,执行后自动删除
every毫秒数固定间隔重复
cron5 字段 cron 表达式标准 cron 调度,支持 IANA 时区

示例:

bash
# 一次性提醒:2026 年 2 月 15 日下午 4 点(UTC)
openclaw cron add --name "提醒" --at "2026-02-15T16:00:00Z" --session main

# 每 30 分钟执行一次
openclaw cron add --name "检查" --every 1800000

# 每天早上 7 点(纽约时间)
openclaw cron add --name "日报" --cron "0 7 * * *" --tz "America/New_York"

# 每周一早上 9 点(上海时间)
openclaw cron add --name "周报" --cron "0 9 * * 1" --tz "Asia/Shanghai"

持久化存储

任务持久化在 ~/.openclaw/cron/,网关重启后自动恢复。

两种执行模式

模式说明适用场景
主会话注入在主会话的下一个心跳中排入系统事件需要完整对话上下文的任务
隔离会话在专用 cron:<jobId> 会话中执行独立智能体回合不污染主会话的独立任务

任务交付

隔离任务可以将结果发送到消息渠道:

bash
openclaw cron add \
  --name "每日摘要" \
  --cron "0 8 * * *" \
  --tz "Asia/Shanghai" \
  --deliver \
  --channel telegram \
  --to "chat-id-123"

也可以静默执行(不发送任何消息)。

模型覆盖

定时任务可以指定不同于默认的模型或思考级别:

bash
openclaw cron add \
  --name "深度分析" \
  --cron "0 2 * * *" \
  --model "anthropic/claude-opus-4-6" \
  --thinking "high"

解析优先级:任务 Payload > 智能体默认配置。

多智能体绑定

bash
openclaw cron add --name "客服检查" --agent "customer-bot" --cron "*/15 * * * *"

未绑定的任务默认由主智能体处理。

CLI 管理

bash
# 列出所有定时任务
openclaw cron list

# 手动触发任务
openclaw cron run <job-id>

# 删除任务
openclaw cron remove <job-id>

配置开关

json5
{
  cron: {
    enabled: true  // 或通过 OPENCLAW_SKIP_CRON=1 环境变量禁用
  }
}

15.2 Heartbeat:心跳监控

心跳是另一种定时机制,设计用于周期性地在主会话中执行检查。

核心特点:

  • 在主会话中运行,拥有完整对话上下文
  • 默认每 30 分钟执行一次
  • 可将多个检查批量处理为单次智能体回合
  • 使用 HEARTBEAT.md 工作区文件定义检查清单

配置:

json5
{
  heartbeat: {
    every: "30m",          // 间隔时间
    activeHours: {
      start: "08:00",      // 活跃时段开始
      end: "22:00"         // 活跃时段结束
    }
  }
}

15.3 Cron vs Heartbeat 选型指南

维度HeartbeatCron
定时精度近似(受队列负载影响轻微漂移)精确(5 字段 cron 表达式 + 时区)
会话方式主会话(保留完整对话上下文)可主会话或隔离会话
效率高(批量多个检查到单次回合)每个任务独立回合
模型覆盖不支持支持指定模型和思考级别
一次性提醒不支持支持(--at 标志)

何时选择 Heartbeat

  • 多个周期性检查需要批量处理(收件箱、日历、通知)
  • 需要上下文感知的优先级判断
  • 近似定时即可(30 分钟间隔)
  • 成本敏感(一次回合处理多个检查)

何时选择 Cron

  • 需要精确定时("每周一早 9 点发送报告")
  • 任务需要隔离以防止上下文污染
  • 需要不同的模型/思考级别
  • 一次性精确提醒(--at 标志)

最佳实践:混合使用

官方推荐组合使用两种机制:

Heartbeat → 处理日常监控(收件箱、通知、系统状态),每 30 分钟批量检查
Cron → 处理精确调度(日报、周报、提醒)和一次性任务

15.4 Lobster 工作流补充

对于需要确定性执行审批门控的多步骤任务,Lobster 工作流运行时是 Cron 和 Heartbeat 的完美补充。

Lobster 是什么

Lobster 是一个类型化工作流 Shell——让 OpenClaw 在单次工具调用中执行多步骤管道,支持中间审批暂停和恢复。

核心优势:

优势说明
统一执行一次 Lobster 调用完成整个流程,而非多次 LLM 往返
显式审批在副作用(发邮件、发评论)前暂停等待人工授权
可恢复状态暂停的管道返回 resumeToken,可稍后继续

典型场景:邮件分拣

搜索邮件 → 分类汇总 → [审批门控] → 发送回复

这个流程在一次确定性调用中完成,而非散落在多轮对话中。

工作流文件(.lobster)

YAML/JSON 格式的声明式管道:

yaml
name: inbox-triage
args:
  - query: string
steps:
  - name: search
    command: gmail-search
    args: { q: "$args.query" }
  - name: categorize
    command: llm-task
    args:
      prompt: "Categorize these emails"
      input: "$search.json"
  - name: send-reply
    approval: required
    command: gmail-send
    args:
      to: "$categorize.json.replyTo"
      body: "$categorize.json.draft"

步骤可以引用前序输出($step.stdout$step.json),并通过 approval 字段设置审批门控。

安装与启用

bash
# 在网关宿主机上安装 Lobster
# 然后在配置中启用
json5
{
  tools: {
    alsoAllow: ["lobster"]  // 在系统或智能体级别启用
  }
}

安全约束:

  • 仅作为本地子进程执行
  • 在沙箱环境中禁用
  • 不管理密钥(委托给 OpenClaw 工具)
  • 自定义二进制需使用绝对路径

输出结构

Lobster 返回 JSON 信封,三种可能状态:

状态说明
ok成功完成
needs_approval暂停,需要 resumeToken 恢复
cancelled被明确拒绝

15.5 插件系统概览

插件(Plugin)是 OpenClaw 最重量级的扩展机制——在网关进程内运行的代码模块,可以添加命令、工具、RPC 方法、HTTP 端点和后台服务。

插件 vs 技能 vs Hook

插件技能Hook
运行位置网关进程内智能体上下文网关进程内
扩展能力RPC、HTTP、工具、命令、渠道智能体指令事件响应
开发语言TypeScriptMarkdownTypeScript
信任级别必须可信(进程内代码)可视为指令注入可信代码
复杂度

官方插件

插件功能
Memory Core / LanceDB记忆存储后端
Voice Call语音通话
Zalo / Matrix / Nostr / MS Teams消息渠道
Google / Qwen / Copilot Proxy OAuth认证提供商

插件可以注册什么

  • Gateway RPC 方法
  • HTTP 处理器
  • 智能体工具
  • CLI 命令
  • 后台服务
  • 技能(通过目录)
  • 自动回复命令(无需 LLM 调用)
  • 消息渠道适配器
  • 认证提供商

插件加载顺序

1. plugins.load.paths(配置的路径)           ← 最高优先级
2. 工作区扩展(.openclaw/extensions/)
3. 全局扩展(~/.openclaw/extensions/)
4. 内置扩展(默认禁用)                      ← 最低优先级

同 ID 的插件,先加载的胜出。

配置示例

json5
{
  plugins: {
    enabled: true,
    allow: ["voice-call"],              // 白名单
    deny: ["untrusted-plugin"],         // 黑名单

    load: {
      paths: ["~/Projects/oss/voice-call-extension"]
    },

    // 互斥插槽:同类插件只能启用一个
    slots: {
      memory: "memory-core"            // memory-core memory-lancedb
    },

    entries: {
      "voice-call": {
        enabled: true,
        config: { provider: "twilio" }
      }
    }
  }
}

CLI 管理

bash
openclaw plugins list            # 列出所有插件
openclaw plugins info <id>       # 查看插件详情
openclaw plugins install <path>  # 安装插件
openclaw plugins install @openclaw/voice-call  # 从 npm 安装
openclaw plugins enable <id>     # 启用
openclaw plugins disable <id>    # 禁用
openclaw plugins doctor          # 诊断插件问题

开发插件

插件导出一个函数或对象:

typescript
// 函数风格
export default function (api) {
  // 注册 RPC 方法
  api.registerGatewayMethod("myplugin.status", async () => {
    return { status: "running" };
  });

  // 注册自动回复命令(无需 LLM)
  api.registerCommand({
    name: "ping",
    description: "Pong!",
    handler: (ctx) => ({
      text: `Pong! Channel: ${ctx.channel}, Sender: ${ctx.senderId}`
    })
  });

  // 注册后台服务
  api.registerService({
    id: "heartbeat-monitor",
    start: () => api.logger.info("Monitor started"),
    stop: () => api.logger.info("Monitor stopped")
  });
}

清单文件(openclaw.plugin.json)

json
{
  "id": "my-plugin",
  "configSchema": {
    "type": "object",
    "properties": {
      "provider": { "type": "string", "enum": ["twilio", "vonage"] }
    }
  },
  "uiHints": {
    "provider": { "label": "VoIP Provider", "placeholder": "Select provider" }
  }
}

安全建议

插件在网关进程内运行。视其为可信代码:只安装你信任的插件。优先使用 plugins.allow 白名单。变更后重启网关。


小结:第四部分覆盖了 OpenClaw 的全部扩展能力——从内置工具到浏览器自动化,从轻量技能到重量级插件,从事件钩子到定时任务。这些机制层层叠加,让你能将 OpenClaw 打造成任何你需要的 AI 助手形态。下一部分将深入多智能体架构与高级路由策略。