[← 第 24 章](/openclaw-tutorial/24-%E5%A4%9A%E6%A8%A1%E6%80%81%E4%B8%8E%E5%AA%92%E4%BD%93%E5%A4%84%E7%90%86.html) · [📑 目录](/openclaw-tutorial/) · [📋 大纲](/openclaw-tutorial/OUTLINE.html)

第 25 章:进阶开发实践

difficulty time chapter

难度: ⭐⭐⭐⭐ 高级 预计阅读: 28 分钟 前置章节: 第 3-4 章第 9 章第 16 章

本章面向资深开发者,介绍如何深度定制 OpenClaw 的 Pipeline、Hooks 系统、自定义 Skill 开发规范、Plugin 架构扩展以及高级自动化模式。掌握这些进阶技术,可以打造完全符合业务需求的自动化方案。

📑 本章目录


25.1 Hooks 系统详解

Hooks 是 OpenClaw 事件驱动架构的核心。通过 Hooks,开发者可以在关键生命周期节点注入自定义逻辑。

Hook 生命周期

阶段 Hook 名称 触发时机 常见用途
启动前 before_pipeline Pipeline 开始执行前 环境检查、缓存预热
阶段前 before_stage 每个 Stage 执行前 日志记录、参数注入
阶段后 after_stage 每个 Stage 执行后 结果校验、指标收集
完成后 after_pipeline Pipeline 全部完成后 报告生成、通知推送
失败时 on_error 任何阶段出错时 错误上报、回滚操作

编写自定义 Hook

// hooks/self-improvement/handler.ts
// 一个典型的 Hook 处理器示例

interface HookContext {
  stage: string;          // 当前阶段名称
  pipeline: string;       // Pipeline 名称
  timestamp: number;      // 触发时间戳
  data: Record<string, unknown>;  // 阶段数据
}

export function afterStage(ctx: HookContext): void {
  // 在每个阶段完成后收集指标
  const duration = Date.now() - ctx.timestamp;
  console.log(`[Hook] Stage ${ctx.stage} completed in ${duration}ms`);

  // 可选: 将指标写入日志
  const logEntry = {
    event: "stage_complete",
    stage: ctx.stage,
    pipeline: ctx.pipeline,
    duration,
    timestamp: new Date().toISOString(),
  };

  appendToLog(logEntry);
}

function appendToLog(entry: Record<string, unknown>): void {
  const fs = require("fs");
  const logPath = `${process.env.HOME}/.openclaw/logs/hook-metrics.jsonl`;
  fs.appendFileSync(logPath, JSON.stringify(entry) + "\n");
}

Hook 注册与配置

{
  "hooks": {
    "self-improvement": {
      "enabled": true,
      "handler": "hooks/self-improvement/handler.js",
      "events": ["after_stage", "on_error"],
      "config": {
        "logLevel": "info",
        "metricsEnabled": true
      }
    }
  }
}

查看已注册的 Hooks

# 列出所有已注册 Hook
openclaw hooks list

# 查看特定 Hook 详情
openclaw hooks info self-improvement

# 测试 Hook 触发
openclaw hooks test self-improvement --event after_stage

# 查看 Hook 执行日志
cat ~/.openclaw/logs/hook-metrics.jsonl | tail -5 | python3 -m json.tool

25.2 Pipeline 定制与扩展

Pipeline 是 OpenClaw 自动化的执行引擎。了解如何定制 Pipeline 可以构建复杂的自动化工作流。

Pipeline 配置结构

# pipeline.yaml — 自定义 Pipeline 配置
name: tutorial-generator
version: "5.4"
description: "教程自动生成与优化 Pipeline"

stages:
  - name: outline_gen
    description: "生成教程大纲"
    parallel_group: 1
    retry: 2
    timeout: 60

  - name: content_gen
    description: "生成章节内容"
    parallel_group: 1
    depends_on: [outline_gen]
    retry: 1
    timeout: 300

  - name: quality_scan
    description: "质量扫描"
    parallel_group: 2
    depends_on: [content_gen]

  - name: auto_fix
    description: "自动修复"
    parallel_group: 2
    depends_on: [quality_scan]
    condition: "quality_scan.defects > 0"

