执着于全量保存OpenClaw的消息不能自拔,于是写了个插件
你有没有想过,OpenClaw是怎么记录你和它的对话消息的呢?
默认情况下,OpenClaw会将每个会话的消息,分别保存在 ~/.openclaw/agents/[agentId]/sessions/ 目录下对应的JSONL文件中:

但养过”虾”的同学多少也知道,如果询问OpenClaw一些比较久远的对话,OpenClaw可能会一问三不知。这是因为OpenClaw会在某些时候自动清理掉一些旧的session文件,比如:超过一定时间周期的、上下文长度不够时触发自动压缩的、手动触发的reset等。
当然,这些默认行为也可以通过修改OpenClaw的配置文件来禁止。不过嘛……还有一个更大的问题是OpenClaw的历史消息查询效率很低。如果你要查询某一天的对话记录,OpenClaw需要逐个扫描这些session文件。查询越久的对话,要扫描的session文件就越多,就非常……非常地低效……
像我这种非常执着于保全所有对话记录的人,当然是不能忍啦(握拳)!在我的完美构想中,Agent的记忆系统应该是分层统一的。无论要怎么加工记忆,最基础的原始数据一定不能丢!我可以接受你的原始消息内容质量差,但不能接受这些一手数据,经常莫名其妙地丢失,或者无法查询。这跟金鱼的七秒钟记忆有什么区别呢?损失太大了呀!
于是,我就写了一个OpenClaw插件:openclaw-raw-message-plugin。
插件的原理其实也很简单,就是利用 OpenClaw 提供的事件钩子,在每条消息写入 session 文件的时候,同时写入到插件的本地SQLite数据库里(数据库文件在 ~/.openclaw/raw-message/source-memory.db)。以及,插件在OpenClaw gateway每次启动时,也会主动扫描所有的session文件,将遗留或遗漏的历史消息回填到数据库里。插件已经做好了消息去重,所以不用担心重复写入的问题。
然后,插件还提供了两个工具给OpenClaw,query_agent_messages 和 query_agent_messages_to_jsonl。这两个工具可以按时间范围查询某个agent的历史对话。查询的时候,插件会直接走SQLite索引,效率非常高。
项目也已经打包发布到npm,安装方式很简单,执行一行命令就可以了:
npx openclaw-raw-message-plugin install
为什么不走OpenClaw标准的plugin安装方式?
嘿嘿,说起这,问就是踩过巨坑了啊……
由于这个插件要使用sqlite数据库,需要依赖
better-sqlite3包。刚好better-sqlite3这个依赖包比较特殊,在安装的时候需要执行安装脚本增加原生模块。OpenClaw为了安全,直接一刀切,禁止插件安装的时候额外执行脚本。这就导致我的插件安转后,缺失关键依赖包,无法正常工作。想来想去,还是参考飞书plugin的最佳实践,直接用npx和安装脚本来定义安装处理了。
插件除了安装,也提供便捷的卸载方法:
# 卸载插件 + 删除数据库npx openclaw-raw-message-plugin uninstall# 卸载插件,保留数据库npx openclaw-raw-message-plugin uninstall --keep-data
以上,
整个插件已经开源,有兴趣的同学可以看看: https://github.com/qinxiandiqi/openclaw-raw-message-plugin
夜雨聆风