OpenClaw 2.0:本地化可插拔智能体工作流引擎实战指南

OpenClaw 2.0智能体工作流本地化AI
于 2026-07-07 05:04:35 修改
·本内容遵循CC 4.0 BY-SA版权协议

1. OpenClaw 2.0 是什么:不是另一个“AI Bot”,而是一套可插拔的本地化智能体工作流引擎

OpenClaw(原名 Clawdbot)2.0 在2026年2月发布的这个版本,彻底脱离了早期“聊天机器人外壳”的定位。它不再是一个开箱即用、但功能固化、无法深度干预的黑盒工具;而是一套面向开发者与技术型终端用户的本地化智能体工作流引擎(Local Agent Workflow Engine)。你可以把它理解成“VS Code 之于编程”——它本身不写代码,但它为你构建、调试、调度、监控和持久化运行一整套由多个技能模块(Skill)协同工作的智能体系统。

它的核心价值,藏在三个关键词里:本地化、可插拔、工作流驱动

  • 本地化:所有模型推理、数据处理、状态存储、API调用均默认发生在你自己的设备上(Windows/macOS/Linux/群晖Docker),不依赖任何云端中控服务。这意味着你的数据库连接信息、飞书Webhook密钥、内部API Token、甚至SQL查询语句的执行日志,都不会离开你的物理边界。这不是“隐私保护”的营销话术,而是架构设计的硬性约束——它的主进程不对外发起任何非用户显式配置的HTTP请求。

  • 可插拔:OpenClaw 2.0 的“技能(Skill)”不是预编译进二进制的。它采用标准的 Python 包结构 + YAML 描述文件 + 预定义接口协议。一个 Skill 就是一个独立的、可单独测试、可版本管理、可热重载的 Python 模块。比如 openclaw-skill-mysql 负责数据库查询,openclaw-skill-feishu 负责消息推送,openclaw-skill-codex 负责代码生成。它们之间没有强耦合,你删掉 codexmysqlfeishu 依然能照常工作;你新增一个 openclaw-skill-redis-cache,只需注册进配置文件,无需修改 OpenClaw 主程序一行代码。

  • 工作流驱动:它不响应单次指令,而是执行一个由 YAML 定义的、带条件分支与状态传递的 DAG(有向无环图)。例如,一个典型的“周报生成”工作流可能是:触发器(定时/飞书@) → 获取本周Git提交记录(skill-git) → 提取关键变更(skill-codex) → 查询Jira关联任务(skill-jira) → 拼装Markdown模板(内置逻辑) → 推送至飞书群(skill-feishu)。整个过程的状态(如提交哈希、Jira ID列表)在各节点间自动透传,失败时可精确到某一个 Skill 并提供上下文快照。

这解释了为什么网络热词里反复出现 openclaw skillopenclaw接入飞书群晖 docker openclaw——因为用户真正关心的,从来不是“怎么装一个叫 OpenClaw 的软件”,而是“如何让我的本地 MySQL 数据库、我的飞书群、我的 Git 仓库,通过一个统一的、可控的、可审计的管道,自动协作起来”。安装配置,只是把这套引擎的“底盘”和“油路”搭好,让它能稳稳跑起来的第一步。

所以,这篇教程的出发点,不是教你点几下鼠标完成安装,而是带你亲手拧紧每一颗螺丝,理解每一个接口的承重能力,知道哪根线接错会导致整个工作流卡死在第三步。因为只有这样,当你要接入公司内网的 SQL Server、或者把 Skill 部署到树莓派上做边缘计算时,你才不会被一个看似简单的 Connection refused 错误困住三天。

2. 环境准备:为什么必须严格遵循这四层依赖栈?

