Plugin SDK reference
Plugin 매니페스트
이 페이지는 네이티브 OpenClaw Plugin 매니페스트 전용입니다.
호환 번들 레이아웃은 Plugin 번들을 참조하세요.
호환 번들 형식은 서로 다른 매니페스트 파일을 사용합니다.
- Codex 번들:
.codex-plugin/plugin.json - Claude 번들:
.claude-plugin/plugin.json또는 매니페스트가 없는 기본 Claude 컴포넌트 레이아웃 - Cursor 번들:
.cursor-plugin/plugin.json
OpenClaw는 이러한 번들 레이아웃도 자동으로 감지하지만, 여기서 설명하는
openclaw.plugin.json 스키마로 검증되지는 않습니다.
호환 번들의 경우 OpenClaw는 현재 번들 메타데이터와 선언된
skill 루트, Claude 명령 루트, Claude 번들 settings.json 기본값,
Claude 번들 LSP 기본값, 그리고 레이아웃이 OpenClaw 런타임 기대사항과 일치할 때
지원되는 hook pack을 읽습니다.
모든 네이티브 OpenClaw Plugin은 Plugin 루트에 openclaw.plugin.json 파일을
반드시 포함해야 합니다. OpenClaw는 이 매니페스트를 사용해 Plugin 코드를 실행하지 않고
구성을 검증합니다. 매니페스트가 없거나 유효하지 않으면 Plugin 오류로 처리되어
구성 검증이 차단됩니다.
전체 Plugin 시스템 가이드를 참조하세요: Plugin. 네이티브 기능 모델과 현재 외부 호환성 지침은 다음을 참조하세요: 기능 모델.
이 파일의 역할
openclaw.plugin.json은 OpenClaw가 Plugin 코드를 로드하기 전에 읽는 메타데이터입니다.
아래의 모든 항목은 Plugin 런타임을 시작하지 않고도 검사할 수 있을 만큼 가벼워야 합니다.
다음 용도로 사용하세요:
- Plugin ID, 구성 검증, 구성 UI 힌트
- 인증, 온보딩, 설정 메타데이터(별칭, 자동 활성화, 제공자 환경 변수, 인증 선택지)
- 컨트롤 플레인 표면의 활성화 힌트
- 모델 패밀리 축약 소유권
- 정적 기능 소유권 스냅샷(
contracts) - 공유
openclaw qa호스트가 검사할 수 있는 QA 러너 메타데이터 - 카탈로그 및 검증 표면에 병합되는 채널별 구성 메타데이터
다음 용도로 사용하지 마세요: 런타임 동작 등록, 코드 진입점 선언,
또는 npm 설치 메타데이터. 이러한 항목은 Plugin 코드와 package.json에 속합니다.
최소 예시
{ "id": "voice-call", "configSchema": { "type": "object", "additionalProperties": false, "properties": {} }}풍부한 예시
{ "id": "openrouter", "name": "OpenRouter", "description": "OpenRouter provider plugin", "version": "1.0.0", "providers": ["openrouter"], "modelSupport": { "modelPrefixes": ["router-"] }, "modelIdNormalization": { "providers": { "openrouter": { "prefixWhenBare": "openrouter" } } }, "providerEndpoints": [ { "endpointClass": "openrouter", "hostSuffixes": ["openrouter.ai"] } ], "providerRequest": { "providers": { "openrouter": { "family": "openrouter" } } }, "cliBackends": ["openrouter-cli"], "syntheticAuthRefs": ["openrouter-cli"], "setup": { "providers": [ { "id": "openrouter", "envVars": ["OPENROUTER_API_KEY"] } ] }, "providerAuthAliases": { "openrouter-coding": "openrouter" }, "channelEnvVars": { "openrouter-chatops": ["OPENROUTER_CHATOPS_TOKEN"] }, "providerAuthChoices": [ { "provider": "openrouter", "method": "api-key", "choiceId": "openrouter-api-key", "choiceLabel": "OpenRouter API key", "groupId": "openrouter", "groupLabel": "OpenRouter", "optionKey": "openrouterApiKey", "cliFlag": "--openrouter-api-key", "cliOption": "--openrouter-api-key <key>", "cliDescription": "OpenRouter API key", "onboardingScopes": ["text-inference"] } ], "uiHints": { "apiKey": { "label": "API key", "placeholder": "sk-or-v1-...", "sensitive": true } }, "configSchema": { "type": "object", "additionalProperties": false, "properties": { "apiKey": { "type": "string" } } }}최상위 필드 참조
| 필드 | 필수 여부 | 유형 | 의미 |
|---|---|---|---|
id |
예 | string |
정식 Plugin id입니다. plugins.entries.<id>에서 사용되는 id입니다. |
configSchema |
예 | object |
이 Plugin 구성에 대한 인라인 JSON Schema입니다. |
requiresPlugins |
아니요 | string[] |
이 Plugin이 효과를 내기 위해 함께 설치되어야 하는 Plugin id입니다. 탐색은 Plugin을 로드 가능 상태로 유지하지만, 필요한 Plugin이 누락되면 경고합니다. |
enabledByDefault |
아니요 | true |
번들 Plugin을 기본적으로 활성화됨으로 표시합니다. 생략하거나 true가 아닌 값을 설정하면 Plugin은 기본적으로 비활성화된 상태로 남습니다. |
enabledByDefaultOnPlatforms |
아니요 | string[] |
예를 들어 ["darwin"]처럼 나열된 Node.js 플랫폼에서만 번들 Plugin을 기본적으로 활성화됨으로 표시합니다. 명시적 구성이 여전히 우선합니다. |
legacyPluginIds |
아니요 | string[] |
이 정식 Plugin id로 정규화되는 레거시 id입니다. |
autoEnableWhenConfiguredProviders |
아니요 | string[] |
auth, 구성 또는 모델 참조에서 언급될 때 이 Plugin을 자동 활성화해야 하는 공급자 id입니다. |
kind |
아니요 | "memory" | "context-engine" |
plugins.slots.*에서 사용하는 배타적 Plugin 종류를 선언합니다. |
channels |
아니요 | string[] |
이 Plugin이 소유한 채널 id입니다. 탐색 및 구성 검증에 사용됩니다. |
providers |
아니요 | string[] |
이 Plugin이 소유한 공급자 id입니다. |
providerCatalogEntry |
아니요 | string |
전체 Plugin 런타임을 활성화하지 않고도 로드할 수 있는 매니페스트 범위의 공급자 카탈로그 메타데이터를 위한, Plugin 루트 기준 경량 공급자 카탈로그 모듈 경로입니다. |
modelSupport |
아니요 | object |
런타임 전에 Plugin을 자동 로드하는 데 사용되는, 매니페스트 소유의 모델 패밀리 메타데이터 축약형입니다. |
modelCatalog |
아니요 | object |
이 Plugin이 소유한 공급자에 대한 선언적 모델 카탈로그 메타데이터입니다. 이는 Plugin 런타임을 로드하지 않고 향후 읽기 전용 목록, 온보딩, 모델 선택기, 별칭 및 억제를 위한 컨트롤 플레인 계약입니다. |
modelPricing |
아니요 | object |
공급자 소유의 외부 가격 조회 정책입니다. 로컬/자체 호스팅 공급자를 원격 가격 카탈로그에서 제외하거나, 코어에 공급자 id를 하드코딩하지 않고 공급자 참조를 OpenRouter/LiteLLM 카탈로그 id에 매핑하는 데 사용합니다. |
modelIdNormalization |
아니요 | object |
공급자 런타임이 로드되기 전에 실행되어야 하는, 공급자 소유의 모델 id 별칭/접두사 정리입니다. |
providerEndpoints |
아니요 | object[] |
공급자 런타임이 로드되기 전에 코어가 분류해야 하는 공급자 라우트용, 매니페스트 소유의 엔드포인트 호스트/baseUrl 메타데이터입니다. |
providerRequest |
아니요 | object |
공급자 런타임이 로드되기 전에 일반 요청 정책에서 사용하는 저비용 공급자 패밀리 및 요청 호환성 메타데이터입니다. |
secretProviderIntegrations |
아니요 | Record<string, object> |
코어에 공급자별 통합을 하드코딩하지 않고 설정 또는 설치 화면에서 제공할 수 있는 선언적 SecretRef exec 공급자 프리셋입니다. |
cliBackends |
아니요 | string[] |
이 Plugin이 소유한 CLI 추론 백엔드 id입니다. 명시적 구성 참조에서 시작 시 자동 활성화하는 데 사용됩니다. |
syntheticAuthRefs |
아니요 | string[] |
런타임이 로드되기 전 콜드 모델 탐색 중에 Plugin 소유의 합성 auth 훅을 검사해야 하는 공급자 또는 CLI 백엔드 참조입니다. |
nonSecretAuthMarkers |
아니요 | string[] |
비밀이 아닌 로컬, OAuth 또는 주변 자격 증명 상태를 나타내는 번들 Plugin 소유의 플레이스홀더 API 키 값입니다. |
commandAliases |
아니요 | object[] |
런타임이 로드되기 전에 Plugin 인식 구성 및 CLI 진단을 생성해야 하는, 이 Plugin이 소유한 명령 이름입니다. |
providerAuthEnvVars |
아니요 | Record<string, string[]> |
공급자 auth/상태 조회를 위한 더 이상 권장되지 않는 호환성 env 메타데이터입니다. 새 Plugin에는 setup.providers[].envVars를 선호하세요. OpenClaw는 지원 중단 기간 동안 이를 계속 읽습니다. |
providerAuthAliases |
아니요 | Record<string, string> |
예를 들어 기본 공급자 API 키와 auth 프로필을 공유하는 코딩 공급자처럼, auth 조회에 다른 공급자 id를 재사용해야 하는 공급자 id입니다. |
channelEnvVars |
아니요 | Record<string, string[]> |
OpenClaw가 Plugin 코드를 로드하지 않고 검사할 수 있는 저비용 채널 env 메타데이터입니다. 일반 시작/구성 헬퍼가 확인해야 하는 env 기반 채널 설정 또는 auth 화면에 사용합니다. |
providerAuthChoices |
아니요 | object[] |
온보딩 선택기, 선호 공급자 해석 및 단순 CLI 플래그 연결에 사용하는 저비용 auth 선택 메타데이터입니다. |
activation |
아니요 | object |
시작, 공급자, 명령, 채널, 라우트 및 기능 트리거 로딩을 위한 저비용 활성화 플래너 메타데이터입니다. 메타데이터일 뿐이며, 실제 동작은 여전히 Plugin 런타임이 소유합니다. |
setup |
아니요 | object |
탐색 및 설정 화면이 Plugin 런타임을 로드하지 않고 검사할 수 있는 저비용 설정/온보딩 설명자입니다. |
qaRunners |
아니요 | object[] |
Plugin 런타임이 로드되기 전에 공유 openclaw qa 호스트가 사용하는 저비용 QA 러너 설명자입니다. |
contracts |
아니요 | object |
외부 auth 훅, 임베딩, 음성, 실시간 전사, 실시간 음성, 미디어 이해, 이미지 생성, 음악 생성, 비디오 생성, 웹 가져오기, 웹 검색 및 도구 소유권에 대한 정적 기능 소유권 스냅샷입니다. |
mediaUnderstandingProviderMetadata |
아니요 | Record<string, object> |
contracts.mediaUnderstandingProviders에 선언된 공급자 id에 대한 저비용 미디어 이해 기본값입니다. |
imageGenerationProviderMetadata |
아니요 | Record<string, object> |
contracts.imageGenerationProviders에 선언된 공급자 id에 대한 저비용 이미지 생성 auth 메타데이터로, 공급자 소유 auth 별칭 및 base-url 가드를 포함합니다. |
videoGenerationProviderMetadata |
아니요 | Record<string, object> |
contracts.videoGenerationProviders에 선언된 공급자 id에 대한 저비용 비디오 생성 auth 메타데이터로, 공급자 소유 auth 별칭 및 base-url 가드를 포함합니다. |
musicGenerationProviderMetadata |
아니요 | Record<string, object> |
contracts.musicGenerationProviders에 선언된 공급자 id에 대한 저비용 음악 생성 auth 메타데이터로, 공급자 소유 auth 별칭 및 base-url 가드를 포함합니다. |
toolMetadata |
아니요 | Record<string, object> |
contracts.tools에 선언된 Plugin 소유 도구의 저비용 가용성 메타데이터입니다. config, env 또는 auth 증거가 있는 경우가 아니면 도구가 런타임을 로드하지 않아야 할 때 사용합니다. |
channelConfigs |
아니요 | Record<string, object> |
런타임이 로드되기 전에 검색 및 검증 표면에 병합되는 매니페스트 소유 채널 config 메타데이터입니다. |
skills |
아니요 | string[] |
Plugin 루트를 기준으로 로드할 Skills 디렉터리입니다. |
name |
아니요 | string |
사람이 읽기 쉬운 Plugin 이름입니다. |
description |
아니요 | string |
Plugin 표면에 표시되는 짧은 요약입니다. |
icon |
아니요 | string |
마켓플레이스/카탈로그 카드용 HTTPS 이미지 URL입니다. ClawHub는 유효한 모든 https:// URL을 허용하며, 이 값이 생략되었거나 유효하지 않으면 기본 Plugin 아이콘으로 대체합니다. |
version |
아니요 | string |
정보 제공용 Plugin 버전입니다. |
uiHints |
아니요 | Record<string, object> |
config 필드의 UI 레이블, 플레이스홀더 및 민감도 힌트입니다. |
생성 provider 메타데이터 참조
생성 provider 메타데이터 필드는 일치하는 contracts.*GenerationProviders 목록에 선언된 provider의 정적 인증 신호를 설명합니다.
OpenClaw는 provider 런타임이 로드되기 전에 이 필드를 읽어, 모든 provider Plugin을 가져오지 않고도 코어 도구가 생성 provider의 사용 가능 여부를 결정할 수 있게 합니다.
이 필드는 저렴한 선언적 사실에만 사용하세요. 전송, 요청 변환, 토큰 갱신, 자격 증명 검증, 실제 생성 동작은 Plugin 런타임에 남겨 둡니다.
{ "contracts": { "imageGenerationProviders": ["example-image"] }, "imageGenerationProviderMetadata": { "example-image": { "aliases": ["example-image-oauth"], "authProviders": ["example-image"], "configSignals": [ { "rootPath": "plugins.entries.example-image.config", "overlayPath": "image", "mode": { "path": "mode", "default": "local", "allowed": ["local"] }, "requiredAny": ["workflow", "workflowPath"], "required": ["promptNodeId"] } ], "authSignals": [ { "provider": "example-image" }, { "provider": "example-image-oauth", "providerBaseUrl": { "provider": "example-image", "defaultBaseUrl": "https://api.example.com/v1", "allowedBaseUrls": ["https://api.example.com/v1"] } } ] } }}각 메타데이터 항목은 다음을 지원합니다.
| 필드 | 필수 여부 | 유형 | 의미 |
|---|---|---|---|
aliases |
아니요 | string[] |
생성 provider의 정적 인증 별칭으로 간주해야 하는 추가 provider ID입니다. |
authProviders |
아니요 | string[] |
구성된 인증 프로필이 이 생성 provider의 인증으로 간주되어야 하는 provider ID입니다. |
configSignals |
아니요 | object[] |
인증 프로필이나 env var 없이 구성할 수 있는 로컬 또는 자체 호스팅 provider에 대한 저렴한 구성 전용 사용 가능 신호입니다. |
authSignals |
아니요 | object[] |
명시적 인증 신호입니다. 존재하는 경우 provider ID, aliases, authProviders에서 나온 기본 신호 집합을 대체합니다. |
referenceAudioInputs |
아니요 | boolean |
비디오 생성 전용입니다. provider가 참조 오디오 자산을 허용하면 true로 설정하세요. 그렇지 않으면 video_generate가 오디오 참조 매개변수를 숨깁니다. |
각 configSignals 항목은 다음을 지원합니다.
| 필드 | 필수 여부 | 유형 | 의미 |
|---|---|---|---|
rootPath |
예 | string |
검사할 Plugin 소유 구성 객체의 점 경로입니다. 예: plugins.entries.example.config. |
overlayPath |
아니요 | string |
신호를 평가하기 전에 루트 객체 위에 오버레이해야 하는, 루트 구성 내부 객체의 점 경로입니다. image, video, music 같은 기능별 구성에 사용하세요. |
overlayMapPath |
아니요 | string |
각 객체 값이 루트 객체 위에 오버레이되어야 하는, 루트 구성 내부 객체의 점 경로입니다. 구성된 계정이 하나라도 있으면 충족되는 accounts 같은 이름 있는 계정 맵에 사용하세요. |
required |
아니요 | string[] |
구성된 값이 있어야 하는 유효 구성 내부의 점 경로입니다. 문자열은 비어 있지 않아야 하고, 객체와 배열도 비어 있으면 안 됩니다. |
requiredAny |
아니요 | string[] |
하나 이상에 구성된 값이 있어야 하는 유효 구성 내부의 점 경로입니다. |
mode |
아니요 | object |
유효 구성 내부의 선택적 문자열 모드 가드입니다. 구성 전용 사용 가능 여부가 특정 모드에만 적용될 때 사용하세요. |
각 mode 가드는 다음을 지원합니다.
| 필드 | 필수 여부 | 유형 | 의미 |
|---|---|---|---|
path |
아니요 | string |
유효 구성 내부의 점 경로입니다. 기본값은 mode입니다. |
default |
아니요 | string |
구성에서 해당 경로를 생략했을 때 사용할 모드 값입니다. |
allowed |
아니요 | string[] |
존재하는 경우, 유효 모드가 이 값 중 하나일 때만 신호가 통과합니다. |
disallowed |
아니요 | string[] |
존재하는 경우, 유효 모드가 이 값 중 하나이면 신호가 실패합니다. |
각 authSignals 항목은 다음을 지원합니다.
| 필드 | 필수 여부 | 유형 | 의미 |
|---|---|---|---|
provider |
예 | string |
구성된 인증 프로필에서 확인할 provider ID입니다. |
providerBaseUrl |
아니요 | object |
참조된 구성 provider가 허용된 기본 URL을 사용할 때만 신호가 인정되게 하는 선택적 가드입니다. 인증 별칭이 특정 API에만 유효할 때 사용하세요. |
각 providerBaseUrl 가드는 다음을 지원합니다.
| 필드 | 필수 여부 | 유형 | 의미 |
|---|---|---|---|
provider |
예 | string |
baseUrl을 확인해야 하는 provider 구성 ID입니다. |
defaultBaseUrl |
아니요 | string |
provider 구성에서 baseUrl을 생략했을 때 가정할 기본 URL입니다. |
allowedBaseUrls |
예 | string[] |
이 인증 신호에 허용되는 기본 URL입니다. 구성된 기본 URL이나 기본값의 기본 URL이 이 정규화된 값 중 하나와 일치하지 않으면 신호가 무시됩니다. |
도구 메타데이터 참조
toolMetadata는 도구 이름을 키로 하여 생성 provider 메타데이터와 동일한 configSignals 및 authSignals 형태를 사용합니다. contracts.tools는 소유권을 선언합니다. toolMetadata는 저렴한 사용 가능 증거를 선언하여, 도구 팩토리가 null을 반환하게 하려고 OpenClaw가 Plugin 런타임을 가져오는 일을 피할 수 있게 합니다.
{ "setup": { "providers": [ { "id": "example", "envVars": ["EXAMPLE_API_KEY"] } ] }, "contracts": { "tools": ["example_search"] }, "toolMetadata": { "example_search": { "authSignals": [ { "provider": "example" } ], "configSignals": [ { "rootPath": "plugins.entries.example.config", "overlayPath": "search", "required": ["apiKey"] } ] } }}도구에 toolMetadata가 없으면 OpenClaw는 기존 동작을 보존하고, 도구 계약이 정책과 일치할 때 소유 Plugin을 로드합니다. 팩토리가 인증/구성에 의존하는 핫 경로 도구의 경우, Plugin 작성자는 코어가 런타임을 가져와서 물어보게 하는 대신 toolMetadata를 선언해야 합니다.
providerAuthChoices 참조
각 providerAuthChoices 항목은 하나의 온보딩 또는 인증 선택지를 설명합니다.
OpenClaw는 provider 런타임이 로드되기 전에 이를 읽습니다.
Provider 설정 목록은 provider 런타임을 로드하지 않고 이러한 매니페스트 선택지, 디스크립터에서 파생된 설정 선택지, 설치 카탈로그 메타데이터를 사용합니다.
| 필드 | 필수 | 유형 | 의미 |
|---|---|---|---|
provider |
예 | string |
이 선택지가 속한 Provider ID. |
method |
예 | string |
디스패치할 인증 메서드 ID. |
choiceId |
예 | string |
온보딩 및 CLI 흐름에서 사용되는 안정적인 인증 선택지 ID. |
choiceLabel |
아니요 | string |
사용자에게 표시되는 레이블. 생략하면 OpenClaw는 choiceId로 대체합니다. |
choiceHint |
아니요 | string |
선택기에 표시되는 짧은 도움말 텍스트. |
assistantPriority |
아니요 | number |
값이 낮을수록 어시스턴트 기반 대화형 선택기에서 더 먼저 정렬됩니다. |
assistantVisibility |
아니요 | "visible" | "manual-only" |
수동 CLI 선택은 계속 허용하면서 어시스턴트 선택기에서는 해당 선택지를 숨깁니다. |
deprecatedChoiceIds |
아니요 | string[] |
사용자를 이 대체 선택지로 리디렉션해야 하는 레거시 선택지 ID. |
groupId |
아니요 | string |
관련 선택지를 그룹화하기 위한 선택적 그룹 ID. |
groupLabel |
아니요 | string |
해당 그룹에 대해 사용자에게 표시되는 레이블. |
groupHint |
아니요 | string |
그룹에 대한 짧은 도움말 텍스트. |
optionKey |
아니요 | string |
단순한 단일 플래그 인증 흐름을 위한 내부 옵션 키. |
cliFlag |
아니요 | string |
--openrouter-api-key 같은 CLI 플래그 이름. |
cliOption |
아니요 | string |
--openrouter-api-key <key> 같은 전체 CLI 옵션 형태. |
cliDescription |
아니요 | string |
CLI 도움말에 사용되는 설명. |
onboardingScopes |
아니요 | Array<"text-inference" | "image-generation" | "music-generation"> |
이 선택지가 표시되어야 하는 온보딩 화면. 생략하면 기본값은 ["text-inference"]입니다. |
commandAliases 참조
Plugin이 사용자가 실수로 plugins.allow에 넣거나 루트 CLI 명령으로
실행하려 할 수 있는 런타임 명령 이름을 소유할 때 commandAliases를
사용하세요. OpenClaw는 Plugin 런타임 코드를 가져오지 않고도 진단에 이
메타데이터를 사용합니다.
{ "commandAliases": [ { "name": "dreaming", "kind": "runtime-slash", "cliCommand": "memory" } ]}| 필드 | 필수 | 유형 | 의미 |
|---|---|---|---|
name |
예 | string |
이 Plugin에 속한 명령 이름. |
kind |
아니요 | "runtime-slash" |
별칭을 루트 CLI 명령이 아니라 채팅 슬래시 명령으로 표시합니다. |
cliCommand |
아니요 | string |
CLI 작업에 제안할 관련 루트 CLI 명령이 있는 경우 해당 명령입니다. |
activation 참조
Plugin이 어떤 제어 플레인 이벤트에 자신을 활성화/로드 계획에 포함해야
하는지 저렴하게 선언할 수 있을 때 activation을 사용하세요.
이 블록은 수명 주기 API가 아니라 플래너 메타데이터입니다. 런타임 동작을
등록하지 않으며, register(...)를 대체하지 않고, Plugin 코드가 이미
실행되었음을 보장하지도 않습니다. 활성화 플래너는 기존 매니페스트 소유권
메타데이터인 providers, channels, commandAliases, setup.providers,
contracts.tools, 훅으로 폴백하기 전에 이 필드를 사용해 후보 Plugin
범위를 좁힙니다.
이미 소유권을 설명하는 가장 좁은 메타데이터를 선호하세요. 해당 필드가
관계를 표현할 수 있다면 providers, channels, commandAliases, 설정
설명자 또는 contracts를 사용하세요. 소유권 필드로 표현할 수 없는 추가
플래너 힌트에는 activation을 사용하세요.
claude-cli, my-cli, google-gemini-cli 같은 CLI 런타임 별칭에는
최상위 cliBackends를 사용하세요. activation.onAgentHarnesses는 이미
소유권 필드가 없는 내장 에이전트 하네스 ID에만 사용합니다.
이 블록은 메타데이터 전용입니다. 런타임 동작을 등록하지 않으며
register(...), setupEntry 또는 다른 런타임/Plugin 진입점을 대체하지
않습니다. 현재 소비자는 더 넓은 Plugin 로드 전에 범위를 좁히는 힌트로
사용하므로, 시작이 아닌 활성화 메타데이터가 누락되어도 일반적으로 성능
비용만 발생합니다. 매니페스트 소유권 폴백이 남아 있는 동안에는 정확성이
바뀌지 않아야 합니다.
모든 Plugin은 activation.onStartup을 의도적으로 설정해야 합니다. Plugin이
Gateway 시작 중에 반드시 실행되어야 할 때만 true로 설정하세요. 시작 시
비활성이며 더 좁은 트리거에서만 로드되어야 하는 경우 false로 설정하세요.
onStartup을 생략해도 더 이상 Plugin을 암시적으로 시작 시 로드하지
않습니다. 시작, 채널, 구성, 에이전트 하네스, 메모리 또는 다른 더 좁은
활성화 트리거에는 명시적인 활성화 메타데이터를 사용하세요.
{ "activation": { "onStartup": false, "onProviders": ["openai"], "onCommands": ["models"], "onChannels": ["web"], "onRoutes": ["gateway-webhook"], "onConfigPaths": ["browser"], "onCapabilities": ["provider", "tool"] }}| 필드 | 필수 | 유형 | 의미 |
|---|---|---|---|
onStartup |
아니요 | boolean |
명시적인 Gateway 시작 활성화입니다. 모든 Plugin은 이를 설정해야 합니다. true는 시작 중 Plugin을 가져오고, false는 일치하는 다른 트리거가 로드를 요구하지 않는 한 시작 시 지연 로드 상태로 둡니다. |
onProviders |
아니요 | string[] |
이 Plugin을 활성화/로드 계획에 포함해야 하는 Provider ID. |
onAgentHarnesses |
아니요 | string[] |
이 Plugin을 활성화/로드 계획에 포함해야 하는 내장 에이전트 하네스 런타임 ID. CLI 백엔드 별칭에는 최상위 cliBackends를 사용하세요. |
onCommands |
아니요 | string[] |
이 Plugin을 활성화/로드 계획에 포함해야 하는 명령 ID. |
onChannels |
아니요 | string[] |
이 Plugin을 활성화/로드 계획에 포함해야 하는 채널 ID. |
onRoutes |
아니요 | string[] |
이 Plugin을 활성화/로드 계획에 포함해야 하는 라우트 종류. |
onConfigPaths |
아니요 | string[] |
경로가 존재하고 명시적으로 비활성화되지 않은 경우 이 Plugin을 시작/로드 계획에 포함해야 하는 루트 기준 구성 경로. |
onCapabilities |
아니요 | Array<"provider" | "channel" | "tool" | "hook"> |
제어 플레인 활성화 계획에서 사용하는 넓은 기능 힌트. 가능하면 더 좁은 필드를 선호하세요. |
현재 라이브 소비자:
- Gateway 시작 계획은 명시적 시작 가져오기에
activation.onStartup을 사용합니다. - 명령으로 트리거되는 CLI 계획은 레거시
commandAliases[].cliCommand또는commandAliases[].name으로 폴백합니다. - 에이전트 런타임 시작 계획은 내장 하네스에
activation.onAgentHarnesses를, CLI 런타임 별칭에 최상위cliBackends[]를 사용합니다. - 채널로 트리거되는 설정/채널 계획은 명시적 채널 활성화 메타데이터가
없을 때 레거시
channels[]소유권으로 폴백합니다. - 시작 Plugin 계획은 번들 브라우저 Plugin의
browser블록 같은 비채널 루트 구성 표면에activation.onConfigPaths를 사용합니다. - Provider로 트리거되는 설정/런타임 계획은 명시적 Provider 활성화
메타데이터가 없을 때 레거시
providers[]및 최상위cliBackends[]소유권으로 폴백합니다.
플래너 진단은 명시적 활성화 힌트와 매니페스트 소유권 폴백을 구분할 수
있습니다. 예를 들어 activation-command-hint는 activation.onCommands가
일치했음을 의미하고, manifest-command-alias는 플래너가 대신
commandAliases 소유권을 사용했음을 의미합니다. 이러한 이유 레이블은
호스트 진단 및 테스트를 위한 것입니다. Plugin 작성자는 소유권을 가장 잘
설명하는 메타데이터를 계속 선언해야 합니다.
qaRunners 참조
Plugin이 공유 openclaw qa 루트 아래에 하나 이상의 전송 러너를 제공할 때
qaRunners를 사용하세요. 이 메타데이터는 저렴하고 정적으로 유지하세요.
실제 CLI 등록은 여전히 qaRunnerCliRegistrations를 내보내는 가벼운
runtime-api.ts 표면을 통해 Plugin 런타임이 소유합니다.
{ "qaRunners": [ { "commandName": "matrix", "description": "Run the Docker-backed Matrix live QA lane against a disposable homeserver" } ]}| 필드 | 필수 | 유형 | 의미 |
|---|---|---|---|
commandName |
예 | string |
openclaw qa 아래에 마운트되는 하위 명령입니다. 예: matrix. |
description |
아니요 | string |
공유 호스트에 스텁 명령이 필요할 때 사용되는 대체 도움말 텍스트입니다. |
setup 참조
런타임이 로드되기 전에 설정 및 온보딩 표면에 저비용 Plugin 소유 메타데이터가
필요할 때 setup을 사용하세요.
{ "setup": { "providers": [ { "id": "openai", "authMethods": ["api-key"], "envVars": ["OPENAI_API_KEY"], "authEvidence": [ { "type": "local-file-with-env", "fileEnvVar": "OPENAI_CREDENTIALS_FILE", "requiresAllEnv": ["OPENAI_PROJECT"], "credentialMarker": "openai-local-credentials", "source": "openai local credentials" } ] } ], "cliBackends": ["openai-cli"], "configMigrations": ["legacy-openai-auth"], "requiresRuntime": false }}최상위 cliBackends는 계속 유효하며 CLI 추론 백엔드를 계속 설명합니다.
setup.cliBackends는 메타데이터 전용으로 유지되어야 하는 제어 플레인/설정
흐름을 위한 설정 전용 설명자 표면입니다.
존재하는 경우 setup.providers 및 setup.cliBackends는 설정 검색을 위한
권장 설명자 우선 조회 표면입니다. 설명자가 후보 Plugin만 좁히고 설정에
여전히 더 풍부한 설정 시점 런타임 훅이 필요한 경우, requiresRuntime: true를
설정하고 대체 실행 경로로 setup-api를 유지하세요.
OpenClaw는 범용 공급자 인증 및 환경 변수 조회에도 setup.providers[].envVars를
포함합니다. providerAuthEnvVars는 지원 중단 기간 동안 호환성 어댑터를 통해
계속 지원되지만, 이를 계속 사용하는 번들 외 Plugin은 매니페스트 진단을
받습니다. 새 Plugin은 설정/상태 환경 메타데이터를 setup.providers[].envVars에
두어야 합니다.
설정 항목이 없거나 setup.requiresRuntime: false가 설정 런타임이 필요하지
않다고 선언하는 경우, OpenClaw는 setup.providers[].authMethods에서 간단한
설정 선택지도 도출할 수 있습니다. 사용자 지정 레이블, CLI 플래그, 온보딩 범위,
어시스턴트 메타데이터에는 명시적인 providerAuthChoices 항목이 계속
권장됩니다.
해당 설명자만으로 설정 표면에 충분할 때만 requiresRuntime: false를
설정하세요. OpenClaw는 명시적인 false를 설명자 전용 계약으로 취급하며
설정 조회를 위해 setup-api 또는 openclaw.setupEntry를 실행하지 않습니다.
설명자 전용 Plugin이 이러한 설정 런타임 항목 중 하나를 여전히 제공하는 경우,
OpenClaw는 추가 진단을 보고하고 계속 무시합니다. requiresRuntime를 생략하면
설명자를 플래그 없이 추가한 기존 Plugin이 중단되지 않도록 레거시 대체 동작을
유지합니다.
설정 조회는 Plugin 소유 setup-api 코드를 실행할 수 있으므로, 정규화된
setup.providers[].id 및 setup.cliBackends[] 값은 검색된 Plugin 전체에서
고유하게 유지되어야 합니다. 소유권이 모호하면 검색 순서에서 승자를 고르는 대신
닫힌 상태로 실패합니다.
설정 런타임이 실행될 때, setup-api가 매니페스트 설명자에 선언되지 않은
공급자 또는 CLI 백엔드를 등록하거나, 설명자에 일치하는 런타임 등록이 없는 경우
설정 레지스트리 진단은 설명자 드리프트를 보고합니다. 이러한 진단은 추가적이며
레거시 Plugin을 거부하지 않습니다.
setup.providers 참조
| 필드 | 필수 | 유형 | 의미 |
|---|---|---|---|
id |
예 | string |
설정 또는 온보딩 중 노출되는 공급자 ID입니다. 정규화된 ID를 전역적으로 고유하게 유지하세요. |
authMethods |
아니요 | string[] |
전체 런타임을 로드하지 않고 이 공급자가 지원하는 설정/인증 메서드 ID입니다. |
envVars |
아니요 | string[] |
Plugin 런타임이 로드되기 전에 범용 설정/상태 표면에서 확인할 수 있는 환경 변수입니다. |
authEvidence |
아니요 | object[] |
비밀이 아닌 마커로 인증할 수 있는 공급자를 위한 저비용 로컬 인증 증거 확인입니다. |
authEvidence는 런타임 코드를 로드하지 않고 검증할 수 있는 공급자 소유 로컬
자격 증명 마커를 위한 것입니다. 이러한 확인은 저비용이고 로컬이어야 합니다:
네트워크 호출 없음, 키체인 또는 비밀 관리자 읽기 없음, 셸 명령 없음, 공급자 API
프로브 없음.
지원되는 증거 항목:
| 필드 | 필수 | 유형 | 의미 |
|---|---|---|---|
type |
예 | string |
현재는 local-file-with-env입니다. |
fileEnvVar |
아니요 | string |
명시적인 자격 증명 파일 경로를 포함하는 환경 변수입니다. |
fallbackPaths |
아니요 | string[] |
fileEnvVar가 없거나 비어 있을 때 확인하는 로컬 자격 증명 파일 경로입니다. ${HOME} 및 ${APPDATA}를 지원합니다. |
requiresAnyEnv |
아니요 | string[] |
증거가 유효하려면 나열된 환경 변수 중 하나 이상이 비어 있지 않아야 합니다. |
requiresAllEnv |
아니요 | string[] |
증거가 유효하려면 나열된 모든 환경 변수가 비어 있지 않아야 합니다. |
credentialMarker |
예 | string |
증거가 있을 때 반환되는 비밀이 아닌 마커입니다. |
source |
아니요 | string |
인증/상태 출력에 표시되는 사용자 대상 소스 레이블입니다. |
setup 필드
| 필드 | 필수 | 유형 | 의미 |
|---|---|---|---|
providers |
아니요 | object[] |
설정 및 온보딩 중 노출되는 공급자 설정 설명자입니다. |
cliBackends |
아니요 | string[] |
설명자 우선 설정 조회에 사용되는 설정 시점 백엔드 ID입니다. 정규화된 ID를 전역적으로 고유하게 유지하세요. |
configMigrations |
아니요 | string[] |
이 Plugin의 설정 표면이 소유하는 구성 마이그레이션 ID입니다. |
requiresRuntime |
아니요 | boolean |
설명자 조회 후 설정에 여전히 setup-api 실행이 필요한지 여부입니다. |
uiHints 참조
uiHints는 구성 필드 이름에서 작은 렌더링 힌트로의 맵입니다.
{ "uiHints": { "apiKey": { "label": "API key", "help": "Used for OpenRouter requests", "placeholder": "sk-or-v1-...", "sensitive": true } }}각 필드 힌트에는 다음이 포함될 수 있습니다:
| 필드 | 유형 | 의미 |
|---|---|---|
label |
string |
사용자 대상 필드 레이블입니다. |
help |
string |
짧은 도움말 텍스트입니다. |
tags |
string[] |
선택적 UI 태그입니다. |
advanced |
boolean |
필드를 고급으로 표시합니다. |
sensitive |
boolean |
필드를 비밀 또는 민감 정보로 표시합니다. |
placeholder |
string |
폼 입력의 자리표시자 텍스트입니다. |
contracts 참조
OpenClaw가 Plugin 런타임을 가져오지 않고 읽을 수 있는 정적 기능 소유권
메타데이터에만 contracts를 사용하세요.
{ "contracts": { "agentToolResultMiddleware": ["openclaw", "codex"], "trustedToolPolicies": ["workflow-budget"], "externalAuthProviders": ["acme-ai"], "embeddingProviders": ["openai-compatible"], "speechProviders": ["openai"], "realtimeTranscriptionProviders": ["openai"], "realtimeVoiceProviders": ["openai"], "memoryEmbeddingProviders": ["local"], "mediaUnderstandingProviders": ["openai"], "imageGenerationProviders": ["openai"], "videoGenerationProviders": ["qwen"], "webFetchProviders": ["firecrawl"], "webSearchProviders": ["gemini"], "migrationProviders": ["hermes"], "gatewayMethodDispatch": ["authenticated-request"], "tools": ["firecrawl_search", "firecrawl_scrape"] }}각 목록은 선택 사항입니다:
| 필드 | 유형 | 의미 |
|---|---|---|
embeddedExtensionFactories |
string[] |
Codex app-server 확장 팩터리 ID이며, 현재는 codex-app-server입니다. |
agentToolResultMiddleware |
string[] |
이 Plugin이 도구 결과 미들웨어를 등록할 수 있는 런타임 ID입니다. |
trustedToolPolicies |
string[] |
설치된 Plugin이 등록할 수 있는 Plugin 로컬 신뢰된 사전 도구 정책 ID입니다. 번들 Plugin은 이 필드 없이 정책을 등록할 수 있습니다. |
externalAuthProviders |
string[] |
이 Plugin이 외부 인증 프로필 훅을 소유하는 제공자 ID입니다. |
embeddingProviders |
string[] |
이 Plugin이 메모리를 포함한 재사용 가능한 벡터 임베딩 용도로 소유하는 일반 임베딩 제공자 ID입니다. |
speechProviders |
string[] |
이 Plugin이 소유하는 음성 제공자 ID입니다. |
realtimeTranscriptionProviders |
string[] |
이 Plugin이 소유하는 실시간 전사 제공자 ID입니다. |
realtimeVoiceProviders |
string[] |
이 Plugin이 소유하는 실시간 음성 제공자 ID입니다. |
memoryEmbeddingProviders |
string[] |
이 Plugin이 소유하는 더 이상 권장되지 않는 메모리 전용 임베딩 제공자 ID입니다. |
mediaUnderstandingProviders |
string[] |
이 Plugin이 소유하는 미디어 이해 제공자 ID입니다. |
transcriptSourceProviders |
string[] |
이 Plugin이 소유하는 대화 기록 소스 제공자 ID입니다. |
imageGenerationProviders |
string[] |
이 Plugin이 소유하는 이미지 생성 제공자 ID입니다. |
videoGenerationProviders |
string[] |
이 Plugin이 소유하는 비디오 생성 제공자 ID입니다. |
webFetchProviders |
string[] |
이 Plugin이 소유하는 웹 가져오기 제공자 ID입니다. |
webSearchProviders |
string[] |
이 Plugin이 소유하는 웹 검색 제공자 ID입니다. |
migrationProviders |
string[] |
이 Plugin이 openclaw migrate용으로 소유하는 가져오기 제공자 ID입니다. |
gatewayMethodDispatch |
string[] |
Gateway 메서드를 프로세스 내부에서 디스패치하는 인증된 Plugin HTTP 라우트용 예약된 권한입니다. |
tools |
string[] |
이 Plugin이 소유하는 에이전트 도구 이름입니다. |
contracts.embeddedExtensionFactories는 번들 Codex
app-server 전용 확장 팩터리를 위해 유지됩니다. 번들 도구 결과 변환은
대신 contracts.agentToolResultMiddleware를 선언하고
api.registerAgentToolResultMiddleware(...)로 등록해야 합니다. 설치된 Plugin은
명시적으로 활성화되고 contracts.agentToolResultMiddleware에 선언한 런타임에
대해서만 동일한 미들웨어 이음새를 사용할 수 있습니다.
호스트가 신뢰하는 사전 도구 정책 계층이 필요한 설치된 Plugin은
등록된 각 로컬 ID를 contracts.trustedToolPolicies에 선언하고 명시적으로
활성화되어야 합니다. 번들 Plugin은 기존 신뢰된 정책 경로를 유지하지만,
선언되지 않은 정책 ID가 있는 설치된 Plugin은 등록 전에 거부됩니다. 정책 ID는
등록하는 Plugin으로 범위가 제한되므로 두 Plugin이 모두 workflow-budget을
선언하고 등록할 수 있습니다. 단일 Plugin은 동일한 로컬 ID를 두 번 등록할 수 없습니다.
런타임 api.registerTool(...) 등록은 contracts.tools와 일치해야 합니다.
도구 탐색은 이 목록을 사용해 요청된 도구를 소유할 수 있는 Plugin 런타임만
로드합니다.
resolveExternalAuthProfiles를 구현하는 제공자 Plugin은
contracts.externalAuthProviders를 선언해야 합니다. 선언되지 않은 외부 인증 훅은 무시됩니다.
일반 임베딩 제공자는 api.registerEmbeddingProvider(...)로 등록된
각 어댑터에 대해 contracts.embeddingProviders를 선언해야 합니다. 메모리 검색에서
사용되는 제공자를 포함해 재사용 가능한 벡터 생성에는 일반 계약을 사용하세요.
contracts.memoryEmbeddingProviders는 더 이상 권장되지 않는
메모리 전용 호환성이며, 기존 제공자가 범용 임베딩 제공자 이음새로
마이그레이션하는 동안에만 남아 있습니다.
contracts.gatewayMethodDispatch는 현재
"authenticated-request"를 허용합니다. 이는 의도적으로 Gateway 컨트롤 플레인
메서드를 프로세스 내부에서 디스패치하는 네이티브 Plugin HTTP 라우트에 대한 API 위생
게이트이며, 악의적인 네이티브 Plugin을 막는 샌드박스가 아닙니다. 이미 Gateway HTTP 인증이
필요한, 면밀히 검토된 번들/운영자 표면에만 사용하세요.
mediaUnderstandingProviderMetadata 참조
미디어 이해 제공자에 런타임 로드 전에 일반 코어 헬퍼가 필요로 하는
기본 모델, 자동 인증 폴백 우선순위 또는 네이티브 문서 지원이 있을 때
mediaUnderstandingProviderMetadata를 사용하세요. 키는
contracts.mediaUnderstandingProviders에도 선언되어야 합니다.
{ "contracts": { "mediaUnderstandingProviders": ["example"] }, "mediaUnderstandingProviderMetadata": { "example": { "capabilities": ["image", "audio"], "defaultModels": { "image": "example-vision-latest", "audio": "example-transcribe-latest" }, "autoPriority": { "image": 40 }, "nativeDocumentInputs": ["pdf"] } }}각 제공자 항목에는 다음이 포함될 수 있습니다.
| 필드 | 유형 | 의미 |
|---|---|---|
capabilities |
("image" | "audio" | "video")[] |
이 제공자가 노출하는 미디어 기능입니다. |
defaultModels |
Record<string, string> |
설정에서 모델을 지정하지 않을 때 사용되는 기능별 모델 기본값입니다. |
autoPriority |
Record<string, number> |
자동 자격 증명 기반 제공자 폴백에서 숫자가 낮을수록 더 먼저 정렬됩니다. |
nativeDocumentInputs |
"pdf"[] |
제공자가 지원하는 네이티브 문서 입력입니다. |
channelConfigs 참조
채널 Plugin이 런타임 로드 전에 저렴한 설정 메타데이터가 필요할 때
channelConfigs를 사용하세요. 읽기 전용 채널 설정/상태 탐색은 설정 항목이 없거나
setup.requiresRuntime: false가 설정 런타임이 불필요하다고 선언할 때, 구성된
외부 채널에 이 메타데이터를 직접 사용할 수 있습니다.
channelConfigs는 Plugin 매니페스트 메타데이터이며, 새로운 최상위 사용자 설정
섹션이 아닙니다. 사용자는 여전히 channels.<channel-id> 아래에서 채널 인스턴스를
구성합니다. OpenClaw는 Plugin 런타임 코드가 실행되기 전에 매니페스트 메타데이터를
읽어 구성된 채널을 어떤 Plugin이 소유하는지 결정합니다.
채널 Plugin에서 configSchema와 channelConfigs는 서로 다른
경로를 설명합니다.
configSchema는plugins.entries.<plugin-id>.config를 검증합니다.channelConfigs.<channel-id>.schema는channels.<channel-id>를 검증합니다.
channels[]를 선언하는 비번들 Plugin은 일치하는
channelConfigs 항목도 선언해야 합니다. 선언하지 않아도 OpenClaw는 여전히 Plugin을
로드할 수 있지만, 콜드 경로 설정 스키마, 설정, Control UI 표면은 Plugin 런타임이 실행될 때까지
채널 소유 옵션 형태를 알 수 없습니다.
channelConfigs.<channel-id>.commands.nativeCommandsAutoEnabled와
nativeSkillsAutoEnabled는 채널 런타임 로드 전에 실행되는 명령 설정
검사용 정적 auto 기본값을 선언할 수 있습니다. 번들 채널은 다른 패키지 소유
채널 카탈로그 메타데이터와 함께 package.json#openclaw.channel.commands를 통해
동일한 기본값을 게시할 수도 있습니다.
{ "channelConfigs": { "matrix": { "schema": { "type": "object", "additionalProperties": false, "properties": { "homeserverUrl": { "type": "string" } } }, "uiHints": { "homeserverUrl": { "label": "Homeserver URL", "placeholder": "https://matrix.example.com" } }, "label": "Matrix", "description": "Matrix homeserver connection", "commands": { "nativeCommandsAutoEnabled": true, "nativeSkillsAutoEnabled": true }, "preferOver": ["matrix-legacy"] } }}각 채널 항목에는 다음이 포함될 수 있습니다.
| 필드 | 유형 | 의미 |
|---|---|---|
schema |
object |
channels.<id>용 JSON Schema입니다. 선언된 각 채널 설정 항목에 필요합니다. |
uiHints |
Record<string, object> |
해당 채널 설정 섹션의 선택적 UI 레이블/플레이스홀더/민감 정보 힌트입니다. |
label |
string |
런타임 메타데이터가 준비되지 않았을 때 선택기와 검사 표면에 병합되는 채널 레이블입니다. |
description |
string |
검사 및 카탈로그 표면용 짧은 채널 설명입니다. |
commands |
object |
런타임 전 설정 검사용 정적 네이티브 명령 및 네이티브 skill 자동 기본값입니다. |
preferOver |
string[] |
선택 표면에서 이 채널이 우선해야 하는 레거시 또는 낮은 우선순위의 Plugin ID입니다. |
다른 채널 Plugin 대체
다른 Plugin도 제공할 수 있는 채널 ID에 대해 내 Plugin이 선호 소유자인 경우
preferOver를 사용하세요. 일반적인 경우는 이름이 변경된 Plugin ID, 번들 Plugin을
대체하는 독립형 Plugin, 또는 설정 호환성을 위해 동일한 채널 ID를 유지하는
유지 관리되는 포크입니다.
{ "id": "acme-chat", "channels": ["chat"], "channelConfigs": { "chat": { "schema": { "type": "object", "additionalProperties": false, "properties": { "webhookUrl": { "type": "string" } } }, "preferOver": ["chat"] } }}channels.chat이 구성되면 OpenClaw는 채널 ID와 선호 Plugin ID를 모두
고려합니다. 낮은 우선순위 Plugin이 번들이거나 기본적으로 활성화되어 있다는 이유로만
선택된 경우, OpenClaw는 유효 런타임 설정에서 이를 비활성화하여 하나의 Plugin이
채널과 해당 도구를 소유하게 합니다. 명시적인 사용자 선택은 여전히 우선합니다. 사용자가
두 Plugin을 모두 명시적으로 활성화하면 OpenClaw는 요청된 Plugin 집합을 조용히
변경하는 대신 해당 선택을 보존하고 중복 채널/도구 진단을 보고합니다.
preferOver는 실제로 동일한 채널을 제공할 수 있는 Plugin ID로 범위를 제한하세요.
이는 일반 우선순위 필드가 아니며 사용자 설정 키의 이름을 변경하지 않습니다.
modelSupport 참조
OpenClaw가 Plugin 런타임을 로드하기 전에 gpt-5.5 또는 claude-sonnet-4.6 같은 축약 모델 ID에서 제공자 Plugin을 추론해야 할 때 modelSupport를 사용합니다.
{ "modelSupport": { "modelPrefixes": ["gpt-", "o1", "o3", "o4"], "modelPatterns": ["^computer-use-preview"] }}OpenClaw는 이 우선순위를 적용합니다.
- 명시적
provider/model참조는 소유providers매니페스트 메타데이터를 사용합니다 modelPatterns가modelPrefixes보다 우선합니다- 번들되지 않은 Plugin 하나와 번들된 Plugin 하나가 모두 일치하면, 번들되지 않은 Plugin이 우선합니다
- 나머지 모호성은 사용자 또는 구성이 제공자를 지정할 때까지 무시됩니다
필드:
| 필드 | 타입 | 의미 |
|---|---|---|
modelPrefixes |
string[] |
축약 모델 ID에 대해 startsWith로 일치시키는 접두사입니다. |
modelPatterns |
string[] |
프로필 접미사를 제거한 뒤 축약 모델 ID에 대해 일치시키는 정규식 소스입니다. |
modelPatterns 항목은 중첩 반복을 포함하는 패턴(예: (a+)+$)을 거부하는 compileSafeRegex를 통해 컴파일됩니다. 안전성 검사를 통과하지 못한 패턴은 문법적으로 유효하지 않은 정규식과 동일하게 조용히 건너뜁니다. 패턴은 단순하게 유지하고 중첩 수량자는 피하세요.
modelCatalog 참조
OpenClaw가 Plugin 런타임을 로드하기 전에 제공자 모델 메타데이터를 알아야 할 때 modelCatalog를 사용합니다. 이는 고정 카탈로그 행, 제공자 별칭, 억제 규칙, 검색 모드에 대한 매니페스트 소유 소스입니다. 런타임 새로고침은 여전히 제공자 런타임 코드에 속하지만, 매니페스트는 런타임이 필요한 시점을 코어에 알려줍니다.
{ "providers": ["openai"], "modelCatalog": { "providers": { "openai": { "baseUrl": "https://api.openai.com/v1", "api": "openai-responses", "models": [ { "id": "gpt-5.4", "name": "GPT-5.4", "input": ["text", "image"], "reasoning": true, "contextWindow": 256000, "maxTokens": 128000, "cost": { "input": 1.25, "output": 10, "cacheRead": 0.125 }, "status": "available", "tags": ["default"] } ] } }, "aliases": { "azure-openai-responses": { "provider": "openai", "api": "azure-openai-responses" } }, "suppressions": [ { "provider": "azure-openai-responses", "model": "gpt-5.3-codex-spark", "reason": "Azure OpenAI Responses에서 사용할 수 없음" } ], "discovery": { "openai": "static" } }}최상위 필드:
| 필드 | 타입 | 의미 |
|---|---|---|
providers |
Record<string, object> |
이 Plugin이 소유한 제공자 ID의 카탈로그 행입니다. 키는 최상위 providers에도 나타나야 합니다. |
aliases |
Record<string, object> |
카탈로그 또는 억제 계획을 위해 소유 제공자로 해석되어야 하는 제공자 별칭입니다. |
suppressions |
object[] |
이 Plugin이 제공자별 이유로 억제하는 다른 소스의 모델 행입니다. |
discovery |
Record<string, "static" | "refreshable" | "runtime"> |
제공자 카탈로그를 매니페스트 메타데이터에서 읽을 수 있는지, 캐시로 새로고침할 수 있는지, 또는 런타임이 필요한지 여부입니다. |
runtimeAugment |
boolean |
제공자 런타임이 매니페스트/구성 계획 이후 카탈로그 행을 추가해야 할 때만 true로 설정합니다. |
aliases는 모델 카탈로그 계획을 위한 제공자 소유권 조회에 참여합니다. 별칭 대상은 동일한 Plugin이 소유한 최상위 제공자여야 합니다. 제공자 필터링 목록이 별칭을 사용하면 OpenClaw는 제공자 런타임을 로드하지 않고도 소유 매니페스트를 읽고 별칭 API/기본 URL 재정의를 적용할 수 있습니다.
별칭은 필터링되지 않은 카탈로그 목록을 확장하지 않습니다. 넓은 목록은 소유하는 정식 제공자 행만 내보냅니다.
suppressions는 이전 제공자 런타임 suppressBuiltInModel 훅을 대체합니다. 억제 항목은 제공자가 Plugin에 의해 소유되었거나 소유 제공자를 대상으로 하는 modelCatalog.aliases 키로 선언된 경우에만 적용됩니다. 모델 해석 중에는 런타임 억제 훅이 더 이상 호출되지 않습니다.
제공자 필드:
| 필드 | 타입 | 의미 |
|---|---|---|
baseUrl |
string |
이 제공자 카탈로그의 모델에 대한 선택적 기본 URL입니다. |
api |
ModelApi |
이 제공자 카탈로그의 모델에 대한 선택적 기본 API 어댑터입니다. |
headers |
Record<string, string> |
이 제공자 카탈로그에 적용되는 선택적 정적 헤더입니다. |
models |
object[] |
필수 모델 행입니다. id가 없는 행은 무시됩니다. |
모델 필드:
| 필드 | 타입 | 의미 |
|---|---|---|
id |
string |
provider/ 접두사가 없는 제공자 로컬 모델 ID입니다. |
name |
string |
선택적 표시 이름입니다. |
api |
ModelApi |
선택적 모델별 API 재정의입니다. |
baseUrl |
string |
선택적 모델별 기본 URL 재정의입니다. |
headers |
Record<string, string> |
선택적 모델별 정적 헤더입니다. |
input |
Array<"text" | "image" | "document" | "audio" | "video"> |
모델이 허용하는 모달리티입니다. |
reasoning |
boolean |
모델이 추론 동작을 노출하는지 여부입니다. |
contextWindow |
number |
네이티브 제공자 컨텍스트 창입니다. |
contextTokens |
number |
contextWindow와 다를 때 선택적으로 적용되는 유효 런타임 컨텍스트 한도입니다. |
maxTokens |
number |
알려진 경우 최대 출력 토큰 수입니다. |
cost |
object |
선택적 백만 토큰당 USD 가격이며, 선택적 tieredPricing을 포함합니다. |
compat |
object |
OpenClaw 모델 구성 호환성과 일치하는 선택적 호환성 플래그입니다. |
status |
"available" | "preview" | "deprecated" | "disabled" |
목록 상태입니다. 행이 전혀 나타나면 안 되는 경우에만 억제하세요. |
statusReason |
string |
사용 불가가 아닌 상태와 함께 표시되는 선택적 이유입니다. |
replaces |
string[] |
이 모델이 대체하는 이전 제공자 로컬 모델 ID입니다. |
replacedBy |
string |
폐기된 행의 대체 제공자 로컬 모델 ID입니다. |
tags |
string[] |
선택기와 필터에서 사용하는 안정적인 태그입니다. |
억제 필드:
| 필드 | 타입 | 의미 |
|---|---|---|
provider |
string |
억제할 업스트림 행의 제공자 ID입니다. 이 Plugin이 소유하거나 소유 별칭으로 선언되어야 합니다. |
model |
string |
억제할 제공자 로컬 모델 ID입니다. |
reason |
string |
억제된 행이 직접 요청될 때 표시되는 선택적 메시지입니다. |
when.baseUrlHosts |
string[] |
억제가 적용되기 전에 필요한 유효 제공자 기본 URL 호스트의 선택적 목록입니다. |
when.providerConfigApiIn |
string[] |
억제가 적용되기 전에 필요한 정확한 제공자 구성 api 값의 선택적 목록입니다. |
런타임 전용 데이터를 modelCatalog에 넣지 마세요. 매니페스트 행만으로 제공자 필터링 목록과 선택기 표면이 레지스트리/런타임 검색을 건너뛰기에 충분히 완전한 경우에만 static을 사용합니다. 매니페스트 행이 나중에 새로고침/캐시로 더 많은 행을 추가할 수 있는 유용한 목록화 가능한 시드 또는 보충 자료인 경우 refreshable을 사용합니다. refreshable 행 자체는 권위 있는 정보가 아닙니다. OpenClaw가 목록을 알기 위해 제공자 런타임을 로드해야 하는 경우 runtime을 사용합니다.
modelIdNormalization 참조
제공자 런타임을 로드하기 전에 발생해야 하는 저비용 제공자 소유 모델 ID 정리에 modelIdNormalization을 사용합니다. 이렇게 하면 짧은 모델 이름, 제공자 로컬 레거시 ID, 프록시 접두사 규칙 같은 별칭을 코어 모델 선택 테이블 대신 소유 Plugin 매니페스트에 유지할 수 있습니다.
{ "providers": ["anthropic", "openrouter"], "modelIdNormalization": { "providers": { "anthropic": { "aliases": { "sonnet-4.6": "claude-sonnet-4-6" } }, "openrouter": { "prefixWhenBare": "openrouter" } } }}제공자 필드:
| 필드 | 타입 | 의미 |
|---|---|---|
aliases |
Record<string,string> |
대소문자를 구분하지 않는 정확한 모델 ID 별칭입니다. 값은 작성된 그대로 반환됩니다. |
stripPrefixes |
string[] |
별칭 조회 전에 제거할 접두사이며, 레거시 provider/model 중복에 유용합니다. |
prefixWhenBare |
string |
정규화된 모델 ID에 아직 /가 포함되지 않은 경우 추가할 접두사입니다. |
prefixWhenBareAfterAliasStartsWith |
object[] |
별칭 조회 후 적용되는 조건부 bare ID 접두사 규칙이며, modelPrefix와 prefix를 키로 사용합니다. |
providerEndpoints 참조
제공자 런타임을 로드하기 전에 일반 요청 정책이 알아야 하는 엔드포인트 분류에는 providerEndpoints를 사용합니다. 코어는 여전히 각 endpointClass의 의미를 소유하고, Plugin 매니페스트는 호스트와 기본 URL 메타데이터를 소유합니다.
Endpoint 필드:
| 필드 | 유형 | 의미 |
|---|---|---|
endpointClass |
string |
openrouter, moonshot-native, google-vertex 같은 알려진 코어 Endpoint 클래스입니다. |
hosts |
string[] |
Endpoint 클래스에 매핑되는 정확한 호스트 이름입니다. |
hostSuffixes |
string[] |
Endpoint 클래스에 매핑되는 호스트 접미사입니다. 도메인 접미사 전용 매칭에는 .를 접두사로 붙입니다. |
baseUrls |
string[] |
Endpoint 클래스에 매핑되는 정확히 정규화된 HTTP(S) 기본 URL입니다. |
googleVertexRegion |
string |
정확한 전역 호스트에 대한 정적 Google Vertex 리전입니다. |
googleVertexRegionHostSuffix |
string |
매칭되는 호스트에서 제거하여 Google Vertex 리전 접두사를 노출할 접미사입니다. |
providerRequest 참조
provider 런타임을 로드하지 않고도 일반 요청 정책에 필요한 저렴한 요청 호환성 메타데이터에는 providerRequest를 사용하세요. 동작별 payload 재작성은 provider 런타임 hook 또는 공유 provider 계열 helper에 유지하세요.
{ "providers": ["vllm"], "providerRequest": { "providers": { "vllm": { "family": "vllm", "openAICompletions": { "supportsStreamingUsage": true } } } }}Provider 필드:
| 필드 | 유형 | 의미 |
|---|---|---|
family |
string |
일반 요청 호환성 결정과 진단에 사용되는 provider 계열 label입니다. |
compatibilityFamily |
"moonshot" |
공유 요청 helper를 위한 선택적 provider 계열 호환성 bucket입니다. |
openAICompletions |
object |
OpenAI 호환 completions 요청 flag이며, 현재는 supportsStreamingUsage입니다. |
secretProviderIntegrations 참조
Plugin이 재사용 가능한 SecretRef exec provider preset을 게시할 수 있을 때 secretProviderIntegrations를 사용하세요. OpenClaw는 Plugin 런타임이 로드되기 전에 이 메타데이터를 읽고, secrets.providers.<alias>.pluginIntegration에 Plugin 소유권을 저장하며, 실제 secret 해석은 SecretRef 런타임에 맡깁니다.
Preset은 번들 Plugin과 git 및 ClawHub 설치처럼 관리되는 Plugin 설치 root에서 발견된 설치된 Plugin에만 노출됩니다.
{ "secretProviderIntegrations": { "secret-store": { "providerAlias": "team-secrets", "displayName": "Team secrets", "source": "exec", "command": "${node}", "args": ["./bin/resolve-secrets.mjs"] } }}map key는 integration id입니다. providerAlias가 생략되면 OpenClaw는 integration id를 SecretRef provider alias로 사용합니다. Provider alias는 일반 SecretRef provider alias pattern과 일치해야 합니다. 예를 들어 team-secrets 또는 onepassword-work입니다.
운영자가 preset을 선택하면 OpenClaw는 다음과 같은 provider reference를 씁니다.
{ "secrets": { "providers": { "team-secrets": { "source": "exec", "pluginIntegration": { "pluginId": "acme-secrets", "integrationId": "secret-store" } } } }}시작/다시 로드 시 OpenClaw는 현재 Plugin manifest 메타데이터를 로드하고, 소유 Plugin이 설치되어 활성 상태인지 확인한 다음, manifest에서 exec command를 materialize하여 해당 provider를 해석합니다. Plugin을 비활성화하거나 제거하면 활성 SecretRef에 대한 provider가 취소됩니다. 독립 실행형 exec 설정을 원하는 운영자는 여전히 수동 command/args provider를 직접 작성할 수 있습니다.
현재는 source: "exec" preset만 지원됩니다. command는 ${node}여야 하며, args[0]은 ./ Plugin root 상대 resolver script여야 합니다. OpenClaw는 시작/다시 로드 시 이를 현재 Node 실행 파일과 Plugin 내부 script의 절대 경로로 materialize합니다. --require, --import, --loader, --env-file, --eval, --print 같은 Node option은 manifest preset contract의 일부가 아닙니다. Node가 아닌 command가 필요한 운영자는 독립 실행형 수동 exec provider를 직접 설정할 수 있습니다.
OpenClaw는 manifest preset의 trustedDirs를 Plugin root와, ${node} preset의 경우 현재 Node 실행 파일 directory에서 파생합니다. manifest에 작성된 trustedDirs는 무시됩니다. timeoutMs, maxOutputBytes, jsonOnly, env, passEnv, allowInsecurePath 같은 다른 exec provider option은 일반 SecretRef exec provider config로 전달됩니다.
modelPricing 참조
provider가 런타임 로드 전에 control-plane 가격 책정 동작을 제어해야 할 때 modelPricing을 사용하세요. Gateway 가격 cache는 provider 런타임 code를 import하지 않고 이 메타데이터를 읽습니다.
{ "providers": ["ollama", "openrouter"], "modelPricing": { "providers": { "ollama": { "external": false }, "openrouter": { "openRouter": { "passthroughProviderModel": true }, "liteLLM": false } } }}Provider 필드:
| 필드 | 유형 | 의미 |
|---|---|---|
external |
boolean |
OpenRouter 또는 LiteLLM 가격을 절대 가져오면 안 되는 로컬/자체 호스팅 provider에는 false로 설정합니다. |
openRouter |
false | object |
OpenRouter 가격 조회 mapping입니다. false는 이 provider에 대한 OpenRouter 조회를 비활성화합니다. |
liteLLM |
false | object |
LiteLLM 가격 조회 mapping입니다. false는 이 provider에 대한 LiteLLM 조회를 비활성화합니다. |
Source 필드:
| 필드 | 유형 | 의미 |
|---|---|---|
provider |
string |
OpenClaw provider id와 다를 때의 외부 catalog provider id입니다. 예를 들어 zai provider의 z-ai입니다. |
passthroughProviderModel |
boolean |
slash가 포함된 model id를 중첩 provider/model ref로 취급합니다. OpenRouter 같은 proxy provider에 유용합니다. |
modelIdTransforms |
"version-dots"[] |
추가 외부 catalog model-id variant입니다. version-dots는 claude-opus-4.6 같은 점이 포함된 version id를 시도합니다. |
OpenClaw Provider Index
OpenClaw Provider Index는 아직 Plugin이 설치되지 않았을 수 있는 provider를 위한 OpenClaw 소유 preview 메타데이터입니다. 이는 Plugin manifest의 일부가 아닙니다. Plugin manifest는 계속 설치된 Plugin의 권한 소스입니다. Provider Index는 provider Plugin이 설치되지 않았을 때 향후 설치 가능한 provider 및 설치 전 model picker surface가 소비할 내부 fallback contract입니다.
Catalog 권한 순서:
- 사용자 config.
- 설치된 Plugin manifest
modelCatalog. - 명시적 refresh의 model catalog cache.
- OpenClaw Provider Index preview row.
Provider Index에는 secret, 활성화 상태, 런타임 hook 또는 live account-specific model data가 포함되면 안 됩니다. preview catalog는 Plugin manifest와 같은 modelCatalog provider row shape를 사용하지만, api, baseUrl, 가격, 호환성 flag 같은 런타임 adapter field가 설치된 Plugin manifest와 의도적으로 정렬되어 유지되는 경우가 아니라면 안정적인 display 메타데이터로 제한되어야 합니다. live /models discovery가 있는 provider는 일반 listing 또는 onboarding에서 provider API를 호출하는 대신 명시적 model catalog cache 경로를 통해 refreshed row를 작성해야 합니다.
Provider Index entry는 Plugin이 core 밖으로 이동했거나 아직 설치되지 않은 provider에 대한 설치 가능한 Plugin 메타데이터도 포함할 수 있습니다. 이 메타데이터는 channel catalog pattern을 반영합니다. package name, npm install spec, expected integrity, 저렴한 auth-choice label만으로도 설치 가능한 setup option을 표시하기에 충분합니다. Plugin이 설치되면 해당 manifest가 우선하며, 그 provider에 대한 Provider Index entry는 무시됩니다.
legacy top-level capability key는 deprecated되었습니다. speechProviders, realtimeTranscriptionProviders, realtimeVoiceProviders, mediaUnderstandingProviders, imageGenerationProviders, videoGenerationProviders, webFetchProviders, webSearchProviders를 contracts 아래로 이동하려면 openclaw doctor --fix를 사용하세요. 일반 manifest loading은 더 이상 이러한 top-level field를 capability ownership으로 취급하지 않습니다.
Manifest와 package.json 비교
두 파일은 서로 다른 역할을 합니다.
| 파일 | 용도 |
|---|---|
openclaw.plugin.json |
Plugin code가 실행되기 전에 존재해야 하는 discovery, config validation, auth-choice 메타데이터, UI hint |
package.json |
npm 메타데이터, dependency 설치, entrypoint, install gating, setup 또는 catalog 메타데이터에 사용되는 openclaw block |
메타데이터가 어디에 속하는지 확실하지 않다면 다음 규칙을 사용하세요.
- OpenClaw가 Plugin code를 로드하기 전에 알아야 한다면
openclaw.plugin.json에 넣으세요 - packaging, entry file 또는 npm install 동작에 관한 것이라면
package.json에 넣으세요
discovery에 영향을 주는 package.json 필드
일부 pre-runtime Plugin 메타데이터는 의도적으로 openclaw.plugin.json 대신 package.json의 openclaw block 아래에 있습니다.
openclaw.bundle과 openclaw.bundle.json은 OpenClaw Plugin contract가 아닙니다. native Plugin은 openclaw.plugin.json과 아래의 지원되는 package.json#openclaw field를 사용해야 합니다.
중요한 예:
| 필드 | 의미 |
|---|---|
openclaw.extensions |
네이티브 플러그인 진입점을 선언합니다. 플러그인 패키지 디렉터리 안에 있어야 합니다. |
openclaw.runtimeExtensions |
설치된 패키지의 빌드된 JavaScript 런타임 진입점을 선언합니다. 플러그인 패키지 디렉터리 안에 있어야 합니다. |
openclaw.setupEntry |
온보딩, 지연된 채널 시작, 읽기 전용 채널 상태/SecretRef 검색 중에 사용되는 가벼운 설정 전용 진입점입니다. 플러그인 패키지 디렉터리 안에 있어야 합니다. |
openclaw.runtimeSetupEntry |
설치된 패키지의 빌드된 JavaScript 설정 진입점을 선언합니다. setupEntry가 필요하며, 반드시 존재해야 하고, 플러그인 패키지 디렉터리 안에 있어야 합니다. |
openclaw.channel |
라벨, 문서 경로, 별칭, 선택 문구 같은 저비용 채널 카탈로그 메타데이터입니다. |
openclaw.channel.commands |
채널 런타임이 로드되기 전에 설정, 감사, 명령 목록 표면에서 사용하는 정적 네이티브 명령 및 네이티브 스킬 자동 기본값 메타데이터입니다. |
openclaw.channel.configuredState |
전체 채널 런타임을 로드하지 않고도 "env 전용 설정이 이미 존재하는가?"에 답할 수 있는 가벼운 설정 상태 검사기 메타데이터입니다. |
openclaw.channel.persistedAuthState |
전체 채널 런타임을 로드하지 않고도 "이미 로그인된 항목이 있는가?"에 답할 수 있는 가벼운 지속 인증 검사기 메타데이터입니다. |
openclaw.install.clawhubSpec / openclaw.install.npmSpec / openclaw.install.localPath |
번들 및 외부 게시 플러그인을 위한 설치/업데이트 힌트입니다. |
openclaw.install.defaultChoice |
여러 설치 소스를 사용할 수 있을 때 선호되는 설치 경로입니다. |
openclaw.install.minHostVersion |
>=2026.3.22 또는 >=2026.5.1-beta.1 같은 semver 하한을 사용하는 최소 지원 OpenClaw 호스트 버전입니다. |
openclaw.compat.pluginApi |
이 패키지에 필요한 최소 OpenClaw 플러그인 API 범위이며, >=2026.5.27 같은 semver 하한을 사용합니다. |
openclaw.install.expectedIntegrity |
sha512-... 같은 예상 npm dist 무결성 문자열입니다. 설치 및 업데이트 흐름은 가져온 아티팩트를 이 값과 대조해 검증합니다. |
openclaw.install.allowInvalidConfigRecovery |
설정이 유효하지 않을 때 좁은 범위의 번들 플러그인 재설치 복구 경로를 허용합니다. |
openclaw.install.requiredPlatformPackages |
lockfile 플랫폼 제약 조건이 현재 호스트와 일치할 때 실제로 생성되어야 하는 npm 패키지 별칭입니다. |
openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen |
설정 런타임 채널 표면을 listen 전에 로드한 다음, 전체 설정된 채널 플러그인을 listen 이후 활성화까지 지연할 수 있게 합니다. |
매니페스트 메타데이터는 런타임이 로드되기 전에 온보딩에 표시되는
제공자/채널/설정 선택지를 결정합니다. package.json#openclaw.install은
사용자가 이러한 선택지 중 하나를 고를 때 온보딩이 해당 플러그인을 가져오거나
활성화하는 방법을 알려줍니다. 설치 힌트를 openclaw.plugin.json으로
옮기지 마세요.
openclaw.install.minHostVersion은 번들되지 않은 플러그인 소스에 대해
설치 및 매니페스트 레지스트리 로딩 중에 적용됩니다. 유효하지 않은 값은
거부됩니다. 더 최신이지만 유효한 값은 이전 호스트에서 외부 플러그인을
건너뜁니다. 번들 소스 플러그인은 호스트 체크아웃과 같은 버전으로 관리된다고
가정합니다.
openclaw.install.requiredPlatformPackages는 선택적 플랫폼별 별칭을 통해
필수 네이티브 바이너리를 노출하는 npm 패키지를 위한 것입니다. 지원되는
각 플랫폼 별칭의 순수 npm 패키지 이름을 나열하세요. npm 설치 중 OpenClaw는
lockfile 제약 조건이 현재 호스트와 일치하는 선언된 별칭만 검증합니다.
npm이 성공을 보고했지만 해당 별칭을 누락한 경우, OpenClaw는 새 캐시로
한 번 재시도하고 별칭이 여전히 없으면 설치를 롤백합니다.
openclaw.compat.pluginApi는 번들되지 않은 플러그인 소스에 대해 패키지
설치 중에 적용됩니다. 패키지가 빌드된 기준 OpenClaw 플러그인 SDK/런타임
API 하한에 사용하세요. 플러그인 패키지에 더 최신 API가 필요하지만 다른
흐름을 위해 더 낮은 설치 힌트를 유지해야 할 때 minHostVersion보다
더 엄격할 수 있습니다. 공식 OpenClaw 릴리스 동기화는 기본적으로 기존
공식 플러그인 API 하한을 OpenClaw 릴리스 버전으로 올리지만, 플러그인
전용 릴리스는 패키지가 의도적으로 이전 호스트를 지원하는 경우 더 낮은
하한을 유지할 수 있습니다. 패키지 버전만을 호환성 계약으로 사용하지
마세요. peerDependencies.openclaw는 npm 패키지 메타데이터로 남습니다.
OpenClaw는 설치 호환성 결정을 위해 openclaw.compat.pluginApi 계약을
사용합니다.
공식 주문형 설치 메타데이터는 플러그인이 ClawHub에 게시된 경우
clawhubSpec을 사용해야 합니다. 온보딩은 이를 선호되는 원격 소스로
취급하고 설치 후 ClawHub 아티팩트 사실을 기록합니다. npmSpec은 아직
ClawHub로 이동하지 않은 패키지를 위한 호환성 대체 경로로 남습니다.
정확한 npm 버전 고정은 이미 npmSpec에 있습니다. 예:
"npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3". 공식 외부 카탈로그
항목은 가져온 npm 아티팩트가 더 이상 고정된 릴리스와 일치하지 않을 때
업데이트 흐름이 fail-closed되도록 정확한 spec을 expectedIntegrity와
짝지어야 합니다. 대화형 온보딩은 호환성을 위해 순수 패키지 이름과
dist-tag를 포함한 신뢰된 레지스트리 npm spec을 계속 제공합니다. 카탈로그
진단은 정확한 소스, 부동 소스, 무결성 고정 소스, 무결성 누락 소스,
패키지 이름 불일치 소스, 유효하지 않은 기본 선택 소스를 구분할 수
있습니다. 또한 expectedIntegrity가 있지만 이를 고정할 수 있는 유효한
npm 소스가 없을 때 경고합니다. expectedIntegrity가 있으면 설치/업데이트
흐름이 이를 강제합니다. 생략되면 레지스트리 해석 결과가 무결성 고정 없이
기록됩니다.
채널 플러그인은 상태, 채널 목록 또는 SecretRef 스캔이 전체 런타임을
로드하지 않고 설정된 계정을 식별해야 할 때 openclaw.setupEntry를
제공해야 합니다. 설정 진입점은 채널 메타데이터와 설정에 안전한 구성,
상태, secrets 어댑터를 노출해야 합니다. 네트워크 클라이언트, Gateway
리스너, 전송 런타임은 기본 확장 진입점에 두세요.
런타임 진입점 필드는 소스 진입점 필드의 패키지 경계 검사를 재정의하지
않습니다. 예를 들어 openclaw.runtimeExtensions는 경계를 벗어나는
openclaw.extensions 경로를 로드 가능하게 만들 수 없습니다.
openclaw.install.allowInvalidConfigRecovery는 의도적으로 좁습니다.
임의로 손상된 설정을 설치 가능하게 만들지 않습니다. 현재는 누락된 번들
플러그인 경로나 동일한 번들 플러그인에 대한 오래된 channels.<id> 항목
같은 특정한 오래된 번들 플러그인 업그레이드 실패에서 설치 흐름을 복구하는
것만 허용합니다. 관련 없는 설정 오류는 여전히 설치를 차단하고 운영자를
openclaw doctor --fix로 보냅니다.
openclaw.channel.persistedAuthState는 작은 검사기 모듈을 위한 패키지
메타데이터입니다.
{ "openclaw": { "channel": { "id": "whatsapp", "persistedAuthState": { "specifier": "./auth-presence", "exportName": "hasAnyWhatsAppAuth" } } }}설정, doctor, 상태 또는 읽기 전용 존재 확인 흐름이 전체 채널 플러그인이 로드되기 전에 저비용 예/아니요 인증 프로브를 필요로 할 때 사용하세요. 지속 인증 상태는 설정된 채널 상태가 아닙니다. 이 메타데이터를 사용해 플러그인을 자동 활성화하거나, 런타임 의존성을 복구하거나, 채널 런타임을 로드해야 하는지 결정하지 마세요. 대상 export는 지속 상태만 읽는 작은 함수여야 합니다. 전체 채널 런타임 barrel을 통해 라우팅하지 마세요.
openclaw.channel.configuredState는 저비용 env 전용 설정 검사를 위해
같은 형태를 따릅니다.
{ "openclaw": { "channel": { "id": "telegram", "configuredState": { "specifier": "./configured-state", "exportName": "hasTelegramConfiguredState" } } }}채널이 env 또는 다른 작은 비런타임 입력만으로 설정 상태에 답할 수 있을 때
사용하세요. 검사에 전체 설정 해석이나 실제 채널 런타임이 필요하다면 해당
로직은 플러그인 config.hasConfiguredState 훅에 유지하세요.
검색 우선순위(중복 플러그인 id)
OpenClaw는 여러 루트에서 플러그인을 검색합니다. 원시 파일 시스템 스캔
순서는 플러그인 스캔 순서를
참조하세요. 두 검색 결과가 같은 id를 공유하면 가장 높은 우선순위의
매니페스트만 유지됩니다. 더 낮은 우선순위의 중복 항목은 함께 로드되지 않고
삭제됩니다.
우선순위는 높은 순서에서 낮은 순서로 다음과 같습니다.
- 설정에서 선택됨 —
plugins.entries.<id>에 명시적으로 고정된 경로 - 번들됨 — OpenClaw와 함께 제공되는 플러그인
- 전역 설치 — 전역 OpenClaw 플러그인 루트에 설치된 플러그인
- 작업공간 — 현재 작업공간을 기준으로 검색된 플러그인
영향:
- 작업공간에 있는 번들 플러그인의 포크 또는 오래된 복사본은 번들 빌드를 가리지 않습니다.
- 로컬 플러그인으로 번들 플러그인을 실제로 재정의하려면 작업공간 검색에 의존하지 말고
plugins.entries.<id>를 통해 고정하여 우선순위에서 이기게 하세요. - 중복 삭제는 Doctor와 시작 진단이 버려진 복사본을 가리킬 수 있도록 기록됩니다.
- 설정에서 선택된 중복 재정의는 진단에서 명시적 재정의로 표현되지만, 오래된 포크와 우발적 가림이 계속 보이도록 여전히 경고합니다.
JSON Schema 요구 사항
- 모든 Plugin은 JSON Schema를 함께 제공해야 합니다, 구성을 받지 않는 경우에도 마찬가지입니다.
- 빈 스키마도 허용됩니다(예:
{ "type": "object", "additionalProperties": false }). - 스키마는 런타임이 아니라 구성 읽기/쓰기 시점에 검증됩니다.
- 새 구성 키로 번들 Plugin을 확장하거나 포크할 때는 해당 Plugin의
openclaw.plugin.jsonconfigSchema도 동시에 업데이트하세요. 번들 Plugin 스키마는 엄격하므로,configSchema.properties에myNewKey를 추가하지 않은 채 사용자 구성에plugins.entries.<id>.config.myNewKey를 추가하면 Plugin 런타임이 로드되기 전에 거부됩니다.
스키마 확장 예시:
{ "configSchema": { "type": "object", "additionalProperties": false, "properties": { "myNewKey": { "type": "string" } } }}검증 동작
- 알 수 없는
channels.*키는 채널 id가 Plugin 매니페스트에 선언되어 있지 않은 한 오류입니다. plugins.entries.<id>,plugins.allow,plugins.deny,plugins.slots.*는 검색 가능한 Plugin id를 참조해야 합니다. 알 수 없는 id는 오류입니다.- Plugin이 설치되어 있지만 매니페스트 또는 스키마가 깨졌거나 누락된 경우, 검증이 실패하고 Doctor가 Plugin 오류를 보고합니다.
- Plugin 구성이 존재하지만 Plugin이 비활성화되어 있으면, 구성은 유지되고 Doctor + 로그에 경고가 표시됩니다.
전체 plugins.* 스키마는 구성 참조를 참조하세요.
참고
- 매니페스트는 로컬 파일시스템 로드를 포함한 네이티브 OpenClaw Plugin에 필수입니다. 런타임은 여전히 Plugin 모듈을 별도로 로드하며, 매니페스트는 검색 + 검증에만 사용됩니다.
- 네이티브 매니페스트는 JSON5로 파싱되므로, 최종 값이 여전히 객체인 한 주석, 후행 쉼표, 따옴표 없는 키가 허용됩니다.
- 문서화된 매니페스트 필드만 매니페스트 로더가 읽습니다. 사용자 지정 최상위 키는 피하세요.
- Plugin에 필요하지 않다면
channels,providers,cliBackends,skills를 모두 생략할 수 있습니다. providerCatalogEntry는 가벼운 상태를 유지해야 하며 광범위한 런타임 코드를 가져오면 안 됩니다. 요청 시점 실행이 아니라 정적 provider catalog 메타데이터 또는 좁은 검색 설명자에 사용하세요.- 배타적 Plugin 종류는
plugins.slots.*를 통해 선택됩니다.plugins.slots.memory를 통한kind: "memory",plugins.slots.contextEngine을 통한kind: "context-engine"(기본값legacy)입니다. - 이 매니페스트에서 배타적 Plugin 종류를 선언하세요. 런타임 항목
OpenClawPluginDefinition.kind는 사용 중단되었으며 이전 Plugin을 위한 호환성 폴백으로만 남아 있습니다. - Env-var 메타데이터(
setup.providers[].envVars, 사용 중단된providerAuthEnvVars,channelEnvVars)는 선언 전용입니다. 상태, 감사, cron 전달 검증 및 기타 읽기 전용 표면은 env var를 구성된 것으로 처리하기 전에 여전히 Plugin 신뢰 및 유효 활성화 정책을 적용합니다. - provider 코드가 필요한 런타임 마법사 메타데이터는 Provider 런타임 훅을 참조하세요.
- Plugin이 네이티브 모듈에 의존하는 경우 빌드 단계와 package-manager 허용 목록 요구 사항을 문서화하세요(예: pnpm
allow-build-scripts+pnpm rebuild <package>).