Obsidian / AI插件的数据路径

官方资料・固定来源确认

Obsidian×AI插件的当前位置
能做的事情・危险的事情【2026】

本页面由日语原文机器翻译而成。 阅读日语原文

笔记本的哪个部分,从哪个功能,到哪里。 阅读Copilot・Smart Connections・Text Generator的固定版,比较资料中了解到的和实际通信的未确认部分。

选择前要看的是模型、语境、索引、附加功能

仅凭“本地对应”这个词,并不能决定插件整体的发送目的地。 分别确认传递给模型的笔记的摘录、制作索引的地方、Web搜索和文件转换的服务、诊断、更新确认。

  1. 模型provider・endpoint・agent
  2. 参考语境选择文・摘录・template
  3. 索引・搜索是本地还是其他server
  4. 附加功能Web・文件转换・诊断・更新

这个图是为了阅读官方资料而整理的。 不是实际的通信记录。 比较是确认固定的资料和来源,不包括设置画面的操作和实际请求、提供者的运用审计。

首先请在下表中确认使用功能的路径。 表中的“来源”表示从代码中读取的常数和分支,“提供来源的说明”表示README和指南的记载。

3个固定版,通过发送目的地和设置进行比较

2026年9月30日获得的官方资料。 不是实际通信的结果表。
固定版资料中显示的路线语境・索引确认按键・设置剩余未确认
副驾驶
4.0.12
提供来源的说明:hosted是Brevilabs和enterprise provider。 Cloud BYOK是指定provider/endpoint,Local BYOK是local endpoint。 opencode、Claude、Codex也有各自的路线。 Q03所选笔记的摘录是模型语境。 Miyo的索引、搜索地址另设local/remote。 Web搜索、文件转换、project context确认附加路径。 Q03 / Q05来源:确认是否有SecretStorage的getter。 enableMiyo=false、activeBackend=opencode等的初期定数。 实际保存和现行GUI尚未确认。 Q07 / Q08 / Q09实payload、索引对象、终端的密钥保存、加密、backend的保留、遵守非学习方针。 自我选择的诊断ZIP upload通常与request区分开来。
智能连接
4.7.2
提供来源的说明:介绍内置local embedding model。 说明了不需要API key的索引制作。 Q10 / Q11README说明在enable之后制作Vault的索引。 设置、model的一部分是外部依赖的。 未读完所有构成的数据路径。来源:有GitHub latest-release的GET和首次介绍中传递的URL。 从local embedding的说明来看,无法判断为没有全部通信。 Q12 / Q13实际索引、获取模型、依赖整体、实际通信和payload、替代model、key storage、telemetry/保留的整体。
文本生成器
0.8.7
源初始值:OpenAI Chat (Langchain)、https://api.openai.com/v1、key为空。 Ollama provider接收设定的basePath。 Q15 / Q23 / Q24includeClipboard=true可以获取值的分支。 初期template是title・starredBlocks・tg_selection。 实际进入prompt的值需要另外确认。 Q15 / Q17来源初始值:encrypt_keys=false。 不可加密/无效的话,返回固定prefix+输入key的分支。 即使plain key栏是空的,也不能判断为已加密。 Q15 / Q19 / Q20 / Q21 / Q22实际payload、现行GUI、终端的加密结果、全功能的通信、收费・回答质量、telemetry/保持的整体。

BYOK是使用自己的键和endpoint的方式。“ “使用自己的钥匙”和“只停留在终端内处理”是不同的条件。

Copilot:即使选择模型,附加功能的路径也会另外留下

固定版的指南分为hosted・Cloud BYOK・Local BYOK・opencode・Claude・Codex的处理对象。 例如,Local BYOK的模型是local endpoint的解释,根据使用的Skill和project context,也有涉及其他服务的情况。 Q03

将笔记的参考和Miyo的索引分开

资料中有说明,agent阅读笔记,将必要的部分放入选择模型的prompt中。“ 仅仅打开Agent Chat就上传了整个Vault”的行为没有说明。 Miyo有local连接和remote server连接,分别选择索引和搜索目的地。 通过搜索找到的摘录也进入了模型的语境。 仅仅使用local的索引,不能说摘录不会传到模型provider。 Q03 / Q05

文件处理也不是统一的。 资料上,Agent Chat的Miyo处理使用local CLI,Quick Chat使用连接的Miyo service,remote的话使用那个server处理。 使用Web・YouTube・binary file的saved project context有使用hosted project service的情况,与Miyo的选择是不同的路径。 Q03

不保证Self-Host Mode会切断通信