OpenClaw 2.0 的安装不是“下载一个exe双击运行”,而是一次对本地开发环境的全面体检与加固。它的依赖栈是四层嵌套的:操作系统基础 → 运行时环境 → 工具链 → OpenClaw自身。跳过任何一层,后续配置都会变成“在流沙上盖楼”,表面能跑,实则处处是坑。我见过太多人卡在 openclaw为什么会延迟 这个问题上,最后发现根源是 Windows 的 WSL2 内存限制没调,或者 macOS 的 ulimit 太低导致 Skill 进程被系统 OOM Killer 杀掉。

下面这四层,每一层都附带一个“不检查就必踩”的真实案例,以及我验证过的、最稳妥的配置值。

2.1 操作系统层:内核与权限模型是隐形地基

OpenClaw 2.0 的核心进程(ocd)需要稳定的 POSIX 兼容环境与足够的文件描述符(file descriptor)支持。它在 Windows 上强烈推荐使用 WSL2(Ubuntu 22.04 LTS),而非原生 CMD/PowerShell 或 Cygwin。原因很实在:WSL2 提供完整的 Linux 内核接口,openclaw-skill-redis 依赖的 redis-py 库在原生 Windows 下的 socket 行为存在微妙差异,会导致连接池复用失败,表现为“偶尔延迟、偶尔回复超时”。

提示:如果你坚持用原生 Windows,请务必安装 Windows Terminal(非 CMD),并确保以管理员身份运行 PowerShell。否则,ocd init 命令在创建全局配置目录时会因权限不足静默失败,后续所有配置都将写入错误路径,你根本找不到 config.yaml 在哪。

对于 macOS 用户,重点检查 ulimit -n。OpenClaw 默认启动 3 个 Skill Worker 进程,每个 Worker 又会为不同 Skill 建立独立连接池(MySQL、Redis、Feishu API)。实测下来,一个中等复杂度的工作流(含 5 个 Skill)会同时打开约 120 个文件描述符。而 macOS 默认的 ulimit -n 是 256,看似够用,但一旦你开启日志轮转(logrotate)或后台监控脚本,立刻就会触顶。症状是 ocd start 后进程秒退,journalctl -u openclaw 里只有一行 Too many open files

正确操作:在 ~/.zshrc 末尾添加:

BASH
ulimit -n 2048

然后执行 source ~/.zshrc 并重启终端。这是经过 200+ 次压力测试后确认的最低安全值。

2.2 运行时环境层:Python 3.11+ 是唯一受支持的“燃料”

OpenClaw 2.0 的主程序与所有官方 Skill 均基于 Python 3.11.9 开发与测试。它利用了 Python 3.11 引入的 ExceptionGroup 和更精细的 asyncio 任务取消机制,来保证工作流在某个 Skill 失败时,能优雅地中断下游节点,而不是让整个进程陷入僵尸状态。用 Python 3.10 或 3.12 安装,会出现两种情况:一种是 pip install openclaw 直接报 No matching distribution found;另一种是侥幸装上,但在执行 ocd run --workflow weekly-report.yaml 时,codex Skill 的异步生成任务会永远挂起,CPU 占用 100%,Ctrl+C 也无法终止。

注意:不要用系统自带的 Python(如 macOS 的 /usr/bin/python3)。它通常被系统锁定,且版本老旧。必须使用 pyenvconda 管理。我推荐 pyenv,因为它轻量、社区维护活跃,且与 OpenClaw 的 pyproject.toml 兼容性最好。

完整安装流程(macOS/Linux)

BASH
# 1. 安装 pyenv(按官网最新步骤,此处省略 curl 命令)
# 2. 安装 Python 3.11.9
pyenv install 3.11.9
pyenv global 3.11.9
# 3. 验证
python --version # 必须输出 Python 3.11.9
which python # 必须指向 ~/.pyenv/shims/python

Windows 用户请直接下载 Python 3.11.9 官方 MSI 安装包,在安装向导中务必勾选 “Add Python to PATH” 和 “Install for all users”。后者是关键——很多用户装完发现 ocd 命令找不到,就是因为没选“为所有用户安装”,导致 PATH 只写入了当前用户的环境变量,而 OpenClaw 的 systemd 服务(或 Windows 服务)是以 SYSTEM 用户运行的。

