跳转至

OpenClaw 集成

概述

OpenClaw 插件为运行在 OpenClaw 网关上的智能体提供 claude-mem 持久记忆。它处理三件事:

  1. 观察记录 —— 从 OpenClaw 的内嵌 runner 捕获工具使用情况,并将其发送到 claude-mem worker 进行 AI 处理
  2. 系统提示词上下文注入 —— 通过 before_prompt_build hook 将观察时间线注入每个智能体的系统提示词,使 MEMORY.md 保持由智能体自主管理
  3. 观察动态流 —— 通过 SSE 将新的观察记录实时流式传输到消息通道(Telegram、Discord、Slack 等)

Info

OpenClaw 的内嵌 runner(pi-embedded)直接调用 Anthropic API,而不会生成 claude 进程,因此 claude-mem 的标准 hook 永远不会触发。该插件利用 OpenClaw 的事件系统捕获相同数据,从而弥合这一差距。

工作原理

OpenClaw Gateway
  │
  ├── before_agent_start ───→ Init session
  ├── before_prompt_build ──→ Inject context into system prompt
  ├── after_tool_call ──────→ Record observation
  ├── agent_end ────────────→ Summarize + Complete session
  └── gateway_start ────────→ Reset session tracking + context cache
                    │
                    ▼
         Claude-Mem Worker (localhost:37777)
           ├── POST /api/sessions/init
           ├── POST /api/sessions/observations
           ├── POST /api/sessions/summarize
           ├── POST /api/sessions/complete
           ├── GET  /api/context/inject ──→ System prompt context
           └── GET  /stream ─────────────→ SSE → Messaging channels

事件生命周期

1. 智能体启动(before_agent_start)

当 OpenClaw 智能体启动时,插件通过将用户提示词发送到 POST /api/sessions/init 来初始化会话,以便 worker 创建新会话并开始处理。

2. 注入上下文(before_prompt_build)

在每次 LLM 调用之前,插件会从 worker 的 /api/context/inject 端点获取观察时间线,并将其作为 appendSystemContext 返回。这会将会话间上下文直接注入智能体的系统提示词,而无需写入任何文件。

上下文会缓存 60 秒,以避免在会话内的每次 LLM 交互时重复获取。

3. 记录工具使用(after_tool_call)

每当智能体使用工具(Read、Write、Bash 等)时,插件都会将观察记录连同工具名称、输入和截断后的响应(最多 1000 个字符)发送到 POST /api/sessions/observations。如果调用失败,响应会以错误文本开头。这是即发即忘(fire-and-forget)调用——不会阻塞智能体继续工作。

前缀为 memory_ 的工具会被跳过,以避免递归记录。

4. 智能体完成(agent_end)

当智能体完成时,插件提取最后一条 assistant 消息并发送到 POST /api/sessions/summarize,然后调用 POST /api/sessions/complete 关闭会话。两者都是即发即忘(fire-and-forget)调用。

5. 网关重启(gateway_start)

清除所有会话跟踪信息(会话 ID、上下文缓存),以便网关重启后智能体获得全新状态。

系统提示词上下文注入

该插件通过 OpenClaw 的 before_prompt_build hook 将跨会话的观察上下文注入每个智能体的系统提示词。内容来自 worker 的 GET /api/context/inject?projects=<project> 端点,它会从 SQLite 数据库生成格式化的 markdown 时间线。

这种方案让 MEMORY.md 继续由智能体控制,用于整理长期记忆(决策、偏好、持久事实),而观察时间线则通过系统提示词传达,这正是它应属的位置。

Info

上下文按项目缓存 60 秒,以避免每次 LLM 交互时重复获取。缓存会在网关重启时清除。使用 syncMemoryFileExclude 可让特定智能体完全退出上下文注入。

观察动态流(SSE → 消息通道)

该插件会运行一个后台服务,连接到 worker 的 SSE 流(GET /stream),并将 new_observation 事件转发到已配置的消息通道。这样你就可以通过 Telegram、Discord、Slack 或任何受支持的 OpenClaw 通道实时监控智能体正在学习的内容。

SSE 连接使用指数退避(1 秒 → 30 秒)实现自动重连。

设置观察动态流