指南明确指出,即使是Self-Host Mode,cloud也不会失效。 发送到选定的Claude、Codex、cloud model和搜索provider等的路径仍然存在。 这是为了确认每个功能是否与想要使用的功能和允许的处理对象一致的设置。 Q04

关键的getter、初期定数、诊断的方针,根据各自的依据来阅读

确认的KeychainService的范围是,确认有没有app.secretStorage,如果没有就会出错的getter。 不是实际保存密钥的结果,也不是验证OS加密的记录。 enableMiyo=false、enableMiyoSearchSkill=false、activeBackend=opencode、debugFullFrames=true是源内的初始值,不显示已转移的设置或读者GUI的值。 Q07 / Q08 / Q09

README说明了hosted request的随机UUID和读者选择upload的诊断ZIP。 ZIP的60天后删除,hosted request的临时处理、非保留、非学习是提供者说明的方针。 并不是在这里审核backend的运用。 不能判断只从debugFullFrames=true开始自动发送诊断ZIP。 Q02

Smart Connections:local embedding的说明和,全部通信的有无分开

README称,内置本地模型会为Vault建立索引,无需API密钥。这可作为查找相关笔记机制的说明,但在本次比较中,我们没有运行模型,也没有观察实际索引过程或网络通信。README关于“private”“offline”和移动端的说明也仅作为提供方的声明。Q10 / Q11

另一方面,自己的src/main.js有从initialize后的更新确认到GitHub latest-release的GET预约代码。 首次用户的StoryModal会传递smartconnections.app的URL。 这是与通信相关的代码路径的确认。 StoryModal的实现在依赖方,实际读取URL,以及传递什么样的payload尚未确认。 Q12 / Q13

model・settings・HTTP等部分参考了Smart Environment/jsbrains相关的外部package。 仅凭这个范围,不能断定“所有功能都在终端内”“没有telemetry”“笔记本一定会被发送”。 将本地索引的说明、更新确认的代码、未确认的依赖、实际通信分开的话,可以知道追加调查的对象。 Q14

Text Generator:确认上下文的候选人和密钥保存的分支

可以获取剪贴板的设置和实际prompt是不同的

固定版的初始设置有includeClipboard=true,context builder如果其值为true,则具有可以获取clipboard的分支。 另一方面,引用的初期template是title、starredBlocks、tg_selection,不是clipboard placeholder。 Q15 / Q17

根据template、frontmatter、context options、选择范围,解决的值会发生变化。 请不要将可用的值一览表和实际请求中的值视为相同的。 这个代码确认不是“clipboard一定会被发送”“Vault全部会一直被发送”的结果。 Q17 / Q18

plain key栏的空文字不能成为加密的证据

初始值是encrypt_keys=false。 有保存时将plain key栏清空的处理和准备其他secret相关字段的处理。 getEncryptedKey在加密不可用或encrypt_keys无效时,返回连接固定prefix和输入key的值。 即使字段名称中包含encrypted/hashed,也不能仅凭这一点判断为加密的bytes。 Q15 / Q19 / Q20 / Q21 / Q22

键,所以实际保存的内容和这个终端的safeStorage动作尚未确认。 在共享包含密钥的配置文件和诊断记录之前,不仅需要关注plain栏,还需要关注保存的其他值。

将初期provider和local对应分开选择

源的初始provider是OpenAI Chat (Langchain),endpoint是https://api.openai.com/v1。 Ollama provider有接收设定的basePath的实现。 仅凭有local对应provider的事实,并不能证明其他功能的处理目的地和全通信都没有。 Q15 / Q23 / Q24

附加request、automatic suggestions、slash suggestions、JavaScript执行在引用的初始值中是OFF。 这些也不是现行GUI的实际测量值。 请在自己的环境中确认使用的template和已保存的设置。 Q15 / Q16

根据自己的使用方法,决定要确认的设置

想做的事情确认对象仅凭这个比较是无法理解的
用云模型处理笔记本model/provider/endpoint,选择文・摘录・template,使用的agent/Skill实际payload、provider的运用、请求、回答质量
想在local制作索引embedding/index的处理对象、remote server设置、后段的模型、模型获取和附加功能所有功能的通信停止,依赖的所有路径,终端的实际索引
想知道保存、共享密钥的范围保存的字段、无法使用加密的分支、日志/诊断/设置的共享目的地遵守该终端的实际保存bytes、backend保留、删除

更改设置后的状态,不是本表实测的结果。 在使用自己的笔记本之前,请将其作为决定使用哪些功能、将哪些数据传递给允许的目的地的阅读方法。

常见问题

