Obsidian / AI 플러그인의 데이터 경로

공식 자료·고정 소스로 확인

Obsidian×AI 플러그인의 현재 위치
할 수 있는 일·위험한 일【2026】

이 페이지는 일본어 원문을 기계 번역한 것입니다. 일본어 원문 보기

노트의 어느 부분이, 어떤 기능에서, 어디로 전달되는지. Copilot·Smart Connections·Text Generator의 고정판을 읽고, 자료에서 알 수 있는 것과 실제 통신의 미확인 부분을 비교합니다.

선택하기 전에 보는 것은 모델·문맥·색인·추가 기능

“로컬 대응”이라는 한 단어만으로는 플러그인 전체의 전송 대상이 정해지지 않습니다. 모델에 전달되는 노트의 발췌, 인덱스를 만드는 위치, 웹 검색 및 문서 변환 서비스, 진단·업데이트 확인을 구분하여 확인합니다.

  1. 모델프로바이더·엔드포인트·에이전트
  2. 참조하는 문맥선택문·발췌·템플릿
  3. 색인·검색로컬인지 다른 서버인지
  4. 추가 기능웹·문서 변환·진단·업데이트

이 도표는 공식 자료를 읽기 위한 정리입니다. 실제 통신 기록이 아닙니다. 비교는 고정된 자료와 소스 확인이며, 설정 화면 조작 및 실제 요청·제공자의 운영 감사는 포함되지 않습니다.

먼저 아래 표에서 사용할 기능의 경로를 확인해 주세요. 표에 있는 「소스」는 코드에서 읽을 수 있는 상수와 분기를 의미하고, 「제공자 설명」은 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 검색·문서 변환·프로젝트 컨텍스트는 추가 경로를 확인합니다. Q03 / Q05소스:SecretStorage의 유무를 확인하는 getter. enableMiyo=false, activeBackend=opencode 등의 초기 상수. 실제 저장 및 현행 GUI는 확인되지 않았습니다. Q07 / Q08 / Q09실제 페이로드, 인덱스 대상, 단말기의 키 저장·암호화, 백엔드 유지·비학습 방침 준수. 자기 선택 진단 ZIP 업로드는 일반적으로 request와 구분됩니다.
스마트 연결
4.7.2
제공자 설명:임베디드 로컬 임베딩 모델을 안내합니다. API 키가 필요 없는 인덱스 생성에 대해 설명하고 있습니다. Q10 / Q11README는 enable 후에 Vault의 인덱스를 만든다고 설명합니다. 설정·모델의 일부는 외부에 의존합니다. 전체 구성의 데이터 경로가 완전히 읽어지지 않았습니다.소스:GitHub latest-release에 대한 GET와, 최초 안내에 전달되는 URL이 있습니다. Local embedding이라는 설명만으로는 전체 통신이 없다고 판단할 수 없습니다. Q12 / Q13실제 인덱스·모델 획득, 의존 전체, 실제 통신 및 페이로드, 대체 모델, 키 스토리지, 텔레메트리/보유 전체.
텍스트 생성기
0.8.7
소스 초기값:OpenAI Chat (Langchain)、https://api.openai.com/v1、key는 비어 있습니다。 Ollama provider는 설정한 basePath를 받습니다. Q15 / Q23 / Q24includeClipboard=true으로 값을 가져올 수 있는 분기. 초기 템플릿은 title·starredBlocks·tg_selection입니다. 실제 프롬프트에 들어가는 값은 별도로 확인이 필요합니다. Q15 / Q17소스 초기값:encrypt_keys=false. 암호화가 불가능하거나 무효인 경우 고정 프리픽스와 입력 키를 반환하는 분기. Plain key 항목이 비어 있어도 암호화된 것으로 판단할 수 없습니다. Q15 / Q19 / Q20 / Q21 / Q22실제 페이로드, 현행 GUI, 단말기의 암호화 결과, 전 기능 통신, 과금·응답 품질, 텔레메트리/유지 전체.

BYOK는 자신의 키와 엔드포인트를 사용하는 방식입니다. '자신의 키를 사용하는 것'과 '처리가 기기 내부에만 머무르는 것'은 별개의 조건입니다.

Copilot:모델을 선택해도, 추가 기능의 경로는 별도로 남습니다

고정 버전 가이드는 hosted·Cloud BYOK·Local BYOK·opencode·Claude·Codex의 처리 대상을 구분하고 있습니다. 예를 들어 Local BYOK 모델이 local endpoint라는 설명이라도, 사용하는 스킬이나 project context에 따라 다른 서비스가 관련될 수 있습니다. Q03

노트의 참조와 Miyo의 인덱스를 구분

자료에는 에이전트가 노트를 읽고, 필요한 부분을 선택 모델의 프롬프트에 넣는 설명이 있습니다. Agent Chat을 열기만 해도 Vault 전체를 업로드하는 동작은 설명되지 않았습니다. Miyo는 로컬 연결과 원격 서버 연결이 있으며, 색인 및 검색 대상을 별도로 선택합니다. 검색으로 찾은 발췌는 모델의 맥락에도 들어갑니다. Local의 인덱스를 사용하는 것만으로는 발췌가 모델 provider에 전달되지 않는다고 말할 수 없습니다. Q03 / Q05

