SiYuan v3.7.0 版本深度解读:命令行接口、内核插件系统与 AI 知识库的落地路径
2026/9/10 8:19:06 网站建设 项目流程

SiYuan v3.7.0 版本深度解读:命令行接口、内核插件系统与 AI 知识库的落地路径

【免费下载链接】siyuanAn open-source, privacy-first, self-hosted knowledge workspace where humans and AI agents work together 开源、隐私优先、自托管的知识工作空间,让人与智能体在此协作项目地址: https://gitcode.com/GitHub_Trending/si/siyuan

SiYuan v3.7.0 是一次"全面焕新"的发布:界面重设计之外,更关键的是能力层面的三块基石——不启动图形界面即可直接操作数据的命令行接口(CLI)、常驻内核的插件系统、以及进入公测的 SiYuan Agent 与向量嵌入语义搜索。本文以 v3.7.0 官方更新日志为主线,结合内核源码逐项拆解这些能力的实现机制与可用参数,帮助你理解每个新特性的边界条件与底层行为。

一、版本总览:五大主线

官方更新日志 app/changelogs/v3.7.0/v3.7.0.md 将本版本概括为五个方向:

  1. 重设计的用户界面:更清晰的视觉层级,其中包含合并顶部标题栏与标签栏(issue #10749)、新版设置界面(PR #17675)、底部 Dock 改进(issue #8890)等具体条目;
  2. 移动端快捷入口(Shorthands):长按 App 图标即可记录灵感,内容以带时间戳的笔记保存,保存路径可自定义(issue #14414);
  3. 内核插件系统:插件常驻内核运行,成为唯一的"数据真相源",让所有窗口与实例保持一致,终结多窗口数据冲突;
  4. 命令行接口(CLI):不启动 SiYuan 即可直连内核数据层,用于批量导入/导出、定时处理与外部系统集成(issue #17674);
  5. AI 知识库:SiYuan Agent 与向量嵌入搜索进入公测,支持用自然语言对话笔记、语义化检索与管理知识。

此外,本版本还支持了密钥与变量配置(issue #17933)、跨文档撤销(issue #4866)、本地 HTTPS + HTTP/2(issue #17822),以及乌克兰语、印地语、印尼语、荷兰语、泰语等 5 个新语言包,并为 Linux 提供了 rpm 发布包(PR #17596)。

二、命令行接口(CLI):直连内核数据层

v3.7.0 最重要的工程性变化是引入了完整的 CLI。它基于 cobra,命令集覆盖笔记块、笔记本、文档、搜索、SQL、导入导出、同步、工作空间等 20 余个领域,对应 kernel/cli/cmd/ 目录下的各命令文件。

2.1 全局参数

rootCmd的持久化 flag 定义(kernel/cli/cmd/root.go)可以确认四个全局参数:

参数简写默认值说明
--workspace-w工作空间路径;留空时依次回退到环境变量SIYUAN_WORKSPACE_PATH,再回退到~/SiYuan
--format-ftable输出格式:tablejson
--dry-runfalse干跑模式:只校验并打印将发生什么,不实际变更数据
--log-level-v日志级别:off / trace / debug / info / warn / error / fatal;单次命令默认warnserve子命令则跟随conf.jsonsystem.logLevel

2.2 启动时的初始化行为

PersistentPreRunE(kernel/cli/cmd/root.go)揭示了 CLI 单次命令的完整启动流程,也解释了若干使用前提:

  1. 工作目录解析resolveWorkingDir()从内核可执行文件位置探测包含appearance/langs的目录(打包态为resources/,兼容 macOS app bundle),并要求该目录存在,否则报错退出;
  2. 工作空间校验-w指定的路径必须存在且通过util.IsWorkspaceDir校验,否则拒绝执行;
  3. 数据库初始化:依次初始化主库、历史库与资产内容库,并按配置设置搜索大小写敏感性与资产路径索引开关;
  4. 语义搜索可用:调用model.PrepareEmbeddingSearch()——源码注释说明,常驻的嵌入索引器是死循环不适合立即退出的进程,这里只打开开关,让search -m 4(语义模式)这类一次性命令也能命中向量搜索;
  5. 退出前落库PersistentPostRunE在命令结束后统一调用model.FlushTxQueue()sql.FlushQueue(),把内存中的 SQL 索引队列刷入磁盘——因为单次命令没有 server 模式的 cron 定时 flush,不做这一步"写完即搜"就无法保证。

2.3 加密笔记本的限制

CLI 对加密笔记本是显式拒绝的:rejectEncryptedNotebookCLI(kernel/cli/cmd/root.go)会检查notebookboxidparent等 flag 值以及文件/资产路径参数,凡涉及加密笔记本一律报错CLI does not support encrypted notebook [...]。源码注释给出了设计动机:加密笔记本只能通过应用内专用流程解锁与操作,避免 CLI 进程成为明文或密文文件的旁路入口。serve子命令不受此限制。

2.4 典型使用场景

结合命令目录与官方描述,CLI 的典型用法包括:

  • 批量导入/导出:import/export相关命令(kernel/cli/cmd/import.go、kernel/cli/cmd/export.go);
  • 直接查询数据:searchsqlblockdatabase命令(kernel/cli/cmd/sql.go);
  • 同步与系统操作:syncsystemworkspace命令。

配合--format json输出与--dry-run校验,CLI 可以安全地嵌入 shell 脚本与 CI 定时任务。

三、Breaking Change:serve 需要显式子命令

本版本明确标注了一条破坏性变更:内核启动服务现在必须显式使用serve子命令(issue #17866)。此前的内核二进制默认即启动 HTTP 服务,现在裸进程只作为 CLI 入口,长期驻留的服务由serve承载。

serve的完整参数定义在 kernel/cli/cmd/serve.go:

参数默认值说明
--wd自动探测SiYuan 工作目录(含appearance/stage/的目录)
--port0HTTP 服务端口
--readonlyfalse只读模式
--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
--modeproddev/prod
--sslfalse启用 HTTPS 与 WSS(对应"Local HTTPS + HTTP/2 support",issue #17822)
--attach-uifalse将内核生命周期挂载到桌面 UI 进程(Electron 使用)
--safe-modefalse安全模式启动(对应"Supports launching in Safe Mode on Desktop",issue #17948)

serveRun函数(kernel/cli/cmd/serve.go)可以看到长驻进程的单次命令都做了:启动 HTTP server、初始化三套数据库、启动数据同步、加载闪卡、启动 cron 定时任务、初始化插件管理器(plugin.InitManager())、启动嵌入索引器(model.StartEmbeddingIndexer())、监视资产/表情/主题变更。这也解释了为什么 CLI 单次命令路径与serve路径在root.go中要互相绕开对方的初始化逻辑。

四、内核插件系统:单一数据真相源

更新日志描述内核插件系统的核心价值是"插件常驻内核,保持所有窗口与实例一致,终结多窗口数据冲突"(对应 PR #17487)。源码实现位于 kernel/plugin/ 目录,其中 manager.go 定义了PluginManager

  • 单例与生命周期InitManager通过sync.Once保证全局唯一,并注册OnKernelPluginStart/Stop等模型层回调,由serve启动流程中的go plugin.InitManager()触发;
  • 热重载:内置fsnotify.Watcher监视插件源文件变化,可触发热重载,无需重启内核;
  • 并发控制:每个插件名一把独立锁(pluginsMu),允许不同插件并发启停、同一插件串行启停;
  • RPC 能力PluginInfo暴露插件名、状态与 RPC 方法列表,配合 kernel/plugin/rpc.go、websocket.go、worker.go 构成插件与内核之间的调用通道,另有sandbox.go提供沙箱能力;
  • 安全集成:kernel/plugin/api_secrets_vars.go 使插件也能消费下一节介绍的密钥与变量体系。

插件目录约定为工作空间内的data/plugins(见PluginManager.pluginsDir注释)。这一设计与"单窗口前端 + 常驻内核"的架构相配合:无论打开多少个前端窗口,插件状态与数据变更都收敛到内核这一处。

五、配置密钥与变量(Secrets and Variables)

"Supports configuring secrets and variables"(issue #17933)为智能体、MCP 服务等提供了统一的凭据注入机制,实现在 kernel/conf/secrets.go 与 kernel/conf/variables.go。

5.1 存储与加密

Secrets是全局密钥库,每条Secretnamevalue组成。关键设计:

  • 落盘加密Secrets.Encrypt()AppConf.Save()序列化前对每个非空Valueutil.AESEncrypt;启动加载时Decrypt()反向解密(注释中特别提到 AES 解密结果还需一次 hex 解码才得到明文,与 AI 配置中 API key 的处理模式一致);
  • 运行时常驻明文:解析操作必须在InitConf解密之后进行,因此密钥只在进程内存中短暂以明文存在。

5.2 引用语法与解析优先级

Resolve方法(kernel/conf/secrets.go)支持两类占位符:

  • 显式语法{{secrets.NAME}}:正则\{\{secrets\.([^}]+)\}\}匹配,仅替换已配置的名字,未配置时保留原文,便于调用方(尤其是 LLM)发现尚未配置的密钥;
  • Shell 风格的$NAME${NAME}:正则限定NAME以字母/下划线开头,避免误伤$100、正则表达式等无关文本;且仅当密钥库中存在同名条目时才替换。

统一入口ResolveSecretsVars先执行密钥解析再执行变量解析,由此形成"$NAME先查密钥库、再查变量库"的优先级顺序。其消费场景在源码注释中写明:智能体的http_request工具、MCP 服务 headers 等。

六、AI 知识库:Agent 与向量嵌入搜索

"SiYuan Agent 与向量嵌入搜索进入公测"是本版本向智能化迈出的标志。仓库中对应的实现分为两部分:

6.1 嵌入索引

kernel/model/embedding.go 定义了后台嵌入索引器的完整参数(文件头部的常量块):

  • 批量与并发:每批 10 个块,最大 8 并发;
  • 内容长度门槛:短于 7 字符或长于 12000 字符的块被标记为忽略(embeddingIgnoredByLen);
  • 可配置排除:支持.siyuan/embeddingignore(gitignore 语法)匹配排除的块,对应embeddingIgnoredByConf
  • 失败退避:嵌入 API 不可用时按30s << 失败次数指数退避(上限 30 分钟),单块连续失败 8 次视为永久失败不再调度;并用embeddingErrNotified原子标记避免并发 worker 重复弹窗。

CLI 侧通过model.PrepareEmbeddingSearch()让一次性命令同样可查询这些向量索引(见 2.2 节)。

6.2 SiYuan Agent

kernel/agent/ 目录实现了智能体核心:agent.go内置的系统提示词定义了块的领域概念(容器块/叶子块、标题层级是"后续兄弟节点"而非子节点、hPath 人类可读路径等),并约束了工具使用模式——关键词检索走search.fulltext、语义检索走search.semantic、内容增删改走block.*工具、日记走dailynote.*工具等;session.go管理会话,tools.gocompaction.go分别负责工具注册与上下文压缩,modelmeta.go与 models.json 描述可用模型。Agent 通过 kernel/mcp/client/ 集成 MCP 工具调用,并严格约束"不捏造块 ID,未找到就如实说明"。

七、界面与编辑体验增强(摘要)

本版本 Enhancement 清单非常长(完整条目见更新日志),按主题归纳如下:

  • 界面布局:合并顶部标题栏与标签栏(#10749)、底部 Dock 改进(#8890)、Dock 面板最小宽度保存与拖拽保持(#17919)、Windows 下自定义下拉框样式(PR #17861);
  • 块与编辑器:超级块内拖拽调节块宽(#9521)、Alt+Enter列表末尾插入改进(PR #16314)、块的递归折叠/展开(PR #17651)、嵌入块支持原地编辑(#17800)、块图标支持在块上/下方快速插入(#17900)、块图标提示简化(#17945);
  • 数据库/属性视图:过滤器组合(#10550)、条目"创建副本"(#10850)、多选字段拖拽排序(#13468)、页脚字段模板化计算(#14394)、日期字段输入格式化(#13428)、视图性能改进(#17830);
  • 表格:合并单元格粘贴改进(#11888)、撤销编辑时保持横向滚动位置(#13829)、键盘导航不穿越合并单元格(#17587)、取消合并时<tbody><th><td>(#17835);
  • 移动端:多块选择(#13207)、手机/桌面界面切换(#13952)、平板与移动端拖拽(#17612、#17628)、跟随系统锁屏(#17625)、Android 内核后台进程改进(#17641);
  • 导出:Markdown 导出参数对话框(#17031)、桌面与移动端导出不再依赖浏览器下载(#17405、#17580)、嵌入块标题级别导出改进(#17629)、PDF 导出预览 UI 改进(#17687);
  • 安全与系统:不再向浏览器暴露工作空间绝对路径(#17410)、工作空间丢失后的启动提示改进(#14748)、数据同步 DNS 故障时自动刷新本地 DNS 缓存并重试(#17936)、macOS GPU 占用异常修复(#17087)。

另有两条值得注意的行为变更:废弃(Abolishment)——不再支持把列表块直接插入列表项块(#17890,Agent 系统提示词中也明确"嵌套列表须先在内层列表项下创建新的 list 块",两者互相印证);重构(Refactor)——升级 Electron 至 v42.5.0、highlight.js 升级至 v11.11.2、不再创建blocks_fts_case_insensitive表(#17849)。

八、面向开发者的 API 变更

本版本对插件开发者与 API 使用者有若干破坏性变更(完整清单见更新日志 Development 一节):

  • 部分内核 API 存在破坏性变更(#15727);/api/history/rollbackDocHistory移除notebook参数(#17411);
  • updateTransaction弃用,由updateTransactionElement替代(#17828);
  • lang取值改为符合 RFC 5646(#17855)——对照serve --lang的参数说明可见语言代码集合已按此规范整理;
  • 新增能力:/api/query/sql支持只读模式(PR #17696)、新增内核 API/api/lute/md2html(PR #17697)与/api/history/createDocHistory(#17774)、LocalStorage 相关 API 改进(PR #17482)、addDock允许在任意生命周期阶段调用(#17506)、插件函数支持导出文件(#15484)。

文档方面,本版本补齐了三份关键资料,仓库中均可直接查阅:

  • docs/SY-FORMAT.md:.sy文件 JSON 结构规范,面向 AI 读写场景,明确了 HTTP API、MCP、CLI、直接读写.sy四种数据通道的分工与索引重建注意事项;
  • docs/WORKSPACE.md:工作空间磁盘布局;
  • docs/API.md:API 文档,本版本新增了 Database 相关端点(#11130)。

九、小结

SiYuan v3.7.0 的更新日志表面是一份功能清单,实际勾勒出产品架构的三个转向:服务与命令分离serve子命令化 + 全功能 CLI,脚本化与自动化首次成为官方一等公民)、前端与状态分离(内核插件常驻内核,多窗口共享单一数据真相源)、笔记与智能体融合(Agent 与向量嵌入搜索公测,密钥/变量体系为 LLM 调用提供安全凭据通道)。对运维与开发者而言,理解serve的完整参数、CLI 的全局 flag 与退出前索引落库行为、加密笔记本在 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询