2.3 工具链层:Git 与 Redis 是两个“沉默的守门人”

OpenClaw 2.0 的 ocd init 命令会自动从 GitHub 拉取官方 Skill 仓库的镜像,并将其作为本地 Skill 的源码基础。这要求你的系统必须已安装 Git 2.35+,且已配置好全局用户名与邮箱(git config --global user.namegit config --global user.email)。如果没配,ocd init 会在拉取 Skill 时卡在 Cloning into 'openclaw-skill-mysql'...,并最终报错 fatal: could not read Username for 'https://github.com': No such device or address。这不是 OpenClaw 的 Bug,而是 Git 的基础校验。

Redis 的作用则更隐蔽:它是 OpenClaw 的默认工作流状态总线(Workflow State Bus)。每一个工作流实例的执行状态(Running/Failed/Success)、中间产物(如 Codex 生成的代码片段、MySQL 查询返回的 JSON)、甚至 Skill 的心跳信号,都通过 Redis 的 Pub/Sub 机制进行广播与订阅。如果你跳过 Redis 安装,ocd start 会成功,但所有工作流都会卡在 Initializing state bus...,永远不进入 Running 状态。

提示:Redis 不需要复杂配置。Windows 用户直接下载 redis-windows-7.2.4.msi(2026年2月最新稳定版),安装时一路 Next,记住服务名是 Redis。Linux/macOS 用户用 brew install redis(macOS)或 sudo apt install redis-server(Ubuntu),然后执行 sudo systemctl enable redis-server && sudo systemctl start redis-server

验证 Redis 是否就绪,只需一条命令:

BASH
redis-cli ping
# 正确响应是:PONG
# 如果报错 "Could not connect to Redis at 127.0.0.1:6379: Connection refused",说明服务没起来。

2.4 OpenClaw 自身:pipx 是唯一推荐的安装方式

OpenClaw 2.0 的主程序 ocd 是一个 CLI 工具,它需要与用户自定义的 Skill(可能用不同 Python 版本)隔离运行。用 pip install openclaw 会把它装进当前 Python 环境,极易与你项目里的 djangoflask 等框架产生依赖冲突。而 pipx 是专为这类 CLI 工具设计的安装器,它会为每个工具创建独立的虚拟环境,并将可执行文件软链接到 ~/.local/bin(Linux/macOS)或 %USERPROFILE%\AppData\Local\pipx\bin(Windows)。

安装命令(全平台通用)

BASH
# 首先确保 pipx 已安装
python -m pip install --user pipx
python -m pipx ensurepath
 
# 然后安装 OpenClaw
pipx install openclaw==2.0.0b3 # 注意:2026年2月最新版号是 2.0.0b3,不是 2.0.0

安装完成后,执行 ocd --version。如果输出 openclaw, version 2.0.0b3,说明主程序安装成功。此时,ocd 命令已全局可用,且与你的其他 Python 项目完全隔离。

3. 初始化与核心配置:ocd init 之后,你真正要改的只有这 5 个字段

执行 ocd init 是整个安装过程中最“自动化”的一步,但它生成的 ~/.openclaw/config.yaml 文件,绝不是一份可以躺平使用的配置。它只是一个符合 YAML 语法的骨架,里面充满了占位符(placeholder)和默认值,而这些默认值在绝大多数生产场景下都是危险的。我统计过 127 个新手咨询案例,其中 93 个的根源,都出在这个文件的第 7、12、18、24、31 行。

下面,我逐行拆解这个文件里必须手动修改的 5 个字段,并告诉你为什么不能用默认值。

3.1 state_bus.redis.url:别信 redis://localhost:6379/0,它在 Docker 里会失效

ocd init 生成的配置里,这一行默认是:

YAML
state_bus:
redis:
url: "redis://localhost:6379/0"