문서 처리도 일률적이지 않습니다. 자료상, Agent Chat의 Miyo 처리는 로컬 CLI를 사용하고, Quick Chat은 연결된 Miyo 서비스를 사용하며, remote인 경우 해당 서버에서 처리합니다. Web·YouTube·binary 파일을 사용하는 saved project context는 hosted project service를 사용할 경우가 있으며, Miyo의 선택과는 별개의 경로입니다. Q03

Self-Host Mode를 통신 차단 보증으로 하지 않음

가이드는 Self-Host Mode에서도 cloud가 비활성화되지 않는다는 것을 명시하고 있습니다. 선택한 Claude·Codex·클라우드 모델 및 검색 provider 등으로 보내는 경로는 남아 있습니다. 사용하고자 하는 기능과 허용되는 처리 대상이 일치하는지 기능별로 확인하기 위한 설정입니다. Q04

키의 getter, 초기 상수, 진단 방침은 각각의 근거에 따라 읽습니다

확인한 KeychainService의 범위는 app.secretStorage의 유무를 확인하고, 없을 경우 오류를 발생시킵니다. 실제로 키를 저장한 결과나 OS 암호화를 검증한 기록이 아닙니다. enableMiyo=false, enableMiyoSearchSkill=false, activeBackend=opencode, debugFullFrames=true는 소스 내 초기값이며, 이전된 설정이나 리더의 GUI 값을 표시하지 않습니다. Q07 / Q08 / Q09

README는 호스팅된 요청의 무작위 UUID와 독자가 선택하여 업로드하는 진단 ZIP을 설명합니다. ZIP의 60일 후 삭제, hosted request의 일시 처리·비보유·비학습은 제공자가 설명하는 방침입니다. 여기서 백엔드 운영을 감사한 것이 아닙니다. debugFullFrames=true만으로 진단 ZIP이 자동으로 전송된다고 판단할 수 없습니다. Q02

Smart Connections: 로컬 임베딩에 대한 설명과 전체 통신의 유무를 구분합니다

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 관련 외부 패키지를 참조하고 있습니다. 이 범위만으로는 “모든 기능이 기기 내에 있다”, “텔레메트리가 없다”, “노트가 반드시 전송된다”고 단정할 수 없습니다. 로컬 인덱스 설명, 업데이트 확인 코드, 미확인 의존성·실통신을 구분하면 추가로 조사 대상을 알 수 있습니다. Q14

Text Generator:문맥 후보와 키 저장 분기를 확인합니다

클립보드를 가져올 수 있는 설정과 실제 프롬프트는 별도

고정 버전의 초기 설정에는 includeClipboard=true이 있으며, context builder는 그 값이 true이면 clipboard를 가져올 수 있는 분기를 가지고 있습니다. 한편, 인용한 초기 템플릿에 있는 것은 title, starredBlocks, tg_selection이며, 클립보드 플레이스홀더가 아닙니다. Q15 / Q17

template, frontmatter, context options, 선택 범위에 따라 해결되는 값이 달라집니다. 사용 가능한 값 목록과 실제 요청에 들어간 값을 동일한 것으로 취급하지 마십시오. 이 코드 확인은 “clipboard가 반드시 전송된다”, “Vault 전체가 항상 전송된다”는 결과가 아닙니다. Q17 / Q18

plain key 열의 빈 문자는 암호화의 증거가 되지 않습니다

초기값은 encrypt_keys=false입니다. 저장 시 plain key 필드를 비우는 처리와 별도의 secret 관련 필드를 준비하는 처리가 있습니다. getEncryptedKey은 암호화를 사용할 수 없거나 encrypt_keys가 비활성화된 경우, 고정 프리픽스와 입력 키를 연결한 값을 반환합니다. 필드 이름에 encrypted/hashed가 포함되어 있더라도, 그것만으로는 암호화된 바이트라고 판단할 수 없습니다. Q15 / Q19 / Q20 / Q21 / Q22

키를 입력하지 않았기 때문에 실제 저장 내용 및 이 단말기의 safeStorage 동작은 확인되지 않았습니다. 키가 포함된 설정 파일이나 진단 기록을 공유하기 전에, plain 필드뿐만 아니라 저장되는 다른 값에도 주목해야 합니다.

초기 provider와 로컬 대응을 구분하여 선택합니다

소스의 초기 공급자는 OpenAI Chat (Langchain)이며, 엔드포인트는 https://api.openai.com/v1입니다. Ollama provider는 설정한 basePath를 수신하는 구현이 있습니다. Local 지원 provider가 있다는 사실만으로는 다른 기능의 처리 대상이나 전체 통신이 없다는 것이 증명되는 것은 아닙니다. Q15 / Q23 / Q24

