思源笔记 v3.7 深度解析:全新 UI、内核插件、CLI 与 AI 知识库
【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间,让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuan
版本总览:思源 v3.7 的“全面焕新”
思源笔记(SiYuan)v3.7 是一个标志性的里程碑版本。该版本对桌面端与移动端进行了全面焕新,在“界面美观度”与“智能化”两个方向同时发力。根据 v3.7.0.zh-TW.md 的发布说明,这一版的核心亮点包括五大主题:重新设计的用户界面、移动端速记、核心插件系统、命令行界面(CLI)、AI 知识库,并伴随大量编辑器、数据库、导出与多语言相关的改进与缺陷修复。
阅读本文后,你将掌握:v3.7 新增的 CLI 直连内核数据层能力(含serve子命令与破坏性变更)、内核级插件系统的架构与热重载机制、移动端闪念速记的使用方式、AI 智能体与嵌入向量检索的技术路径,以及所有破坏性变更对插件开发者与高级用户的实际影响。
注意:本文事实均来自当前仓库源码与官方变更记录,版本号以 util/working.go 中的
Ver = "3.7.2"为当前仓库实际版本基准(v3.7.0 为其上一个正式版本)。
重新设计的用户界面
新的默认外观主题与图标
v3.7 引入了全新的默认外观主题(对应 issue #17384)与默认外观图标(#7976)。仓库中appearance/themes/daylight与appearance/themes/midnight目录下的 CSS 与主题配置即为随版本发布的默认主题;appearance/icons/litheness目录则是新的默认图标集。同时,appearance/covers目录中提供了 70+ 张内置封面图(cover_001.webp至cover_072.webp),供文档封面设置使用。
新的设置界面与视觉层级
设置界面在 v3.7 中被重做(PR #17675),顶部标题栏与标签列合并(#10749),整体视觉层级更清晰。外观底部停靠栏(#8890)也得到了改进。这些改动体现在app/src/config与app/src/layout等前端的渲染逻辑中——从源码结构看,设置面板的配置项依旧围绕kernel/conf下的各配置结构体(如editor.go、appearance.go、search.go等)进行读写,因此新界面只是交互层重构,底层配置模型保持兼容。
移动端速记(闪念速记)
v3.7 为移动端新增了“速记”能力(issue #14414):灵感来临时,长按应用图标即可即开即写。内容会被保存为带时间戳的笔记,保存路径可自定义,碎片化想法不再丢失。
从前端源码看,速记功能仅在移动端内核支持。app/src/config/tabs/fileTab.ts中的注释明确写道:
// 仅移动端内核支持使用闪念速记 https://github.com/siyuan-note/siyuan/issues/14414因此:
- 该功能面向 Android / iOS 移动端;
- 入口是应用图标的长按手势,属于系统级快捷操作;
- 写入的笔记以时间戳命名,存储路径可在设置中自定义(例如归档到指定的笔记本或目录)。
同一版本还补齐了移动端的一批体验改进:移动端多块选择(#13207)、移动端切换手机/桌面界面(#13952)、平板拖拽(#17612)、移动设备拖拽(#17628)、三指选择后立即复制(#17633)、iOS 上打开用户指南(#17851)、Android 核心后台进程改进(#17641)以及 Android 上引用不可用(#17877)的修复。
核心插件系统:常驻内核的单一数据源
架构定位
v3.7 引入了核心插件(Kernel Plugin)系统(PR #17487)。与传统的“前端插件”不同,内核插件常驻在核心进程中运行,作为单一数据来源(single source of truth),使多个窗口和实例之间始终保持一致,彻底告别多窗口场景下的数据冲突。
从源码看,这一机制由kernel/plugin包实现:
- manager.go 是插件的生命周期管理器,负责插件的发现、加载、启动与停止;
- 插件的物理目录为工作空间下的
data/plugins/(见pluginsDir: filepath.Join(util.DataDir, "plugins")); - 每个插件的入口文件是插件目录下的
kernel.js; - 管理器以单例(
sync.Once)形式存在,InitManager()在核心启动流程中被调用(见 serve.go 中go plugin.InitManager())。
生命周期与热重载
PluginManager维护PluginManagerStateStopped/PluginManagerStateRunning两种状态,并使用fsnotify监听插件源码目录:
- 当
kernel.js文件发生Create或Write事件时,会自动触发插件重载(hot reload); - 插件启用/停用由
model.SetPetalEnabled驱动,管理器通过model.OnKernelPluginStart/Stop等回调与前端插件体系(Petal)打通; - 启动与停止均使用
sync.Map+ 每插件互斥锁,保证不同插件可以并发启停,同一插件不会并发启停; - 若配置
Conf.Bazaar.PetalDisabled或未信任集市(!Conf.Bazaar.Trust),内核插件将被整体禁用,这是重要的安全开关。
对开发者的意义
内核插件常驻核心进程意味着:它可以直接读写核心数据层、调用核心内部能力,而无需经过前端渲染进程转发,从而在多窗口/多实例场景下天然避免数据冲突。插件开发者需要关注 v3.7 中的相关破坏性变更(详见下文“破坏性变更”章节),例如updateTransaction的弃用、lang值改为 RFC 5646 规范等。
命令行界面(CLI):直连内核数据层
设计目标
v3.7 为内核新增了命令行界面(issue #17674)。无需启动思源即可直连核心数据层,适用于脚本与自动化任务:批量导入导出、定时处理、外部系统整合。
从源码看,CLI 基于 spf13/cobra(cmd.Execute()),子命令定义于kernel/cli/cmd/目录,包括:
asset.go attr.go block.go bookmark.go dailynote.go database.go document.go export.go file.go history.go import.go inbox.go notebook.go outline.go ref.go repo.go root.go search.go serve.go sql.go sync.go system.go tag.go template.go workspace.go涵盖文档、块、笔记本、数据库、属性、书签、搜索、SQL 查询、导出导入、历史、同步、模板、标签、大纲、引用、收件箱、仓库等数据层操作,几乎覆盖核心 API 的完整能力面。
全局参数
root.go 定义了四个全局(Persistent)参数:
| 参数 | 简写 | 默认值 | 说明 |
|---|---|---|---|
--workspace | -w | 环境变量SIYUAN_WORKSPACE_PATH,为空则~/SiYuan | 指定工作空间路径,必须是合法的思源工作区 |
--format | -f | table | 输出格式:table或json |
--dry-run | - | false | 干跑模式:只校验并打印将要执行的操作,不真正改动数据 |
--log-level | -v | warn(CLI 单次命令默认值) | 日志级别:off/trace/debug/info/warn/error/fatal |
几个值得注意的细节:
- 工作空间校验:CLI 启动时会校验
appearance/langs目录存在(用于定位内核运行目录),并校验workspacePath是合法工作区(util.IsWorkspaceDir); - 日志默认 warn 级:CLI 单次命令默认只输出警告及以上日志到
temp/siyuan-cli.log,避免内核初始化日志刷屏;serve子命令例外,仍跟随conf.json的system.logLevel; - 命令结束自动落库:CLI 单次命令没有后台 cron 周期刷 SQL 队列(server 模式才有
job.StartCron),因此PersistentPostRunE会在命令执行完后统一调用model.FlushTxQueue()与sql.FlushQueue(),保证“写完即可搜索”——这也是 CLI 与常驻服务在数据一致性上的关键差异。
子命令与输出格式
- 所有子命令支持
-f json输出机器可读结果,便于脚本解析; --dry-run可用于对导入、导出、删除等有副作用的操作做安全演练;- CLI 支持对加密笔记本的安全限制:
rejectEncryptedNotebookCLI会拒绝 CLI 对加密笔记本及其块的操作,避免 CLI 进程成为明文/密文文件的旁路入口(exportDataCmd、notebookRandomIconCmd与涉及加密笔记本 id 的操作会被拒绝)。
破坏性变更:核心服务需显式serve子命令
v3.7 有一条对部署方式影响最大的破坏性变更(issue #17866):
核心服务现在需要显式使用
serve子命令。
即:过去直接运行内核二进制即启动 HTTP 服务的方式不再可用,现在必须运行:
./kernel serveserve子命令(serve.go)负责启动内核 HTTP 服务,其完整参数如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
--wd | 内核可执行文件所在目录的上一级(打包后为resources/) | 思源工作目录(working directory) |
--port | 0 | HTTP 服务端口,0表示自动分配 |
--readonly | false | 只读模式 |
--accessAuthCode | 空 | 访问授权码(即锁屏密码) |
--lang | 空 | 界面语言:ar/de/en/es/fr/he/hi/id/it/ja/ko/nl/pl/pt-BR/ru/sk/th/tr/uk/zh-CN/zh-TW |
--mode | prod | 运行模式:dev/prod |
--ssl | false | 是否启用 HTTPS 与 WSS |
--attach-ui | false | 将内核生命周期挂接到桌面 UI 进程(Electron 使用) |
--safe-mode | false | 以安全模式启动(对应桌面端新增的“安全模式”入口,#17948) |
serve的启动流程(Run函数)展示了完整的服务初始化链路:BootWithFlags→InitJwtKey→InitConf→server.Serve→ 各 SQL 数据库初始化 →BootSyncData→InitBoxes→LoadFlashcards→job.StartCron→ 自动生成文件历史 → 插件管理器 → 嵌入向量索引器 → 资产/表情/主题监听 → 信号处理。
注意:CLI 单次命令模式与
serve是两种不同的进程形态。前者执行完即退出、内存索引随之释放(依赖末尾 flush 落库);后者是长驻服务,拥有完整的后台任务(cron、插件、嵌入索引、文件监听等)。
AI 知识库:智能体与嵌入向量检索
v3.7 开始公开测试思源智能体(Agent)与嵌入向量搜索,用自然语言与笔记对话、用语义检索管理知识。仓库中的相关实现包括:
- kernel/agent/agent.go:智能体核心,内嵌系统提示词(system prompt),定义了块(Block)、文档、标题层级、嵌套列表、hPath、日记等思源领域概念,并通过一组领域工具(
document.*、block.*、search.fulltext、search.semantic、dailynote.*、database.*、inbox.*、attr.*、todo_write、file等)操作笔记数据; - kernel/model/embedding.go:嵌入向量索引器实现(
StartEmbeddingIndexer在 serve.go 中以 goroutine 启动); - kernel/model/rerank.go:检索结果的重排序(rerank)能力;
- kernel/api/ai.go:AI 相关 API 端点;
- kernel/conf/ai.go:AI 配置项;
- kernel/util/openai.go:OpenAI 兼容接口的底层客户端封装。
从架构看,语义检索链路为:全文检索(search.fulltext)+ 语义检索(search.semantic)→ 重排序(rerank)→ 交由智能体整合回答。CLI 模式同样支持语义检索——root.go 中model.PrepareEmbeddingSearch()的注释说明:CLI 一次性命令无法运行嵌入索引的死循环索引器,因此只把语义搜索开关置真,命中已构建的嵌入索引(如search -m 4之类带语义模式的命令可正常工作)。
说明:AI 知识库在 v3.7 属于“公开测试”特性,文中关于其内部实现的事实以仓库源码为准,具体模型接入与计费方式请以思源官方后续发布为准。
设置密钥和变量(Secrets & Variables)
v3.7 支持设置密钥(secrets)和变量(variables)(issue #17933),用于在智能体工具、MCP 服务等场景中安全地引用敏感信息。实现位于 kernel/conf/secrets.go:
- 密钥(Secret):一条命名密钥,
Name为引用名(如weread_key),运行时为明文,落盘时通过 AES 加密(util.AESEncrypt); - 引用语法:支持
{{secrets.NAME}}显式占位符,也支持无前缀的 shell 风格$NAME与${NAME}(仅在密钥库存在对应名字时才替换,找不到则保留原文,便于调用方/LLM 发现尚未配置的密钥); - 统一解析:
ResolveSecretsVars串行调用密钥与变量的Resolve,形成“$NAME 先密钥后变量”的优先级,供智能体http_request工具、MCP 服务 headers 等统一消费。
注意:密钥只在内存明文状态下解析(
InitConf解密后),落盘均为密文。请勿把密钥明文写入笔记正文。
编辑器、数据库与其他体验改进
v3.7 在编辑器与数据库上同样有大量改进,按主题归类如下。
编辑器与文档编辑
- 跨文件撤销(#4866):撤销/重做不再局限于当前文档;
- 嵌入区块就地编辑(#17800):嵌入块支持就地修改内容;
- 超级区块拖拽调宽(#9521)、区块拖拽工具提示改进(#14034)、列表与超级区块拖放体验改进(#17893);
- 根据字体文件自动调整编辑器字体字重(#10313)、字体菜单支持搜索(#17691);
Alt+Enter在列表末端插入新项目(PR #16314)、递归折叠/展开块(PR #17651);- 区块标改进(#17751)、区块标支持在上方或下方快速插入块(#17900)、区块标提示简化(#17945);
- 行级元素解析改进(#17611)、行级公式与图片复制改进、剪切行为与复制一致(#17571)、粘贴大量
text/siyuan内容不再导致渲染进程崩溃(#17569)、字数统计改进(PR #17572); - 剪贴板粘贴改进(PR #17850)、复制到微信公众号时列表左缩进修复(#17759);
- 所有编辑器共享同一个 Lute 实例,降低多分页内存占用(#17869);
- 改进空标题的边界情况(PR #17468)。
数据库(属性视图)
- 数据库筛选器组合(#10550);
- 数据库项目支持“创建副本”(#10850);
- 数据库日期字段输入格式改进(#13428);
- 数据库多选字段值支持拖拽排序(#13468);
- 数据库页脚字段计算支持基于模板的计算(#14394);
- 数据库视图性能改进(#17830);
- 取消单元格合并时
<tbody>中的<th>转换为<td>(#17835)。
表格与搜索
- 包含合并单元格的表格粘贴体验改进(#11888);
- 表格中方向键导航不绕过合并单元格(#17587)、无外围块的表格中方向键失效修复(#17567);
- 撤销编辑时保留水平滚动位置(#13829);
- 搜索新增标题和列表子类型筛选器(PR #17597);
- 通过文件名搜索可从数据快照返回文件列表(#17258);
- 新增简繁中文敏感度选项(PR #17846)。
导出、图表与显示
- 新增 Markdown 导出参数对话框(#17031);
- 桌面端/移动端文件导出不再依赖浏览器下载(#17405、#17580);
- 改进导出预览的 HTML 复制(PR #17783)、改进 PDF 导出预览界面(#17687);
- 改进嵌入块中标题层级的导出(#17629);
- mermaid/graphviz 图表新增缩放和平移选项(#12691);
- Mermaid 图表中的公式渲染修复(#17593);
- 改进 IFrame 区块(#17659)。
安全与隐私
- 不再向浏览器暴露绝对工作区路径(#17410);
- 将“访问授权码”更名为“锁屏密码”(#17701)——这是语义上的安全术语统一;
- 修复一些安全漏洞(#17624);
- 本地 HTTPS + HTTP/2 支持(#17822);
- 桌面端支持安全模式启动(#17948);
- Windows 数据同步因 DNS 问题失败时自动刷新本地 DNS 缓存并重试(#17936)。
多语言与发布
- 新增乌克兰语(PR #17595)、印地语(#17636)、印尼语(#17637)、荷兰语(#17638)、泰语(#17639)支持——
appearance/langs目录下可看到对应语言文件(uk.json、hi.json、id.json、nl.json、th.json); - 为 Linux 新增 rpm 发布包(PR #17596);
- 推送通知标题变更后窗口标题同步更新(#17621)。
移除功能与破坏性变更清单
移除功能
- 不再支持直接将列表区块插入到列表项区块中(#17890)。依据思源的树形结构约束,列表项的父级必须是列表(
NodeList),嵌套列表应通过“在列表项下创建子列表”的方式实现。
破坏性变更
| 变更 | 影响对象 |
|---|---|
核心服务需显式serve子命令(#17866) | 所有直接运行内核二进制的部署/脚本 |
| 一些核心 API 的破坏性变更(#15727) | 依赖旧版 API 的插件 |
/api/history/rollbackDocHistory移除notebook参数(#17411) | 调用该 API 的插件/脚本 |
弃用updateTransaction,替换为updateTransactionElement(#17828) | 使用事务更新的插件 |
修改lang值以符合 RFC 5646(#17855) | 依赖语言代码的插件与配置 |
开发者迁移时请重点检查:内核服务启动命令、历史回滚 API 参数、事务更新 API、语言代码取值。
开发者相关更新
v3.7 面向插件开发者的更新还包括:
- 提供用于导出文件的插件函数(#15484);
- 改进 LocalStorage 相关 API(PR #17482);
addDock允许在任意生命周期阶段调用(#17506);- 修复插件安装/卸载/启用/停用后全局快捷键注册/注销失效(#17599);
- 为
/api/query/sql新增只读模式(PR #17696); - 新增核心 API
/api/lute/md2html(PR #17697); - 新增核心 API
/api/history/createDocHistory(#17774); - RTL 布局:为
.protyle新增.rtl类,并修复提示/块引用样式(#17741); - 升级 Electron 至 v42.5.0(#17617)、升级 highlight.js 至 v11.11.2(#17928);
- 不再创建数据表
blocks_fts_case_insensitive(#17849)——全文搜索的大小写敏感行为统一由sql.SetCaseSensitive(model.Conf.Search.CaseSensitive)控制; - 改进 Linux 构建脚本(PR #17632)、改进数据索引稳定性(#17610)、避免数据仓库清理结束时长时间等待(#17711)。
文档与规范更新
- 新增数据库 API 端点文档(#11130);
- 新增
.sy格式规范文件(#17961)——即仓库根目录的 docs/SY-FORMAT.md,定义了思源专有的.sy文档格式; - 改进用户指南(#17870),并通过发布服务提供在线用户指南(#17673);iOS 端也支持打开用户指南(#17851)。
缺陷修复精选
v3.7 修复了多类关键缺陷,值得关注的有:
- 焦点块开头按 Enter 插入位置错误(#14742);
- 反向链接面板 Shift+Click 多选失效(#17867);
- 重新索引回退导致 sort.json 损坏(#17862);
- 页面加载完成前滚动导致突然重新定位跳变(#17864);
- 启动时缺少
window.siyuan.storage报错(#17620); - 工作清单复选框切换问题(PR #17840);
- 提示块内部删除块引用后撤销异常(#17665);
reconnectWebSocket的 ping 隔离,CONNECTING 套接字下保持存活(PR #17680);- 包含连续图片的内容设置行级元素样式时图片消失(#17704);
- 无法将笔记本拖拽到最末端(#17709);
- 搜索窗口内为文档添加标签异常(#17623);
- 导入 Markdown 后标签页自动关闭(#17615)。
升级与部署建议
- 脚本与自动化用户:检查启动内核的脚本,统一改为
./kernel serve;如需批处理,可先使用--dry-run演练再执行实际操作; - 插件开发者:对照上文“破坏性变更清单”逐一迁移,特别是
updateTransaction与lang值; - 自托管用户:可利用 CLI 在不启动界面的情况下完成数据备份、SQL 查询与批量导入导出;利用密钥/变量机制安全管理 AI 工具与 MCP 的凭据;
- 多窗口用户:升级后建议迁移到内核插件体系,以获得跨窗口一致的单一数据源体验。
思源 v3.7 在“界面焕新—内核能力开放—智能检索”三条主线上同时发力:CLI 让数据层向脚本与外部系统完全开放,内核插件解决了多窗口数据一致性难题,而智能体与语义检索则开启了“笔记会思考”的新阶段。对于追求自动化与知识库智能化的用户,这是一个值得立即升级的版本。
【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间,让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuan
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考