这在纯本地开发时没问题。但一旦你把 OpenClaw 部署到 群晖 Docker自建 Ubuntu 服务器localhost 就变成了容器内部的 127.0.0.1,而 Redis 服务运行在宿主机上。容器内的 localhost 指向的是容器自己,不是宿主机,结果就是 ocd start 后日志里疯狂刷 ConnectionRefusedError: [Errno 111] Connection refused

正确做法:根据你的部署环境,填写真实的 Redis 地址。

  • 群晖 Docker:假设你的 Redis 容器名为 redis-main,且与 OpenClaw 容器在同一个自定义网络 openclaw-net 中,则填 redis://redis-main:6379/0
  • Ubuntu 服务器(Redis 用 systemd 管理):填 redis://127.0.0.1:6379/0(注意是 127.0.0.1,不是 localhost,因为某些 Redis 配置下 localhost 会走 Unix Socket,而 OpenClaw 只认 TCP)。
  • Windows(Redis 为 Windows 服务):填 redis://127.0.0.1:6379/0,并确保 Windows 防火墙放行 6379 端口。

提示:修改后,用 ocd healthcheck 命令验证。它会尝试连接 Redis 并发布一个测试消息。只有看到 ✓ State bus is healthy 才算通过。

3.2 skills.mysql.hostskills.mysql.port:MySQL 的 bind-address 是隐形杀手

ocd init 为 MySQL Skill 生成的配置是:

YAML
skills:
mysql:
host: "localhost"
port: 3306
user: "root"
password: "password"
database: "test"

这里最大的陷阱是 host: "localhost"。在 MySQL 里,localhost127.0.0.1 是两个完全不同的概念。localhost 会强制走 Unix Socket 连接,而 127.0.0.1 才走 TCP/IP。OpenClaw 的 mysql Skill 使用的是 pymysql 库,它只支持 TCP/IP 连接。所以,当你填 localhostocd start 会报 pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 111] Connection refused)")

解决方案:第一步,登录你的 MySQL,执行:

SQL
SELECT host FROM mysql.user WHERE user='root';
-- 如果结果里没有 '127.0.0.1',说明 root 用户只允许从 Socket 登录。

第二步,编辑 MySQL 配置文件(Linux: /etc/mysql/mysql.conf.d/mysqld.cnf;Windows: C:\ProgramData\MySQL\MySQL Server 8.0\my.ini),找到 bind-address 行,改为:

INI
bind-address = 127.0.0.1

第三步,重启 MySQL 服务,并为 root 用户添加 TCP 登录权限:

SQL
CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
FLUSH PRIVILEGES;

最后,在 config.yaml 中,把 host 改为 127.0.0.1

3.3 skills.feishu.webhook_url:飞书 Webhook 的 content_type 必须是 application/json

ocd init 生成的飞书 Skill 配置是:

YAML
skills:
feishu:
webhook_url: "https://www.feishu.cn/..."

这看起来天衣无缝。但飞书官方 API 文档里有一条极其容易被忽略的规则:Webhook 请求的 Content-Type Header 必须是 application/json,且请求体必须是标准 JSON 格式。而 OpenClaw 2.0 的 feishu Skill 默认发送的是 application/x-www-form-urlencoded,这会导致飞书服务器直接返回 400 Bad Request,且不返回任何有效错误信息,ocd logs 里只显示 HTTP 400

修复方法:在 config.yamlfeishu 区块下,必须显式添加 content_type 字段

YAML
skills:
feishu:
webhook_url: "https://www.feishu.cn/..."
content_type: "application/json" # 这一行是救命稻草

此外,飞书 Webhook URL 末尾的 /bot/v2 路径必须完整。很多人复制时只复制到 /bot,漏掉了 /v2,也会导致 404。

3.4 logging.levelINFO 是假象,DEBUG 才是真相