选择本地模型的话,插件完全不通信吗?
模型的处理目的地和索引、Web搜索、文件转换、更新确认是不同的路径。 Copilot的资料区分了附加功能的路径,Smart Connections的自前代码有GitHub更新确认GET。 在这次资料确认中,没有确认所有功能没有通信和实际发送内容。
Smart Connections会把笔记本发送到外部吗?
固定版README说明了通过内置的本地模型制作embedding和索引。 这是提供者的说明。 自己的来源有更新确认和首次介绍的URL,模型、设置等有一部分是外部依赖。 这个比较没有测量实际的笔记发送和全部通信的有无。
Text Generator的includeClipboard=true,是一定要发送剪贴板的意思吗?
在源代码中,当该设置为true时,context builder可以获取剪贴板的分支。 另一方面,刊登的初期模板使用title、starredBlocks、tg_selection,没有指定clipboard。 可用的值和实际组装的请求内容是不同的。 实际payload未测量。
如果保存数据的api_key是空的,密钥已经加密了吗?
仅凭空键栏无法判断。 在Text Generator 0.8.7中,有清空plain key栏的保存处理和单独的保存字段,如果无法使用加密或encrypt_keys无效时,有返回固定prefix和输入键的分支。 没有尝试过实际的密钥保存和平台的加密动作。
这篇报道是否比较了AI的回答质量和费用、iPhone的动作?
比较对象是固定的3版的官方资料和代码中显示的数据路径和设置。 插件的安装、设置画面的实际操作、模型生成、收费、实际通信、包括iPhone在内的终端动作、提供者的保存、非学习方针的遵守没有确认。

确认的版本和依据的原文

以下是2026年9月30日14:25 UTC记录的官方release和固定commit。“ 是当时确认的版本”,不保证未来的最新版。 Minimum Obsidian是manifest的值。 没有从mobile对应flag中推测实际终端的动作。

官方registry也固定在commit 2db5da29e67e7600176c8c9450fd1c36c3a6831b。 关于24引用、14文件、579行,确认与原始文件bytes/SHA256、行范围、引用文一致。 为了确认固定版资料的再现性而进行的核对,不是runtime privacy认证。

24件的固定引用和确认范围用JSON读取

主要说明和代码的引用

英文原文和代码是固定commit的对应范围。 从表中的Q号码开始,也可以进行GitHub原文。

副驾驶 · docs/copilot-plus-and-self-host.md · Q03

打开固定commit的原文