parallel_groups:
  1: { max_workers: 4 }
  2: { max_workers: 2 }

hooks:
  before_pipeline: [env_check]
  after_stage: [metrics_collector]
  after_pipeline: [report_generator, notification]
  on_error: [error_reporter]

Pipeline 阶段依赖图

outline_gen ──→ content_gen ──→ quality_scan ──→ auto_fix
                                      │
                                      └──→ report_gen

增量执行模式

Pipeline 支持增量执行,只处理变更的内容:

# 完整执行
openclaw pipeline run tutorial-generator

# 增量执行(只处理有变更的章节)
openclaw pipeline run tutorial-generator --incremental

# 指定质量阈值(低于此分数的章节才进入 auto_fix)
openclaw pipeline run tutorial-generator --refine-threshold 95

# 并行度控制
openclaw pipeline run tutorial-generator --max-workers 8

# 查看 Pipeline 执行历史
openclaw pipeline history tutorial-generator --limit 10

自定义 Stage 开发

# stages/custom_stage.py — 自定义 Pipeline Stage

class CustomStage:
    """一个自定义的 Pipeline Stage 模板"""

    def __init__(self, config: dict):
        self.config = config
        self.name = config.get("name", "custom_stage")

    def run(self, context: dict) -> dict:
        """执行阶段逻辑,返回结果"""
        input_data = context.get("input", {})

        # 自定义处理逻辑
        result = self.process(input_data)

        return {
            "status": "success",
            "output": result,
            "metrics": {
                "items_processed": len(result),
                "duration_ms": context.get("duration", 0),
            }
        }

    def process(self, data: dict) -> list:
        """实现具体的处理逻辑"""
        # 在这里编写你的业务逻辑
        processed_items = []
        for item in data.get("items", []):
            processed_items.append(self.transform(item))
        return processed_items

    def transform(self, item: dict) -> dict:
        """单个项目的转换逻辑"""
        return {**item, "processed": True}

25.3 自定义 Skill 开发规范

开发高质量的 Skill 需要遵循一套标准化的规范。

Skill 项目结构

my-custom-skill/
├── SKILL.md              # 技能说明书(必需)
├── CHANGELOG.md          # 变更日志
├── config.yaml           # 技能配置
├── package.json          # Node.js 依赖(如需要)
├── src/
│   ├── index.ts          # 主入口
│   ├── tools/            # MCP 工具实现
│   │   ├── search.ts
│   │   └── create.ts
│   └── utils/            # 工具函数
│       └── helpers.ts
├── tests/
│   ├── search.test.ts
│   └── create.test.ts
└── docs/
    └── usage.md

SKILL.md 规范

# 查看 SKILL.md 规范模板
openclaw skill template --show

# 创建新 Skill 项目(自动生成标准结构)
openclaw skill init my-custom-skill

# 验证 Skill 格式
openclaw skill validate ./my-custom-skill
SKILL.md 必需章节 内容要求 评分权重
名称与版本 清晰的 Skill 名和语义版本号 10%
功能描述 详细说明 Skill 能做什么 20%
输入输出 参数格式、返回值格式 20%
使用示例 至少 3 个实际使用场景 25%
限制说明 已知限制和边界条件 10%
变更历史 版本变更记录 15%

工具函数实现模式

// src/tools/search.ts — MCP 工具实现标准模式

interface SearchParams {
  query: string;
  limit?: number;
  filter?: Record<string, string>;
}

interface SearchResult {
  items: Array<{
    title: string;
    content: string;
    relevance: number;
  }>;
  total: number;
  hasMore: boolean;
}

