🔥 BRAVE 質押池已上線 — 在錢包搜尋 BRAVE 即可委託

如何将 OpenCode 智能体对话自动归档到 Trilium Notes

    • #34050

      为什么要做这件事

      用 OpenCode 编程时,每一次对话都是完整的开发决策记录——我是怎么理解问题的、AI 给出了什么方案、我选择了哪条路、踩了什么坑。这些信息比最终代码更有价值,因为代码只记录结果,对话记录过程。

      但我之前从来没把这些对话保存下来。手动复制太累,OpenCode 本身不提供自动导出。试过让 AI 自己写笔记(MCP 方案),但那意味着 AI 能读我整个笔记库——我不想开这个口子。

      我想要的是:对话自动存到我的私人知识库里,AI 完全不知道这件事。

      我用了哪些东西

      我家里有一台长期开机的服务器,上面跑了:

      • Trilium Notes(Docker 部署)——我的知识库,所有笔记都在里面
      • WordPress——上面跑了一套我陆续写的插件,负责跟 Trilium 通信、处理 AI 聊天内容、跑自动化管线

      我的开发机上装了 OpenCode,日常用它写代码。

      所有服务都跑在内网,不对外开放。这是一个重要的前提——如果你的 WordPress 在公网上,下面的方案需要额外加用户认证。

      最终效果

      每次 OpenCode 对话结束后,Trilium 里自动出现这样一个结构:

      我的笔记库/
        └─ 2026-05-31/
             └─ 重构xx模块的数据库设计 (ses_a1b2c3d4)/
                  ├─ 对话 #1
                  ├─ 对话 #2
                  └─ ...

      每条”对话 #N”就是一次用户提问 + AI 回复的完整记录。如果我在同一个会话里问了三次问题,Trilium 里就是三条笔记,按顺序排列。

      方案拆解

      整个链路分成三段:

      第一段:OpenCode 端的插件

      OpenCode 支持插件机制——在它的插件目录放一个 JS 文件,它启动时自动加载。插件可以监听会话事件。

      我只监听一个事件:session.idle。这是 OpenCode 告诉你”AI 回答完了,用户也停下来了”的信号。

      插件做的事情很简单:

      1. idle 事件来了,从事件的属性里取出会话 ID
      2. 通过 OpenCode SDK 的接口读这个会话的标题和所有消息
      3. 把这些数据用 HTTP POST 发到我的 WordPress 站点
      4. 每次只发新增的消息——插件内部记着上次同步到了第几条消息

      为什么不在会话过程中同步?一开始我试过。OpenCode 在 AI 回复过程中会不停地触发”会话更新”事件,加防抖也没用——AI 输出过程中就会触发一次,输出完成 idle 又来一次,长对话压缩又来一次。一条对话存了三个重复文件夹。改成只监听 idle 之后就好了。

      第二段:WordPress 端的中转

      WordPress 上注册了一个 REST API 接口(POST 到 /trilium/v1/opencode/session)。请求进来后先检查一个后台开关——如果没在后台点启用,直接返回 403。

      开关注册在 WordPress 的设置体系里。你在后台看到的就是一个复选框 + 一个保存按钮。

      验证通过后,数据交给 Trillium 内容保存器去处理。

      没有用户认证。因为我的 WordPress 跑在内网,外面进不来。

      第三段:Trilium 内容保存器

      这部分是我复用已有的对话保存功能——它本来就在 WordPress 插件里,之前用来保存其他 AI 工具的聊天记录。这次给它加了一个专门处理 OpenCode 数据的方法。

      它的处理流程:

      1. 找位置:如果要按日期建子文件夹(我开了这个开关),先看今天文件夹有没有,没有就建一个。如果创建失败(笔记系统的 API 有时返回的不是真实 ID 而是占位字符串),直接回退到根目录继续。
      2. 建会话文件夹:用会话 ID 查之前在 WordPress 里存的一个映射表,看看这个会话是不是已经有了专属文件夹。有就直接用,没有就新建一个并记下来。
      3. 分组:收到的消息按用户角色分组——遇到用户消息就新开一组,后面的 AI 回复、推理过程、工具调用都归到这一组。
      4. 编号:每组生成一条笔记,编号”对话 #1″”对话 #2″这样往后排。同一会话多次同步不会重号。
      5. 格式化:用户消息显示为👤,AI 显示为🤖。文本内容经过 Markdown 渲染,工具调用和工具结果用不同颜色的引用框包起来,结果太长(超过 3000 字符)会自动截断,AI 的推理过程用可折叠区域展示。
      6. 写进 Trilium:调用 Trilium 的 API 创建笔记。之前说的占位符问题——这个 API 在特定情况下返回状态码 201 但被 PHP 的 HTTP 库当错误处理——需要单独处理,从错误数据里把笔记 ID 提取出来。

      需要手动做的事情

      配置分两头:

      WordPress 后台:

      1. 确保”对话保存”已启用并填好了 Trilium 目标文件夹 ID
      2. 在 OpenCode 同步设置页面打开开关

      OpenCode 端:

      1. 把插件文件放进它的插件目录
      2. 在插件文件里填上 WordPress 的端点地址

      不需要配数据库,不需要配 API Key,不需要改 OpenCode 或 WordPress 的核心代码。

      不想做成什么样

      我特意不做的事情:

      不用 MCP。 MCP 能让 AI 在对话中调用工具——你让它”把这段决策过程记到笔记里”,它就去写。但 MCP 通常是双向的,开了读权限就相当于把整个知识库送进 AI 上下文。我不需要这个功能。真有需要时我会手动导出一两个页面拖进对话。

      不在 OpenCode 端配任何 Trilium 信息。 插件只知道 WordPress 地址。文件夹在哪里、怎么命名、要不要按日期分组——全由 WordPress 端的已有设置决定。好处是换了笔记系统只管后端,OpenCode 端不用动;换了 AI 工具重写插件就行,后端不用动。

      不足之处

      1. AI 读不到这些笔记。这是设计意图,但如果未来我想让 AI 翻看历史记录,得加一个只读的查询接口,而且只能暴露特定标记过的笔记。
      2. 仅适用于有插件机制的 AI 工具。Web 版 ChatGPT、Claude 之类没办法。
      3. 会出现少量死数据。每个会话在 WordPress 里留一条文件夹映射和一条轮次计数。聊得多累计起来可能有几百条。后台加了个”清理数据”按钮手动处理。
      4. 多台电脑同时用不冲突但也不合并。每台电脑的会话 ID 不同,各自建立独立的文件夹。不会乱,但也不会自动归到一起。
      5. 这套配置只适用于内网。如果 WordPress 对外暴露,需要在 REST 接口上加认证。

      关于代码

      全部代码约 120 行 JS(OpenCode 端)+ 230 行 PHP(WordPress REST 接口)+ 140 行 PHP 增量(内容保存扩展)。不算多,架构本身也简单——它的价值不在技术难度上,而在于把”自动归档”这件事从 AI agent 手里拿出来,放到了基础设施层面。

  • 抱歉,回覆主題必需先登入。