75: 
76: | Model source                | How access works                                               | Who processes the prompt                                        |
77: | --------------------------- | -------------------------------------------------------------- | --------------------------------------------------------------- |
78: | **Copilot-hosted**          | Lite, Plus, or included Supporter access                       | Brevilabs and the enterprise model provider used for that model |
79: | **Cloud BYOK**              | Your API key under BYOK                                        | The provider and endpoint you configured                        |
80: | **Local BYOK**              | Ollama, LM Studio, or another local OpenAI-compatible endpoint | Your local endpoint                                             |
81: | **opencode-reported model** | Authentication managed by opencode                             | The provider behind that opencode model                         |
82: | **Claude**                  | Claude Code login or environment                               | Anthropic under your Claude account                             |
83: | **Codex**                   | Codex CLI login through `codex-acp`                            | OpenAI under your Codex or ChatGPT account                      |
84: 
85: A Claude or ChatGPT subscription is not an API key. Use the Claude or Codex Agent Chat setup for those subscriptions. Use BYOK only when you have API access or an OpenAI-compatible endpoint.
86: 
87: ## Understand service data routes
88: 
89: The selected model is only one possible route. A feature may call another service for the part of the task you asked it to perform:
90: 
91: - A **Copilot-hosted Skill** sends the search query, URL, or document needed by that Skill to Brevilabs.
92: - **Plus document processing** sends the supported document to Copilot's hosted processor.
93: - In **Agent Chat**, **Miyo document processing** runs through the local Miyo CLI, so PDF and EPUB parsing stays on this computer even when search uses a remote Miyo server.
94: - In **Quick Chat**, **Miyo document processing** uses the connected Miyo service. A configured remote Miyo server processes the document there rather than on this computer.
95: - Saved **project context** that needs web, YouTube, or binary-file conversion can use Copilot's hosted project service. The Miyo Document Processor choice does not change that project route.
96: - An agent can read a local note and include relevant text in the prompt sent to the selected model. Opening Agent Chat alone does not upload the whole vault.
97: 
98: For a workflow that does not send task content to Brevilabs, use direct Markdown context, local tools or local Miyo, and a local model. Disable Copilot's cloud-backed Skills for every agent you use. Do not add web pages, YouTube links, or binary files as saved project context when their hosted conversion is outside your intended boundary.
99: 
100: The [privacy policy](https://www.obsidiancopilot.com/en/privacy) describes how Copilot's hosted requests are processed. Your model provider and Miyo server have their own boundaries and terms.
副驾驶 · docs/copilot-plus-and-self-host.md · Q04

打开固定commit的原文

103: 
104: Supporter and eligible legacy licenses can open **Settings → Copilot → Self-Host** and enable **Self-Host Mode**.
105: 
106: When it is on, Copilot:
107: 
108: - Lets you supply Firecrawl, Perplexity, Parallel, or Exa credentials for web search.
109: - With OpenCode selected, routes Agent Chat web searches through that selected provider while keeping its API key inside Obsidian. This does not require Obsidian's command line interface.
110: - Disables OpenCode's native web-search and web-fetch tools so they cannot bypass the selected route. Full-page fetching through OpenCode is unavailable until the self-host providers share a supported fetch interface.
111: - Lets you supply a Supadata key for YouTube transcripts.
112: - Directs you to BYOK for local or self-hosted model endpoints.
113: - Flags and sorts cloud agents and models below local or self-hosted choices.
114: 
115: It does not disable the cloud. Claude, Codex, Copilot-hosted models, cloud BYOK providers, Firecrawl, Perplexity, Parallel, Exa, and Supadata can still send data to their services when you select them. The warnings make those routes visible so you can decide.
116: 
117: You do not need Self-Host Mode to use a local BYOK model or local Miyo. Those are available independently.
副驾驶 · src/services/keychainService.ts · Q09

打开固定commit的原文

239:   /** Whether the OS keychain is available in this Obsidian version. */
240:   // DESIGN NOTE — intentionally only checks for the `secretStorage` object,
241:   // not individual methods (`getSecret`/`setSecret`/`listSecrets`). Obsidian
242:   // ships SecretStorage as a single API surface (1.11.4); there is no
243:   // released version where the object exists but methods are missing.
244:   // Capability-probing each method would add branching for a partial-API
245:   // world that does not exist. If a future review flags this again, point
246:   // them at this note.
247:   isAvailable(): boolean {
248:     return !!this.app.secretStorage;
249:   }
250: 
251:   /** Get the current vault namespace ID. */
252:   getVaultId(): string {
253:     return this.vaultId;
254:   }
255: 
256:   /**
257:    * Set the vault namespace ID from persisted settings.
258:    * Reason: called during load to replace the path-derived fallback with the
259:    * stable persisted ID, so vault renames don't orphan keychain entries.
260:    */
261:   setVaultId(id: string): void {
262:     this.vaultId = id;
263:   }
264: 
265:   /**
266:    * Access SecretStorage with a runtime guard.
267:    * Reason: replaces scattered non-null assertions with a single guard
268:    * that produces a clear error when keychain is unavailable.
269:    */
270:   private get storage(): SecretStorage {
271:     if (!this.app.secretStorage) {
272:       throw new Error("OS keychain (SecretStorage) is not available.");
273:     }
274:     return this.app.secretStorage;
智能连接 · src/main.js · Q13

打开固定commit的原文

144:   async check_for_updates() {
145:     if (await this.is_new_plugin_version(this.manifest.version)) {
146:       // console.log("opening release notes modal");
147:       try {
148:         this.ReleaseNotesView.open(this.app.workspace, this.manifest.version);
149:       } catch (error) {
150:         console.error('Failed to open ReleaseNotesView', error);
151:       }
152:       await this.set_last_known_version(this.manifest.version);
153:     }
154:     window.setTimeout(this.check_for_update.bind(this), 3000);
155:   }
156: 
157:   async check_for_update() {
158:     try {
159:       const { json: response } = await requestUrl({
160:         url: "https://api.github.com/repos/brianpetro/obsidian-smart-connections/releases/latest",
161:         method: "GET",
162:         headers: {
163:           "Content-Type": "application/json",
164:         },
165:         contentType: "application/json",
166:       });
167:       const latest_release = response.tag_name;
168:       if (latest_release !== this.manifest.version) {
169:         if (!this.update_available || this.latest_release_version !== latest_release) {
文本生成器 · src/default-settings.ts · Q15

打开固定commit的原文

4: const DEFAULT_SETTINGS: TextGeneratorSettings = {
5:   version: pkg.version as any,
6:   endpoint: "https://api.openai.com/v1",
7:   models: [],
8:   api_key: "",
9:   encrypt_keys: false,
10:   selectedProvider: "OpenAI Chat (Langchain)",
11:   max_tokens: 5000,
12:   temperature: 0.7,
13:   frequency_penalty: 0.5,
14:   showStatusBar: true,
15:   outputToBlockQuote: false,
16:   freeCursorOnStreaming: false,
17:   allowJavascriptRun: false,
18:   experiment: false,
19:   promptsPath: "textgenerator/templates",
20:   textGenPath: "textgenerator/",
21:   prefix: "\n\n",
22:   tgSelectionLimiter: "^\\*\\*\\*",
23:   stream: true,
24:   context: {
25:     customInstructEnabled: true,
26:     includeClipboard: true,
27:     customInstruct: `Title: {{title}}
28:   
29: Starred Blocks: {{starredBlocks}}
30: 	  
31: {{tg_selection}}`,
32: 
33:     contextTemplate: `Title: {{title}}
34: 	
35: Starred Blocks: {{starredBlocks}}
36: 	  
37: {{tg_selection}}`,
38:   },
39:   requestTimeout: 300000,
40:   options: {
文本生成器 · src/scope/context-manager.ts · Q17

打开固定commit的原文

355:       {},
356:       this.getFrontmatter(this.getMetaData(templatePath)),
357:       contextObj.frontmatter
358:     );
359: 
360:     if (contextOptions.includeClipboard)
361:       try {
362:         blocks["clipboard"] = await this.getClipboard();
363:       } catch {
364:         // empty
365:       }
366: 
367:     const options = {
368:       selection,
369:       selections,
370:       ...blocks["frontmatter"],
371:       ...blocks["headings"],
372:       content: ctnt,
373:       context,
374:       ...blocks,
文本生成器 · src/main.ts · Q20

打开固定commit的原文

664:   encryptAllKeys() {
665:     // check if user have LLMProviderOptionsKeysHashed object (upgrading from older version)
666:     this.settings.LLMProviderOptionsKeysHashed ??= {};
667: 
668:     const keyList: string[] = [];
669: 
670:     this.settings.api_key_encrypted = this.getEncryptedKey(
671:       this.settings.api_key
672:     );
673: 
674:     // get all secret keys
675:     Object.entries(this.settings?.LLMProviderOptions).forEach(([key1, l1]) => {
676:       if (typeof l1 != "object") return;
677:       Object.entries(l1).forEach(([key2, l2]) => {
678:         if (key2.toLowerCase().includes("key") && typeof l2 == "string") {
679:           keyList.push(`${key1}.${key2}`);
680:         }
681:       });
682:     });
683: 
684:     keyList.forEach((pth) => {
685:       const keyval =
686:         (get(this.settings?.LLMProviderOptions, pth) as never as string) || "";
687: 
688:       const encrypted = this.getEncryptedKey(keyval);
689:       this.settings.LLMProviderOptionsKeysHashed[pth] = encrypted;
690:     });
691:   }
692: 
693:   removeApikeys(settings: typeof this.settings): typeof this.settings {
694:     const LLMProviderOptions = JSON.parse(
695:       JSON.stringify(settings?.LLMProviderOptions)
696:     ) as typeof this.settings.LLMProviderOptions;
697: 
698:     // get all secret keys
699:     Object.entries(LLMProviderOptions).forEach(([key1, l1]) => {
700:       if (typeof l1 != "object") return;
701:       Object.entries(l1).forEach(([key2, l2]) => {
702:         if (key2.toLowerCase().includes("key") && typeof l2 == "string") {
703:           set(LLMProviderOptions, `${key1}.${key2}`, "");
704:         }
705:       });
706:     });
707: 
708:     return {
709:       ...settings,
710:       api_key: "",
711:       LLMProviderOptions,
712:     };
文本生成器 · src/main.ts · Q21

打开固定commit的原文

742:   getEncryptedKey(apiKey: string) {
743:     if (!safeStorage?.isEncryptionAvailable() || !this.settings.encrypt_keys) {
744:       return `${DecryptKeyPrefix}${apiKey}`;
745:     }
746: 
747:     return safeStorage.encryptString(apiKey) as Buffer;
748:   }
749: 
文本生成器 · src/constants.ts · Q22

打开固定commit的原文

35:   custom_header: true,
36: };
37: 
38: export const DecryptKeyPrefix = "__@#key_prefix#@__";
39: 

通过这个比较没有确认的事情

插件的安装、激活、设置GUI、生成、对模型/API的调用、实键、发送packet、依赖整体的network audit、provider backend的保留、学习、删除方针的遵守没有确认。 SimpleMemo的输入、配送、AI标签、同步、不同终端的行为、速度、生产力、流入、AI引用的效果也不适用。

写作是SimpleMemo Developer。 在YURIKA, K.K.运营的本网站的资料比较中,不是Obsidian官方的认证和各插件的privacy认证。