每当 claude-mem 创建一条新的观察记录时,观察动态流都会向你的 OpenClaw 通道发送一条格式化消息。每条消息都包含观察标题和副标题,这样你就可以在智能体工作时实时跟进。

你的通道中的消息如下所示:

🧠 Claude-Mem Observation
**Implemented retry logic for API client**
Added exponential backoff with configurable max retries to handle transient failures

步骤 1:选择你的通道

观察动态流适用于你的 OpenClaw 网关已配置的任何通道。你需要两条信息:

  • 通道类型 —— 已在 OpenClaw 注册的通道插件名称(例如 telegram、discord、slack、signal、whatsapp、line)
  • 目标 ID —— 消息应发送到的聊天 ID、频道 ID 或用户 ID
Telegram

通道类型: telegram

目标 ID: 你的 Telegram 聊天 ID(数字)。查找方法: 1. 在 Telegram 上向 @userinfobot 发送消息 2. 它会回复你的聊天 ID(例如 123456789) 3. 对于群聊,ID 为负数(例如 -1001234567890)

"observationFeed": {
  "enabled": true,
  "channel": "telegram",
  "to": "123456789"
}
Discord

通道类型: discord

目标 ID: Discord 频道 ID。查找方法: 1. 在 Discord 中启用开发者模式(设置 → 高级 → 开发者模式) 2. 右键点击频道 → 复制频道 ID

"observationFeed": {
  "enabled": true,
  "channel": "discord",
  "to": "1234567890123456789"
}
Slack

通道类型: slack

目标 ID: Slack 频道 ID(不是频道名称)。查找方法: 1. 在 Slack 中打开该频道 2. 点击顶部的频道名称 3. 滚动到频道详情底部——ID 类似于 C01ABC2DEFG

```json
"observationFeed": {
  "enabled": true,
  "channel": "slack",
  "to": "C01ABC2DEFG"
}
```
Signal

频道类型: signal

目标 ID: 在 OpenClaw 网关中配置的 Signal 电话号码或群组 ID。

"observationFeed": {
  "enabled": true,
  "channel": "signal",
  "to": "+1234567890"
}
WhatsApp

频道类型: whatsapp

目标 ID: 在 OpenClaw 网关中配置的 WhatsApp 电话号码或群组 JID。

"observationFeed": {
  "enabled": true,
  "channel": "whatsapp",
  "to": "+1234567890"
}
LINE

频道类型: line

目标 ID: 来自 LINE Developer Console 的 LINE 用户 ID 或群组 ID。

"observationFeed": {
  "enabled": true,
  "channel": "line",
  "to": "U1234567890abcdef"
}

第 2 步:将配置添加到你的网关

将 observationFeed 配置块添加到你的 OpenClaw 网关配置中的 claude-mem 插件配置里:

{
  "plugins": {
    "claude-mem": {
      "enabled": true,
      "config": {
        "project": "my-project",
        "observationFeed": {
          "enabled": true,
          "channel": "telegram",
          "to": "123456789"
        }
      }
    }
  }
}

Warning

channel 的值必须与已在你的 OpenClaw 网关中配置并运行的频道插件匹配。如果该频道未注册,你将在日志中看到 Unknown channel type: <channel>。

第 3 步:验证连接

启动网关后,检查信息推送是否已连接:

  1. 检查日志——你应该会看到:

    [claude-mem] Observation feed starting — channel: telegram, target: 123456789
    [claude-mem] Connecting to SSE stream at http://localhost:37777/stream
    [claude-mem] Connected to SSE stream
    

  2. 使用状态命令——在任何 OpenClaw 聊天中运行 /claude_mem_feed,查看:

    Claude-Mem Observation Feed
    Enabled: yes
    Channel: telegram
    Target: 123456789
    Connection: connected
    

  3. 触发测试——让一个智能体执行一些操作。当 worker 服务将工具使用记录处理为一条观察记录后,你会在配置的频道中收到一条消息。

Info

该信息推送只发送 new_observation 事件,而不是原始的工具使用记录。观察记录由 worker 服务中的 AI 智能体异步生成,因此工具使用与观察记录消息出现在你的频道之间会有 1-2 秒的延迟。

排查信息推送问题