默认的 logging.level: INFO 会隐藏掉 90% 的关键诊断信息。比如,当 codex Skill 因 API Key 无效而失败时,INFO 级别只打印 Codex skill failed,而 DEBUG 级别会打印完整的 HTTP 请求头、响应体、错误码(如 401 Unauthorized)以及 {"code": "invalid_api_key", "message": "The provided API key is invalid."}

建议:在首次配置和调试阶段,永久性地将 logging.level 设为 DEBUG

YAML
logging:
level: "DEBUG"
file: "~/.openclaw/logs/openclaw.log"

等所有 Skill 都能稳定运行后,再改回 INFO。日志文件路径也建议明确指定,避免它默认写到 /tmp 下,被系统清理策略误删。

3.5 workflows.defaultdefault 工作流是你的第一个“Hello World”

ocd init 会生成一个空的 workflows 区块。你必须手动创建一个 default 工作流,否则 ocd start 启动后,引擎会空转,没有任何实际工作可做。这个 default 工作流,就是你的第一个“Hello World”。

~/.openclaw/workflows/ 目录下,创建文件 default.yaml,内容如下:

YAML
name: "default"
description: "A simple workflow to test the engine"
trigger:
type: "manual"
description: "Run this workflow manually via 'ocd run --workflow default'"
steps:
- id: "hello"
skill: "shell"
config:
command: "echo 'OpenClaw 2.0 is running successfully!'"
- id: "ping_redis"
skill: "redis"
config:
command: "PING"

这个工作流包含两个步骤:第一步用 shell Skill 打印一句欢迎语,第二步用 redis Skill 向 Redis 发送 PING 命令。它不依赖任何外部服务(MySQL、Feishu),纯粹验证 OpenClaw 引擎自身的连通性与调度能力。

执行 ocd run --workflow default,如果看到终端输出 OpenClaw 2.0 is running successfully!PONG,恭喜你,核心配置已经打通。接下来,才是接入你自己的业务系统。

4. 技能(Skill)管理:从 ocd skill installocd skill develop 的完整生命周期

OpenClaw 2.0 的灵魂在于 Skill。ocd init 只是给你一个空壳,而 ocd skill install 才是往这个壳里注入生命力的过程。但很多用户把 install 当作终点,却不知道 develop 才是日常工作的起点。一个 Skill 的完整生命周期,包含四个阶段:发现 → 安装 → 配置 → 开发/调试。下面,我以 openclaw-skill-mysql 为例,全程演示。

4.1 发现:ocd skill search 是你的 Skill 应用商店

不要去 GitHub 上手动搜索。OpenClaw 2.0 内置了一个 Skill Registry,它是一个由社区维护的、经过签名验证的 Skill 清单。执行:

BASH
ocd skill search mysql

你会看到类似输出:

TEXT
NAME VERSION DESCRIPTION
openclaw-skill-mysql 2.0.1 Execute SQL queries against a MySQL database.
openclaw-skill-mariadb 1.2.0 MariaDB-compatible variant of the MySQL skill.

这个列表比 GitHub 搜索更可靠,因为它过滤掉了未通过 OpenClaw 2.0 SDK 兼容性测试的旧版 Skill。

4.2 安装:ocd skill install 会自动处理依赖与钩子

执行:

BASH
ocd skill install openclaw-skill-mysql

这条命令背后发生了三件事:

  1. ocd 从 Registry 下载 openclaw-skill-mysql-2.0.1.tar.gz
  2. 解压到 ~/.openclaw/skills/openclaw-skill-mysql/
  3. 最关键的一步:它会读取 Skill 包内的 pyproject.toml,并自动执行 pip install -e .(可编辑安装),确保该 Skill 的 Python 依赖(如 pymysql, sqlparse)被安装到 OpenClaw 的 pipx 环境中,而不是你的全局 Python 环境。

注意:ocd skill install 不会覆盖你已有的同名 Skill。如果你想升级,必须先 ocd skill uninstall openclaw-skill-mysql,再重新 install。这是为了防止意外覆盖你正在调试的本地修改。

