Decentralization? We're still early!

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

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

    發布人 Brave 2026-05-31 13:23

    为什么要做这件事

    用 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 手里拿出来,放到了基础设施层面。

    Brave 回复 2 weeks ago 1 成員 · 0 回复
  • 0 回复

歡迎留言回复交流。

Log in to reply.

讨论開始
00 回复 2018 年 6 月
現在