첨가된 request, automatic suggestions, slash suggestions, JavaScript 실행은 인용한 초기값에서 OFF입니다. 이것들도 현재 GUI의 실제 측정값이 아닙니다. 사용할 템플릿과 저장된 설정을 자신의 환경에서 확인해 주세요. Q15 / Q16

자신의 사용 방법에 맞게 확인할 설정을 결정합니다

하고 싶은 일확인 대상이 비교만으로는 알 수 없는 것
노트를 클라우드 모델로 취급model/provider/endpoint, 선택문·발췌·템플릿, 사용하는 agent/Skill실제 payload, provider의 운용, 청구, 답변 품질
지표를 로컬에서 만들고 싶습니다embedding/index 처리 대상, remote server 설정, 후단 모델, 모델 획득 및 추가 기능전체 기능의 통신 중단, 의존하는 모든 경로, 단말기에서의 실제 색인
키를 저장·공유하는 범위를 알고 싶습니다저장할 필드, 암호화를 사용할 수 없는 분기, 로그/진단/설정 공유 대상해당 단말기의 실제 저장 바이트, 백엔드 유지·삭제 준수

설정을 변경한 후의 상태는 이 표에서 실제 측정한 결과가 아닙니다. 자신의 노트를 사용하기 전에, 어떤 기능을 사용하고 어떤 데이터를 허용 대상에 전달할지 결정하기 위한 읽는 방법으로 사용하십시오.

자주 묻는 질문

로컬 모델을 선택하면 플러그인이 전혀 통신되지 않나요?
모델의 처리 대상과 인덱스·웹 검색·문서 변환·업데이트 확인은 별개의 경로입니다. Copilot의 자료는 추가 기능의 경로를 구분하고, Smart Connections의 자체 코드에는 GitHub 업데이트 확인 GET이 있습니다. 이번 자료 확인에서는 전체 기능이 통신되지 않는 것이나 실제 전송 내용을 확인하지 않았습니다.
Smart Connections는 노트를 외부로 전송합니까?
고정판 README는 임베딩 로컬 모델을 사용하여 임베딩과 인덱스를 만든다고 설명하고 있습니다. 이는 제공자의 설명입니다. 자체 소스에 업데이트 확인 및 최초 안내인 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가 무효인 경우 고정 프리픽스와 입력 키를 반환하는 분기점이 있습니다. 실제 키 저장 및 플랫폼 암호화 동작은 시도하지 않았습니다.
이 기사에서는 AI의 답변 품질 및 요금, iPhone 동작을 비교하고 있습니까?
비교 대상은 고정된 3 버전의 공식 자료와 코드에 표시된 데이터 경로 및 설정입니다. 플러그인 설치, 설정 화면의 실제 조작, 모델 생성, 과금, 실제 통신, iPhone을 포함한 단말기의 동작, 제공자의 저장·비학습 방침 준수를 확인하지 않았습니다.

확인한 버전과 근거의 원문

아래는 2026년 9월 30일 14:25 UTC에 기록된 공식 릴리스와 고정 커밋입니다. 그 시점에 확인한 버전이며, 향후 최신 버전을 보장하지 않습니다. Minimum Obsidian은 manifest의 값입니다. 모바일 지원 플래그에서 실제 단말기의 동작을 추정하고 있지 않습니다.

공식 레지스트리도 2db5da29e67e7600176c8c9450fd1c36c3a6831b에 커밋했습니다. 24 인용·14 파일·579 행에 대해 원본 파일의 bytes/SHA256·행 범위·인용문과 일치함을 확인하고 있습니다. 고정판 자료의 재현성을 확인하기 위한 대조이며, 런타임 프라이버시 인증이 아닙니다.

24건의 고정 인용 및 확인 범위를 JSON에서 읽습니다

주요 설명 및 코드 인용

영어 원문과 코드는 고정 커밋의 해당 범위에 해당합니다. 표의 Q 번호에서 GitHub 원문으로도 진행합니다.

코파일럿 · 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.
코파일럿 · 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.
코파일럿 · 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;
스마트 연결 · 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) {
텍스트 생성기 · 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: {
텍스트 생성기 · 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,
텍스트 생성기 · 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:     };
텍스트 생성기 · 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: 
텍스트 생성기 · src/constants.ts · Q22

고정 커밋의 원문을 엽니다

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

이 비교에서 확인되지 않은 사항

플러그인의 설치, 활성화, 설정 GUI, 생성, 모델/API에 대한 호출, 실제 키, 전송 패킷, 의존 전체에 대한 네트워크 감사, provider backend의 유지·학습·삭제 방침 준수를 확인하지 않았습니다. SimpleMemo의 입력·배송·AI 태그, 동기화, 기기별 동작, 속도·생산성, 유입·AI 인용 효과도 대상에서 제외됩니다.

집필은 SimpleMemo Developer입니다. YURIKA, K.K.가 운영하는 본 사이트의 자료 비교에서는 Obsidian 공식 인증이나 각 플러그인의 프라이버시 인증이 아닙니다.