Presentazione dei messaggi
La presentazione dei messaggi è il contratto condiviso di OpenClaw per UI chat ricche in uscita. Consente ad agenti, comandi CLI, flussi di approvazione e plugin di descrivere una sola volta l’intento del messaggio, mentre ogni plugin di canale rende la migliore forma nativa possibile. Usa la presentazione per una UI dei messaggi portabile:- sezioni di testo
- piccolo testo di contesto/footer
- divisori
- pulsanti
- menu di selezione
- titolo e tono della scheda
components, Slack
blocks, Telegram buttons, Teams card o Feishu card allo strumento
messaggi condiviso. Questi sono output di rendering posseduti dal plugin di canale.
Contratto
Gli autori di plugin importano il contratto pubblico da:valueè un valore di azione applicativa instradato di nuovo attraverso il percorso di interazione esistente del canale quando il canale supporta controlli cliccabili.urlè un pulsante link. Può esistere senzavalue.labelè obbligatorio ed è usato anche nel fallback testuale.styleè indicativo. I renderer dovrebbero mappare gli stili non supportati a un valore predefinito sicuro, non far fallire l’invio.
options[].valueè il valore applicativo selezionato.placeholderè indicativo e può essere ignorato dai canali senza supporto nativo per i selettori.- Se un canale non supporta i selettori, il testo di fallback elenca le etichette.
Esempi di producer
Scheda semplice:Contratto del renderer
I plugin di canale dichiarano il supporto del rendering sul proprio adapter in uscita:Flusso di rendering del core
Quando unReplyPayload o un’azione messaggio include presentation, il core:
- Normalizza il payload di presentazione.
- Risolve l’adapter in uscita del canale target.
- Legge
presentationCapabilities. - Chiama
renderPresentationquando l’adapter può rendere il payload. - Ricade su testo conservativo quando l’adapter è assente o non può eseguire il rendering.
- Invia il payload risultante tramite il normale percorso di consegna del canale.
- Applica i metadati di consegna come
delivery.pindopo il primo messaggio inviato con successo.
Regole di degradazione
La presentazione deve essere sicura da inviare su canali limitati. Il testo di fallback include:titlecome prima riga- blocchi
textcome normali paragrafi - blocchi
contextcome righe di contesto compatte - blocchi
dividercome separatore visivo - etichette dei pulsanti, inclusi URL per i pulsanti link
- etichette delle opzioni del selettore
- Telegram con pulsanti inline disabilitati invia fallback testuale.
- Un canale senza supporto per i selettori elenca le opzioni del selettore come testo.
- Un pulsante solo URL diventa un pulsante link nativo oppure una riga URL di fallback.
- I fallimenti opzionali del pin non fanno fallire il messaggio consegnato.
delivery.pin.required: true; se il pin è richiesto come
obbligatorio e il canale non può fissare il messaggio inviato, la consegna riporta un errore.
Mappatura provider
Renderer inclusi attuali:| Canale | Target di rendering nativo | Note |
|---|---|---|
| Discord | Components e container di componenti | Preserva il legacy channelData.discord.components per i producer di payload nativi specifici del provider esistenti, ma i nuovi invii condivisi dovrebbero usare presentation. |
| Slack | Block Kit | Preserva il legacy channelData.slack.blocks per i producer di payload nativi specifici del provider esistenti, ma i nuovi invii condivisi dovrebbero usare presentation. |
| Telegram | Testo più tastiere inline | Pulsanti/selettori richiedono la capacità di pulsanti inline per la superficie target; altrimenti viene usato il fallback testuale. |
| Mattermost | Testo più props interattive | Gli altri blocchi degradano a testo. |
| Microsoft Teams | Adaptive Cards | Il testo semplice message viene incluso con la scheda quando sono forniti entrambi. |
| Feishu | Schede interattive | L’header della scheda può usare title; il body evita di duplicare quel titolo. |
| Canali semplici | Fallback testuale | I canali senza renderer ricevono comunque output leggibile. |
Presentation vs InteractiveReply
InteractiveReply è il vecchio sottoinsieme interno usato dagli helper di approvazione e interazione.
Supporta:
- testo
- pulsanti
- selettori
MessagePresentation è il contratto canonico condiviso di invio. Aggiunge:
- titolo
- tono
- contesto
- divisore
- pulsanti solo URL
- metadati generici di consegna tramite
ReplyPayload.delivery
openclaw/plugin-sdk/interactive-runtime quando colleghi codice meno recente:
MessagePresentation.
Delivery Pin
Il pin è comportamento di consegna, non presentazione. Usadelivery.pin invece di
campi nativi specifici del provider come channelData.telegram.pin.
Semantica:
pin: truefissa il primo messaggio consegnato con successo.pin.notifyèfalseper impostazione predefinita.pin.requiredèfalseper impostazione predefinita.- I fallimenti opzionali del pin degradano e lasciano intatto il messaggio inviato.
- I fallimenti obbligatori del pin fanno fallire la consegna.
- I messaggi suddivisi in chunk fissano il primo chunk consegnato, non quello finale.
pin, unpin e pins esistono ancora per i messaggi
esistenti nei casi in cui il provider supporti tali operazioni.
Checklist per autori di plugin
- Dichiara
presentationdadescribeMessageTool(...)quando il canale può rendere o degradare in modo sicuro la presentazione semantica. - Aggiungi
presentationCapabilitiesall’adapter runtime in uscita. - Implementa
renderPresentationnel codice runtime, non nel codice di configurazione del plugin del control plane. - Tieni le librerie UI native fuori dai percorsi caldi di setup/catalogo.
- Preserva i limiti della piattaforma nel renderer e nei test.
- Aggiungi test di fallback per pulsanti non supportati, selettori, pulsanti URL, duplicazione
titolo/testo e invii misti
messagepiùpresentation. - Aggiungi supporto al delivery pin tramite
deliveryCapabilities.pinepinDeliveredMessagesolo quando il provider può fissare l’ID del messaggio inviato. - Non esporre nuovi campi nativi specifici del provider per schede/blocchi/componenti/pulsanti tramite lo schema condiviso dell’azione messaggio.