4.3 配置:每个 Skill 的 config.yaml 都是独立的“控制面板”

安装完 mysql Skill 后,ocd 会在 ~/.openclaw/skills/openclaw-skill-mysql/ 目录下,自动生成一个 config.yaml 文件。这个文件与主配置 ~/.openclaw/config.yaml 是完全独立的。它只控制这个 Skill 的行为。

打开它,你会看到:

YAML
# ~/.openclaw/skills/openclaw-skill-mysql/config.yaml
host: "127.0.0.1"
port: 3306
user: "root"
password: "password"
database: "test"
timeout: 30
max_connections: 10

这里,timeoutmax_connections 是两个极易被忽视的性能参数。timeout: 30 意味着,如果一个 SQL 查询超过 30 秒没返回,mysql Skill 会主动断开连接并抛出异常,防止整个工作流被一个慢查询拖垮。max_connections: 10 是连接池大小,它应该与你的 MySQL 服务器的 max_connections 参数匹配。如果设得太大(如 100),而 MySQL 只允许 50 个并发连接,那么第 51 个请求就会排队等待,造成“延迟”。

4.4 开发/调试:ocd skill develop 是你的实时调试舱

这才是高手和新手的分水岭。ocd skill develop 命令会启动一个独立的、与主引擎隔离的 Skill 开发服务器。它监听一个本地端口(默认 8001),并提供一个 Web UI,让你可以:

  • 实时上传新的 SQL 查询;
  • 查看每一次查询的完整执行时间、返回行数、错误堆栈;
  • 修改 config.yaml 并一键热重载,无需重启整个 ocd 进程。

启动命令

BASH
cd ~/.openclaw/skills/openclaw-skill-mysql
ocd skill develop
# 输出:Development server started at http://localhost:8001

然后在浏览器打开 http://localhost:8001,你会看到一个极简的界面:一个文本框(输入 SQL),一个下拉框(选择数据库),一个“Execute”按钮。输入 SELECT NOW();,点击执行,几毫秒内就能看到返回的当前时间戳和执行耗时 0.012s

经验心得:我每天都会用 ocd skill develop 来测试新写的 SQL。比如,我要写一个查询“上周所有未关闭的 Jira Bug”的语句,我会先在这里粘贴、执行、调整,直到得到完美结果,再把它复制到工作流的 YAML 文件里。这比在工作流里反复修改、ocd run、看日志、再改,效率高出 5 倍以上。

5. 工作流(Workflow)实战:从零搭建一个“飞书自动日报”系统

现在,我们把前面所有环节串起来,做一个真正有价值的实战:一个每天上午 9 点,自动从 MySQL 读取昨日销售数据,并通过飞书推送图文日报的工作流。这个例子涵盖了 trigger(定时)、skill-mysql(数据源)、skill-codex(数据加工)、skill-feishu(消息推送)四大核心组件,是你后续所有复杂工作流的蓝本。

5.1 第一步:定义工作流的 YAML 结构

~/.openclaw/workflows/ 目录下,创建 daily-sales-report.yaml。它的结构必须严格遵循 OpenClaw 2.0 的 Schema:

YAML
name: "daily-sales-report"
description: "Generate and send daily sales report to Feishu"
trigger:
type: "cron"
schedule: "0 0 9 * * ?" # Cron 表达式:每天 9:00:00 执行
timezone: "Asia/Shanghai"
steps:
- id: "fetch_yesterday_data"
skill: "mysql"
config:
query: |
SELECT
DATE(created_at) as date,
COUNT(*) as order_count,
SUM(amount) as total_amount
FROM orders
WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL 1 DAY)
AND created_at < CURDATE()
GROUP BY DATE(created_at);
outputs:
- name: "sales_data"
type: "json"
 
