Plugin 설치 및 사용
Plugin 추가, 활성화, 문제 해결을 위한 최종 사용자 가이드입니다.
Plugin 빌드
가장 작은 동작 manifest를 사용하는 첫 Plugin 튜토리얼입니다.
Channel Plugin
메시징 channel Plugin을 빌드합니다.
Provider Plugin
모델 provider Plugin을 빌드합니다.
SDK 개요
Import map 및 registration API 레퍼런스입니다.
공개 기능 모델
기능은 OpenClaw 내부의 공개 네이티브 Plugin 모델입니다. 모든 네이티브 OpenClaw Plugin은 하나 이상의 기능 유형에 등록됩니다.| 기능 | 등록 메서드 | 예시 Plugin |
|---|---|---|
| 텍스트 추론 | api.registerProvider(...) | openai, anthropic |
| CLI 추론 백엔드 | api.registerCliBackend(...) | openai, anthropic |
| 임베딩 | api.registerEmbeddingProvider(...) | Provider 소유 vector Plugin |
| 음성 | api.registerSpeechProvider(...) | elevenlabs, microsoft |
| 실시간 전사 | api.registerRealtimeTranscriptionProvider(...) | openai |
| 실시간 음성 | api.registerRealtimeVoiceProvider(...) | openai |
| 미디어 이해 | api.registerMediaUnderstandingProvider(...) | openai, google |
| Transcript 소스 | api.registerTranscriptSourceProvider(...) | discord |
| 이미지 생성 | api.registerImageGenerationProvider(...) | openai, google, fal, minimax |
| 음악 생성 | api.registerMusicGenerationProvider(...) | google, minimax |
| 동영상 생성 | api.registerVideoGenerationProvider(...) | qwen |
| 웹 가져오기 | api.registerWebFetchProvider(...) | firecrawl |
| 웹 검색 | api.registerWebSearchProvider(...) | google |
| Channel / 메시징 | api.registerChannel(...) | msteams, matrix |
| Gateway 검색 | api.registerGatewayDiscoveryService(...) | bonjour |
기능을 하나도 등록하지 않지만 hook, 도구, discovery service 또는 백그라운드 서비스를 제공하는 Plugin은 레거시 hook-only Plugin입니다. 이 패턴은 여전히 완전히 지원됩니다.
외부 호환성 입장
기능 모델은 core에 반영되어 현재 번들/네이티브 Plugin에서 사용되고 있지만, 외부 Plugin 호환성에는 “export되었으므로 고정되었다”보다 더 엄격한 기준이 필요합니다.| Plugin 상황 | 지침 |
|---|---|
| 기존 외부 Plugin | Hook 기반 통합이 계속 동작하도록 유지합니다. 이것이 호환성 기준선입니다. |
| 새 번들/네이티브 Plugin | Vendor별 내부 접근이나 새 hook-only 설계보다 명시적 기능 등록을 선호합니다. |
| 기능 등록을 채택하는 외부 Plugin | 허용되지만, 문서에서 안정적이라고 표시하지 않는 한 기능별 helper surface는 진화 중으로 취급합니다. |
Plugin 형태
OpenClaw는 로드된 모든 Plugin을 정적 metadata만이 아니라 실제 등록 동작을 기준으로 형태로 분류합니다.plain-capability
plain-capability
정확히 하나의 기능 유형을 등록합니다(예:
mistral 같은 provider 전용 Plugin).hybrid-capability
hybrid-capability
여러 기능 유형을 등록합니다(예:
openai는 텍스트 추론, 음성, 미디어 이해, 이미지 생성을 소유합니다).hook-only
hook-only
Hook(typed 또는 custom)만 등록하고 기능, 도구, 명령, 서비스는 등록하지 않습니다.
non-capability
non-capability
도구, 명령, 서비스 또는 route를 등록하지만 기능은 등록하지 않습니다.
openclaw plugins inspect <id>를 사용하세요. 자세한 내용은 CLI 레퍼런스를 참고하세요.
레거시 hook
before_agent_start hook은 hook-only Plugin을 위한 호환성 경로로 계속 지원됩니다. 레거시 실제 Plugin은 여전히 이것에 의존합니다.
방향:
- 계속 동작하게 유지
- 레거시로 문서화
- 모델/provider override 작업에는
before_model_resolve선호 - prompt mutation 작업에는
before_prompt_build선호 - 실제 사용량이 줄고 fixture coverage가 migration 안전성을 증명한 뒤에만 제거
호환성 신호
openclaw doctor 또는 openclaw plugins inspect <id>를 실행하면 다음 label 중 하나가 표시될 수 있습니다.
| 신호 | 의미 |
|---|---|
| config valid | Config가 정상적으로 parse되고 Plugin이 resolve됨 |
| compatibility advisory | Plugin이 지원되지만 오래된 패턴을 사용함(예: hook-only) |
| legacy warning | Plugin이 deprecated된 before_agent_start를 사용함 |
| hard error | Config가 유효하지 않거나 Plugin 로드에 실패함 |
hook-only와 before_agent_start는 현재 Plugin을 깨뜨리지 않습니다. hook-only는 advisory이고, before_agent_start는 warning만 트리거합니다. 이러한 신호는 openclaw status --all 및 openclaw plugins doctor에도 표시됩니다.
아키텍처 개요
OpenClaw의 Plugin 시스템은 네 개의 계층으로 구성됩니다.Manifest + discovery
OpenClaw는 설정된 경로, workspace root, global Plugin root, 번들 Plugin에서 후보 Plugin을 찾습니다. Discovery는 먼저 네이티브
openclaw.plugin.json manifest와 지원되는 bundle manifest를 읽습니다.Runtime loading
네이티브 OpenClaw Plugin은 in-process로 로드되고 기능을 중앙 registry에 등록합니다. 패키지된 JavaScript는 네이티브
require를 통해 로드됩니다. 서드파티 local source TypeScript는 긴급 Jiti fallback입니다. 호환 bundle은 runtime code를 import하지 않고 registry record로 정규화됩니다.- parse-time metadata는
registerCli(..., { descriptors: [...] })에서 가져옵니다. - 실제 Plugin CLI module은 lazy 상태를 유지하고 첫 invocation 때 등록될 수 있습니다.
- manifest/config 검증은 Plugin code를 실행하지 않고 manifest/schema metadata에서 동작해야 합니다.
- 네이티브 기능 discovery는 trusted Plugin entry code를 로드해 non-activating registry snapshot을 만들 수 있습니다.
- 네이티브 runtime 동작은
api.registrationMode === "full"인 Plugin module의register(api)경로에서 나옵니다.
Plugin metadata snapshot 및 lookup table
Gateway startup은 현재 config snapshot에 대해 하나의PluginMetadataSnapshot을 빌드합니다. Snapshot은 metadata 전용입니다. 설치된 Plugin index, manifest registry, manifest diagnostic, owner map, Plugin id normalizer, manifest record를 저장합니다. 로드된 Plugin module, provider SDK, package contents 또는 runtime export는 보관하지 않습니다.
Plugin-aware config validation, startup auto-enable, Gateway Plugin bootstrap은 manifest/index metadata를 독립적으로 다시 빌드하는 대신 해당 snapshot을 사용합니다. PluginLookUpTable은 같은 snapshot에서 파생되며 현재 runtime config의 startup Plugin plan을 추가합니다.
Startup 이후 Gateway는 현재 metadata snapshot을 교체 가능한 runtime product로 유지합니다. 반복되는 runtime provider discovery는 각 provider-catalog pass마다 설치된 index와 manifest registry를 재구성하는 대신 해당 snapshot을 빌릴 수 있습니다. Snapshot은 Gateway shutdown, config/Plugin inventory 변경, 설치된 index write 시 clear되거나 교체됩니다. 호환되는 현재 snapshot이 없으면 caller는 cold manifest/index 경로로 fallback합니다. Workspace Plugin은 metadata scope의 일부이므로 compatibility check에는 plugins.load.paths 및 default agent workspace 같은 Plugin discovery root가 포함되어야 합니다.
Snapshot과 lookup table은 반복되는 startup 결정을 fast path에 유지합니다.
- channel ownership
- deferred channel startup
- startup Plugin id
- provider 및 CLI backend ownership
- setup provider, command alias, model catalog provider, manifest contract ownership
- Plugin config schema 및 channel config schema 검증
- startup auto-enable 결정
PluginLookUpTable을 받는 대신 persisted installed Plugin index에서 직접 manifest registry를 재구성합니다. 이제 해당 경로는 필요할 때 registry를 재구성합니다. Caller가 이미 보유한 경우 current lookup table 또는 명시적 manifest registry를 runtime flow로 전달하는 것을 선호하세요.
Activation planning
Activation planning은 control plane의 일부입니다. Caller는 더 넓은 runtime registry를 로드하기 전에 구체적인 command, provider, channel, route, agent harness 또는 capability와 관련된 Plugin이 무엇인지 물을 수 있습니다. Planner는 현재 manifest behavior와 호환성을 유지합니다:activation.*필드는 명시적인 플래너 힌트입니다providers,channels,commandAliases,setup.providers,contracts.tools, 훅은 manifest 소유권 fallback으로 남습니다- ID 전용 플래너 API는 기존 호출자에게 계속 제공됩니다
- plan API는 진단에서 명시적 힌트와 소유권 fallback을 구분할 수 있도록 reason label을 보고합니다
채널 Plugin과 공유 메시지 도구
채널 Plugin은 일반 채팅 작업을 위해 별도의 send/edit/react 도구를 등록할 필요가 없습니다. OpenClaw는 코어에 하나의 공유message 도구를 유지하고, 채널 Plugin은 그 뒤의 채널별 discovery와 실행을 소유합니다.
현재 경계는 다음과 같습니다.
- 코어는 공유
message도구 호스트, 프롬프트 연결, 세션/스레드 bookkeeping, 실행 dispatch를 소유합니다 - 채널 Plugin은 범위가 지정된 action discovery, capability discovery, 채널별 schema fragment를 소유합니다
- 채널 Plugin은 conversation id가 thread id를 인코딩하거나 parent conversation에서 상속하는 방식 같은 provider별 세션 conversation grammar를 소유합니다
- 채널 Plugin은 action adapter를 통해 최종 action을 실행합니다
ChannelMessageActionAdapter.describeMessageTool(...)입니다. 이 통합 discovery 호출을 통해 Plugin은 표시되는 action, capability, schema contribution을 함께 반환할 수 있으므로 해당 요소들이 서로 어긋나지 않습니다.
채널별 메시지 도구 param이 로컬 path나 원격 media URL 같은 media source를 전달하는 경우, Plugin은 describeMessageTool(...)에서 mediaSourceParams도 반환해야 합니다. 코어는 Plugin이 소유한 param 이름을 하드코딩하지 않고도 sandbox path normalization과 outbound media-access hint를 적용하기 위해 이 명시적 목록을 사용합니다. 여기서는 채널 전체에 대한 단일 flat list가 아니라 action 범위의 map을 선호하세요. 그래야 profile 전용 media param이 send 같은 관련 없는 action에서 normalize되지 않습니다.
코어는 해당 discovery 단계에 runtime scope를 전달합니다. 중요한 필드는 다음과 같습니다.
accountIdcurrentChannelIdcurrentThreadTscurrentMessageIdsessionKeysessionIdagentId- 신뢰된 inbound
requesterSenderId
message 도구에 채널별 branch를 하드코딩하지 않고도 active account, 현재 room/thread/message, 신뢰된 requester identity를 기준으로 메시지 action을 숨기거나 노출할 수 있습니다.
embedded-runner routing 변경이 여전히 Plugin 작업인 이유도 이것입니다. runner는 현재 chat/session identity를 Plugin discovery 경계로 전달하여 공유 message 도구가 현재 turn에 맞는 올바른 채널 소유 표면을 노출하도록 할 책임이 있습니다.
채널 소유 실행 helper의 경우, bundled Plugin은 실행 runtime을 자체 extension module 안에 유지해야 합니다. 코어는 더 이상 src/agents/tools 아래의 Discord, Slack, Telegram, WhatsApp message-action runtime을 소유하지 않습니다. 별도의 plugin-sdk/*-action-runtime subpath를 publish하지 않으며, bundled Plugin은 자신의 extension 소유 module에서 자체 local runtime code를 직접 import해야 합니다.
동일한 경계는 일반적으로 provider 이름이 붙은 SDK seam에도 적용됩니다. 코어는 Slack, Discord, Signal, WhatsApp 또는 유사한 extension의 채널별 convenience barrel을 import해서는 안 됩니다. 코어에 어떤 behavior가 필요하다면 bundled Plugin 자체의 api.ts / runtime-api.ts barrel을 사용하거나, 그 필요를 공유 SDK의 좁은 generic capability로 승격하세요.
Bundled Plugin도 같은 규칙을 따릅니다. bundled Plugin의 runtime-api.ts는 자체 branded openclaw/plugin-sdk/<plugin-id> facade를 다시 export해서는 안 됩니다. 이러한 branded facade는 external Plugin과 오래된 consumer를 위한 compatibility shim으로 남지만, bundled Plugin은 local export와 openclaw/plugin-sdk/channel-policy, openclaw/plugin-sdk/runtime-store, openclaw/plugin-sdk/webhook-ingress 같은 좁은 generic SDK subpath를 사용해야 합니다. 기존 external ecosystem의 compatibility boundary가 요구하지 않는 한, 새 코드는 plugin-id-specific SDK facade를 추가해서는 안 됩니다.
poll의 경우 구체적으로 두 가지 실행 경로가 있습니다.
outbound.sendPoll은 공통 poll model에 맞는 채널을 위한 공유 baseline입니다actions.handleAction("poll")은 채널별 poll semantic이나 추가 poll parameter를 위한 권장 경로입니다
Capability 소유권 모델
OpenClaw는 native Plugin을 서로 관련 없는 integration 묶음이 아니라 회사 또는 기능의 소유권 경계로 취급합니다. 이는 다음을 의미합니다.- 회사 Plugin은 일반적으로 해당 회사의 OpenClaw-facing surface 전체를 소유해야 합니다
- 기능 Plugin은 일반적으로 자신이 도입하는 전체 feature surface를 소유해야 합니다
- 채널은 provider behavior를 ad hoc으로 다시 구현하는 대신 공유 코어 capability를 사용해야 합니다
Vendor multi-capability
Vendor multi-capability
openai는 text inference, speech, realtime voice, media understanding, image generation을 소유합니다. google은 text inference와 media understanding, image generation, web search를 소유합니다. qwen은 text inference와 media understanding, video generation을 소유합니다.Vendor single-capability
Vendor single-capability
elevenlabs와 microsoft는 speech를 소유하고, firecrawl은 web-fetch를 소유하며, minimax / mistral / moonshot / zai는 media-understanding backend를 소유합니다.Feature plugin
Feature plugin
voice-call은 call transport, tool, CLI, route, Twilio media-stream bridging을 소유하지만, vendor Plugin을 직접 import하는 대신 공유 speech, realtime transcription, realtime voice capability를 사용합니다.- OpenAI는 text model, speech, image, 향후 video에 걸쳐 있더라도 하나의 Plugin에 있습니다
- 다른 vendor도 자신의 surface area에 대해 같은 방식을 사용할 수 있습니다
- 채널은 어떤 vendor Plugin이 provider를 소유하는지 신경 쓰지 않고, 코어가 노출하는 공유 capability contract를 사용합니다
- Plugin = 소유권 경계
- capability = 여러 Plugin이 구현하거나 사용할 수 있는 코어 contract
이렇게 하면 소유권을 명시적으로 유지하면서, 단일 vendor나 일회성 Plugin-specific code path에 의존하는 코어 behavior를 피할 수 있습니다.
Capability layering
코드가 어디에 속하는지 결정할 때 이 mental model을 사용하세요.- Core capability layer
- Vendor plugin layer
- Channel/feature plugin layer
공유 orchestration, policy, fallback, config merge rule, delivery semantic, typed contract.
- 코어는 reply-time TTS policy, fallback order, pref, channel delivery를 소유합니다
openai,elevenlabs,microsoft는 synthesis implementation을 소유합니다voice-call은 telephony TTS runtime helper를 사용합니다
Multi-capability company Plugin 예시
회사 Plugin은 외부에서 응집력 있게 느껴져야 합니다. OpenClaw에 model, speech, realtime transcription, realtime voice, media understanding, image generation, video generation, web fetch, web search에 대한 공유 contract가 있다면, vendor는 자신의 모든 surface를 한곳에서 소유할 수 있습니다.- 하나의 Plugin이 vendor surface를 소유합니다
- 코어는 여전히 capability contract를 소유합니다
- 채널과 기능 Plugin은 vendor code가 아니라
api.runtime.*helper를 사용합니다 - contract test는 Plugin이 소유한다고 주장하는 capability를 register했는지 assert할 수 있습니다
Capability 예시: video understanding
OpenClaw는 이미 image/audio/video understanding을 하나의 공유 capability로 취급합니다. 동일한 소유권 모델이 여기에 적용됩니다.Vendor plugins register
Vendor Plugin은 해당되는 경우
describeImage, transcribeAudio, describeVideo를 register합니다.api.registerVideoGenerationProvider(...) implementation을 register합니다.
구체적인 rollout checklist가 필요하신가요? Capability Cookbook을 참고하세요.
Contract와 enforcement
Plugin API surface는 의도적으로OpenClawPluginApi에 typed되고 centralized되어 있습니다. 이 contract는 지원되는 registration point와 Plugin이 의존할 수 있는 runtime helper를 정의합니다.
이것이 중요한 이유는 다음과 같습니다.
- Plugin author는 하나의 안정적인 internal standard를 얻습니다
- 코어는 같은 provider id를 두 Plugin이 register하는 것 같은 중복 소유권을 거절할 수 있습니다
- startup은 잘못된 registration에 대해 actionable diagnostic을 표시할 수 있습니다
- contract test는 bundled-Plugin ownership을 enforce하고 silent drift를 방지할 수 있습니다
Runtime registration enforcement
Runtime registration enforcement
Plugin 레지스트리는 Plugin이 로드될 때 등록을 검증합니다. 예: 중복된 provider id, 중복된 speech provider id, 잘못된 형식의 등록은 정의되지 않은 동작 대신 Plugin 진단을 생성합니다.
Contract tests
Contract tests
번들된 Plugin은 테스트 실행 중 계약 레지스트리에 캡처되어 OpenClaw가 소유권을 명시적으로 검증할 수 있습니다. 현재 이는 모델 provider, speech provider, 웹 검색 provider, 번들 등록 소유권에 사용됩니다.
계약에 포함되어야 하는 것
- Good contracts
- Bad contracts
- 타입이 지정됨
- 작음
- capability별로 구체적임
- core가 소유함
- 여러 Plugin에서 재사용 가능함
- 벤더 지식 없이 채널/기능에서 사용할 수 있음
실행 모델
네이티브 OpenClaw Plugin은 Gateway와 같은 프로세스 안에서 실행됩니다. 샌드박스 처리되지 않습니다. 로드된 네이티브 Plugin은 core 코드와 동일한 프로세스 수준 신뢰 경계를 가집니다. 호환 번들은 OpenClaw가 현재 이를 메타데이터/콘텐츠 팩으로 취급하므로 기본적으로 더 안전합니다. 현재 릴리스에서는 이는 주로 번들된 Skills를 의미합니다. 번들되지 않은 Plugin에는 allowlist와 명시적인 설치/로드 경로를 사용하세요. 워크스페이스 Plugin은 프로덕션 기본값이 아니라 개발 시점 코드로 취급하세요. 번들된 워크스페이스 패키지 이름의 경우, Plugin id를 npm 이름에 고정하세요. 기본값은@openclaw/<id>이며, 패키지가 의도적으로 더 좁은 Plugin 역할을 노출하는 경우 -provider, -plugin, -speech, -sandbox, -media-understanding 같은 승인된 타입 접미사를 사용할 수 있습니다.
신뢰 참고:
plugins.allow는 소스 출처가 아니라 Plugin id를 신뢰합니다. 번들된 Plugin과 동일한 id를 가진 워크스페이스 Plugin은 해당 워크스페이스 Plugin이 활성화되거나 allowlist에 포함될 때 의도적으로 번들된 복사본을 가립니다. 이는 정상이며 로컬 개발, 패치 테스트, 핫픽스에 유용합니다. 번들된 Plugin의 신뢰는 설치 메타데이터가 아니라 로드 시점의 디스크에 있는 매니페스트와 코드인 소스 스냅샷에서 해석됩니다. 손상되었거나 대체된 설치 레코드는 실제 소스가 주장하는 범위를 넘어 번들된 Plugin의 신뢰 표면을 조용히 넓힐 수 없습니다.내보내기 경계
OpenClaw는 구현 편의성이 아니라 capability를 내보냅니다. capability 등록은 공개로 유지하세요. 계약이 아닌 헬퍼 내보내기는 줄이세요.- 번들된 Plugin별 헬퍼 하위 경로
- 공개 API로 의도되지 않은 런타임 배관 하위 경로
- 벤더별 편의 헬퍼
- 구현 세부 사항인 setup/onboarding 헬퍼
plugin-sdk/gateway-runtime, plugin-sdk/security-runtime, plugin-sdk/plugin-config-runtime 같은 일반 SDK 계약으로 승격하세요.