- bagian teks
- teks konteks/footer kecil
- pemisah
- tombol
- menu select
- judul kartu dan tone
components, Slack
blocks, Telegram buttons, Teams card, atau Feishu card ke
alat pesan bersama. Itu adalah output renderer yang dimiliki oleh plugin saluran.
Kontrak
Penulis plugin mengimpor kontrak publik dari:valueadalah nilai aksi aplikasi yang dirutekan kembali melalui jalur interaksi saluran yang sudah ada ketika saluran mendukung kontrol yang dapat diklik.urladalah tombol tautan. Ini dapat ada tanpavalue.labelwajib dan juga digunakan dalam fallback teks.stylebersifat advisory. Renderer sebaiknya memetakan style yang tidak didukung ke default yang aman, bukan membuat pengiriman gagal.
options[].valueadalah nilai aplikasi yang dipilih.placeholderbersifat advisory dan dapat diabaikan oleh saluran tanpa dukungan select native.- Jika saluran tidak mendukung select, fallback teks menampilkan label-labelnya.
Contoh producer
Kartu sederhana:Kontrak renderer
Plugin saluran mendeklarasikan dukungan render pada adapter keluar mereka:Alur render core
KetikaReplyPayload atau tindakan pesan menyertakan presentation, core:
- Menormalkan payload presentasi.
- Menyelesaikan adapter keluar saluran target.
- Membaca
presentationCapabilities. - Memanggil
renderPresentationketika adapter dapat merender payload. - Melakukan fallback ke teks konservatif ketika adapter tidak ada atau tidak dapat merender.
- Mengirim payload yang dihasilkan melalui jalur pengiriman saluran normal.
- Menerapkan metadata pengiriman seperti
delivery.pinsetelah pesan pertama berhasil dikirim.
Aturan degradasi
Presentasi harus aman untuk dikirim pada saluran yang terbatas. Fallback teks mencakup:titlesebagai baris pertama- blok
textsebagai paragraf normal - blok
contextsebagai baris konteks ringkas - blok
dividersebagai pemisah visual - label tombol, termasuk URL untuk tombol tautan
- label opsi select
- Telegram dengan tombol inline dinonaktifkan mengirim fallback teks.
- Saluran tanpa dukungan select menampilkan opsi select sebagai teks.
- Tombol hanya-URL menjadi tombol tautan native atau baris URL fallback.
- Kegagalan pin opsional tidak menggagalkan pesan yang telah terkirim.
delivery.pin.required: true; jika pin diminta sebagai
wajib dan saluran tidak dapat menyematkan pesan yang dikirim, pengiriman dilaporkan gagal.
Pemetaan provider
Renderer bawaan saat ini:| Saluran | Target render native | Catatan |
|---|---|---|
| Discord | Components dan component containers | Mempertahankan channelData.discord.components lama untuk producer payload native provider yang sudah ada, tetapi pengiriman bersama baru sebaiknya menggunakan presentation. |
| Slack | Block Kit | Mempertahankan channelData.slack.blocks lama untuk producer payload native provider yang sudah ada, tetapi pengiriman bersama baru sebaiknya menggunakan presentation. |
| Telegram | Teks plus inline keyboard | Tombol/select memerlukan kapabilitas tombol inline untuk permukaan target; jika tidak, fallback teks digunakan. |
| Mattermost | Teks plus interactive props | Blok lain mengalami degradasi menjadi teks. |
| Microsoft Teams | Adaptive Cards | Teks message biasa disertakan bersama kartu ketika keduanya diberikan. |
| Feishu | Kartu interaktif | Header kartu dapat menggunakan title; isi menghindari penduplikasian judul tersebut. |
| Saluran biasa | Fallback teks | Saluran tanpa renderer tetap mendapatkan output yang dapat dibaca. |
Presentation vs InteractiveReply
InteractiveReply adalah subset internal lama yang digunakan oleh helper persetujuan dan interaksi. Ini mendukung:
- teks
- tombol
- select
MessagePresentation adalah kontrak pengiriman bersama yang kanonis. Ini menambahkan:
- judul
- tone
- konteks
- pemisah
- tombol hanya-URL
- metadata pengiriman generik melalui
ReplyPayload.delivery
openclaw/plugin-sdk/interactive-runtime saat menjembatani kode lama:
MessagePresentation secara langsung.
Delivery Pin
Pinning adalah perilaku pengiriman, bukan presentasi. Gunakandelivery.pin alih-alih
field native provider seperti channelData.telegram.pin.
Semantik:
pin: truemenyematkan pesan pertama yang berhasil dikirim.pin.notifydefault-nyafalse.pin.requireddefault-nyafalse.- Kegagalan pin opsional mengalami degradasi dan membiarkan pesan terkirim tetap utuh.
- Kegagalan pin yang diwajibkan membuat pengiriman gagal.
- Pesan yang dipecah (chunked) menyematkan potongan pertama yang dikirim, bukan potongan terakhir.
pin, unpin, dan pins tetap ada untuk pesan yang sudah ada
ketika provider mendukung operasi tersebut.
Checklist penulis plugin
- Deklarasikan
presentationdaridescribeMessageTool(...)ketika saluran dapat merender atau dengan aman mendegradasikan presentasi semantik. - Tambahkan
presentationCapabilitieske adapter keluar runtime. - Implementasikan
renderPresentationdalam kode runtime, bukan pada kode setup plugin control-plane. - Jauhkan library UI native dari jalur setup/katalog hot.
- Pertahankan batas platform di renderer dan pengujian.
- Tambahkan pengujian fallback untuk tombol yang tidak didukung, select, tombol URL, duplikasi title/text, dan pengiriman campuran
messagepluspresentation. - Tambahkan dukungan delivery pin melalui
deliveryCapabilities.pindanpinDeliveredMessagehanya ketika provider dapat menyematkan id pesan yang dikirim. - Jangan mengekspos field kartu/blok/komponen/tombol native provider baru melalui skema tindakan pesan bersama.