Plugins
Gambaran umum Plugin SDK
SDK Plugin adalah kontrak bertipe antara Plugin dan inti. Halaman ini adalah referensi untuk apa yang perlu diimpor dan apa yang dapat Anda daftarkan.
Konvensi impor
Selalu impor dari subpath tertentu:
Setiap subpath adalah modul kecil yang mandiri. Ini menjaga startup tetap cepat dan
mencegah masalah dependensi melingkar. Untuk helper entry/build khusus channel,
utamakan openclaw/plugin-sdk/channel-core; gunakan openclaw/plugin-sdk/core untuk
permukaan payung yang lebih luas dan helper bersama seperti
buildChannelConfigSchema.
Untuk konfigurasi channel, publikasikan JSON Schema milik channel melalui
openclaw.plugin.json#channelConfigs. Subpath plugin-sdk/channel-config-schema
ditujukan untuk primitif skema bersama dan builder generik. Plugin bawaan OpenClaw
menggunakan plugin-sdk/bundled-channel-config-schema untuk skema channel bawaan
yang dipertahankan. Ekspor kompatibilitas yang tidak digunakan lagi tetap ada di
plugin-sdk/channel-config-schema-legacy; tidak satu pun subpath skema bawaan ini
menjadi pola untuk Plugin baru.
Referensi subpath
SDK Plugin diekspos sebagai sekumpulan subpath sempit yang dikelompokkan menurut area (entry Plugin, channel, provider, auth, runtime, capability, memory, dan helper Plugin bawaan yang dicadangkan). Untuk katalog lengkap — dikelompokkan dan ditautkan — lihat Subpath SDK Plugin.
Daftar 200+ subpath yang dihasilkan berada di scripts/lib/plugin-sdk-entrypoints.json.
API pendaftaran
Callback register(api) menerima objek OpenClawPluginApi dengan metode berikut:
Pendaftaran capability
| Metode | Yang didaftarkan |
|---|---|
api.registerProvider(...) |
Inferensi teks (LLM) |
api.registerAgentHarness(...) |
Eksekutor agen level rendah eksperimental |
api.registerCliBackend(...) |
Backend inferensi CLI lokal |
api.registerChannel(...) |
Channel pesan |
api.registerSpeechProvider(...) |
Sintesis teks-ke-ucapan / STT |
api.registerRealtimeTranscriptionProvider(...) |
Transkripsi realtime streaming |
api.registerRealtimeVoiceProvider(...) |
Sesi suara realtime dupleks |
api.registerMediaUnderstandingProvider(...) |
Analisis gambar/audio/video |
api.registerImageGenerationProvider(...) |
Pembuatan gambar |
api.registerMusicGenerationProvider(...) |
Pembuatan musik |
api.registerVideoGenerationProvider(...) |
Pembuatan video |
api.registerWebFetchProvider(...) |
Provider pengambilan / scrape web |
api.registerWebSearchProvider(...) |
Pencarian web |
Alat dan perintah
| Metode | Yang didaftarkan |
|---|---|
api.registerTool(tool, opts?) |
Alat agen (wajib atau { optional: true }) |
api.registerCommand(def) |
Perintah kustom (melewati LLM) |
Perintah Plugin dapat menetapkan agentPromptGuidance ketika agen membutuhkan petunjuk routing singkat
milik perintah. Pertahankan teks itu tentang perintah itu sendiri; jangan tambahkan
kebijakan khusus provider atau Plugin ke builder prompt inti.
Infrastruktur
| Metode | Yang didaftarkan |
|---|---|
api.registerHook(events, handler, opts?) |
Hook event |
api.registerHttpRoute(params) |
Endpoint HTTP Gateway |
api.registerGatewayMethod(name, handler) |
Metode RPC Gateway |
api.registerGatewayDiscoveryService(service) |
Pengiklan discovery Gateway lokal |
api.registerCli(registrar, opts?) |
Subperintah CLI |
api.registerService(service) |
Layanan latar belakang |
api.registerInteractiveHandler(registration) |
Handler interaktif |
api.registerAgentToolResultMiddleware(...) |
Middleware hasil alat runtime |
api.registerMemoryPromptSupplement(builder) |
Bagian prompt tambahan yang berdekatan dengan memory |
api.registerMemoryCorpusSupplement(adapter) |
Korpus pencarian/baca memory tambahan |
Hook host untuk Plugin workflow
Hook host adalah seam SDK untuk Plugin yang perlu berpartisipasi dalam siklus hidup host alih-alih hanya menambahkan provider, channel, atau alat. Hook ini adalah kontrak generik; Plan Mode dapat menggunakannya, begitu juga workflow persetujuan, gate kebijakan workspace, monitor latar belakang, wizard setup, dan Plugin pendamping UI.
| Metode | Kontrak yang dimilikinya |
|---|---|
api.registerSessionExtension(...) |
State sesi milik Plugin yang kompatibel dengan JSON dan diproyeksikan melalui sesi Gateway |
api.enqueueNextTurnInjection(...) |
Konteks exactly-once yang tahan lama, diinjeksi ke giliran agen berikutnya untuk satu sesi |
api.registerTrustedToolPolicy(...) |
Kebijakan alat pra-Plugin bawaan/tepercaya yang dapat memblokir atau menulis ulang params alat |
api.registerToolMetadata(...) |
Metadata tampilan katalog alat tanpa mengubah implementasi alat |
api.registerCommand(...) |
Perintah Plugin berscope; hasil perintah dapat menetapkan continueAgent: true; perintah native Discord mendukung descriptionLocalizations |
api.registerControlUiDescriptor(...) |
Descriptor kontribusi Control UI untuk permukaan sesi, alat, run, atau pengaturan |
api.registerRuntimeLifecycle(...) |
Callback cleanup untuk resource runtime milik Plugin pada path reset/delete/reload |
api.registerAgentEventSubscription(...) |
Langganan event yang disanitasi untuk state workflow dan monitor |
api.setRunContext(...) / getRunContext(...) / clearRunContext(...) |
State scratch Plugin per-run yang dibersihkan pada siklus hidup run terminal |
api.registerSessionSchedulerJob(...) |
Record pekerjaan scheduler sesi milik Plugin dengan cleanup deterministik |
Kontrak ini sengaja membagi otoritas:
- Plugin eksternal dapat memiliki ekstensi sesi, descriptor UI, perintah, metadata alat, injeksi giliran berikutnya, dan hook normal.
- Kebijakan alat tepercaya berjalan sebelum hook
before_tool_callbiasa dan hanya untuk bawaan karena berpartisipasi dalam kebijakan keamanan host. - Kepemilikan perintah yang dicadangkan hanya untuk bawaan. Plugin eksternal harus menggunakan nama perintah atau alias mereka sendiri.
allowPromptInjection=falsemenonaktifkan hook yang mengubah prompt termasukagent_turn_prepare,before_prompt_build,heartbeat_prompt_contribution, field prompt daribefore_agent_startlegacy, danenqueueNextTurnInjection.
Contoh konsumen non-Plan:
| Arketipe Plugin | Hook yang digunakan |
|---|---|
| Workflow persetujuan | Ekstensi sesi, kelanjutan perintah, injeksi giliran berikutnya, descriptor UI |
| Gate kebijakan anggaran/workspace | Kebijakan alat tepercaya, metadata alat, proyeksi sesi |
| Monitor siklus hidup latar belakang | Cleanup siklus hidup runtime, langganan event agen, kepemilikan/cleanup scheduler sesi, kontribusi prompt Heartbeat, descriptor UI |
| Wizard setup atau onboarding | Ekstensi sesi, perintah berscope, descriptor Control UI |
Kapan menggunakan middleware hasil alat
Plugin bawaan dapat menggunakan api.registerAgentToolResultMiddleware(...) ketika
mereka perlu menulis ulang hasil alat setelah eksekusi dan sebelum runtime
memasukkan hasil tersebut kembali ke model. Ini adalah seam tepercaya yang netral terhadap runtime
untuk reducer output asinkron seperti tokenjuice.
Plugin bawaan harus mendeklarasikan contracts.agentToolResultMiddleware untuk setiap
runtime yang ditargetkan, misalnya ["pi", "codex"]. Plugin eksternal
tidak dapat mendaftarkan middleware ini; gunakan hook Plugin OpenClaw normal untuk pekerjaan
yang tidak membutuhkan timing hasil alat pra-model. Path pendaftaran factory ekstensi tertanam
khusus Pi yang lama telah dihapus.
Pendaftaran discovery Gateway
api.registerGatewayDiscoveryService(...) memungkinkan Plugin mengiklankan Gateway aktif
pada transport discovery lokal seperti mDNS/Bonjour. OpenClaw memanggil
service selama startup Gateway ketika discovery lokal diaktifkan, meneruskan
port Gateway saat ini dan data petunjuk TXT non-rahasia, lalu memanggil handler
stop yang dikembalikan selama shutdown Gateway.
api.registerGatewayDiscoveryService({
id: "my-discovery",
async advertise(ctx) {
const handle = await startMyAdvertiser({
gatewayPort: ctx.gatewayPort,
tls: ctx.gatewayTlsEnabled,
displayName: ctx.machineDisplayName,
});
return { stop: () => handle.stop() };
},
});
Plugin discovery Gateway tidak boleh memperlakukan nilai TXT yang diiklankan sebagai rahasia atau autentikasi. Discovery adalah petunjuk perutean; autentikasi Gateway dan penyematan TLS tetap memiliki kepercayaan.
Metadata pendaftaran CLI
api.registerCli(registrar, opts?) menerima dua jenis metadata tingkat atas:
commands: root perintah eksplisit yang dimiliki oleh registrardescriptors: deskriptor perintah waktu parse yang digunakan untuk bantuan CLI root, perutean, dan pendaftaran CLI Plugin secara lazy
Jika Anda ingin perintah Plugin tetap dimuat secara lazy di jalur CLI root normal,
sediakan descriptors yang mencakup setiap root perintah tingkat atas yang diekspos oleh
registrar tersebut.
api.registerCli(
async ({ program }) => {
const { registerMatrixCli } = await import("./src/cli.js");
registerMatrixCli({ program });
},
{
descriptors: [
{
name: "matrix",
description: "Manage Matrix accounts, verification, devices, and profile state",
hasSubcommands: true,
},
],
},
);
Gunakan commands saja hanya ketika Anda tidak memerlukan pendaftaran CLI root secara lazy.
Jalur kompatibilitas eager itu tetap didukung, tetapi tidak memasang
placeholder berbasis deskriptor untuk pemuatan lazy waktu parse.
Pendaftaran backend CLI
api.registerCliBackend(...) memungkinkan Plugin memiliki config default untuk backend
CLI AI lokal seperti codex-cli.
idbackend menjadi prefiks provider dalam referensi model seperticodex-cli/gpt-5.configbackend menggunakan bentuk yang sama denganagents.defaults.cliBackends.<id>.- Config pengguna tetap menang. OpenClaw menggabungkan
agents.defaults.cliBackends.<id>di atas default Plugin sebelum menjalankan CLI. - Gunakan
normalizeConfigketika backend memerlukan penulisan ulang kompatibilitas setelah penggabungan (misalnya menormalisasi bentuk flag lama). - Gunakan
resolveExecutionArgsuntuk penulisan ulang argv bercakupan permintaan yang termasuk dalam dialek CLI, seperti memetakan tingkat berpikir OpenClaw ke flag upaya native.
Slot eksklusif
| Metode | Yang didaftarkan |
|---|---|
api.registerContextEngine(id, factory) |
Mesin konteks (satu aktif pada satu waktu). Callback assemble() menerima availableTools dan citationsMode sehingga mesin dapat menyesuaikan penambahan prompt. |
api.registerMemoryCapability(capability) |
Kapabilitas memori terpadu |
api.registerMemoryPromptSection(builder) |
Builder bagian prompt memori |
api.registerMemoryFlushPlan(resolver) |
Resolver rencana flush memori |
api.registerMemoryRuntime(runtime) |
Adapter runtime memori |
Adapter embedding memori
| Metode | Yang didaftarkan |
|---|---|
api.registerMemoryEmbeddingProvider(adapter) |
Adapter embedding memori untuk Plugin aktif |
registerMemoryCapabilityadalah API Plugin memori eksklusif yang disarankan.registerMemoryCapabilityjuga dapat mengekspospublicArtifacts.listArtifacts(...)sehingga Plugin pendamping dapat mengonsumsi artefak memori yang diekspor melaluiopenclaw/plugin-sdk/memory-host-corealih-alih mengakses layout privat Plugin memori tertentu.registerMemoryPromptSection,registerMemoryFlushPlan, danregisterMemoryRuntimeadalah API Plugin memori eksklusif yang kompatibel dengan legacy.MemoryFlushPlan.modeldapat menyematkan giliran flush ke referensiprovider/modelpersis, sepertiollama/qwen3:8b, tanpa mewarisi rantai fallback aktif.registerMemoryEmbeddingProvidermemungkinkan Plugin memori aktif mendaftarkan satu atau lebih id adapter embedding (misalnyaopenai,gemini, atau id kustom yang ditentukan Plugin).- Config pengguna seperti
agents.defaults.memorySearch.providerdanagents.defaults.memorySearch.fallbackdiselesaikan terhadap id adapter yang terdaftar tersebut.
Event dan siklus hidup
| Metode | Yang dilakukan |
|---|---|
api.on(hookName, handler, opts?) |
Hook siklus hidup bertipe |
api.onConversationBindingResolved(handler) |
Callback binding percakapan |
Lihat Hook Plugin untuk contoh, nama hook umum, dan semantik guard.
Semantik keputusan hook
before_tool_call: mengembalikan{ block: true }bersifat terminal. Setelah handler mana pun mengaturnya, handler berprioritas lebih rendah dilewati.before_tool_call: mengembalikan{ block: false }diperlakukan sebagai tanpa keputusan (sama seperti menghilangkanblock), bukan sebagai override.before_install: mengembalikan{ block: true }bersifat terminal. Setelah handler mana pun mengaturnya, handler berprioritas lebih rendah dilewati.before_install: mengembalikan{ block: false }diperlakukan sebagai tanpa keputusan (sama seperti menghilangkanblock), bukan sebagai override.reply_dispatch: mengembalikan{ handled: true, ... }bersifat terminal. Setelah handler mana pun mengklaim dispatch, handler berprioritas lebih rendah dan jalur dispatch model default dilewati.message_sending: mengembalikan{ cancel: true }bersifat terminal. Setelah handler mana pun mengaturnya, handler berprioritas lebih rendah dilewati.message_sending: mengembalikan{ cancel: false }diperlakukan sebagai tanpa keputusan (sama seperti menghilangkancancel), bukan sebagai override.message_received: gunakan field bertipethreadIdketika Anda memerlukan perutean thread/topik masuk. Simpanmetadatauntuk tambahan khusus channel.message_sending: gunakan field perutean bertipereplyToId/threadIdsebelum fallback kemetadatakhusus channel.gateway_start: gunakanctx.config,ctx.workspaceDir, danctx.getCron?.()untuk status startup milik Gateway alih-alih bergantung pada hook internalgateway:startup.cron_changed: amati perubahan siklus hidup Cron milik Gateway. Gunakanevent.job?.state?.nextRunAtMsdanctx.getCron?.()saat menyinkronkan scheduler bangun eksternal, dan pertahankan OpenClaw sebagai sumber kebenaran untuk pemeriksaan jatuh tempo dan eksekusi.
Field objek API
| Field | Tipe | Deskripsi |
|---|---|---|
api.id |
string |
Id Plugin |
api.name |
string |
Nama tampilan |
api.version |
string? |
Versi Plugin (opsional) |
api.description |
string? |
Deskripsi Plugin (opsional) |
api.source |
string |
Jalur sumber Plugin |
api.rootDir |
string? |
Direktori root Plugin (opsional) |
api.config |
OpenClawConfig |
Snapshot config saat ini (snapshot runtime in-memory aktif jika tersedia) |
api.pluginConfig |
Record<string, unknown> |
Config khusus Plugin dari plugins.entries.<id>.config |
api.runtime |
PluginRuntime |
Helper runtime |
api.logger |
PluginLogger |
Logger bercakupan (debug, info, warn, error) |
api.registrationMode |
PluginRegistrationMode |
Mode pemuatan saat ini; "setup-runtime" adalah jendela startup/setup ringan sebelum entri penuh |
api.resolvePath(input) |
(string) => string |
Selesaikan jalur relatif terhadap root Plugin |
Konvensi modul internal
Di dalam Plugin Anda, gunakan file barrel lokal untuk import internal:
my-plugin/
api.ts # Public exports for external consumers
runtime-api.ts # Internal-only runtime exports
index.ts # Plugin entry point
setup-entry.ts # Lightweight setup-only entry (optional)
Permukaan publik Plugin bundled yang dimuat facade (api.ts, runtime-api.ts,
index.ts, setup-entry.ts, dan file entri publik serupa) lebih memilih
snapshot config runtime aktif ketika OpenClaw sudah berjalan. Jika belum ada snapshot
runtime, permukaan tersebut fallback ke file config yang diselesaikan di disk.
Facade Plugin bundled yang dikemas harus dimuat melalui loader facade Plugin
OpenClaw; import langsung dari dist/extensions/... melewati pemeriksaan manifest
dan runtime sidecar yang digunakan instalasi terkemas untuk kode milik Plugin.
Plugin provider dapat mengekspos barrel kontrak lokal Plugin yang sempit ketika helper sengaja khusus provider dan belum cocok masuk ke subpath SDK generik. Contoh bundled:
- Anthropic: seam publik
api.ts/contract-api.tsuntuk header beta Claude dan helper streamservice_tier. @openclaw/openai-provider:api.tsmengekspor builder provider, helper model default, dan builder provider realtime.@openclaw/openrouter-provider:api.tsmengekspor builder provider beserta helper onboarding/config.
Terkait
Opsi definePluginEntry dan defineChannelPluginEntry.
Referensi namespace api.runtime lengkap.
Pemaketan, manifes, dan skema konfigurasi.
Utilitas pengujian dan aturan lint.
Bermigrasi dari antarmuka yang sudah tidak digunakan.
Arsitektur mendalam dan model kapabilitas.