Obsidian / AIプラグインのデータ経路
公式資料・固定ソースで確認Obsidian×AIプラグインの現在地
できること・危ういこと【2026】
ノートのどの部分が、どの機能から、どこへ渡るのか。Copilot・Smart Connections・Text Generatorの固定版を読み、資料で分かることと実通信の未確認部分を比べます。
選ぶ前に見るのは、モデル・文脈・索引・追加機能
「ローカル対応」という一語だけでは、プラグイン全体の送信先は決まりません。モデルへ渡すノートの抜粋、索引を作る場所、Web検索や文書変換のサービス、診断・更新確認を分けて確認します。
- モデルprovider・endpoint・agent
- 参照する文脈選択文・抜粋・template
- 索引・検索ローカルか別のserverか
- 追加機能Web・文書変換・診断・更新
この図は公式資料を読むための整理です。実際の通信記録ではありません。比較は固定した資料とソースの確認で、設定画面の操作や実リクエスト・提供元の運用監査は含みません。
まず下の表で、使う機能の経路を確かめてください。表中の「ソース」はコードから読めた定数や分岐、「提供元の説明」はREADMEやガイドの記載を表します。
3つの固定版を、送信先と設定で比較する
| 固定版 | 資料に示される経路 | 文脈・索引 | キー・設定の確認 | 残る未確認 |
|---|---|---|---|---|
| Copilot 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と区別。 |
| Smart Connections 4.7.2 | 提供元の説明:組み込みlocal embedding modelを案内。API key不要の索引作成を説明しています。 Q10 / Q11 | READMEはenable後にVaultの索引を作ると説明。設定・modelの一部は外部依存です。全構成のデータ経路は読み切れていません。 | ソース:GitHub latest-releaseへのGETと、初回案内に渡されるURLがあります。local embeddingという説明から、全通信なしとは判断できません。 Q12 / Q13 | 実索引・モデル取得、依存全体、実通信やpayload、代替model、key storage、telemetry/保持の全体。 |
| Text Generator 0.8.7 | ソース初期値:OpenAI Chat (Langchain)、https://api.openai.com/v1、keyは空。Ollama providerは設定したbasePathを受け取ります。 Q15 / Q23 / Q24 | includeClipboard=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全体をuploadする」挙動とは説明されていません。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は、組み込みlocal modelがVaultをindexし、API keyを必要としないと説明しています。関連するノートを見つける仕組みの案内として読めますが、この比較ではモデルを起動して実索引や通信を観測していません。READMEの「private」「offline」やmobileに関する説明も、提供元の主張として扱います。 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保持・削除の遵守 |
設定を変えた後の状態は、この表で実測した結果ではありません。自分のノートを使う前に、どの機能を使い、どのデータを許容する先へ渡すかを決めるための読み方として使ってください。
よくある質問
ローカルモデルを選べば、プラグインは一切通信しませんか?
Smart Connectionsはノートを外部へ送りますか?
Text GeneratorのincludeClipboard=trueは、クリップボードを必ず送る意味ですか?
保存データのapi_keyが空なら、キーは暗号化済みですか?
この記事は、AIの回答品質や料金、iPhone動作を比較していますか?
確認した版と、根拠の原文
以下は2026年9月30日14:25 UTCに記録した公式releaseと固定commitです。「その時点で確認した版」であり、将来の最新版を保証しません。minimum Obsidianはmanifestの値です。mobile対応flagから実端末の動作を推測していません。
- Copilot 4.0.12 · minimum Obsidian 1.11.4 · release · commit 8c56781c43
- Smart Connections 4.7.2 · minimum Obsidian 1.8.7 · release · commit 92e8d56c66
- Text Generator 0.8.7 · minimum Obsidian 1.6.0 · release · commit 4b9ddf8767
公式registryもcommit 2db5da29e67e7600176c8c9450fd1c36c3a6831bへ固定しました。24引用・14ファイル・579行について、原ファイルのbytes/SHA256・行範囲・引用文との一致を確認しています。固定版資料の再現性を確認するための照合で、runtime privacy認証ではありません。
主要な説明とコードの引用
英語の原文とコードは固定commitの該当範囲です。表のQ番号からGitHub原文にも進めます。
Copilot · docs/copilot-plus-and-self-host.md · Q03
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.Copilot · docs/copilot-plus-and-self-host.md · Q04
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.Copilot · src/services/keychainService.ts · Q09
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;Smart Connections · src/main.js · Q13
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) {Text Generator · src/default-settings.ts · Q15
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: {Text Generator · src/scope/context-manager.ts · Q17
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,Text Generator · src/main.ts · Q20
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: };Text Generator · src/main.ts · Q21
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: Text Generator · src/constants.ts · Q22
35: custom_header: true,
36: };
37:
38: export const DecryptKeyPrefix = "__@#key_prefix#@__";
39: この比較で確認していないこと
プラグインのインストール、有効化、設定GUI、生成、モデル/APIへの呼び出し、実キー、送信packet、依存全体のnetwork audit、provider backendの保持・学習・削除方針の遵守は確認していません。SimpleMemoの入力・配送・AIタグ、同期、端末別の挙動、速度・生産性、流入・AI引用の効果も対象外です。
執筆はシンプルメモ開発者。株式会社ユリカが運営する本サイトの資料比較で、Obsidian公式の認定や各プラグインのprivacy認証ではありません。