Presentasi pesan adalah kontrak bersama OpenClaw untuk UI chat keluar yang kaya. Ini memungkinkan agen, perintah CLI, alur persetujuan, dan Plugin mendeskripsikan maksud pesan satu kali, sementara setiap Plugin saluran merender bentuk native terbaik yang dapat dilakukannya. Gunakan presentasi untuk UI pesan portabel:Documentation Index
Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
- bagian teks
- teks konteks/footer kecil
- pemisah
- tombol
- menu pilihan
- judul kartu dan nada
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 tindakan 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 saran. Renderer harus memetakan gaya yang tidak didukung ke default yang aman, bukan menggagalkan pengiriman.
options[].valueadalah nilai aplikasi yang dipilih.placeholderbersifat saran dan dapat diabaikan oleh saluran tanpa dukungan pilihan native.- Jika saluran tidak mendukung pilihan, fallback teks mencantumkan label.
Contoh produsen
Kartu sederhana:Kontrak renderer
Plugin saluran mendeklarasikan dukungan render pada adaptor keluar mereka:Alur render inti
KetikaReplyPayload atau tindakan pesan menyertakan presentation, inti:
- Menormalkan payload presentasi.
- Menyelesaikan adaptor keluar saluran target.
- Membaca
presentationCapabilities. - Memanggil
renderPresentationketika adaptor dapat merender payload. - Beralih ke teks konservatif ketika adaptor tidak ada atau tidak dapat merender.
- Mengirim payload yang dihasilkan melalui jalur pengiriman saluran normal.
- Menerapkan metadata pengiriman seperti
delivery.pinsetelah pesan terkirim pertama berhasil.
Aturan degradasi
Presentasi harus aman dikirim pada saluran terbatas. Teks fallback 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 pilihan
- Telegram dengan tombol inline dinonaktifkan mengirim fallback teks.
- Saluran tanpa dukungan pilihan mencantumkan opsi pilihan sebagai teks.
- Tombol hanya URL menjadi tombol tautan native atau baris URL fallback.
- Kegagalan penyematan opsional tidak menggagalkan pesan yang sudah terkirim.
delivery.pin.required: true; jika penyematan diminta
sebagai wajib dan saluran tidak dapat menyematkan pesan terkirim, pengiriman
melaporkan kegagalan.
Pemetaan penyedia
Renderer bawaan saat ini:| Saluran | Target render native | Catatan |
|---|---|---|
| Discord | Komponen dan kontainer komponen | Mempertahankan channelData.discord.components legacy untuk produsen payload native penyedia yang sudah ada, tetapi pengiriman bersama baru harus menggunakan presentation. |
| Slack | Block Kit | Mempertahankan channelData.slack.blocks legacy untuk produsen payload native penyedia yang sudah 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 prop interaktif | Blok lain terdegradasi menjadi teks. |
| Microsoft Teams | Adaptive Cards | Teks message biasa disertakan dengan 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 output 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 hanya URL
- metadata pengiriman generik melalui
ReplyPayload.delivery
openclaw/plugin-sdk/interactive-runtime ketika menjembatani
kode lama:
MessagePresentation secara langsung.
presentationToInteractiveReply(...) mempertahankan teks presentasi yang terlihat
dengan memetakan judul, teks, konteks, tombol, dan pilihan ke bentuk
InteractiveReply lama. Renderer komponen yang sudah menggambar blok judul,
teks, konteks, dan pemisah secara native harus menggunakan
presentationToInteractiveControlsReply(...) sebagai gantinya, lalu hanya
menambahkan kontrol tombol dan pilihan.
renderMessagePresentationFallbackText(...) mengembalikan string kosong untuk
blok presentasi yang tidak memiliki fallback teks, seperti presentasi yang hanya
berisi pemisah. Transport yang memerlukan isi pengiriman tidak kosong dapat
meneruskan emptyFallback untuk memilih isi minimal tanpa mengubah kontrak
fallback default.
Penyematan pengiriman
Penyematan adalah perilaku pengiriman, bukan presentasi. Gunakandelivery.pin
alih-alih field native penyedia seperti channelData.telegram.pin.
Semantik:
pin: truemenyematkan pesan pertama yang berhasil dikirim.pin.notifydefault kefalse.pin.requireddefault kefalse.- Kegagalan penyematan opsional terdegradasi dan membiarkan pesan terkirim tetap utuh.
- Kegagalan penyematan 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.
Daftar periksa penulis Plugin
- Deklarasikan
presentationdaridescribeMessageTool(...)ketika saluran dapat merender atau mendegradasikan presentasi semantik dengan aman. - Tambahkan
presentationCapabilitieske adaptor keluar runtime. - Implementasikan
renderPresentationdalam kode runtime, bukan kode penyiapan Plugin control-plane. - Jauhkan pustaka UI native dari jalur penyiapan/katalog yang panas.
- Pertahankan batas platform dalam renderer dan pengujian.
- Tambahkan pengujian fallback untuk tombol yang tidak didukung, pilihan, tombol
URL, duplikasi judul/teks, dan pengiriman campuran
messagepluspresentation. - Tambahkan dukungan penyematan pengiriman melalui
deliveryCapabilities.pindanpinDeliveredMessagehanya ketika penyedia dapat menyematkan id pesan terkirim. - Jangan mengekspos field kartu/blok/komponen/tombol native penyedia baru melalui skema tindakan pesan bersama.