Membangun Plugin Channel
Panduan ini membahas cara membangun plugin channel yang menghubungkan OpenClaw ke platform perpesanan. Pada akhirnya Anda akan memiliki channel yang berfungsi dengan keamanan DM, pairing, threading balasan, dan perpesanan keluar.Jika Anda belum pernah membangun plugin OpenClaw sebelumnya, baca
Getting Started terlebih dahulu untuk struktur
paket dasar dan penyiapan manifest.
Cara kerja plugin channel
Plugin channel tidak memerlukan tool send/edit/react mereka sendiri. OpenClaw mempertahankan satu toolmessage bersama di core. Plugin Anda memiliki:
- Konfigurasi — resolusi akun dan wizard penyiapan
- Keamanan — kebijakan DM dan allowlist
- Pairing — alur persetujuan DM
- Tata bahasa sesi — bagaimana ID percakapan khusus provider dipetakan ke chat dasar, ID thread, dan fallback parent
- Outbound — mengirim teks, media, dan polling ke platform
- Threading — bagaimana balasan di-thread
:thread:, dan dispatch.
Jika platform Anda menyimpan scope tambahan di dalam ID percakapan, pertahankan penguraian itu
di plugin dengan messaging.resolveSessionConversation(...). Itu adalah hook kanonis
untuk memetakan rawId ke ID percakapan dasar, ID thread opsional,
baseConversationId eksplisit, dan parentConversationCandidates
apa pun. Saat Anda mengembalikan parentConversationCandidates, jaga urutannya dari
parent paling sempit ke percakapan paling luas/dasar.
Plugin bawaan yang memerlukan penguraian yang sama sebelum registry channel melakukan boot
juga dapat mengekspos file session-key-api.ts level atas dengan
ekspor resolveSessionConversation(...) yang cocok. Core menggunakan permukaan aman-bootstrap itu
hanya ketika registry plugin runtime belum tersedia.
messaging.resolveParentConversationCandidates(...) tetap tersedia sebagai
fallback kompatibilitas lama saat plugin hanya membutuhkan fallback parent
di atas ID generik/mentah. Jika kedua hook ada, core menggunakan
resolveSessionConversation(...).parentConversationCandidates terlebih dahulu dan hanya
fallback ke resolveParentConversationCandidates(...) saat hook kanonis
menghilangkannya.
Persetujuan dan kapabilitas channel
Sebagian besar plugin channel tidak memerlukan kode khusus persetujuan.- Core memiliki
/approvedi chat yang sama, payload tombol persetujuan bersama, dan pengiriman fallback generik. - Utamakan satu objek
approvalCapabilitypada plugin channel saat channel memerlukan perilaku khusus persetujuan. approvalCapability.authorizeActorActiondanapprovalCapability.getActionAvailabilityStateadalah seam auth persetujuan yang kanonis.- Gunakan
outbound.shouldSuppressLocalPayloadPromptatauoutbound.beforeDeliverPayloaduntuk perilaku siklus hidup payload khusus channel seperti menyembunyikan prompt persetujuan lokal duplikat atau mengirim indikator mengetik sebelum pengiriman. - Gunakan
approvalCapability.deliveryhanya untuk routing persetujuan native atau penekanan fallback. - Gunakan
approvalCapability.renderhanya saat channel benar-benar memerlukan payload persetujuan kustom alih-alih renderer bersama. - Jika sebuah channel dapat menyimpulkan identitas DM mirip pemilik yang stabil dari konfigurasi yang ada, gunakan
createResolvedApproverActionAuthAdapterdariopenclaw/plugin-sdk/approval-runtimeuntuk membatasi/approvedi chat yang sama tanpa menambahkan logika core khusus persetujuan. - Jika sebuah channel memerlukan pengiriman persetujuan native, jaga kode channel tetap fokus pada normalisasi target dan hook transport. Gunakan
createChannelExecApprovalProfile,createChannelNativeOriginTargetResolver,createChannelApproverDmTargetResolver,createApproverRestrictedNativeApprovalCapability, dancreateChannelNativeApprovalRuntimedariopenclaw/plugin-sdk/approval-runtimeagar core memiliki pemfilteran permintaan, routing, dedupe, kedaluwarsa, dan subscription gateway. - Channel persetujuan native harus merutekan
accountIddanapprovalKindmelalui helper tersebut.accountIdmenjaga kebijakan persetujuan multi-akun tetap dibatasi ke akun bot yang tepat, danapprovalKindmenjaga perilaku persetujuan exec vs plugin tetap tersedia bagi channel tanpa branch hardcoded di core. - Pertahankan jenis ID persetujuan yang telah dikirim secara ujung-ke-ujung. Klien native tidak boleh menebak atau menulis ulang routing persetujuan exec vs plugin dari state lokal channel.
- Jenis persetujuan yang berbeda memang dapat mengekspos permukaan native yang berbeda secara sengaja.
Contoh bawaan saat ini:
- Slack menjaga routing persetujuan native tetap tersedia untuk ID exec dan plugin.
- Matrix menjaga routing DM/channel native hanya untuk persetujuan exec dan membiarkan
persetujuan plugin tetap pada jalur
/approvebersama di chat yang sama.
createApproverRestrictedNativeApprovalAdaptermasih ada sebagai wrapper kompatibilitas, tetapi kode baru sebaiknya mengutamakan builder kapabilitas dan mengeksposapprovalCapabilitypada plugin.
openclaw/plugin-sdk/approval-auth-runtimeopenclaw/plugin-sdk/approval-client-runtimeopenclaw/plugin-sdk/approval-delivery-runtimeopenclaw/plugin-sdk/approval-native-runtimeopenclaw/plugin-sdk/approval-reply-runtime
openclaw/plugin-sdk/setup-runtime,
openclaw/plugin-sdk/setup-adapter-runtime,
openclaw/plugin-sdk/reply-runtime,
openclaw/plugin-sdk/reply-dispatch-runtime,
openclaw/plugin-sdk/reply-reference, dan
openclaw/plugin-sdk/reply-chunking saat Anda tidak memerlukan
permukaan payung yang lebih luas.
Khusus untuk penyiapan:
openclaw/plugin-sdk/setup-runtimemencakup helper penyiapan yang aman untuk runtime: adapter patch penyiapan yang aman untuk import (createPatchedAccountSetupAdapter,createEnvPatchedAccountSetupAdapter,createSetupInputPresenceValidator), output catatan lookup,promptResolvedAllowFrom,splitSetupEntries, dan builder setup-proxy terdelegasiopenclaw/plugin-sdk/setup-adapter-runtimeadalah seam adapter sempit yang sadar env untukcreateEnvPatchedAccountSetupAdapteropenclaw/plugin-sdk/channel-setupmencakup builder penyiapan instalasi opsional plus beberapa primitif aman-penyiapan:createOptionalChannelSetupSurface,createOptionalChannelSetupAdapter,createOptionalChannelSetupWizard,DEFAULT_ACCOUNT_ID,createTopLevelChannelDmPolicy,setSetupChannelEnabled, dansplitSetupEntries- gunakan seam
openclaw/plugin-sdk/setupyang lebih luas hanya saat Anda juga membutuhkan helper penyiapan/konfigurasi bersama yang lebih berat sepertimoveSingleAccountChannelSectionToDefaultAccount(...)
createOptionalChannelSetupSurface(...). Adapter/wizard yang dihasilkan
gagal-tertutup pada penulisan konfigurasi dan finalisasi, dan menggunakan ulang pesan
instalasi-diperlukan yang sama di seluruh validasi, finalisasi, dan salinan
tautan dokumentasi.
Untuk jalur channel panas lainnya, utamakan helper sempit daripada permukaan lama yang lebih luas:
openclaw/plugin-sdk/account-core,openclaw/plugin-sdk/account-id,openclaw/plugin-sdk/account-resolution, danopenclaw/plugin-sdk/account-helpersuntuk konfigurasi multi-akun dan fallback akun defaultopenclaw/plugin-sdk/inbound-envelopedanopenclaw/plugin-sdk/inbound-reply-dispatchuntuk pengkabelan route/envelope masuk serta perekaman-dan-dispatchopenclaw/plugin-sdk/messaging-targetsuntuk penguraian/pencocokan targetopenclaw/plugin-sdk/outbound-mediadanopenclaw/plugin-sdk/outbound-runtimeuntuk pemuatan media plus delegasi identitas/pengiriman keluaropenclaw/plugin-sdk/thread-bindings-runtimeuntuk siklus hidup thread-binding dan pendaftaran adapteropenclaw/plugin-sdk/agent-media-payloadhanya saat tata letak field payload agent/media lama masih diperlukanopenclaw/plugin-sdk/telegram-command-configuntuk normalisasi perintah kustom Telegram, validasi duplikat/konflik, dan kontrak konfigurasi perintah fallback-stabil
Panduan langkah demi langkah
Paket dan manifest
Buat file plugin standar. Field
channel di package.json adalah
yang menjadikan ini plugin channel. Untuk permukaan metadata paket lengkap,
lihat Plugin Setup and Config:Bangun objek plugin channel
Interface
ChannelPlugin memiliki banyak permukaan adapter opsional. Mulailah dengan
yang minimum — id dan setup — lalu tambahkan adapter sesuai kebutuhan Anda.Buat src/channel.ts:src/channel.ts
Yang dilakukan createChatChannelPlugin untuk Anda
Yang dilakukan createChatChannelPlugin untuk Anda
Alih-alih mengimplementasikan interface adapter level rendah secara manual, Anda
meneruskan opsi deklaratif dan builder menyusunnya:
Anda juga dapat meneruskan objek adapter mentah alih-alih opsi deklaratif
jika Anda memerlukan kontrol penuh.
| Opsi | Yang dihubungkan |
|---|---|
security.dm | Resolver keamanan DM yang dibatasi dari field konfigurasi |
pairing.text | Alur pairing DM berbasis teks dengan pertukaran kode |
threading | Resolver mode reply-to (tetap, dibatasi akun, atau kustom) |
outbound.attachedResults | Fungsi pengiriman yang mengembalikan metadata hasil (ID pesan) |
Hubungkan entrypoint
Buat Letakkan descriptor CLI milik channel di
index.ts:index.ts
registerCliMetadata(...) agar OpenClaw
dapat menampilkannya di bantuan root tanpa mengaktifkan runtime channel penuh,
sementara pemuatan penuh normal tetap mengambil descriptor yang sama untuk pendaftaran
perintah yang sesungguhnya. Pertahankan registerFull(...) untuk pekerjaan khusus runtime.
Jika registerFull(...) mendaftarkan metode RPC gateway, gunakan
prefiks khusus plugin. Namespace admin core (config.*,
exec.approvals.*, wizard.*, update.*) tetap dicadangkan dan selalu
di-resolve ke operator.admin.
defineChannelPluginEntry menangani pemisahan mode registrasi secara otomatis. Lihat
Entry Points untuk semua
opsinya.Tambahkan entry penyiapan
Buat OpenClaw memuat ini alih-alih entry penuh saat channel dinonaktifkan
atau belum dikonfigurasi. Ini menghindari penarikan kode runtime berat selama alur penyiapan.
Lihat Setup and Config untuk detail.
setup-entry.ts untuk pemuatan ringan selama onboarding:setup-entry.ts
Tangani pesan masuk
Plugin Anda perlu menerima pesan dari platform dan meneruskannya ke
OpenClaw. Pola yang umum adalah webhook yang memverifikasi permintaan dan
mengirimkannya melalui handler masuk channel Anda:
Penanganan pesan masuk bersifat khusus channel. Setiap plugin channel memiliki
pipeline masuknya sendiri. Lihat plugin channel bawaan
(misalnya paket plugin Microsoft Teams atau Google Chat) untuk pola nyata.
Uji
Tulis pengujian yang diletakkan bersama di Untuk helper pengujian bersama, lihat Testing.
src/channel.test.ts:src/channel.test.ts
Struktur file
Topik lanjutan
Opsi threading
Mode reply tetap, dibatasi akun, atau kustom
Integrasi tool message
describeMessageTool dan penemuan aksi
Resolusi target
inferTargetChatType, looksLikeId, resolveTarget
Helper runtime
TTS, STT, media, subagent via api.runtime
Beberapa seam helper bawaan masih ada untuk pemeliharaan plugin bawaan dan
kompatibilitas. Seam tersebut bukan pola yang direkomendasikan untuk plugin channel baru;
utamakan subpath channel/setup/reply/runtime generik dari permukaan SDK umum
kecuali Anda memang memelihara keluarga plugin bawaan itu secara langsung.
Langkah selanjutnya
- Plugin Provider — jika plugin Anda juga menyediakan model
- Ikhtisar SDK — referensi impor subpath lengkap
- SDK Testing — utilitas pengujian dan pengujian kontrak
- Manifest Plugin — skema manifest lengkap