export async function searchTool(params: SearchParams): Promise<SearchResult> {
  // 1. 参数校验
  if (!params.query || params.query.trim().length === 0) {
    throw new Error("query 参数不能为空");
  }

  const limit = Math.min(params.limit ?? 10, 100);

  // 2. 执行搜索
  const results = await performSearch(params.query, limit, params.filter);

  // 3. 格式化返回
  return {
    items: results.map(r => ({
      title: r.title,
      content: r.snippet,
      relevance: r.score,
    })),
    total: results.length,
    hasMore: results.length >= limit,
  };
}

25.4 Plugin 架构扩展

OpenClaw 的 Plugin 系统允许在更底层扩展 Agent 能力。

Plugin vs Skill 的区别

特性 Skill Plugin
作用层级 应用层 系统层
安装方式 npx skills install openclaw plugin install
能力范围 提供 MCP 工具 扩展核心功能
隔离性 独立运行、互不影响 可能影响全局行为
开发难度 中等 较高
审核要求 标准审核 严格审核

Plugin Loader 机制

# 查看已加载的 Plugins
openclaw plugin list

# 查看 Plugin 加载顺序
openclaw plugin list --verbose

# 安装第三方 Plugin
openclaw plugin install @openclaw/enhanced-memory

# 禁用特定 Plugin(不卸载)
openclaw plugin disable enhanced-memory

# 查看 Plugin 事件绑定
openclaw plugin events

自定义 Plugin 开发

// plugins/custom-logger/index.ts

interface PluginMeta {
  name: string;
  version: string;
  hooks: string[];
}

export const meta: PluginMeta = {
  name: "custom-logger",
  version: "1.0.0",
  hooks: [
    "before_pipeline",
    "after_stage",
    "on_error",
  ],
};

export function beforePipeline(context: Record<string, unknown>): void {
  console.log(`[CustomLogger] Pipeline starting: ${context.pipeline}`);
}

export function afterStage(context: Record<string, unknown>): void {
  const { stage, duration } = context;
  console.log(`[CustomLogger] ${stage} done in ${duration}ms`);
}

export function onError(error: Error, context: Record<string, unknown>): void {
  console.error(`[CustomLogger] Error in ${context.stage}: ${error.message}`);
  // 可选: 发送告警通知
}

25.5 高级自动化模式

结合前面的技术,可以构建复杂的自动化方案。

多 Pipeline 编排

# 串行执行多个 Pipeline
openclaw pipeline run data-collect && \
openclaw pipeline run data-process && \
openclaw pipeline run report-gen

# 并行执行独立的 Pipeline
openclaw pipeline run monitor-a &
openclaw pipeline run monitor-b &
wait
echo "所有监控 Pipeline 完成"

# 查看所有活跃 Pipeline
openclaw pipeline status --active

# 查看运行目录
ls ~/.openclaw/cron/runs/

事件驱动自动化

触发事件 自动化动作 实现方式
文件变更 重新扫描质量 inotifywait + Hook
Cron 定时 定期内容更新 Cron Job
消息到达 自动处理请求 飞书 Callback
Git Push CI/CD 集成 GitHub Actions

完整自动化示例:教程持续优化

#!/bin/bash
# auto-tutorial-optimize.sh
# 教程内容持续优化的完整自动化脚本

set -e

REPO=~/.openclaw/workspace/zxk-private/openclaw-tutorial-auto
REPORTS=/tmp/openclaw-tutorial-auto-reports
THRESHOLD=95

echo "=== 教程持续优化 Pipeline ==="

# Stage 1: 拉取最新内容
cd "$REPO"
git pull origin main 2>/dev/null || true

# Stage 2: 运行质量扫描
echo "--- 运行质量扫描 ---"
python3 modules/tutorial_scanner.py "$REPO" > "$REPORTS/scan-$(date +%Y%m%d).json"

