Plugin SDK 개요
plugin SDK는 플러그인과 코어 사이의 타입 지정된 계약입니다. 이 페이지는 무엇을 임포트해야 하는지와 무엇을 등록할 수 있는지에 대한 참조입니다.임포트 규칙
항상 특정 하위 경로에서 임포트하세요:openclaw/plugin-sdk/channel-core를 우선 사용하고, 더 넓은 우산형 표면과
buildChannelConfigSchema 같은 공용 헬퍼에는 openclaw/plugin-sdk/core를
사용하세요.
openclaw/plugin-sdk/slack, openclaw/plugin-sdk/discord,
openclaw/plugin-sdk/signal, openclaw/plugin-sdk/whatsapp 같은
프로바이더 이름이 붙은 편의 seam이나 채널 브랜드 헬퍼 seam을 추가하거나
의존하지 마세요. 번들 플러그인은 자체 api.ts 또는 runtime-api.ts
barrel 내부에서 일반적인 SDK 하위 경로를 조합해야 하며, 코어는 해당 필요가
정말로 채널 간 공통인 경우에만 그 플러그인 로컬 barrel을 사용하거나
좁은 범위의 일반 SDK 계약을 추가해야 합니다.
생성된 export 맵에는 여전히 plugin-sdk/feishu, plugin-sdk/feishu-setup,
plugin-sdk/zalo, plugin-sdk/zalo-setup, plugin-sdk/matrix* 같은
소수의 번들 플러그인 헬퍼 seam이 포함되어 있습니다. 이러한 하위 경로는
번들 플러그인 유지 관리와 호환성을 위해서만 존재하며, 아래의 공통 표에서는
의도적으로 제외되어 있고 새 서드파티 플러그인에 권장되는 임포트 경로가
아닙니다.
하위 경로 참조
용도별로 그룹화한, 가장 자주 사용되는 하위 경로입니다. 생성된 전체 목록 200개 이상의 하위 경로는scripts/lib/plugin-sdk-entrypoints.json에
있습니다.
예약된 번들 플러그인 헬퍼 하위 경로는 여전히 생성된 목록에 표시됩니다.
문서 페이지에서 명시적으로 공개용으로 안내하지 않는 한, 이를 구현 세부 사항/
호환성 표면으로 취급하세요.
플러그인 엔트리
| 하위 경로 | 주요 export |
|---|---|
plugin-sdk/plugin-entry | definePluginEntry |
plugin-sdk/core | defineChannelPluginEntry, createChatChannelPlugin, createChannelPluginBase, defineSetupPluginEntry, buildChannelConfigSchema |
plugin-sdk/config-schema | OpenClawSchema |
plugin-sdk/provider-entry | defineSingleProviderPluginEntry |
채널 하위 경로
채널 하위 경로
프로바이더 하위 경로
프로바이더 하위 경로
인증 및 보안 하위 경로
인증 및 보안 하위 경로
| 하위 경로 | 주요 export |
|---|---|
plugin-sdk/command-auth | resolveControlCommandGate, 명령 레지스트리 헬퍼, 발신자 권한 부여 헬퍼 |
plugin-sdk/approval-auth-runtime | 승인자 해결 및 동일 채팅 action-auth 헬퍼 |
plugin-sdk/approval-client-runtime | 네이티브 exec 승인 프로필/필터 헬퍼 |
plugin-sdk/approval-delivery-runtime | 네이티브 승인 기능/전달 어댑터 |
plugin-sdk/approval-native-runtime | 네이티브 승인 대상 + account-binding 헬퍼 |
plugin-sdk/approval-reply-runtime | exec/plugin 승인 응답 페이로드 헬퍼 |
plugin-sdk/command-auth-native | 네이티브 명령 auth + 네이티브 session-target 헬퍼 |
plugin-sdk/command-detection | 공용 명령 감지 헬퍼 |
plugin-sdk/command-surface | command-body 정규화 및 command-surface 헬퍼 |
plugin-sdk/allow-from | formatAllowFromLowercase |
plugin-sdk/security-runtime | 공용 신뢰, DM 게이팅, 외부 콘텐츠 및 비밀 수집 헬퍼 |
plugin-sdk/ssrf-policy | 호스트 allowlist 및 사설 네트워크 SSRF 정책 헬퍼 |
plugin-sdk/ssrf-runtime | pinned-dispatcher, SSRF 보호 fetch 및 SSRF 정책 헬퍼 |
plugin-sdk/secret-input | 비밀 입력 파싱 헬퍼 |
plugin-sdk/webhook-ingress | 웹훅 요청/대상 헬퍼 |
plugin-sdk/webhook-request-guards | 요청 본문 크기/타임아웃 헬퍼 |
런타임 및 저장소 하위 경로
런타임 및 저장소 하위 경로
기능 및 테스트 하위 경로
기능 및 테스트 하위 경로
| 하위 경로 | 주요 export |
|---|---|
plugin-sdk/media-runtime | 미디어 페이로드 빌더를 포함한 공용 미디어 fetch/transform/store 헬퍼 |
plugin-sdk/media-understanding | 미디어 이해 프로바이더 타입과 프로바이더용 이미지/오디오 헬퍼 export |
plugin-sdk/text-runtime | assistant-visible-text 제거, markdown 렌더링/청킹/표 헬퍼, 리덕션 헬퍼, directive-tag 헬퍼 및 safe-text 유틸리티 같은 공용 텍스트/markdown/로깅 헬퍼 |
plugin-sdk/text-chunking | 아웃바운드 텍스트 청킹 헬퍼 |
plugin-sdk/speech | 음성 프로바이더 타입과 프로바이더용 directive, registry 및 검증 헬퍼 |
plugin-sdk/speech-core | 공용 음성 프로바이더 타입, registry, directive 및 정규화 헬퍼 |
plugin-sdk/realtime-transcription | 실시간 전사 프로바이더 타입 및 레지스트리 헬퍼 |
plugin-sdk/realtime-voice | 실시간 음성 프로바이더 타입 및 레지스트리 헬퍼 |
plugin-sdk/image-generation | 이미지 생성 프로바이더 타입 |
plugin-sdk/image-generation-core | 공용 이미지 생성 타입, 페일오버, auth 및 registry 헬퍼 |
plugin-sdk/video-generation | 비디오 생성 프로바이더/요청/결과 타입 |
plugin-sdk/video-generation-core | 공용 비디오 생성 타입, 페일오버 헬퍼, 프로바이더 조회 및 model-ref 파싱 |
plugin-sdk/webhook-targets | 웹훅 대상 레지스트리 및 route-install 헬퍼 |
plugin-sdk/webhook-path | 웹훅 경로 정규화 헬퍼 |
plugin-sdk/web-media | 공용 원격/로컬 미디어 로딩 헬퍼 |
plugin-sdk/zod | plugin SDK 소비자를 위해 재export된 zod |
plugin-sdk/testing | installCommonResolveTargetErrorCases, shouldAckReaction |
메모리 하위 경로
메모리 하위 경로
| 하위 경로 | 주요 export |
|---|---|
plugin-sdk/memory-core | manager/config/file/CLI 헬퍼를 위한 번들 memory-core 헬퍼 표면 |
plugin-sdk/memory-core-engine-runtime | 메모리 인덱스/검색 런타임 파사드 |
plugin-sdk/memory-core-host-engine-foundation | 메모리 호스트 기반 엔진 export |
plugin-sdk/memory-core-host-engine-embeddings | 메모리 호스트 임베딩 엔진 export |
plugin-sdk/memory-core-host-engine-qmd | 메모리 호스트 QMD 엔진 export |
plugin-sdk/memory-core-host-engine-storage | 메모리 호스트 저장소 엔진 export |
plugin-sdk/memory-core-host-multimodal | 메모리 호스트 멀티모달 헬퍼 |
plugin-sdk/memory-core-host-query | 메모리 호스트 쿼리 헬퍼 |
plugin-sdk/memory-core-host-secret | 메모리 호스트 비밀 헬퍼 |
plugin-sdk/memory-core-host-status | 메모리 호스트 상태 헬퍼 |
plugin-sdk/memory-core-host-runtime-cli | 메모리 호스트 CLI 런타임 헬퍼 |
plugin-sdk/memory-core-host-runtime-core | 메모리 호스트 코어 런타임 헬퍼 |
plugin-sdk/memory-core-host-runtime-files | 메모리 호스트 파일/런타임 헬퍼 |
plugin-sdk/memory-lancedb | 번들 memory-lancedb 헬퍼 표면 |
예약된 번들 헬퍼 하위 경로
예약된 번들 헬퍼 하위 경로
등록 API
register(api) 콜백은 다음 메서드를 가진 OpenClawPluginApi 객체를
받습니다:
기능 등록
| 메서드 | 등록하는 항목 |
|---|---|
api.registerProvider(...) | 텍스트 추론 (LLM) |
api.registerCliBackend(...) | 로컬 CLI 추론 백엔드 |
api.registerChannel(...) | 메시징 채널 |
api.registerSpeechProvider(...) | 텍스트 음성 변환 / STT 합성 |
api.registerRealtimeTranscriptionProvider(...) | 스트리밍 실시간 전사 |
api.registerRealtimeVoiceProvider(...) | 양방향 실시간 음성 세션 |
api.registerMediaUnderstandingProvider(...) | 이미지/오디오/비디오 분석 |
api.registerImageGenerationProvider(...) | 이미지 생성 |
api.registerVideoGenerationProvider(...) | 비디오 생성 |
api.registerWebFetchProvider(...) | 웹 fetch / 스크래핑 프로바이더 |
api.registerWebSearchProvider(...) | 웹 검색 |
도구 및 명령
| 메서드 | 등록하는 항목 |
|---|---|
api.registerTool(tool, opts?) | 에이전트 도구 (필수 또는 { optional: true }) |
api.registerCommand(def) | 사용자 지정 명령 (LLM 우회) |
인프라
| 메서드 | 등록하는 항목 |
|---|---|
api.registerHook(events, handler, opts?) | 이벤트 hook |
api.registerHttpRoute(params) | 게이트웨이 HTTP 엔드포인트 |
api.registerGatewayMethod(name, handler) | 게이트웨이 RPC 메서드 |
api.registerCli(registrar, opts?) | CLI 하위 명령 |
api.registerService(service) | 백그라운드 서비스 |
api.registerInteractiveHandler(registration) | 대화형 핸들러 |
config.*, exec.approvals.*, wizard.*,
update.*)는 플러그인이 더 좁은 게이트웨이 메서드 범위를 지정하려고 해도
항상 operator.admin으로 유지됩니다. 플러그인 소유 메서드에는
플러그인별 접두사를 사용하는 것이 좋습니다.
CLI 등록 메타데이터
api.registerCli(registrar, opts?)는 두 종류의 최상위 메타데이터를 받습니다:
commands: registrar가 소유한 명시적 명령 루트descriptors: 루트 CLI 도움말, 라우팅 및 지연 플러그인 CLI 등록에 사용되는 파싱 시점 명령 디스크립터
descriptors를
제공하세요.
commands를
단독으로 사용하세요. 이 eager 호환성 경로는 계속 지원되지만, 파싱 시점
지연 로딩을 위한 descriptor 기반 플레이스홀더는 설치하지 않습니다.
CLI 백엔드 등록
api.registerCliBackend(...)는 플러그인이 claude-cli 또는 codex-cli
같은 로컬 AI CLI 백엔드의 기본 config를 소유하도록 합니다.
- 백엔드
id는claude-cli/opus같은 model ref에서 프로바이더 접두사가 됩니다. - 백엔드
config는agents.defaults.cliBackends.<id>와 같은 형태를 사용합니다. - 사용자 config가 여전히 우선합니다. OpenClaw는 CLI를 실행하기 전에
agents.defaults.cliBackends.<id>를 플러그인 기본값 위에 병합합니다. - 병합 후 백엔드에 호환성 재작성(예: 이전 플래그 형식 정규화)이 필요한 경우
normalizeConfig를 사용하세요.
배타적 슬롯
| 메서드 | 등록하는 항목 |
|---|---|
api.registerContextEngine(id, factory) | 컨텍스트 엔진 (한 번에 하나만 활성) |
api.registerMemoryPromptSection(builder) | 메모리 프롬프트 섹션 빌더 |
api.registerMemoryFlushPlan(resolver) | 메모리 flush 계획 해결기 |
api.registerMemoryRuntime(runtime) | 메모리 런타임 어댑터 |
메모리 임베딩 어댑터
| 메서드 | 등록하는 항목 |
|---|---|
api.registerMemoryEmbeddingProvider(adapter) | 활성 플러그인을 위한 메모리 임베딩 어댑터 |
registerMemoryPromptSection,registerMemoryFlushPlan, 그리고registerMemoryRuntime은 메모리 플러그인 전용입니다.registerMemoryEmbeddingProvider를 사용하면 활성 메모리 플러그인이 하나 이상의 임베딩 어댑터 ID(예:openai,gemini, 또는 사용자 정의 플러그인 ID)를 등록할 수 있습니다.agents.defaults.memorySearch.provider및agents.defaults.memorySearch.fallback같은 사용자 config는 등록된 해당 어댑터 ID에 대해 해결됩니다.
이벤트 및 수명 주기
| 메서드 | 수행하는 작업 |
|---|---|
api.on(hookName, handler, opts?) | 타입 지정된 수명 주기 hook |
api.onConversationBindingResolved(handler) | 대화 바인딩 콜백 |
Hook 결정 의미론
before_tool_call:{ block: true }를 반환하면 최종 결정입니다. 어떤 핸들러든 이를 설정하면 더 낮은 우선순위의 핸들러는 건너뜁니다.before_tool_call:{ block: false }를 반환하면 결정 없음으로 처리됩니다(block을 생략한 것과 동일하며), override가 아닙니다.before_install:{ block: true }를 반환하면 최종 결정입니다. 어떤 핸들러든 이를 설정하면 더 낮은 우선순위의 핸들러는 건너뜁니다.before_install:{ block: false }를 반환하면 결정 없음으로 처리됩니다(block을 생략한 것과 동일하며), override가 아닙니다.message_sending:{ cancel: true }를 반환하면 최종 결정입니다. 어떤 핸들러든 이를 설정하면 더 낮은 우선순위의 핸들러는 건너뜁니다.message_sending:{ cancel: false }를 반환하면 결정 없음으로 처리됩니다(cancel을 생략한 것과 동일하며), override가 아닙니다.
API 객체 필드
| 필드 | 타입 | 설명 |
|---|---|---|
api.id | string | 플러그인 ID |
api.name | string | 표시 이름 |
api.version | string? | 플러그인 버전 (선택 사항) |
api.description | string? | 플러그인 설명 (선택 사항) |
api.source | string | 플러그인 소스 경로 |
api.rootDir | string? | 플러그인 루트 디렉터리 (선택 사항) |
api.config | OpenClawConfig | 현재 config 스냅샷 (사용 가능한 경우 활성 인메모리 런타임 스냅샷) |
api.pluginConfig | Record<string, unknown> | plugins.entries.<id>.config의 플러그인별 config |
api.runtime | PluginRuntime | 런타임 헬퍼 |
api.logger | PluginLogger | 범위 지정 로거 (debug, info, warn, error) |
api.registrationMode | PluginRegistrationMode | 현재 로드 모드; "setup-runtime"은 가벼운 전체 엔트리 전 시작/설정 창입니다 |
api.resolvePath(input) | (string) => string | 플러그인 루트를 기준으로 경로 해결 |
내부 모듈 규칙
플러그인 내부에서는 내부 임포트를 위해 로컬 barrel 파일을 사용하세요:api.ts, runtime-api.ts,
index.ts, setup-entry.ts 및 유사한 공개 엔트리 파일)은 이제 OpenClaw가
이미 실행 중인 경우 활성 런타임 config 스냅샷을 우선 사용합니다. 아직
런타임 스냅샷이 없으면 디스크에서 해결된 config 파일로 폴백합니다.
프로바이더 플러그인은 헬퍼가 의도적으로 프로바이더별이며 아직 일반적인 SDK
하위 경로에 속하지 않는 경우, 좁은 범위의 플러그인 로컬 계약 barrel을
노출할 수도 있습니다. 현재 번들 예시: Anthropic 프로바이더는 Anthropic
beta-header 및 service_tier 로직을 일반적인 plugin-sdk/* 계약으로
승격하는 대신, Claude 스트림 헬퍼를 자체 공개 api.ts /
contract-api.ts seam에 유지합니다.
다른 현재 번들 예시는 다음과 같습니다:
@openclaw/openai-provider:api.ts는 프로바이더 빌더, 기본 모델 헬퍼 및 실시간 프로바이더 빌더를 export합니다@openclaw/openrouter-provider:api.ts는 프로바이더 빌더와 온보딩/config 헬퍼를 export합니다
관련 내용
- 엔트리 포인트 —
definePluginEntry및defineChannelPluginEntry옵션 - 런타임 헬퍼 — 전체
api.runtime네임스페이스 참조 - 설정 및 config — 패키징, 매니페스트, config 스키마
- 테스트 — 테스트 유틸리티 및 lint 규칙
- SDK 마이그레이션 — 사용 중단된 표면에서 마이그레이션
- 플러그인 내부 구조 — 심층 아키텍처 및 기능 모델