OpenClaw 集成
概述¶
OpenClaw 插件为运行在 OpenClaw 网关上的智能体提供 claude-mem 持久记忆。它处理三件事:
- 观察记录 —— 从 OpenClaw 的内嵌 runner 捕获工具使用情况,并将其发送到 claude-mem worker 进行 AI 处理
- 系统提示词上下文注入 —— 通过
before_prompt_buildhook 将观察时间线注入每个智能体的系统提示词,使MEMORY.md保持由智能体自主管理 - 观察动态流 —— 通过 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)
Discord
通道类型: discord
目标 ID: Discord 频道 ID。查找方法: 1. 在 Discord 中启用开发者模式(设置 → 高级 → 开发者模式) 2. 右键点击频道 → 复制频道 ID
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。
频道类型: whatsapp
目标 ID: 在 OpenClaw 网关中配置的 WhatsApp 电话号码或群组 JID。
LINE
频道类型: line
目标 ID: 来自 LINE Developer Console 的 LINE 用户 ID 或群组 ID。
第 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 步:验证连接¶
启动网关后,检查信息推送是否已连接:
-
检查日志——你应该会看到:
-
使用状态命令——在任何 OpenClaw 聊天中运行
/claude_mem_feed,查看: -
触发测试——让一个智能体执行一些操作。当 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 都是必填项 |
安装¶
运行下面这一行命令即可自动安装所有内容:
该安装程序会处理依赖检查(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 上与它通信。
配置¶
projectstring (body) 默认值:openclaw- 用于在记忆数据库中将观察记录按项目划分的项目名称。来自此网关的所有观察记录都将存储在该项目名称下。
syncMemoryFileboolean (body)- 通过
before_prompt_buildhook 将观察上下文注入到智能体的系统提示词中。当为true时,智能体会自动获得跨会话上下文。设置为false可完全禁用上下文注入(观察记录仍会被保存)。 syncMemoryFileExcludestring[] (body) 默认值:[]- 被排除在自动上下文注入之外的智能体 ID。适用于自行管理记忆且不需要观察时间线的智能体(例如
["snarf", "debugger"])。被排除的智能体仍会记录观察记录——只是跳过上下文注入。 workerPortnumber (body) 默认值:37777- claude-mem Worker Service 的端口。如果你的 worker 运行在非默认端口上,请覆盖此设置。
observationFeed.enabledboolean (body) 默认值:false- 启用向消息频道实时推送观察记录。
observationFeed.channelstring(body)- 频道类型:
telegram,discord,signal,slack,whatsapp,line observationFeed.tostring(body)- 要将观察反馈发送到的目标聊天/用户/频道 ID。
命令¶
/claude_mem_feed¶
显示或切换观察反馈状态。
/claude_mem_status¶
检查 worker 健康状态和会话状态。
返回 worker 状态、端口、活动会话数以及观察反馈连接状态。
架构¶
该插件通过 HTTP 调用已运行的 claude-mem worker 服务,而不是生成子进程。这意味着:
- 网关无需
bun依赖 - 每个事件没有进程生成开销
- 使用与 Claude Code 钩子相同的 worker API
- 所有操作均为非阻塞(尽可能即发即弃)
会话跟踪¶
每个 OpenClaw agent 会话都会获得一个唯一的 contentSessionId(格式:openclaw-<sessionKey>-<timestamp>),它映射到 worker 中的 claude-mem 会话。该插件跟踪:
sessionIds— 将 OpenClaw 会话键映射到内容会话 IDcontextCache— 用于上下文注入响应的 TTL 缓存(60 秒),按项目作为键
两者均在 gateway_start 时清除。
要求¶
- 在
localhost:37777(或配置的端口)上运行的 Claude-mem worker 服务 - 支持插件的 OpenClaw 网关
- 网关与 worker 之间的网络访问(仅限 localhost)
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/claude-mem