Building Plugins
Plugins는 OpenClaw에 새로운 기능을 추가합니다: 채널, 모델 provider, speech, 실시간 transcription, 실시간 voice, media 이해, 이미지 생성, 비디오 생성, 웹 fetch, 웹 search, 에이전트 도구 또는 이들의 조합. plugin을 OpenClaw 리포지토리에 추가할 필요는 없습니다. ClawHub 또는 npm에 게시하고 사용자는openclaw plugins install <package-name>로 설치합니다. OpenClaw는 먼저 ClawHub를 시도하고
자동으로 npm으로 대체합니다.
전제 조건
- Node >= 22 및 패키지 관리자(npm 또는 pnpm)
- TypeScript(ESM)에 대한 익숙함
- 리포지토리 내부 plugin의 경우: 리포지토리 클론 및
pnpm install완료
어떤 종류의 plugin인가요?
채널 plugin
OpenClaw를 메시징 플랫폼(Discord, IRC 등)에 연결
Provider plugin
모델 provider(LLM, 프록시 또는 사용자 지정 엔드포인트) 추가
도구 / hook plugin
에이전트 도구, 이벤트 hook 또는 서비스 등록 — 아래 계속
openclaw/plugin-sdk/channel-setup의
createOptionalChannelSetupSurface(...)를 사용하세요. 이는 설치 요구 사항을 광고하고,
plugin이 설치될 때까지 실제 config 기록에서 fail closed하는 설정 adapter + wizard 쌍을 생성합니다.
빠른 시작: 도구 plugin
이 단계별 설명에서는 에이전트 도구를 등록하는 최소 plugin을 만듭니다. 채널 및 provider plugins에는 위에 링크된 전용 가이드가 있습니다.패키지와 manifest 만들기
docs/snippets/plugin-publish/에 있습니다.진입점 작성
definePluginEntry는 비채널 plugin용입니다. 채널의 경우
defineChannelPluginEntry를 사용하세요 — Channel Plugins를 참조하세요.
전체 진입점 옵션은 Entry Points를 참조하세요.Plugin 기능
하나의 plugin은api 객체를 통해 임의 개수의 기능을 등록할 수 있습니다:
| 기능 | 등록 메서드 | 상세 가이드 |
|---|---|---|
| 텍스트 추론(LLM) | api.registerProvider(...) | Provider Plugins |
| CLI 추론 백엔드 | api.registerCliBackend(...) | CLI Backends |
| 채널 / 메시징 | api.registerChannel(...) | Channel Plugins |
| Speech (TTS/STT) | api.registerSpeechProvider(...) | Provider Plugins |
| 실시간 transcription | api.registerRealtimeTranscriptionProvider(...) | Provider Plugins |
| 실시간 voice | api.registerRealtimeVoiceProvider(...) | Provider Plugins |
| Media 이해 | api.registerMediaUnderstandingProvider(...) | Provider Plugins |
| 이미지 생성 | api.registerImageGenerationProvider(...) | Provider Plugins |
| 비디오 생성 | api.registerVideoGenerationProvider(...) | Provider Plugins |
| 웹 fetch | api.registerWebFetchProvider(...) | Provider Plugins |
| 웹 search | api.registerWebSearchProvider(...) | Provider Plugins |
| 에이전트 도구 | api.registerTool(...) | 아래 |
| 사용자 지정 명령 | api.registerCommand(...) | Entry Points |
| 이벤트 hook | api.registerHook(...) | Entry Points |
| HTTP 라우트 | api.registerHttpRoute(...) | Internals |
| CLI 하위 명령 | api.registerCli(...) | Entry Points |
config.*,
exec.approvals.*, wizard.*, update.*)는 예약된 상태로 유지되며
plugin이 더 좁은 범위를 요청하더라도 항상 operator.admin으로 해석됩니다.
기억해야 할 hook 가드 의미:
before_tool_call:{ block: true }는 최종 결정이며 더 낮은 우선순위 핸들러를 중단시킵니다.before_tool_call:{ block: false }는 결정 없음으로 처리됩니다.before_tool_call:{ requireApproval: true }는 에이전트 실행을 일시 중지하고 exec 승인 오버레이, Telegram 버튼, Discord 상호작용 또는 어느 채널에서든/approve명령을 통해 사용자 승인을 요청합니다.before_install:{ block: true }는 최종 결정이며 더 낮은 우선순위 핸들러를 중단시킵니다.before_install:{ block: false }는 결정 없음으로 처리됩니다.message_sending:{ cancel: true }는 최종 결정이며 더 낮은 우선순위 핸들러를 중단시킵니다.message_sending:{ cancel: false }는 결정 없음으로 처리됩니다.
/approve 명령은 exec 승인과 plugin 승인 모두를 제한된 fallback과 함께 처리합니다. exec 승인 ID를 찾지 못하면 OpenClaw는 동일한 ID를 plugin 승인을 통해 다시 시도합니다. plugin 승인 전달은 config의 approvals.plugin을 통해 독립적으로 구성할 수 있습니다.
사용자 지정 승인 플러밍에서 동일한 제한된 fallback 사례를 감지해야 한다면,
승인 만료 문자열을 수동으로 매칭하지 말고 openclaw/plugin-sdk/error-runtime의
isApprovalNotFoundError를 사용하세요.
자세한 내용은 SDK Overview hook decision semantics를 참조하세요.
에이전트 도구 등록
도구는 LLM이 호출할 수 있는 타입 지정 함수입니다. 필수(항상 사용 가능) 또는 선택 사항(사용자 opt-in)으로 만들 수 있습니다:- 도구 이름은 코어 도구와 충돌하면 안 됩니다(충돌 시 건너뜀)
- 부작용이나 추가 바이너리 요구 사항이 있는 도구에는
optional: true를 사용하세요 - 사용자는
tools.allow에 plugin ID를 추가하여 plugin의 모든 도구를 활성화할 수 있습니다
import 규칙
항상 집중된openclaw/plugin-sdk/<subpath> 경로에서 import하세요:
api.ts, runtime-api.ts)을 사용하세요 — 자신의 plugin을 SDK 경로를 통해 import하지 마세요.
provider plugins의 경우 provider 전용 helper는 해당 패키지 루트
barrel에 유지하세요. seam이 진짜로 일반적인 경우에만 예외입니다. 현재 번들 예시:
- Anthropic: Claude 스트림 래퍼 및
service_tier/ 베타 helper - OpenAI: provider 빌더, 기본 모델 helper, 실시간 provider
- OpenRouter: provider 빌더 및 onboarding/config helper
openclaw/plugin-sdk/*로 승격시키기보다 해당
패키지 루트 seam에 두세요.
생성된 일부 openclaw/plugin-sdk/<bundled-id> helper seam은 여전히
번들 plugin 유지관리와 호환성을 위해 존재합니다. 예를 들어
plugin-sdk/feishu-setup 또는 plugin-sdk/zalo-setup이 있습니다. 이를
새 서드파티 plugin의 기본 패턴이 아니라 예약된 표면으로 취급하세요.
제출 전 체크리스트
package.json에 올바른
openclaw 메타데이터가 있음openclaw.plugin.json manifest가 존재하고 유효함
진입점이
defineChannelPluginEntry 또는 definePluginEntry를 사용함모든 import가 집중된
plugin-sdk/<subpath> 경로를 사용함내부 import가 SDK self-import가 아니라 로컬 모듈을 사용함
테스트 통과 (
pnpm test -- <bundled-plugin-root>/my-plugin/)pnpm check 통과 (리포지토리 내부 plugins)베타 릴리스 테스트
- openclaw/openclaw의 GitHub 릴리스 태그를 주시하고
Watch>Releases를 통해 구독하세요. 베타 태그는v2026.3.N-beta.1처럼 보입니다. 릴리스 공지를 위해 공식 OpenClaw X 계정 @openclaw의 알림을 켤 수도 있습니다. - 베타 태그가 나타나는 즉시 plugin을 테스트하세요. stable 이전의 창은 보통 몇 시간밖에 되지 않습니다.
- 테스트 후
plugin-forumDiscord 채널의 plugin 스레드에all good또는 무엇이 깨졌는지를 게시하세요. 아직 스레드가 없다면 새로 만드세요. - 무언가 깨졌다면
Beta blocker: <plugin-name> - <summary>제목으로 이슈를 열거나 업데이트하고beta-blocker레이블을 적용하세요. 이슈 링크를 스레드에 넣으세요. main에fix(<plugin-id>): beta blocker - <summary>제목으로 PR을 열고, PR과 Discord 스레드 모두에 이슈를 링크하세요. 기여자는 PR에 레이블을 붙일 수 없으므로 제목이 유지관리자와 자동화를 위한 PR 측 신호입니다. PR이 있는 blocker는 병합되고, 없는 blocker는 그대로 릴리스될 수 있습니다. 유지관리자는 베타 테스트 동안 이 스레드를 모니터링합니다.- 아무 말이 없으면 녹색 신호입니다. 시간을 놓쳤다면 수정 사항은 다음 주기에 들어갈 가능성이 큽니다.
다음 단계
Channel Plugins
메시징 채널 plugin 만들기
Provider Plugins
모델 provider plugin 만들기
SDK Overview
import 맵 및 등록 API 참조
Runtime Helpers
api.runtime를 통한 TTS, search, subagentTesting
테스트 유틸리티 및 패턴
Plugin Manifest
전체 manifest 스키마 참조
관련
- Plugin Architecture — 내부 아키텍처 심층 설명
- SDK Overview — Plugin SDK 참조
- Manifest — plugin manifest 형식
- Channel Plugins — 채널 plugin 만들기
- Provider Plugins — provider plugin 만들기