# Stage 3: 检查是否需要优化
LOW_SCORE=$(python3 -c "
import json
with open('$REPORTS/scan-$(date +%Y%m%d).json') as f:
    data = json.load(f)
low = [c for c in data['chapters'] if c['score'] < $THRESHOLD]
print(len(low))
")

if [[ "$LOW_SCORE" -gt 0 ]]; then
  echo "发现 $LOW_SCORE 个低分章节,启动优化..."

  # Stage 4: 自动优化
  python3 auto_optimizer.py --incremental --refine-threshold $THRESHOLD

  # Stage 5: 提交变更
  git add -A
  git commit -m "auto: optimize $LOW_SCORE chapters below $THRESHOLD"
  git push origin main

  echo "✅ 优化完成并已推送"
else
  echo "✅ 所有章节分数 >= $THRESHOLD,无需优化"
fi

进阶:Pipeline 与 Plugin 架构原理

深入理解核心架构有助于编写高效、可靠的扩展。

Pipeline 执行引擎

组件 职责 关键特性
Scheduler 阶段调度与依赖解析 DAG 拓扑排序
Executor 阶段执行与并行控制 ThreadPoolExecutor
Monitor 运行状态监控 实时指标收集
Reporter 执行报告生成 JSON/HTML 格式

Hook 分发机制

Hook 系统采用观察者模式,事件从 Pipeline Engine 发出,经过 Plugin Loader 分发到各已注册的处理器。分发顺序由 Plugin 的优先级决定(priority 字段,默认 100,数值越小越先执行)。

Hook 处理器默认同步执行。如果 Hook 逻辑耗时较长(如网络请求),建议在处理器内部使用异步机制,避免阻塞 Pipeline 主线程。

Plugin 隔离与安全

安全机制 说明
文件系统隔离 Plugin 只能访问指定目录
网络访问控制 需要在 manifest 中声明网络权限
API 限频 每个 Plugin 有独立的调用速率限制
错误隔离 单个 Plugin 错误不影响其他 Plugin

注意事项与常见错误

常见错误 后果 正确做法
Hook 处理器中抛出未捕获异常 可能中断 Pipeline 执行 始终用 try-catch 包裹 Hook 逻辑
Pipeline 阶段间传递大量数据 内存溢出、执行变慢 使用文件或数据库中转大数据
Skill 不做参数校验 运行时崩溃、安全风险 入口处严格校验所有输入参数
自定义 Plugin 修改全局状态 与其他 Plugin 冲突 保持 Plugin 无状态或使用隔离存储

实操练习

练习 1:编写一个简单 Hook

目标:创建一个 Hook 处理器,记录每次 Pipeline 执行的耗时。

# Step 1: 创建 Hook 目录
mkdir -p ~/.openclaw/hooks/timer-hook

# Step 2: 编写 Hook 处理器
cat > ~/.openclaw/hooks/timer-hook/handler.js << 'HOOK'
// timer-hook — 记录 Pipeline 阶段耗时
const fs = require("fs");
const logFile = process.env.HOME + "/.openclaw/logs/timer-hook.jsonl";

module.exports = {
  afterStage(ctx) {
    const entry = {
      stage: ctx.stage,
      pipeline: ctx.pipeline,
      duration: Date.now() - ctx.timestamp,
      time: new Date().toISOString(),
    };
    fs.appendFileSync(logFile, JSON.stringify(entry) + "\n");
  }
};
HOOK

echo "✅ Hook 处理器已创建"

# Step 3: 验证文件
cat ~/.openclaw/hooks/timer-hook/handler.js

# Step 4: 查看输出日志(执行 Pipeline 后)
cat ~/.openclaw/logs/timer-hook.jsonl 2>/dev/null || echo "尚无日志"

练习 2:创建 Skill 项目骨架

目标:使用标准规范创建一个新的 Skill 项目。

# Step 1: 初始化 Skill 项目
SKILL_DIR=/tmp/my-test-skill
mkdir -p "$SKILL_DIR"/{src/tools,tests,docs}

# Step 2: 创建 SKILL.md
cat > "$SKILL_DIR/SKILL.md" << 'SKILL'
# my-test-skill

**Version**: 1.0.0

## 功能描述
这是一个测试 Skill,用于学习 Skill 开发流程。

## 使用示例

    openclaw skill run my-test-skill --action greet --name World

## 参数说明
| 参数 | 类型 | 必填 | 描述 |
|------|------|------|------|
| action | string | 是 | 要执行的动作 |
| name | string | 否 | 名称参数 |

## 限制说明
- 仅用于测试和学习目的
- 不支持批量操作
SKILL

# Step 3: 创建配置
cat > "$SKILL_DIR/config.yaml" << 'CONFIG'
name: my-test-skill
version: 1.0.0
description: 测试 Skill
tools:
  - name: greet
    description: 生成问候语
CONFIG

# Step 4: 验证结构
echo "=== Skill 项目结构 ==="
find "$SKILL_DIR" -type f | sort

echo "=== SKILL.md 内容 ==="
cat "$SKILL_DIR/SKILL.md"

练习 3:分析 Pipeline 执行历史

目标:查看和分析 Cron 任务的执行记录。

# Step 1: 列出最近的执行记录
echo "=== 最近的 Cron 执行记录 ==="
ls -lt ~/.openclaw/cron/runs/*.jsonl 2>/dev/null | head -5

# Step 2: 分析最近一次执行
LATEST=$(ls -t ~/.openclaw/cron/runs/*.jsonl 2>/dev/null | head -1)
if [[ -n "$LATEST" ]]; then
  echo "=== 分析: $(basename "$LATEST") ==="
  echo "总行数: $(wc -l < "$LATEST")"
  echo "首条记录:"
  head -1 "$LATEST" | python3 -m json.tool 2>/dev/null || head -1 "$LATEST"
  echo "末条记录:"
  tail -1 "$LATEST" | python3 -m json.tool 2>/dev/null || tail -1 "$LATEST"
else
  echo "无执行记录"
fi

# Step 3: 统计执行状态
echo "=== 执行状态统计 ==="
for f in ~/.openclaw/cron/runs/*.jsonl; do
  [[ -f "$f" ]] || continue
  echo "$(basename "$f"): $(wc -l < "$f") 条记录"
done

常见问题 (FAQ)

Q1:Hooks 和 Plugins 有什么区别?

A:Hooks 是事件处理器,监听并响应特定事件(如阶段完成);Plugins 是功能扩展,可以注册多个 Hooks 并提供额外的配置和工具。简单说,Hooks 是 Plugin 的一部分,Plugin 是更完整的扩展包。

Q2:如何调试自定义 Pipeline Stage?

A:建议先单独测试 Stage 逻辑,再集成到 Pipeline 中:

  1. 单元测试:直接调用 Stage 的 run 方法
  2. 日志调试:在 Stage 中添加详细日志
  3. 干运行:使用 --dry-run 标志查看执行计划

Q3:Pipeline 支持条件执行吗?

A:支持。通过 condition 字段可以设置阶段的执行条件,例如 condition: "quality_scan.defects > 0" 表示只有当扫描发现缺陷时才执行修复阶段。

Q4:如何发布自己的 Skill 供他人使用?

A:遵循以下步骤:

  1. 按规范完善 SKILL.md 和 config.yaml
  2. 通过 openclaw skill validate 验证格式
  3. 推送到 GitHub 仓库
  4. 提交到 OpenClaw Skill Registry 进行审核
  5. 审核通过后,其他用户可通过 npx skills install 安装

参考来源

来源 链接 说明
OpenClaw 开发者文档 https://docs.OpenClaw.ai/developer 开发者参考
OpenClaw GitHub https://github.com/OpenClaw/OpenClaw 源码与示例
MCP 工具规范 https://www.modelcontextprotocol.io MCP 协议标准
TypeScript Handbook https://www.typescriptlang.org/docs/handbook/ TypeScript 开发参考

本章小结

恭喜!你已经完成了 OpenClaw 教程的全部内容。回到 📑 目录 查看其他章节,或开始构建你自己的自动化方案吧!


[← 上一章:多模态与媒体处理](/openclaw-tutorial/24-%E5%A4%9A%E6%A8%A1%E6%80%81%E4%B8%8E%E5%AA%92%E4%BD%93%E5%A4%84%E7%90%86.html) · [📑 返回目录](/openclaw-tutorial/) · 🎉 全书完