Halaman ini ditujukan untuk penulis plugin yang menggunakan
openclaw/plugin-sdk/* di dalam
OpenClaw. Untuk aplikasi eksternal, skrip, dasbor, tugas CI, dan ekstensi IDE
yang ingin menjalankan agen melalui Gateway, gunakan
Integrasi Gateway untuk aplikasi eksternal sebagai gantinya.Konvensi impor
Selalu impor dari subpath tertentu: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 retained
channel bawaan. Ekspor kompatibilitas yang sudah usang tetap ada di
plugin-sdk/channel-config-schema-legacy; tidak satu pun subpath skema bawaan merupakan
pola untuk plugin baru.
Referensi subpath
SDK plugin diekspos sebagai serangkaian subpath sempit yang dikelompokkan menurut area (entry plugin, channel, provider, auth, runtime, kapabilitas, memori, dan helper plugin bawaan yang dicadangkan). Untuk katalog lengkap yang dikelompokkan dan ditautkan, lihat Subpath SDK Plugin. Inventaris entrypoint compiler berada discripts/lib/plugin-sdk-entrypoints.json; ekspor paket dihasilkan dari
subset publik setelah mengurangkan subpath pengujian/internal lokal repo yang tercantum di
scripts/lib/plugin-sdk-private-local-only-subpaths.json. Jalankan
pnpm plugin-sdk:surface untuk mengaudit jumlah ekspor publik. Subpath publik usang
yang sudah cukup lama dan tidak digunakan oleh kode produksi ekstensi bawaan
dilacak di scripts/lib/plugin-sdk-deprecated-public-subpaths.json; barrel re-export
usang yang luas dilacak di
scripts/lib/plugin-sdk-deprecated-barrel-subpaths.json.
API pendaftaran
Callbackregister(api) menerima objek OpenClawPluginApi dengan metode berikut:
Pendaftaran kapabilitas
| Metode | Yang didaftarkannya |
|---|---|
api.registerProvider(...) | Inferensi teks (LLM) |
api.registerAgentHarness(...) | Eksekutor agen tingkat rendah eksperimental |
api.registerCliBackend(...) | Backend inferensi CLI lokal |
api.registerChannel(...) | Channel perpesanan |
api.registerEmbeddingProvider(...) | Provider embedding vektor yang dapat digunakan ulang |
api.registerSpeechProvider(...) | Sintesis text-to-speech / 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 fetch / scrape web |
api.registerWebSearchProvider(...) | Pencarian web |
api.registerEmbeddingProvider(...) juga harus
dicantumkan dalam contracts.embeddingProviders di manifes plugin. Ini
adalah permukaan embedding generik untuk pembuatan vektor yang dapat digunakan ulang. Pencarian memori
dapat memakai permukaan provider generik ini. Seam
api.registerMemoryEmbeddingProvider(...) dan
contracts.memoryEmbeddingProviders yang lebih lama adalah kompatibilitas usang sementara
provider khusus memori yang ada bermigrasi.
Provider khusus memori yang masih mengekspos runtime batchEmbed(...) tetap berada pada
kontrak batching per-file yang ada kecuali runtime-nya secara eksplisit mengatur
sourceWideBatchEmbed: true. Opt-in tersebut memungkinkan host memori mengirim chunk dari
beberapa file memori dirty dan sumber yang diaktifkan dalam satu panggilan batchEmbed(...) hingga
batas batch host. Adapter batch yang mengunggah file permintaan JSONL harus
membagi tugas provider sebelum batas ukuran unggah serta batas jumlah permintaannya.
Provider harus mengembalikan satu embedding per chunk input dalam urutan yang sama dengan
batch.chunks; hilangkan flag ini ketika provider mengharapkan batch lokal-file atau
tidak dapat mempertahankan urutan input di seluruh tugas source-wide yang lebih besar.
Alat dan perintah
GunakandefineToolPlugin untuk plugin sederhana khusus alat
dengan nama alat tetap. Gunakan api.registerTool(...) secara langsung untuk plugin campuran
atau pendaftaran alat yang sepenuhnya dinamis.
| Metode | Yang didaftarkannya |
|---|---|
api.registerTool(tool, opts?) | Alat agen (wajib atau { optional: true }) |
api.registerCommand(def) | Perintah kustom (melewati LLM) |
agentPromptGuidance saat agen membutuhkan petunjuk routing singkat
milik perintah. Pertahankan teks tersebut tentang perintah itu sendiri; jangan tambahkan
kebijakan khusus provider atau plugin ke builder prompt core.
Entri panduan dapat berupa string legacy, yang berlaku untuk setiap permukaan prompt, atau
entri terstruktur:
surfaces terstruktur dapat mencakup openclaw_main, codex_app_server,
cli_backend, acp_backend, atau subagent. pi_main tetap menjadi alias usang
untuk openclaw_main. Hilangkan surfaces untuk panduan semua permukaan yang disengaja. Jangan
meneruskan array surfaces kosong; itu ditolak agar hilangnya cakupan secara tidak sengaja
tidak menjadi teks prompt global.
Instruksi developer app-server Codex native lebih ketat daripada permukaan prompt lainnya:
hanya panduan yang secara eksplisit dicakupkan ke codex_app_server yang dipromosikan ke
lane berprioritas lebih tinggi tersebut. Panduan string legacy dan panduan terstruktur tanpa cakupan
tetap tersedia untuk permukaan prompt non-Codex demi kompatibilitas.
Infrastruktur
| Metode | Yang didaftarkannya |
|---|---|
api.registerHook(events, handler, opts?) | Hook peristiwa |
api.registerHttpRoute(params) | Endpoint HTTP Gateway |
api.registerGatewayMethod(name, handler) | Metode RPC Gateway |
api.registerGatewayDiscoveryService(service) | Pengiklan penemuan Gateway lokal |
api.registerCli(registrar, opts?) | Subperintah CLI |
api.registerNodeCliFeature(registrar, opts?) | CLI fitur Node di bawah openclaw nodes |
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 memori |
api.registerMemoryCorpusSupplement(adapter) | Korpus pencarian/baca memori tambahan |
Hook host untuk plugin workflow
Hook host adalah seam SDK untuk plugin yang perlu berpartisipasi dalam siklus hidup host, bukan hanya menambahkan provider, channel, atau alat. Hook ini adalah kontrak generik; Plan Mode dapat menggunakannya, tetapi begitu juga workflow persetujuan, gate kebijakan workspace, monitor latar belakang, wizard penyiapan, dan plugin pendamping UI.| Metode | Kontrak yang dimilikinya |
|---|---|
api.session.state.registerSessionExtension(...) | Status sesi milik Plugin yang kompatibel JSON dan diproyeksikan melalui sesi Gateway |
api.session.workflow.enqueueNextTurnInjection(...) | Konteks tahan lama tepat-sekali yang disuntikkan ke giliran agen berikutnya untuk satu sesi |
api.registerTrustedToolPolicy(...) | Kebijakan alat tepercaya pra-Plugin yang dibatasi manifes dan dapat memblokir atau menulis ulang parameter alat |
api.registerToolMetadata(...) | Metadata tampilan katalog alat tanpa mengubah implementasi alat |
api.registerCommand(...) | Perintah Plugin berlingkup; hasil perintah dapat menetapkan continueAgent: true atau suppressReply: true; perintah native Discord mendukung descriptionLocalizations |
api.session.controls.registerControlUiDescriptor(...) | Deskriptor kontribusi UI kontrol untuk permukaan sesi, alat, run, atau pengaturan |
api.lifecycle.registerRuntimeLifecycle(...) | Callback pembersihan untuk sumber daya runtime milik Plugin pada jalur reset/hapus/muat ulang |
api.agent.events.registerAgentEventSubscription(...) | Langganan peristiwa yang disanitasi untuk status alur kerja dan pemantau |
api.runContext.setRunContext(...) / getRunContext(...) / clearRunContext(...) | Status scratch Plugin per-run yang dibersihkan pada siklus hidup run terminal |
api.session.workflow.registerSessionSchedulerJob(...) | Metadata pembersihan untuk job penjadwal milik Plugin; tidak menjadwalkan pekerjaan atau membuat rekaman tugas |
api.session.workflow.sendSessionAttachment(...) | Pengiriman lampiran file khusus bawaan yang dimediasi host ke rute sesi direct-outbound aktif |
api.session.workflow.scheduleSessionTurn(...) / unscheduleSessionTurnsByTag(...) | Giliran sesi terjadwal berbasis Cron khusus bawaan plus pembersihan berbasis tag |
api.session.controls.registerSessionAction(...) | Tindakan sesi bertipe yang dapat dikirim klien melalui Gateway |
api.session.state.registerSessionExtension(...)api.session.workflow.enqueueNextTurnInjection(...)api.session.workflow.registerSessionSchedulerJob(...)api.session.workflow.sendSessionAttachment(...)api.session.workflow.scheduleSessionTurn(...)api.session.workflow.unscheduleSessionTurnsByTag(...)api.session.controls.registerSessionAction(...)api.session.controls.registerControlUiDescriptor(...)api.agent.events.registerAgentEventSubscription(...)api.agent.events.emitAgentEvent(...)api.runContext.setRunContext(...)/getRunContext(...)/clearRunContext(...)api.lifecycle.registerRuntimeLifecycle(...)
api.registerSessionExtension, api.enqueueNextTurnInjection,
api.registerControlUiDescriptor, api.registerRuntimeLifecycle,
api.registerAgentEventSubscription, api.emitAgentEvent,
api.setRunContext, api.getRunContext, api.clearRunContext,
api.registerSessionSchedulerJob, api.registerSessionAction,
api.sendSessionAttachment, api.scheduleSessionTurn, atau
api.unscheduleSessionTurnsByTag secara langsung.
scheduleSessionTurn(...) adalah kemudahan berlingkup sesi di atas penjadwal
Cron Gateway. Cron memiliki pewaktuan dan membuat rekaman tugas latar belakang
saat giliran berjalan; Plugin SDK hanya membatasi sesi target, penamaan milik
Plugin, dan pembersihan. Gunakan api.runtime.tasks.managedFlows di dalam
giliran terjadwal saat pekerjaan itu sendiri memerlukan status Task Flow
multi-langkah yang tahan lama.
Kontrak sengaja memisahkan otoritas:
- Plugin eksternal dapat memiliki ekstensi sesi, deskriptor UI, perintah, metadata alat, injeksi giliran berikutnya, dan hook normal.
- Kebijakan alat tepercaya berjalan sebelum hook
before_tool_callbiasa dan dipercaya host. Kebijakan bawaan berjalan lebih dulu; kebijakan Plugin terpasang memerlukan pengaktifan eksplisit plus id lokalnya dicontracts.trustedToolPolicies, dan berjalan berikutnya dalam urutan pemuatan Plugin. Id kebijakan berlingkup pada Plugin yang mendaftarkannya. - Kepemilikan perintah yang dicadangkan hanya untuk bawaan. Plugin eksternal sebaiknya menggunakan nama perintah atau aliasnya sendiri.
allowPromptInjection=falsemenonaktifkan hook yang mengubah prompt termasukagent_turn_prepare,before_prompt_build,heartbeat_prompt_contribution, bidang prompt daribefore_agent_startlama, danenqueueNextTurnInjection.
| Arketipe Plugin | Hook yang digunakan |
|---|---|
| Alur kerja persetujuan | Ekstensi sesi, kelanjutan perintah, injeksi giliran berikutnya, deskriptor UI |
| Gerbang kebijakan anggaran/workspace | Kebijakan alat tepercaya, metadata alat, proyeksi sesi |
| Pemantau siklus hidup latar belakang | Pembersihan siklus hidup runtime, langganan peristiwa agen, kepemilikan/pembersihan penjadwal sesi, kontribusi prompt Heartbeat, deskriptor UI |
| Wizard setup atau onboarding | Ekstensi sesi, perintah berlingkup, deskriptor UI Kontrol |
Namespace admin inti yang dicadangkan (
config.*, exec.approvals.*, wizard.*,
update.*) selalu tetap operator.admin, bahkan jika sebuah Plugin mencoba
menetapkan lingkup metode Gateway yang lebih sempit. Utamakan prefiks khusus
Plugin untuk metode milik Plugin.Kapan menggunakan middleware hasil alat
Kapan menggunakan middleware hasil alat
Plugin bawaan dan Plugin terpasang yang diaktifkan secara eksplisit dengan
kontrak manifes yang cocok dapat menggunakan
api.registerAgentToolResultMiddleware(...)
saat perlu menulis ulang hasil alat setelah eksekusi dan sebelum runtime
memasukkan hasil itu kembali ke model. Ini adalah seam tepercaya yang netral
terhadap runtime untuk reducer output asinkron seperti tokenjuice.Plugin harus mendeklarasikan contracts.agentToolResultMiddleware untuk setiap
runtime yang ditargetkan, misalnya ["openclaw", "codex"]. Plugin terpasang
tanpa kontrak itu, atau tanpa pengaktifan eksplisit, tidak dapat mendaftarkan
middleware ini; pertahankan hook Plugin OpenClaw normal untuk pekerjaan yang
tidak memerlukan pewaktuan hasil alat pra-model. Jalur pendaftaran factory
ekstensi lama yang hanya untuk embedded-runner telah dihapus.Pendaftaran penemuan Gateway
api.registerGatewayDiscoveryService(...) memungkinkan Plugin mengiklankan
Gateway aktif pada transport penemuan lokal seperti mDNS/Bonjour. OpenClaw
memanggil layanan selama startup Gateway saat penemuan lokal diaktifkan,
meneruskan port Gateway saat ini dan data petunjuk TXT non-rahasia, serta
memanggil handler stop yang dikembalikan selama shutdown Gateway.
Metadata pendaftaran CLI
api.registerCli(registrar, opts?) menerima dua jenis metadata perintah:
commands: nama perintah eksplisit yang dimiliki registrardescriptors: deskriptor perintah waktu-parse yang digunakan untuk bantuan CLI, perutean, dan pendaftaran CLI Plugin secara malasparentPath: jalur perintah induk opsional untuk grup perintah bersarang, seperti["nodes"]
api.registerNodeCliFeature(registrar, opts?). Ini adalah wrapper kecil di
sekitar api.registerCli(..., { parentPath: ["nodes"] }) dan membuat perintah
seperti openclaw nodes canvas menjadi fitur node milik Plugin yang eksplisit.
Jika Anda ingin perintah Plugin tetap dimuat malas di jalur CLI root normal,
sediakan descriptors yang mencakup setiap root perintah tingkat atas yang
diekspos oleh registrar tersebut.
program:
commands saja hanya saat Anda tidak memerlukan pendaftaran CLI root
malas. Jalur kompatibilitas eager itu tetap didukung, tetapi tidak memasang
placeholder berbasis deskriptor untuk pemuatan malas waktu-parse.
Pendaftaran backend CLI
api.registerCliBackend(...) memungkinkan Plugin memiliki konfigurasi default
untuk backend CLI AI lokal seperti claude-cli atau my-cli.
idbackend menjadi prefiks penyedia dalam ref model sepertimy-cli/gpt-5.configbackend menggunakan bentuk yang sama denganagents.defaults.cliBackends.<id>.- Konfigurasi 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 menormalkan bentuk flag lama). - Gunakan
resolveExecutionArgsuntuk penulisan ulang argv bercakupan permintaan yang menjadi bagian dari dialek CLI, seperti memetakan level berpikir OpenClaw ke flag upaya native. Hook menerimactx.executionMode; gunakan"side-question"untuk menambahkan flag isolasi native-backend bagi panggilan/btwsementara. Jika flag tersebut secara andal menonaktifkan tool native untuk CLI yang sebaliknya selalu aktif, deklarasikansideQuestionToolMode: "disabled"juga.
Slot eksklusif
| Metode | Yang didaftarkan |
|---|---|
api.registerContextEngine(id, factory) | Engine konteks (satu aktif pada satu waktu). Callback siklus hidup menerima runtimeSettings ketika host dapat menyediakan diagnostik model/penyedia/mode; engine ketat lama dicoba ulang tanpa kunci tersebut. |
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 yang tidak digunakan lagi
| 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 menggunakan artefak memori yang diekspor melaluiopenclaw/plugin-sdk/memory-host-corealih-alih masuk ke tata letak 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.registerMemoryEmbeddingProvidertidak digunakan lagi. Penyedia embedding baru harus menggunakanapi.registerEmbeddingProvider(...)dancontracts.embeddingProviders.- Penyedia khusus memori yang sudah ada tetap berfungsi selama jendela migrasi, tetapi laporan inspeksi plugin menandai ini sebagai utang kompatibilitas untuk plugin yang tidak dibundel.
Event dan siklus hidup
| Metode | Yang dilakukan |
|---|---|
api.on(hookName, handler, opts?) | Hook siklus hidup bertipe |
api.onConversationBindingResolved(handler) | Callback binding percakapan |
Semantik keputusan hook
before_install adalah hook siklus hidup runtime-plugin, bukan permukaan kebijakan
instal operator. Gunakan security.installPolicy ketika keputusan izinkan/blokir harus
mencakup jalur instal atau pembaruan yang didukung CLI dan Gateway.
before_tool_call: mengembalikan{ block: true }bersifat terminal. Setelah handler mana pun menetapkannya, 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 menetapkannya, 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 menetapkannya, 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 membutuhkan routing thread/topik masuk. Simpanmetadatauntuk tambahan khusus channel.message_sending: gunakan field routing 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 penjadwal 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 konfigurasi saat ini (snapshot runtime dalam memori aktif jika tersedia) |
api.pluginConfig | Record<string, unknown> | Konfigurasi 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 | Resolve jalur relatif terhadap root plugin |
Konvensi modul internal
Di dalam plugin Anda, gunakan file barrel lokal untuk impor internal:api.ts, runtime-api.ts,
index.ts, setup-entry.ts, dan file entri publik serupa) lebih memilih
snapshot konfigurasi runtime aktif ketika OpenClaw sudah berjalan. Jika belum ada snapshot
runtime, permukaan tersebut fallback ke file konfigurasi yang di-resolve di disk.
Facade plugin bundel yang dipaketkan harus dimuat melalui loader facade plugin
OpenClaw; impor langsung dari dist/extensions/... melewati pemeriksaan manifest
dan sidecar runtime yang digunakan instalasi terpaket untuk kode milik plugin.
Plugin penyedia dapat mengekspos barrel kontrak lokal-plugin yang sempit ketika
helper memang khusus penyedia dan belum seharusnya berada di subjalur SDK generik.
Contoh bundel:
- Anthropic: seam publik
api.ts/contract-api.tsuntuk helper stream beta-header Claude danservice_tier. @openclaw/openai-provider:api.tsmengekspor builder penyedia, helper model default, dan builder penyedia realtime.@openclaw/openrouter-provider:api.tsmengekspor builder penyedia plus helper onboarding/konfigurasi.
Terkait
Titik masuk
Opsi
definePluginEntry dan defineChannelPluginEntry.Helper runtime
Referensi namespace
api.runtime lengkap.Setup dan konfigurasi
Packaging, manifest, dan skema konfigurasi.
Pengujian
Utilitas pengujian dan aturan lint.
Migrasi SDK
Bermigrasi dari permukaan yang tidak digunakan lagi.
Internal Plugin
Arsitektur mendalam dan model kapabilitas.