Appearance
第四部分:工具与能力扩展
OpenClaw 的智能体不只是能聊天——它能执行命令、浏览网页、搜索信息、管理定时任务、响应事件。本部分详细讲解 OpenClaw 的工具体系、浏览器自动化、技能系统、Hook 钩子和定时任务。
第 11 章:内置工具体系
工具(Tools)是智能体与外部世界交互的手臂。OpenClaw 提供了一套丰富的内置工具,涵盖命令执行、文件操作、网络搜索、跨渠道通信等多个领域。
11.1 工具分类总览
OpenClaw 的内置工具按功能域划分为以下类别:
| 类别 | 工具 | 说明 |
|---|---|---|
| 执行与进程 | exec | 在工作区内运行 Shell 命令 |
process | 管理后台执行会话 | |
apply_patch | 跨文件的结构化补丁修改 | |
| 网络与信息 | web_search | 通过 Brave Search / Perplexity 搜索 |
web_fetch | 抓取 URL 内容并转为可读 Markdown | |
| 浏览器与 UI | browser | 控制专属隔离浏览器 |
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:runtime | exec, bash, process |
group:fs | read, write, edit, apply_patch |
group:messaging | message |
group:web | web_search, web_fetch |
group:ui | browser, canvas |
group:automation | cron, gateway |
group:nodes | nodes |
group:sessions | sessions_list, sessions_history, sessions_send, sessions_spawn |
group:openclaw | OpenClaw 系统级工具 |
11.3 工具策略配置
工具策略决定了智能体能使用哪些工具。这是安全控制的核心机制之一。
内置策略模板
OpenClaw 提供四种预设模板,适用于不同信任级别的场景:
| 模板 | 说明 | 适用场景 |
|---|---|---|
minimal | 最少权限 | 高安全要求的公开机器人 |
coding | 编码导向(文件读写 + 命令执行) | 开发辅助 |
messaging | 消息通信导向 | 跨平台消息机器人 |
full | 全部工具开放 | 个人私用的全能助手 |
允许/拒绝列表
通过 tools.allow 和 tools.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 Sonar | AI 合成答案 + 来源引用,适合复杂查询 | 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 备选提取
}
}
}
}处理优先级:
- Readability 提取器(默认)
- 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 Chat | emoji 必填 | emoji="" 移除全部;remove: true 移除指定 |
| Telegram | emoji 必填 | 设置 remove: true(仍需提供 emoji 值) |
emoji 必填 | remove: true 映射为清空 emoji | |
| Signal | emoji 必填 | 需启用 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 快照 | 数字(12) | click 12, type 23 "text" | 通用页面交互 |
| 角色快照 | 角色前缀(e12) | click 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.targetbash
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+ |
| CPU | 1 核 | 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,而非让智能体处理认证凭据。
推荐流程:
- 启动 OpenClaw 浏览器:
openclaw browser start - 打开目标网站:
openclaw browser open https://x.com - 在弹出的浏览器窗口中手动完成登录
- 登录态保存在 Profile 中,后续智能体自动复用
为什么不让智能体登录?
- 避免触发反机器人检测
- 防止凭据暴露在会话记录中
- 登录态持久化在 Profile 中,无需每次重复
安全建议:
- 使用专用浏览器 Profile,不要用日常浏览器
- 网关和节点仅通过 Tailnet 暴露
- 不需要时禁用浏览器代理路由
- 将节点配对视为管理员级别的访问权限
12.10 沙箱 vs 工具策略 vs 提权模式
三种执行控制机制各管一个维度:
| 机制 | 控制什么 | 核心问题 |
|---|---|---|
| 沙箱(Sandbox) | 工具在哪里执行 | Docker 容器 vs 宿主机 |
| 工具策略(Tool Policy) | 哪些工具可用 | 允许/拒绝列表 |
| 提权模式(Elevated) | exec 的宿主机逃逸 | 沙箱中临时在宿主机执行 |
提权模式详解
提权模式仅在智能体处于沙箱中时有意义——非沙箱智能体本来就在宿主机上执行。
| 命令 | 行为 |
|---|---|
/elevated on 或 ask | 在宿主机执行,保留审批机制 |
/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.json 的 skills 部分管理技能:
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.*.env和skills.entries.*.apiKey注入的密钥仅在该智能体回合的宿主进程中可见 - 沙箱会话中的技能进程在 Docker 中运行时,全局环境变量不会自动透传
- 解决方案:使用智能体特定的 Docker 环境配置,或将变量嵌入自定义沙箱镜像
第 14 章:Hooks 事件钩子
Hook 是 OpenClaw 的事件驱动自动化系统——当智能体命令或网关生命周期事件发生时,自动执行自定义脚本。
14.1 Hooks vs Webhooks
这两个概念容易混淆,但它们的方向完全不同:
| Hooks | Webhooks | |
|---|---|---|
| 方向 | 内部事件 → 自定义脚本 | 外部系统 → 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-evil14.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 | 网关启动 |
| 插件 API | tool_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.md的openclaw.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 转换为 wake 或 agent 动作:
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 内置的调度器,支持持久化的定时任务,在精确时间唤醒智能体。
三种调度方式
| 方式 | 格式 | 说明 |
|---|---|---|
at | ISO 8601 时间戳 | 一次性任务,执行后自动删除 |
every | 毫秒数 | 固定间隔重复 |
cron | 5 字段 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 选型指南
| 维度 | Heartbeat | Cron |
|---|---|---|
| 定时精度 | 近似(受队列负载影响轻微漂移) | 精确(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、工具、命令、渠道 | 智能体指令 | 事件响应 |
| 开发语言 | TypeScript | Markdown | TypeScript |
| 信任级别 | 必须可信(进程内代码) | 可视为指令注入 | 可信代码 |
| 复杂度 | 高 | 低 | 中 |
官方插件
| 插件 | 功能 |
|---|---|
| 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 助手形态。下一部分将深入多智能体架构与高级路由策略。