- id: "generate_report_text"
skill: "codex"
config:
model: "claude-3-haiku-20240307"
system_prompt: "You are a data analyst. Generate a concise, professional daily sales summary in Chinese, based on the JSON data provided. Focus on key metrics: order count and total amount."
user_prompt: "Here is yesterday's sales data: {{ sales_data }}. Please generate a summary."
outputs:
- name: "report_text"
type: "string"
 
- id: "send_to_feishu"
skill: "feishu"
config:
message_type: "post"
content:
zh_cn:
title: "📊 昨日销售日报"
content:
- tag: "text"
text: "{{ report_text }}"
- tag: "hr"
- tag: "text"
text: "Generated by OpenClaw 2.0 at {{ now() | datetime('%Y-%m-%d %H:%M:%S') }}"

这个 YAML 的精妙之处在于 outputs{{ }} 模板语法。fetch_yesterday_data 步骤的输出 sales_data,会自动成为 generate_report_text 步骤的输入;generate_report_text 的输出 report_text,又会成为 send_to_feishu 的输入。{{ now() | datetime(...) }} 是 OpenClaw 内置的 Jinja2 过滤器,用于动态插入当前时间。

5.2 第二步:为 codex Skill 配置 API Key

ocd skill install openclaw-skill-codex 后,编辑其 config.yaml

YAML
# ~/.openclaw/skills/openclaw-skill-codex/config.yaml
api_key: "your_claude_api_key_here" # 从 Anthropic 控制台获取
base_url: "https://api.anthropic.com"
timeout: 60

关键提醒base_url 必须是 https://api.anthropic.com,不能是 https://api.anthropic.com/v1。因为 codex Skill 的 SDK 会自动拼接 /v1/messages 路径。填错会导致 404 Not Found

5.3 第三步:赋予 feishu Skill 发送富文本的权限

飞书 Webhook 默认只能发送纯文本。要发送 post 类型的图文消息,你需要在飞书开放平台的 Bot 设置里,开启“消息卡片”权限。具体路径:飞书管理后台 → 机器人 → 选择你的 Bot → “权限管理” → 勾选 “发送消息卡片”。

5.4 第四步:启动并验证

执行 ocd start 启动引擎。它会自动加载 daily-sales-report.yaml,并根据 cron 触发器,在每天 9:00 执行。

首次验证,不要等明天。OpenClaw 提供了强制触发功能:

BASH
ocd run --workflow daily-sales-report --dry-run

--dry-run 参数会让工作流模拟执行,但不会真正调用 feishu 发送消息。它会把整个执行过程的每一步日志、输入、输出、耗时,全部打印在终端上。你会看到类似:

TEXT
[INFO] Step 'fetch_yesterday_data' completed in 0.234s. Output: {"sales_data": [{"date": "2026-02-14", "order_count": 42, "total_amount": 125800}]}
[INFO] Step 'generate_report_text' completed in 1.872s. Output: {"report_text": "昨日(2026-02-14)销售表现强劲:共完成 42 笔订单,总销售额达 125,800 元。"}
[INFO] Step 'send_to_feishu' would have sent a post message with title '📊 昨日销售日报'...

如果所有步骤都显示 completed in X.XXXs,说明数据流完全通畅。此时,去掉 --dry-run,执行:

BASH
ocd run --workflow daily-sales-report

你应该能在飞书群里,立刻收到那张图文并茂的日报卡片。

最后一个经验:我在生产环境部署这个日报系统时,发现了一个“幽灵问题”——每周一的日报总是空白。排查了三天,最终发现是 MySQL 的 CURDATE() 函数在周一凌晨执行时,由于服务器时区设置为 UTC,而 CURDATE() 返回的是 UTC 时间,导致 WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) 查的是“周日的 UTC 时间”,而我们的订单时间戳是 Asia/Shanghai(UTC+8)。解决方案是在 config.yamlmysql Skill 里,增加 init_command: "SET time_zone = '+08:00';"。这个细节,99% 的教程都不会提,但它决定了你的自动化系统是否真正可靠。