- Textabschnitte
- kleinen Kontext-/Footer-Text
- Trenner
- Buttons
- Auswahlmenüs
- Kartentitel und Tonalität
components, Slack
blocks, Telegram buttons, Teams card oder Feishu card hinzu. Diese sind Renderer-Ausgaben im Besitz des Kanal-Plugins.
Vertrag
Plugin-Autoren importieren den öffentlichen Vertrag aus:valueist ein Aktionswert der Anwendung, der über den vorhandenen Interaktionspfad des Kanals zurückgeleitet wird, wenn der Kanal anklickbare Controls unterstützt.urlist ein Link-Button. Er kann ohnevalueexistieren.labelist erforderlich und wird auch im Text-Fallback verwendet.styleist hinweisend. Renderer sollten nicht unterstützte Styles auf einen sicheren Standard abbilden und das Senden nicht fehlschlagen lassen.
options[].valueist der ausgewählte Anwendungswert.placeholderist hinweisend und kann von Kanälen ohne native Unterstützung für Auswahlmenüs ignoriert werden.- Wenn ein Kanal Auswahlmenüs nicht unterstützt, listet der Fallback-Text die Labels auf.
Beispiele für Producer
Einfache Karte:Renderer-Vertrag
Kanal-Plugins deklarieren Render-Unterstützung auf ihrem Outbound-Adapter:Core-Render-Fluss
Wenn einReplyPayload oder eine Nachrichtenaktion presentation enthält, führt Core Folgendes aus:
- Die Nutzlast von Presentation normalisieren.
- Den Outbound-Adapter des Zielkanals auflösen.
presentationCapabilitieslesen.renderPresentationaufrufen, wenn der Adapter die Nutzlast rendern kann.- Auf konservativen Text zurückfallen, wenn der Adapter fehlt oder nicht rendern kann.
- Die resultierende Nutzlast über den normalen Kanalzustellpfad senden.
- Zustellmetadaten wie
delivery.pinnach der ersten erfolgreichen gesendeten Nachricht anwenden.
Regeln für Degradation
Presentation muss sicher auf eingeschränkten Kanälen gesendet werden können. Fallback-Text enthält:titleals erste Zeile- Blöcke
textals normale Absätze - Blöcke
contextals kompakte Kontextzeilen - Blöcke
dividerals visuelle Trennung - Button-Labels, einschließlich URLs für Link-Buttons
- Labels von Auswahloptionen
- Telegram mit deaktivierten Inline-Buttons sendet Text-Fallback.
- Ein Kanal ohne Unterstützung für Auswahlmenüs listet Auswahloptionen als Text auf.
- Ein reiner URL-Button wird entweder zu einem nativen Link-Button oder zu einer Fallback-URL-Zeile.
- Optionale Fehler beim Anheften lassen die gesendete Nachricht nicht fehlschlagen.
delivery.pin.required: true; wenn Anheften als
erforderlich angefordert wird und der Kanal die gesendete Nachricht nicht anheften kann, meldet die Zustellung einen Fehler.
Provider-Zuordnung
Aktuelle gebündelte Renderer:| Kanal | Ziel für natives Rendering | Hinweise |
|---|---|---|
| Discord | Components und Component-Container | Bewahrt das ältere channelData.discord.components für bestehende Producer providernativer Nutzlasten, aber neue gemeinsame Sends sollten presentation verwenden. |
| Slack | Block Kit | Bewahrt das ältere channelData.slack.blocks für bestehende Producer providernativer Nutzlasten, aber neue gemeinsame Sends sollten presentation verwenden. |
| Telegram | Text plus Inline-Keyboards | Buttons/Auswahlmenüs erfordern Inline-Button-Fähigkeit für die Zieloberfläche; andernfalls wird Text-Fallback verwendet. |
| Mattermost | Text plus interaktive Props | Andere Blöcke degradieren zu Text. |
| Microsoft Teams | Adaptive Cards | Einfacher message-Text wird zusammen mit der Karte eingeschlossen, wenn beides bereitgestellt wird. |
| Feishu | Interaktive Karten | Der Karten-Header kann title verwenden; der Body vermeidet die doppelte Verwendung dieses Titels. |
| Plain channels | Text-Fallback | Auch Kanäle ohne Renderer erhalten weiterhin lesbare Ausgabe. |
Presentation vs InteractiveReply
InteractiveReply ist die ältere interne Teilmenge, die von Genehmigungs- und Interaktions-
Helpern verwendet wird. Sie unterstützt:
- Text
- Buttons
- Auswahlmenüs
MessagePresentation ist der kanonische gemeinsame Send-Vertrag. Sie fügt hinzu:
- Titel
- Tonalität
- Kontext
- Trenner
- reine URL-Buttons
- generische Zustellmetadaten über
ReplyPayload.delivery
openclaw/plugin-sdk/interactive-runtime, wenn Sie älteren
Code überbrücken:
MessagePresentation direkt akzeptieren oder erzeugen.
Zustellung mit Anheften
Anheften ist Zustellverhalten, nicht Presentation. Verwenden Siedelivery.pin statt
providernativer Felder wie channelData.telegram.pin.
Semantik:
pin: trueheftet die erste erfolgreich zugestellte Nachricht an.pin.notifyist standardmäßigfalse.pin.requiredist standardmäßigfalse.- Optionale Fehler beim Anheften degradieren und lassen die gesendete Nachricht intakt.
- Erforderliche Fehler beim Anheften lassen die Zustellung fehlschlagen.
- Bei gechunkten Nachrichten wird der erste zugestellte Chunk angeheftet, nicht der letzte Chunk.
pin, unpin und pins existieren weiterhin für bestehende
Nachrichten, bei denen der Provider diese Operationen unterstützt.
Checkliste für Plugin-Autoren
- Deklarieren Sie
presentationausdescribeMessageTool(...), wenn der Kanal semantische Presentation rendern oder sicher degradieren kann. - Fügen Sie
presentationCapabilitieszum Runtime-Outbound-Adapter hinzu. - Implementieren Sie
renderPresentationin Runtime-Code, nicht in Control-Plane-Plugin- Setup-Code. - Halten Sie native UI-Bibliotheken aus heißen Setup-/Katalogpfaden heraus.
- Bewahren Sie Plattformgrenzen im Renderer und in Tests.
- Fügen Sie Fallback-Tests für nicht unterstützte Buttons, Auswahlmenüs, URL-Buttons, Doppelung von Titel/Text und gemischte Sends mit
messagepluspresentationhinzu. - Fügen Sie Unterstützung für Anheften über
deliveryCapabilities.pinundpinDeliveredMessagenur hinzu, wenn der Provider die gesendete Nachrichten-ID anheften kann. - Stellen Sie keine neuen providernativen Felder für Karten/Blöcke/Komponenten/Buttons über das gemeinsame Schema der Nachrichtenaktion bereit.