为什么需要这个 链接到标题

AI Agent 经常需要执行耗时较长的异步任务(视频剪辑、字幕生成、模型推理等)。任务完成后,如何通知用户?

有三种常见实现方式:

方式 过程 优点 缺点
同步等待 发起任务 → 一直等到完成 → 返回结果 实现简单 长时间阻塞,用户体验差
异步轮询 发起任务 → 拿到 job_id → 不断查询 → 完成 不阻塞 对话不能断开,浪费 token
异步+通知 发起任务 → 返回"已提交" → 完成后主动推送 体验最好,资源最优 需要服务端支持回调

OpenClaw 的独特优势在于它拥有 Webhook/Hook 机制,可以作为服务端接收外部回调,主动推送消息到飞书。

对比其他 AI 工具:

  • OpenCode / Claude Code:纯 CLI 工具,只有"触发→等待→返回"的模式,没有回调机制
  • OpenClaw:内置 Gateway 服务,支持 /hooks/* 端点,天然适合异步回调

所以 “异步+通知” 是 OpenClaw 的场景的最优解。

整体架构 链接到标题

sequenceDiagram participant U as 用户(飞书) participant O as OpenClaw Agent participant W as Windmill / 外部系统 participant H as OpenClaw Hook U->>O: 发消息处理这个视频 O->>W: API 调用(异步) O-->>U: 任务已提交 Note over W: 几分钟后... W-->>H: POST /hooks/agent H->>H: 创建 Agent Turn H->>U: 飞书消息(带下载链接)

Agent Turn 与 Wake 链接到标题

OpenClaw 提供了两种代码触发的消息通知方式,它们都通过 Gateway 的 /hooks/* 端点实现。

Agent Turn(action: “agent”) 链接到标题

创建一个 隔离的 Agent 执行回合,Agent 可调用工具、执行命令、使用 message 工具发送消息到指定的飞书用户。

sequenceDiagram participant E as 外部系统 participant G as OpenClaw Gateway participant A as Agent Turn participant F as 飞书 E->>G: POST /hooks/agent { message, channel, to } G-->>E: { ok: true, runId } G->>A: 创建隔离 Agent 回合 Note over A: Agent 收到原始数据,可做格式化处理 A->>A: LLM 分析数据、格式化消息 A->>F: message tool → 飞书 Note over F: 用户收到消息(不保存在会话历史中)

Wake(action: “wake”) 链接到标题

主会话 注入一条系统事件,Agent 在主会话中处理这条消息并回复。

sequenceDiagram participant E as 外部系统 participant G as OpenClaw Gateway participant S as 主会话 participant F as 飞书 E->>G: POST /hooks/wake { text, mode } G-->>E: { ok: true, mode } G->>S: 向主会话注入系统事件 Note over S: Agent 在主会话中处理事件 S->>F: 回复到主会话对话 Note over F: 消息保存在主会话历史中

对比 链接到标题

维度 Agent Turn Wake
创建方式 POST /hooks/agent POST /hooks/wake
执行环境 隔离的 Agent 回合 主会话
目标用户 可指定任意飞书用户 仅主会话
消息存储 不入会话历史 保存在会话历史中
消息再处理 ✅ Agent 可理解、格式化、增强数据 ❌ 原样转交
权限要求 基础 Hook 配置即可 需要额外配置 session key

Agent Turn 适用场景

  • 需要将消息推送到特定用户(不是主会话的发起者)
  • 需要对原始数据进行格式化/增强(如生成预签名 URL、计算耗时、加 emoji)
  • 通知和主会话解耦,适合独立通知

Wake 适用场景

  • 消息需要保留在用户会话历史
  • 简单的系统提醒
  • 通知触发后用户可以在同一对话中继续追问

前置条件 链接到标题

基础配置 链接到标题

~/.openclaw/openclaw.json 中:

{
  "hooks": {
    "enabled": true,
    "token": "whk_oClAw_xxxxxxxxxxxx",
    "path": "/hooks"
  }
}

Wake 额外配置 链接到标题

Wake 要指定目标会话,需要额外开启两个配置:

{
  "hooks": {
    "allowRequestSessionKey": true,
    "allowedSessionKeyPrefixes": ["feishu:", "hook:"]
  }
}

curl 代码示例 链接到标题

Agent Turn——发送消息到指定用户 链接到标题

# 基础路径
HOOK_URL="http://YOUR_HOST:18789/hooks/agent"
HOOK_TOKEN="your_hook_token"

curl -X POST "$HOOK_URL" \
  -H "Authorization: Bearer $HOOK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "message": "🎬 视频处理完成!\n\n📥 [点击下载](https://STORAGE_SERVER/...)\n\n⏱ 有效期:7天",
    "name": "视频处理通知",
    "channel": "feishu",
    "to": "feishu:user:ou_xxxxxxx"
  }'

Agent Turn——触发后让 Agent 自行格式化 链接到标题

curl -X POST "$HOOK_URL" \
  -H "Authorization: Bearer $HOOK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "message": "视频流水线已结束。\n状态: success\n耗时: 323秒\nS3路径: BUCKET_NAME/.../output.mp4\n\n请格式化这条消息,生成预签名下载链接,发给 feishu:user:ou_xxxxxxx",
    "name": "视频处理通知"
  }'

Wake——发送到主会话 链接到标题

WAKE_URL="http://YOUR_HOST:18789/hooks/wake"

curl -X POST "$WAKE_URL" \
  -H "Authorization: Bearer $HOOK_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "🔔 视频处理完成,请查看结果",
    "mode": "now"
  }'

参数说明 链接到标题

Hook Token 链接到标题

~/.openclaw/openclaw.json 中的 hooks.token 字段获取。这是外部系统调用 Hook 端口的认证凭证,通过 Authorization: Bearer 头传递。

feishu_target(Agent Turn) 链接到标题

飞书消息的目标地址,格式为:

场景 格式
单聊 feishu:user:ou_xxxxxxx
群聊 feishu:chat:oc_xxxxxxx

这个值从 Agent 的聊天上下文中获取,或者通过飞书开放平台查询。Windmill 等外部系统回调时需要原样透传。

Session Key(Wake) 链接到标题

Wake 方式的会话标识,格式通常为 feishu:ou_xxxxxxx(对应飞书用户 ID)。需要在 openclaw.json 中开启 allowRequestSessionKey: true 才允许外部传入。

实际案例:视频处理流水线 链接到标题

完整的异步视频处理流程:

flowchart TD A["用户发消息:将 xxx/video.mov 生成带字幕视频"] B["Agent:提取 S3 key,调用 Windmill API"] C["Agent:回复‘已提交任务’"] D["Windmill 处理视频(几分钟)"] E["Windmill 完成 → POST /hooks/agent"] F["Agent Turn:生成预签名 URL"] G["Agent 格式化消息"] H["飞书推送通知到用户"] I["用户:点击下载"] A --> B B --> C C --> D D --> E E --> F F --> G G --> H H --> I style C fill:#e1f5fe style H fill:#e8f5e9 style I fill:#fff3e0

这种模式用户无需等待,处理完成会自动收到飞书通知。

总结 链接到标题

  • OpenClaw 的 Hook 机制使其成为唯一能实现 “异步触发+主动通知” 的 AI Agent 工具
  • Agent Turn 适合定向通知、消息再处理,用途更广
  • Wake 适合回到主会话的简单提醒
  • 选择哪种方式取决于是否需要指定目标用户消息是否要入会话历史