- bagian teks
- teks konteks/footer kecil
- pemisah
- tombol
- menu pilihan
- judul dan nada kartu
components, Slack
blocks, Telegram buttons, Teams card, atau Feishu card ke alat pesan
bersama. Itu adalah output perender yang dimiliki oleh Plugin kanal.
Kontrak
Penulis Plugin mengimpor kontrak publik dari:action.type: "command"menjalankan perintah garis miring native melalui jalur perintah inti. Gunakan ini untuk tombol dan menu perintah bawaan.action.type: "callback"membawa data Plugin opak melalui jalur interaksi kanal. Plugin kanal tidak boleh menafsirkan ulang data callback sebagai perintah garis miring.valueadalah nilai callback opak lama. Kontrol baru sebaiknya menggunakanactionagar Plugin kanal dapat memetakan perintah dan callback tanpa menebak dari teks.urladalah tombol tautan. Ini dapat ada tanpavalue.webAppmenjelaskan tombol aplikasi web native kanal. Telegram merender ini sebagaiweb_appdan hanya mendukungnya di chat privat.web_appmasih diterima dalam payload JSON longgar untuk kompatibilitas, tetapi produsen TypeScript sebaiknya menggunakanwebApp.labelwajib dan juga digunakan dalam fallback teks.stylebersifat anjuran. Perender sebaiknya memetakan gaya yang tidak didukung ke default yang aman, bukan menggagalkan pengiriman.priorityopsional. Saat kanal mengiklankan batas tindakan dan kontrol harus dibuang, inti mempertahankan tombol berprioritas lebih tinggi terlebih dahulu dan mempertahankan urutan asli di antara tombol dengan prioritas yang sama. Saat semua kontrol muat, urutan yang ditulis dipertahankan.disabledopsional. Kanal harus ikut serta dengansupportsDisabled; jika tidak, inti mendegradasi kontrol nonaktif menjadi teks fallback non-interaktif.reusableopsional. Kanal yang mendukung callback native yang dapat digunakan ulang dapat mempertahankan tindakan tetap tersedia setelah interaksi berhasil. Gunakan ini untuk tindakan yang dapat diulang atau idempoten seperti refresh, inspeksi, atau detail lainnya; biarkan tidak diatur untuk persetujuan sekali pakai normal dan tindakan destruktif.
options[].actionmemiliki arti perintah/callback yang sama seperti tombolaction.options[].valueadalah nilai aplikasi terpilih lama.placeholderbersifat anjuran dan dapat diabaikan oleh kanal tanpa dukungan pilihan native.- Jika kanal tidak mendukung pilihan, teks fallback mencantumkan label.
Contoh produsen
Kartu sederhana:Kontrak perender
Plugin kanal mendeklarasikan dukungan render pada adaptor keluar mereka:limits
opsional menjelaskan amplop generik yang dapat diadaptasi inti sebelum memanggil
perender:
Alur render inti
SaatReplyPayload atau tindakan pesan menyertakan presentation, inti:
- Menormalkan payload presentasi.
- Menyelesaikan adaptor keluar kanal target.
- Membaca
presentationCapabilities. - Menerapkan batas kapabilitas generik seperti jumlah tindakan, panjang label, dan jumlah opsi pilihan saat adaptor mengiklankannya.
- Memanggil
renderPresentationsaat adaptor dapat merender payload. - Beralih ke teks konservatif saat adaptor tidak ada atau tidak dapat merender.
- Mengirim payload yang dihasilkan melalui jalur pengiriman kanal normal.
- Menerapkan metadata pengiriman seperti
delivery.pinsetelah pesan terkirim pertama berhasil.
Aturan degradasi
Presentasi harus aman untuk dikirim pada kanal terbatas. Teks fallback menyertakan: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 pilihan
Visibilitas fallback nilai tombol
Saat kanal tidak dapat merender kontrol interaktif, nilai tombol dan pilihan beralih ke teks biasa. Perilaku fallback mempertahankan kegunaan sambil menjaga data callback opak tetap privat:- Tindakan bertipe
commanddirender sebagailabel: \command“ sehingga pengguna dapat menyalin perintah dan menjalankannya secara manual di input kanal. - Tindakan bertipe
callbackdan bidangvaluelama dirender sebagai hanya label. Nilai callback opak tidak diekspos dalam teks fallback. - Tombol
url/webAppmerender teks URL bersama label tombol, karena URL ditujukan untuk pengguna. - Opsi pilihan dirender sebagai hanya label. Nilai opsi yang mendasarinya tidak diekspos dalam teks fallback.
- Telegram dengan tombol inline dinonaktifkan mengirim fallback teks.
- Kanal tanpa dukungan pilihan mencantumkan opsi pilihan sebagai teks.
- Tombol hanya URL menjadi tombol tautan native atau baris URL fallback.
- Kegagalan pin opsional tidak menggagalkan pesan yang dikirim.
delivery.pin.required: true; jika penyematan diminta sebagai
wajib dan kanal tidak dapat menyematkan pesan terkirim, pengiriman melaporkan kegagalan.
Pemetaan penyedia
Perender bawaan saat ini:| Saluran | Target render native | Catatan |
|---|---|---|
| Discord | Komponen dan kontainer komponen | Mempertahankan channelData.discord.components lama untuk produsen payload native-penyedia yang ada, tetapi pengiriman bersama baru harus menggunakan presentation. |
| Slack | Block Kit | Mempertahankan channelData.slack.blocks lama untuk produsen payload native-penyedia yang ada, tetapi pengiriman bersama baru harus menggunakan presentation. |
| Telegram | Teks plus keyboard inline | Tombol/pilihan memerlukan kapabilitas tombol inline untuk permukaan target; jika tidak, fallback teks digunakan. |
| Mattermost | Teks plus properti interaktif | Blok lain diturunkan menjadi teks. |
| Microsoft Teams | Adaptive Cards | Teks message biasa disertakan bersama kartu ketika keduanya disediakan. |
| Feishu | Kartu interaktif | Header kartu dapat menggunakan title; isi menghindari duplikasi judul tersebut. |
| Saluran biasa | Fallback teks | Saluran tanpa renderer tetap mendapatkan keluaran yang dapat dibaca. |
Presentation vs InteractiveReply
InteractiveReply adalah subset internal lama yang digunakan oleh helper
persetujuan dan interaksi. Ini mendukung:
- teks
- tombol
- pilihan
MessagePresentation adalah kontrak pengiriman bersama kanonis. Ini menambahkan:
- judul
- nada
- konteks
- pemisah
- tombol khusus URL
- metadata pengiriman generik melalui
ReplyPayload.delivery
openclaw/plugin-sdk/interactive-runtime saat menjembatani
kode lama:
OC_I18N_900011
Kode baru harus menerima atau menghasilkan MessagePresentation secara langsung.
Payload interactive yang ada adalah subset usang dari presentation; dukungan
runtime tetap ada untuk produsen lama.
Tipe InteractiveReply* lama dan helper konversi ditandai
@deprecated di SDK:
InteractiveReply,InteractiveReplyBlock,InteractiveReplyButton,InteractiveReplyOption,InteractiveReplySelectBlock, danInteractiveReplyTextBlocknormalizeInteractiveReply(...)hasInteractiveReplyBlocks(...)interactiveReplyToPresentation(...)presentationToInteractiveReply(...)presentationToInteractiveControlsReply(...)resolveInteractiveTextFallback(...)reduceInteractiveReply(...)
presentationToInteractiveReply(...) dan
presentationToInteractiveControlsReply(...) tetap tersedia sebagai jembatan
renderer untuk implementasi saluran lama. Kode produsen baru tidak boleh
memanggilnya; kirim presentation dan biarkan adaptasi inti/saluran menangani rendering.
Helper persetujuan juga memiliki pengganti yang mengutamakan presentation:
- gunakan
buildApprovalPresentationFromActionDescriptors(...)alih-alihbuildApprovalInteractiveReplyFromActionDescriptors(...) - gunakan
buildApprovalPresentation(...)alih-alihbuildApprovalInteractiveReply(...) - gunakan
buildExecApprovalPresentation(...)alih-alihbuildExecApprovalInteractiveReply(...)
renderMessagePresentationFallbackText(...) mengembalikan string kosong untuk
blok presentation yang tidak memiliki fallback teks, seperti presentation yang
hanya berisi pemisah. Transport yang memerlukan isi pengiriman yang tidak kosong
dapat meneruskan emptyFallback untuk memilih isi minimal tanpa mengubah kontrak
fallback default.
Pin pengiriman
Penyematan adalah perilaku pengiriman, bukan presentation. Gunakandelivery.pin
alih-alih field native-penyedia seperti channelData.telegram.pin.
Semantik:
pin: truemenyematkan pesan pertama yang berhasil dikirim.pin.notifydefault-nya adalahfalse.pin.requireddefault-nya adalahfalse.- Kegagalan pin opsional diturunkan dan membiarkan pesan terkirim tetap utuh.
- Kegagalan pin wajib menggagalkan pengiriman.
- Pesan yang dipecah menyematkan potongan pertama yang terkirim, bukan potongan akhir.
pin, unpin, dan pins tetap ada untuk pesan yang sudah ada
ketika penyedia mendukung operasi tersebut.
Checklist penulis Plugin
- Deklarasikan
presentationdaridescribeMessageTool(...)ketika saluran dapat merender atau menurunkan presentation semantik dengan aman. - Tambahkan
presentationCapabilitieske adaptor outbound runtime. - Implementasikan
renderPresentationdi kode runtime, bukan kode setup Plugin control-plane. - Jauhkan pustaka UI native dari jalur setup/katalog yang panas.
- Deklarasikan batas kapabilitas generik pada
presentationCapabilities.limitsketika batas tersebut diketahui. - Pertahankan batas platform final di renderer dan pengujian.
- Tambahkan pengujian fallback untuk tombol yang tidak didukung, pilihan, tombol URL, duplikasi judul/teks,
dan pengiriman campuran
messagepluspresentation. - Tambahkan dukungan pin pengiriman melalui
deliveryCapabilities.pindanpinDeliveredMessagehanya ketika penyedia dapat menyematkan id pesan yang dikirim. - Jangan mengekspos field kartu/blok/komponen/tombol native-penyedia baru melalui skema aksi pesan bersama.