症状 原因 解决方法
Connection: disconnected worker 服务未运行或端口错误 检查 workerPort 配置,运行 npm run worker:status
Connection: reconnecting worker 服务曾在运行,但连接已断开 插件会以退避方式自动重连——最多等待 30 秒
日志中的 Unknown channel type 网关未加载频道插件 确认你的 OpenClaw 网关已配置相应的频道插件
没有消息出现 信息推送已连接,但未创建任何观察记录 检查智能体是否在运行,以及 worker 服务是否正在处理观察记录
日志中的 Observation feed disabled enabled 为 false 或缺失 将 observationFeed.enabled 设置为 true
日志中的 Observation feed misconfigured 缺少 channel 或 to channel 和 to 都是必填项

安装

运行下面这一行命令即可自动安装所有内容:

curl -fsSL https://install.cmem.ai/openclaw.sh | bash

该安装程序会处理依赖检查(Bun、uv)、插件安装、记忆槽位配置、AI 提供商设置、worker 服务启动,以及可选的信息推送配置。

你也可以预先选择选项:

# With a specific AI provider
curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --provider=gemini --api-key=YOUR_KEY

# Fully unattended (defaults to Claude Max Plan)
curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --non-interactive

# Upgrade existing installation
curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --upgrade

手动配置

将 claude-mem 添加到你的 OpenClaw 网关的插件配置中:

{
  "plugins": {
    "claude-mem": {
      "enabled": true,
      "config": {
        "project": "my-project",
        "syncMemoryFile": true,
        "workerPort": 37777,
        "observationFeed": {
          "enabled": true,
          "channel": "telegram",
          "to": "your-chat-id"
        }
      }
    }
  }
}

Note

claude-mem Worker Service 必须与 OpenClaw 网关运行在同一台机器上。该插件通过 HTTP 在 localhost:37777 上与它通信。

配置

project string (body) 默认值:openclaw
用于在记忆数据库中将观察记录按项目划分的项目名称。来自此网关的所有观察记录都将存储在该项目名称下。
syncMemoryFile boolean (body)
通过 before_prompt_build hook 将观察上下文注入到智能体的系统提示词中。当为 true 时,智能体会自动获得跨会话上下文。设置为 false 可完全禁用上下文注入(观察记录仍会被保存)。
syncMemoryFileExclude string[] (body) 默认值:[]
被排除在自动上下文注入之外的智能体 ID。适用于自行管理记忆且不需要观察时间线的智能体(例如 ["snarf", "debugger"])。被排除的智能体仍会记录观察记录——只是跳过上下文注入。
workerPort number (body) 默认值:37777
claude-mem Worker Service 的端口。如果你的 worker 运行在非默认端口上,请覆盖此设置。
observationFeed.enabled boolean (body) 默认值:false
启用向消息频道实时推送观察记录。
observationFeed.channel string(body)
频道类型:telegram, discord, signal, slack, whatsapp, line
observationFeed.to string(body)
要将观察反馈发送到的目标聊天/用户/频道 ID。

命令

/claude_mem_feed

显示或切换观察反馈状态。

/claude_mem_feed        # 显示当前状态
/claude_mem_feed on     # 请求启用
/claude_mem_feed off    # 请求禁用

/claude_mem_status

检查 worker 健康状态和会话状态。

/claude_mem_status

返回 worker 状态、端口、活动会话数以及观察反馈连接状态。

架构

该插件通过 HTTP 调用已运行的 claude-mem worker 服务,而不是生成子进程。这意味着:

  • 网关无需 bun 依赖
  • 每个事件没有进程生成开销
  • 使用与 Claude Code 钩子相同的 worker API
  • 所有操作均为非阻塞(尽可能即发即弃)

会话跟踪

每个 OpenClaw agent 会话都会获得一个唯一的 contentSessionId(格式:openclaw-<sessionKey>-<timestamp>),它映射到 worker 中的 claude-mem 会话。该插件跟踪:

  • sessionIds — 将 OpenClaw 会话键映射到内容会话 ID
  • contextCache — 用于上下文注入响应的 TTL 缓存(60 秒),按项目作为键

两者均在 gateway_start 时清除。

要求

  • 在 localhost:37777(或配置的端口)上运行的 Claude-mem worker 服务
  • 支持插件的 OpenClaw 网关
  • 网关与 worker 之间的网络访问(仅限 localhost)

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/claude-mem