Current Note AI
unlistedby Zhang Fan
Discuss and safely revise the current Markdown note with external AI providers.
Current Note AI
Current Note AI 是一个桌面端 Obsidian 插件,用 DeepSeek 或 Kimi 分析、讨论并安全修改当前 Markdown 笔记。
当前版本:v0.1.7。最低 Obsidian 版本为 1.13.0,仅支持桌面端。
它的核心原则不是“让模型直接编辑文件”,而是把 AI 修改变成可审阅的本地事务:模型只返回结构化提案;插件在本地验证、展示差异,并且只在用户点击 Apply selected 后写入。
当前能力
- Ribbon 按钮和命令面板打开右侧聊天栏。
- iMessage 风格的用户/AI 对话气泡。
- AI 回复支持安全的 Markdown 排版,包括标题、列表、表格、引用、链接和代码块;原始 HTML 与自动嵌入被禁用。
- 设置页可创建任意多条 DeepSeek/Kimi 账户档案;每条档案有独立的 SecretStorage 引用、模型目录、启用状态与隐私同意。
- 每条 Kimi 档案可明确选择中国区 (
api.moonshot.cn) 或国际区 (api.moonshot.ai);插件不会把同一密钥静默重试到另一区域。 - 所有已启用档案的模型仍在同一个分组下拉框中显示,不增加单独的供应商按钮;Kimi 只接受经该账户
/models验证的kimi-k2.6。 - Discussion、Edit、Continue 与 Edit retry 都绑定到明确的 profile/model;档案被删除、禁用或更改后会阻断旧请求,不会静默改用另一个账户。
- DeepSeek 请求显式使用 non-thinking 模式,温度设置仅适用于 DeepSeek;Kimi 请求非流式、禁用 thinking,并设置 120 秒本地超时。
- 回答达到输出上限时会单独标记为未完成,并提供最多两次、由用户触发的 Continue;警告状态不会写入模型正文。
- 输入框严格使用 Enter 换行、Shift+Enter 发送,并避免中文输入法组词确认时误发。
- 侧栏顶部可直接选择 DeepSeek 或 Kimi 模型,并可在不发送笔记内容的前提下刷新对应供应商的
/models列表。 - 侧栏顶部的 History 按钮按最近更新时间列出会话;首条用户消息会在本地自动生成会话标题。
- 只读取主编辑区当前绑定的 Markdown 源码,包括未保存内容和 frontmatter。
- 不展开 Wiki 链接、嵌入、附件、Dataview 结果或其他笔记。
- 普通 Send 只讨论,永远不写文件。
- Propose changes 请求所选供应商返回版本化 JSON 编辑提案。
- 本地拒绝缺失、重复、重叠、过大、截断、格式错误或声明
needs_segmentation的提案。 - 不完整编辑可由用户发起一次更高 token 预算的完整重试;半截 JSON 永远不会续接或局部应用。
- 逐项查看和勾选修改;Apply 前再次核对 leaf、文件身份、路径和全文快照。
- 只在文档仍等于 AI 修改后的版本时允许 Revert AI edit。
- 最近 50 个会话保存在插件本地数据中;单会话最多 5 MiB、全部历史最多 20 MiB,编辑提案和回滚副本仍只保存在内存中。
- Apply/Revert 成功与历史保存失败会分别提示;保存使用 revision 串行化,并在待保存时提供显式 Retry save。编辑器变化只刷新 stale/revert 状态,不会全量重绘聊天内容;Markdown HTML 解析结果按消息缓存,滚动位置得以保持。
安装
从 Release 安装(推荐)
- 从与
manifest.json版本号一致的 GitHub Release 下载current-note-ai-x.y.z.zip。 - 解压到 Vault 的
.obsidian/plugins/current-note-ai/。 - 确认目录中包含
main.js、manifest.json、styles.css。 - 在 Settings → Third-party plugins 中启用 Current Note AI。
从源码构建
- 在本目录运行
pnpm install和pnpm build。 - 在 Vault 的
.obsidian/plugins/current-note-ai/中放入:main.jsmanifest.jsonstyles.css
- 在 Obsidian 的社区插件设置中启用 Current Note AI。
配置 DeepSeek 与 Kimi
- 打开 Settings → Current Note AI。
- 点击 Add DeepSeek 或 Add Kimi 创建账户档案;同一供应商可以添加多次并分别命名。
- Kimi 档案先在 API region 中选择创建密钥时使用的中国区或国际区;随后在 API key secret 中选择或创建 SecretStorage secret,并点击 Test connection 缓存该账户的模型。
- 在侧栏唯一的模型下拉框中按“档案 · 供应商”选择模型;刷新按钮只查询已启用档案的模型列表,不发送笔记内容。
- 档案可排序、禁用或删除。更换密钥或 Kimi API 区域会清除该档案的模型缓存、当前选择和隐私授权,必须重新测试与选择。
普通 Discussion 与 Edit 请求都显式关闭 DeepSeek thinking;Kimi 请求固定非流式并禁用 thinking。温度设置仅作用于 DeepSeek。设置中的 Maximum output tokens 是单次请求预算;Discussion 的 Continue 会产生新的计费请求,Edit 的更高预算重试也会产生新的计费请求。
普通 data.json 保存 secret 的名称引用、非敏感档案信息和本地会话历史,不保存 API key 本身。升级前会一次性保留 data.v0.1.6.rollback.json;它同样只含旧设置与 secret 引用。会话消息保存冻结的 profile/provider/model 来源,因此应按笔记内容同等保护这些文件。
数据边界
打开侧栏不会发送任何数据。首次向某供应商 Send 或 Propose changes 前,插件会明确询问是否允许把以下内容发送给该供应商;跨供应商使用已有历史时会再次披露并征求对应供应商同意:
- 当前绑定笔记的完整 Markdown 文本;
- 当前内存会话中最近的用户和助手消息。
默认不会发送 Vault 名、文件路径、其他文件内容或遥测。供应商已经收到请求后,本地 Cancel 只能忽略迟到响应,不能撤销远端处理。
请求体会按所选模型目录中的上下文窗口做保守启发式预算(DeepSeek 缺省回退为 64,000 token,Kimi K2.6 上限为 256,000 token);超过预算会在联网前阻断,不会静默截断。两个供应商的 requestUrl 都有 120 秒本地超时:超时只停止本地等待或忽略迟到结果,远端请求可能仍在处理或计费。
历史会话与创建它的笔记路径绑定。若加载历史时当前绑定的是另一篇笔记,插件只允许查看旧消息,并锁定发送按钮;回到原笔记并重新绑定后才能继续。打开历史列表或加载历史本身不会产生网络请求。
架构概览
flowchart LR
Editor["当前 Markdown 编辑器"] --> Gate["CurrentDocumentGate\n身份与全文快照检查"]
Gate --> Sidebar["Current Note AI 侧栏"]
Sidebar --> Prompt["受限提示构建器"]
Prompt --> Providers["DeepSeek / Kimi HTTPS API"]
Providers --> Discussion["普通讨论文本"]
Providers --> Proposal["结构化编辑提案"]
Proposal --> Validator["本地 schema、锚点、重叠与改动预算验证"]
Validator --> Review["用户逐项审阅"]
Review --> Transaction["Obsidian Editor transaction"]
插件不会向模型暴露命令、文件系统、Vault 搜索或任意工具。讨论请求只能读取当前绑定笔记的完整 Markdown 快照;编辑请求只能返回受限 JSON,真正的文本替换在本地完成。
主要模块:
src/context.ts:绑定当前 Markdown leaf,并在读取和写入前核对 leaf、文件对象与路径。src/provider/deepseek.ts、src/provider/kimi.ts:分别封装供应商/models与/chat/completions请求和错误映射。src/provider/registry.ts、src/core/provider-profiles.ts:维护代码内置的供应商/区域端点预设、账户档案身份和冻结请求目标;设置数据不能注入任意 URL。src/core/prompt.ts:构建讨论与编辑提示,明确把笔记视为不可信数据。src/core/edit-proposal.ts:解析和验证编辑提案,拒绝重复、缺失、重叠或过大的修改。src/core/conversation-history.ts:本地命名、清洗、排序并限制历史会话。src/view.ts:侧栏、消息气泡、History、模型选择、差异审阅和 Apply/Revert 交互。
编辑安全协议
所选供应商的完整编辑响应只能使用以下形状的 JSON:
{
"schemaVersion": 2,
"status": "complete",
"summary": "修改摘要",
"coveredTargets": ["已覆盖的修改目标"],
"uncoveredTargets": [],
"operations": [
{
"id": "edit-1",
"oldText": "必须在快照中唯一出现的原文",
"newText": "替换文本",
"reason": "修改理由"
}
]
}
如果完整提案无法安全放进一次响应,模型必须返回 status: "needs_segmentation"、空 operations 和明确的 uncoveredTargets。插件不会把这种响应或任何截断 JSON 创建成可应用提案。
插件不接受模型提供的文件路径、offset、命令或工具调用。Apply 瞬间只要笔记发生过任何变化,旧提案就会失效,不会自动重基或模糊匹配。
MVP 限制
- 仅桌面端和 Markdown 标签页。
- 使用 Obsidian
requestUrl的完整响应模式,暂不逐 token 流式显示。 - Thinking 模式暂不开放为用户选项;复杂分析仍使用显式 non-thinking 策略,后续需用真实质量数据决定是否增加 Deep 模式。
- 不支持 PDF、Canvas、EPUB、多文件编辑、全库检索、历史导出或跨设备会话合并。
- 单次笔记正文上限为 1,500,000 字符;超限时拒绝发送,不会静默截断。
- 最多保留最近 50 个会话,每个会话最多持久化最近 200 条用户/助手消息。
- 单会话历史最多 5 MiB、全部历史最多 20 MiB;支持删除单条会话或全部历史,笔记重命名会更新绑定与历史路径。
- 请求体按所选模型的上下文窗口使用保守启发式预算,超限在联网前拒绝;120 秒 timeout 是本地等待边界,不代表远端取消。
- 精确锚点若在正文中重复,会拒绝该提案并要求重新生成更长的上下文锚点。
开发
pnpm install
pnpm check
pnpm build
pnpm check 会运行 TypeScript 类型检查和纯函数测试;CI 还会构建 Release 三件套及 zip。涉及多窗格、重命名、同步并发、Editor Undo 或供应商网络请求的改动,仍应在真实 Obsidian 中进行集成验证;仓库测试不等同于真实 Obsidian 验证。
开源与安全
本项目采用 MIT License。安全设计、密钥存储与漏洞报告建议见 SECURITY.md,版本变化见 CHANGELOG.md,架构和威胁边界详见 docs/ARCHITECTURE.md。
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.