OpenClaw 插件接入
通过 duMemory OpenClaw 插件(@baidu/openclaw-memory)接入记忆服务,可在 OpenClaw 对话中自动 retain/recall 长期记忆。插件以 Cloud-only 方式运行,不会替换 OpenClaw 本地会话存储,仅额外将对话写入 duMemory Cloud,并在新对话开始前自动召回相关记忆。
连接信息
| 信息 | 值 |
|---|---|
| API Base URL | https://cloud.memory.bj.baidubce.com/api |
| API Key | 在控制台"API Key"页签中创建。在 OpenClaw 插件中作为 DUMEMORY_API_TOKEN 环境变量引用 |
| Bank ID | 在控制台创建记忆库时设定 |
| 插件下载地址 | https://cloud-memory.bj.bcebos.com/baidu-openclaw-memory-0.8.1.tgz |
API Base URL 已包含
/api,不要再额外拼接。以下示例中<API_BASE_URL>替换为上述实际地址。
前提条件
- Node.js
>=22 - npm
- 已安装并可运行
openclaw - 已创建记忆库,获取 API Base URL、API Key 和 Bank ID
安装流程
1. 下载插件
1curl -fsSL -o baidu-openclaw-memory-0.8.1.tgz \
2 https://cloud-memory.bj.bcebos.com/baidu-openclaw-memory-0.8.1.tgz
或直接访问 baidu-openclaw-memory-0.8.1.tgz 下载。
2. 安装插件
1openclaw plugins install ./baidu-openclaw-memory-0.8.1.tgz
3. 配置参数
推荐使用环境变量保存 Token:
1# 方式一:交互式配置向导(推荐)
2node ~/.openclaw/extensions/dumemory-openclaw/dist/setup.js
3
4# 方式二:非交互式,通过环境变量引用 token(适合 CI/生产)
5node ~/.openclaw/extensions/dumemory-openclaw/dist/setup.js \
6 --mode cloud \
7 --token-env DUMEMORY_API_TOKEN
推荐固定 Bank ID:所有会话写入同一个 memory bank。
1openclaw config set plugins.entries.dumemory-openclaw.config.dynamicBankId false --strict-json
2openclaw config set plugins.entries.dumemory-openclaw.config.bankId "<your-bank-id>"
4. 验证安装并重启
1openclaw plugins inspect dumemory-openclaw
2openclaw config validate
3openclaw plugins doctor
4openclaw gateway restart
插件默认行为:
- 对话结束后自动 retain 记忆
- 新对话开始前自动 recall 相关记忆
- 按 bankId 隔离 memory bank
常用配置
配置路径:plugins.entries.dumemory-openclaw.config
连接配置
| 字段 | 说明 | 默认值 |
|---|---|---|
duMemoryApiUrl |
duMemory Cloud API 地址 | https://cloud.memory.bj.baidubce.com/api |
duMemoryApiToken |
即控制台创建的 API Key,推荐通过 SecretRef 引用环境变量 DUMEMORY_API_TOKEN |
— |
记忆库(Bank)配置
| 字段 | 说明 | 默认值 |
|---|---|---|
dynamicBankId |
是否启用动态记忆库,按上下文自动派生 bank ID | true |
bankId |
dynamicBankId: false 时使用的静态 bank ID |
— |
bankIdPrefix |
bank ID 前缀(如 prod → prod-agent::channel::user),适合区分环境 |
— |
dynamicBankGranularity |
派生 bank ID 所用的字段,可选:agent、channel、user、provider |
["agent", "channel", "user"] |
bankMission |
首次使用时写入 bank 的 reflect_mission,仅影响 reflect 操作 |
内置默认文本 |
retainMission |
首次使用时写入 bank 的 retain_mission,引导事实提取方向 |
— |
observationsMission |
首次使用时写入 bank 的 observations_mission,引导观察合并方向 |
— |
存储(Retain)配置
| 字段 | 说明 | 默认值 |
|---|---|---|
autoRetain |
每轮对话结束后是否自动存储 | true |
retainRoles |
存储哪些角色的消息 | ["user", "assistant"] |
retainFormat |
存储格式:json(结构化数组)或 text(旧版标记格式) |
"json" |
retainToolCalls |
json 格式时是否包含工具调用内容 |
true |
retainEveryNTurns |
每 N 轮存储一次(>1 时启用滑动窗口分块存储) | 1 |
retainOverlapTurns |
分块存储时额外包含的前几轮,窗口 = retainEveryNTurns + retainOverlapTurns |
0 |
retainTags |
所有存储文档附加的标签,也支持消息内联 <retain_tags> 指令 |
[] |
retainSource |
存储文档元数据中的 source 字段 |
"openclaw" |
retainDocumentScope |
文档 ID 粒度:session(整个会话一个文档)或 turn(每次存储一个文档) |
"session" |
召回(Recall)配置
| 字段 | 说明 | 默认值 |
|---|---|---|
autoRecall |
每次提示前是否自动召回记忆 | true |
recallBudget |
召回力度:low、mid、high |
"mid" |
recallMaxTokens |
召回结果最大 token 数 | 1024 |
recallTypes |
召回的记忆类型:world、experience、observation |
["observation"] |
recallRoles |
构建召回查询时包含的消息角色 | ["user", "assistant"] |
recallTopK |
每轮最多注入的记忆条数(不设则不限) | — |
recallContextTurns |
构建召回查询时包含的历史轮数 | 1 |
recallMaxQueryChars |
召回查询的最大字符数 | 800 |
recallPromptPreamble |
注入记忆块前的提示语 | 内置默认文本 |
recallInjectionPosition |
注入位置:prepend(系统提示头)、append(系统提示尾)、user(用户消息前) |
"prepend" |
recallTimeoutMs |
自动召回超时时间(毫秒) | 10000 |
会话过滤
通过 glob 模式排除定时任务、子 Agent 等会话,控制哪些会话写入或读取记忆。
| 字段 | 说明 | 默认值 |
|---|---|---|
excludeProviders |
跳过指定 Provider 的所有召回和存储 | ["heartbeat"] |
ignoreSessionPatterns |
完全忽略的会话 key glob 模式(不召回、不存储) | [] |
statelessSessionPatterns |
只读会话 glob 模式(永远不存储;skipStatelessSessions: true 时也不召回) |
[] |
skipStatelessSessions |
true 时无状态会话同时跳过召回 |
true |
Glob 语法:
*匹配单段(不含:),**匹配多段(含:)。会话 key 格式:agent:<agentId>:<type>:<uuid>
典型场景:定时任务完全忽略、子 Agent 可读不可写:
1{
2 "ignoreSessionPatterns": ["agent:*:cron:**"],
3 "statelessSessionPatterns": ["agent:*:subagent:**"],
4 "skipStatelessSessions": false
5}
其他配置
| 字段 | 说明 | 默认值 |
|---|---|---|
retainQueuePath |
失败重试队列文件路径 | ~/.openclaw/data/dumemory-retain-queue.jsonl |
retainQueueMaxAgeMs |
队列条目最大存活时间(毫秒,-1 永不过期) | -1 |
retainQueueFlushIntervalMs |
队列刷新间隔(毫秒) | 60000 |
enableKnowledgeTools |
注册 agent_knowledge_* 系列工具,支持 Agent 主动查询记忆 |
false |
logLevel |
日志级别:off、error、warning、info、debug |
"info" |
logSummaryIntervalMs |
日志摘要聚合间隔(毫秒),0 = 每次都打印 | 300000 |
debugPerfTiming |
输出每个钩子的性能耗时日志 | false |
Bank ID 配置示例
单用户或本地 CLI/TUI 使用时,推荐指定 bank ID:
1{
2 "plugins": {
3 "entries": {
4 "dumemory-openclaw": {
5 "enabled": true,
6 "hooks": { "allowConversationAccess": true },
7 "config": {
8 "duMemoryApiUrl": "https://cloud.memory.bj.baidubce.com/api",
9 "duMemoryApiToken": {
10 "source": "env",
11 "provider": "default",
12 "id": "DUMEMORY_API_TOKEN"
13 },
14 "dynamicBankId": false,
15 "bankId": "<your-bank-id>"
16 }
17 }
18 }
19 }
20}
改完后重启 OpenClaw gateway:
1openclaw gateway restart
如果不指定,插件默认会用动态 bank ID,格式类似:
1agent::channel::user
注意:切换到新 bank 后,旧 bank 里的记忆不会自动迁移。需要通过指定旧 bank 的 bank id 以继续使用旧 bank,或把历史数据 backfill 到新 bank。
历史数据回填
插件提供历史 OpenClaw 会话导入命令(dumemory-openclaw-backfill),默认继承当前插件的 bank 路由配置。
先 dry-run 确认计划:
1node ~/.openclaw/extensions/dumemory-openclaw/dist/backfill.js --dry-run --limit 20
确认后执行:
1node ~/.openclaw/extensions/dumemory-openclaw/dist/backfill.js --wait-until-drained --max-pending-operations 0
常用参数:
| 参数 | 说明 |
|---|---|
--agent <id> |
只导入指定 Agent 的历史(可重复) |
--exclude-archive |
跳过迁移备份归档目录 |
--bank-strategy <mode> |
mirror-config(跟随插件配置)、agent(按 Agent 建 bank)、fixed(固定 bank) |
--resume |
跳过断点文件中已完成的条目 |
--checkpoint <path> |
自定义断点文件路径 |
--wait-until-drained |
阻塞等待所有队列处理完毕后再退出 |
--dry-run |
只打印导入计划,不实际执行 |
--limit <n> |
最多导入 N 个会话 |
--api-token <token> |
临时指定 token(也可通过 $DUMEMORY_API_TOKEN 注入) |
--api-url <url> |
临时指定 API 地址 |
示例:指定 Agent + 断点续传:
1node ~/.openclaw/extensions/dumemory-openclaw/dist/backfill.js \
2 --agent my-agent \
3 --resume \
4 --max-pending-operations 10
卸载
1openclaw plugins uninstall dumemory-openclaw
评价此篇文章
