乐于分享
好东西不私藏

我把 OpenClaw 接进了 Obsidian,可以沉浸式写文章了

我把 OpenClaw 接进了 Obsidian,可以沉浸式写文章了

摘要

我的笔记、日记和项目文档几乎都在 Obsidian 里,日常任务又经常交给 OpenClaw 处理。问题是,这两个工具之间一直隔着一道墙:在 Obsidian 里选中文本,复制到 OpenClaw,等回复,再复制回笔记。

这个动作偶尔做一次没什么,但一天重复几十次,就会把写作和整理思路的节奏打碎。于是我做了一个 Obsidian 插件,把 OpenClaw 直接接进笔记里:选中文本、发给 OpenClaw、实时看回复、自动插回当前笔记。

起因

我在 Obsidian 中写技术文档、整理会议纪要、翻译内容时,经常需要 AI 辅助。原来的流程是:

  1. 在 Obsidian 中选中一段文本
  2. 复制到 OpenClaw
  3. 等待回复
  4. 再复制回 Obsidian

流程本身不复杂,但上下文切换太频繁。真正影响效率的不是复制粘贴,而是每次都要从笔记状态切出去,再重新找回刚才的写作位置。

OpenClaw 本身提供了 Gateway 服务,默认地址是 ws://127.0.0.1:18789,支持 WebSocket 连接。这给了我一个很直接的思路:写一个 Obsidian 插件,通过 WebSocket 连接本地 OpenClaw Gateway,让 AI 回复直接回到当前笔记。

插件做了什么

插件叫 OpenClaw Command,核心功能很简单:

  • 选中即发送:在笔记中选中一段文本,通过命令面板一键发送给 OpenClaw,回复生成完后自动插入到选中文本的下一行,并自动选中新插入的内容。
  • 弹框提问:不选中文本也可以直接输入指令,适合让 OpenClaw 沿用当前笔记的独立会话继续写、总结或改写。
  • 流式预览:不用等全部生成完,弹框里会实时显示 OpenClaw 的输出。
  • 会话隔离:每篇笔记都有独立的会话上下文,不同笔记之间的对话互不干扰。
  • 文件链接:插件会自动注入 Obsidian 环境提示,让 AI 尽量用 [名称](file:///绝对路径) 格式返回文件路径,方便在 Obsidian 中点击跳转。

实现思路

连接 OpenClaw

OpenClaw Gateway 默认运行在本地 ws://127.0.0.1:18789。插件启动一个 Node.js 子进程运行 ws-runner.js,由它负责:

  1. 通过 WebSocket 连接 Gateway
  2. 读取 ~/.openclaw/ 下的 token 和设备密钥,完成认证
  3. 发送用户消息
  4. 接收流式回复,并通过 stdout 输出 JSON 事件

为什么要用子进程,而不是直接在 Obsidian 里连 WebSocket?

Obsidian 的 Electron 环境自带 Node.js,但版本和运行环境并不总是符合预期。最初我尝试直接在 Obsidian 里处理连接,遇到过启动崩溃和 WebSocket 不可用的问题。最终方案是让插件启动一个独立 runner,并使用 ws npm 包作为 WebSocket 客户端。

ws 是纯 JavaScript 的 WebSocket 客户端,兼容性更稳。这里不直接分发完整的 node_modules,而是让安装 skill 在用户自己的 Obsidian 插件目录里执行 npm install --omit=dev。这样 ws 会按用户当前平台安装,避免跨平台复制 node_modules 带来的差异。

运行时插件会优先检测系统 Node.js;如果找不到,就回退到 Obsidian 的 Electron,并通过 ELECTRON_RUN_AS_NODE=1 运行。

流式输出

ws-runner.js 收到 OpenClaw 的事件后,会逐行向 stdout 输出 JSON。认证、启动生成这类状态消息用 status,真正的模型输出用 progress,最终结果用 final

{"type":"status","text":"等待认证..."}{"type":"status","text":"OpenClaw 已开始生成..."}{"type":"progress","text":"你好"}{"type":"progress","text":"你好!有什么"}{"type":"progress","text":"你好!有什么可以帮你的吗?"}{"type":"final","text":"你好!有什么可以帮你的吗?"}

插件主进程监听子进程 stdout,解析每个 JSON 事件,并实时更新弹框内容。status 只作为临时提示显示,不参与正文累加;progress 才会按流式内容追加。

这里有一个小细节:模型输出不是每次清空后重写,而是用 appendChild(document.createTextNode(delta)) 只追加新增文本。这样流式输出不会闪烁,也不会因为频繁重绘造成卡顿。为了降低渲染压力,我还加了 60ms 的节流。

生成完成后,如果是选中文本发送,最终结果会插入到选中文本下一行;如果是弹框提问,结果会插入到当前光标位置。插入后插件会自动选中新生成的内容,方便继续复制、移动或二次处理。

注入环境提示

为了让 OpenClaw 知道自己是在 Obsidian 中被调用,插件每次发送消息时都会自动加上一段系统提示:

当前环境为 Obsidian 笔记应用。 如果需要引用文件路径,请使用 [名称](file:///绝对路径) 格式。

这样 AI 返回的文件链接在 Obsidian 里可以直接点击跳转,尤其适合整理项目文档、代码说明和本地资料索引。

安装和使用

安装

可以在openclaw中输入下面语句安装

https://github.com/dbfu/obsidian-openclaw-plugin 根据这个代码仓库里的说明,安装obsidian插件

插件安装成功后,可能需要在obsidian第三方插件中手动启用插件。

使用

安装完成后,在 Obsidian 命令面板(Cmd+P)搜索 OpenClaw,可以看到三个命令:

  • 发送选中文本到 OpenClaw:选中文本后执行,回复会实时预览,并在完成后插入到选中文本下一行,插入内容会自动保持选中。
  • 向 OpenClaw 提问:打开弹框,输入指令后回车发送,适合总结、改写、续写或直接提问。
  • 清除当前笔记的 OpenClaw 上下文:重置当前笔记的会话历史,防止上下文过长,大模型出现幻觉。

也可以点击左侧栏的机器人图标打开提问弹框。建议给常用命令绑定快捷键。

实际使用场景

翻译:选中一段英文,执行命令,翻译结果直接出现在笔记里。

总结会议纪要:把会议记录粘贴到笔记中,选中全部内容,让 OpenClaw 提炼要点和待办事项。

代码解释:选中一段代码片段,让 AI 逐行解释,解释结果保留在同一篇笔记中。

写作辅助:写了一段话觉得不满意,选中后让 OpenClaw 帮忙润色。因为每篇笔记都有独立上下文,所以不同主题之间不会互相串台。

搜索资料:可以让ai从网上搜索最新信息,插入到文章中。

总结

这个插件的实现并不复杂,本质上就是一个 WebSocket runner 加上 Obsidian 编辑器 API。但它解决了一个真实的工作流问题:让 AI 辅助进入笔记现场,而不是停留在另一个需要来回切换的窗口里。

如果你也同时使用 Obsidian 和 OpenClaw,这个插件值得试试。它不会改变你写笔记的方式,只是把原来那些反复复制、切换、等待、粘贴的动作省掉了。