- sekcje tekstowe
- mały tekst kontekstu/stopki
- separatory
- przyciski
- menu select
- tytuł karty i ton
components, Slack
blocks, Telegram buttons, Teams card albo Feishu card, do współdzielonego
narzędzia wiadomości. To wyniki renderera należące do Pluginu kanału.
Kontrakt
Autorzy Pluginów importują publiczny kontrakt z:valueto wartość akcji aplikacji kierowana z powrotem przez istniejącą ścieżkę interakcji kanału, gdy kanał obsługuje klikalne kontrolki.urlto przycisk linku. Może istnieć bezvalue.labeljest wymagane i jest także używane w fallbacku tekstowym.stylema charakter doradczy. Renderery powinny mapować nieobsługiwane style na bezpieczne ustawienie domyślne, a nie kończyć wysyłanie błędem.
options[].valueto wybrana wartość aplikacji.placeholderma charakter doradczy i może być ignorowane przez kanały bez natywnej obsługi selectów.- Jeśli kanał nie obsługuje selectów, fallback tekstowy wypisuje etykiety.
Przykłady producentów
Prosta karta:Kontrakt renderera
Pluginy kanałów deklarują obsługę renderowania na adapterze wychodzącym:Główny przepływ renderowania
GdyReplyPayload albo akcja wiadomości zawiera presentation, rdzeń:
- Normalizuje ładunek prezentacji.
- Rozwiązuje adapter wychodzący docelowego kanału.
- Odczytuje
presentationCapabilities. - Wywołuje
renderPresentation, gdy adapter potrafi wyrenderować ładunek. - Stosuje fallback do zachowawczego tekstu, gdy adapter nie istnieje albo nie potrafi renderować.
- Wysyła wynikowy ładunek przez normalną ścieżkę dostarczania kanału.
- Stosuje metadane dostarczania, takie jak
delivery.pin, po pierwszej udanej wysłanej wiadomości.
Reguły degradacji
Prezentacja musi być bezpieczna do wysłania na ograniczonych kanałach. Fallback tekstowy zawiera:titlejako pierwszy wiersz- bloki
textjako zwykłe akapity - bloki
contextjako kompaktowe linie kontekstu - bloki
dividerjako wizualny separator - etykiety przycisków, w tym URL-e dla przycisków linków
- etykiety opcji select
- Telegram z wyłączonymi inline buttons wysyła fallback tekstowy.
- Kanał bez obsługi selectów wypisuje opcje select jako tekst.
- Przycisk tylko z URL staje się natywnym przyciskiem linku albo fallbackową linią URL.
- Opcjonalne błędy przypinania nie powodują błędu dostarczonej wiadomości.
delivery.pin.required: true; jeśli przypinanie jest wymagane
i kanał nie może przypiąć wysłanej wiadomości, dostarczenie raportuje błąd.
Mapowanie dostawców
Obecne dołączone renderery:| Kanał | Natywny cel renderowania | Uwagi |
|---|---|---|
| Discord | Components i component containers | Zachowuje starsze channelData.discord.components dla istniejących producentów ładunków natywnych dla dostawcy, ale nowe współdzielone wysyłki powinny używać presentation. |
| Slack | Block Kit | Zachowuje starsze channelData.slack.blocks dla istniejących producentów ładunków natywnych dla dostawcy, ale nowe współdzielone wysyłki powinny używać presentation. |
| Telegram | Tekst plus inline keyboards | Przyciski/selecty wymagają możliwości inline button dla docelowej powierzchni; w przeciwnym razie używany jest fallback tekstowy. |
| Mattermost | Tekst plus interactive props | Inne bloki degradują się do tekstu. |
| Microsoft Teams | Adaptive Cards | Zwykły tekst message jest dołączany razem z kartą, gdy podano oba elementy. |
| Feishu | Interactive cards | Nagłówek karty może używać title; treść unika duplikowania tego tytułu. |
| Plain channels | Fallback tekstowy | Kanały bez renderera nadal otrzymują czytelne wyjście. |
Presentation vs InteractiveReply
InteractiveReply to starszy wewnętrzny podzbiór używany przez helpery zatwierdzeń i interakcji.
Obsługuje:
- tekst
- przyciski
- selecty
MessagePresentation to kanoniczny współdzielony kontrakt wysyłania. Dodaje:
- tytuł
- ton
- kontekst
- separator
- przyciski tylko z URL
- ogólne metadane dostarczania przez
ReplyPayload.delivery
openclaw/plugin-sdk/interactive-runtime:
MessagePresentation.
Delivery Pin
Przypinanie to zachowanie dostarczania, a nie prezentacji. Używajdelivery.pin zamiast
pól natywnych dla dostawcy, takich jak channelData.telegram.pin.
Semantyka:
pin: trueprzypina pierwszą pomyślnie dostarczoną wiadomość.pin.notifydomyślnie ma wartośćfalse.pin.requireddomyślnie ma wartośćfalse.- Opcjonalne błędy przypinania degradują się i pozostawiają wysłaną wiadomość bez zmian.
- Wymagane błędy przypinania powodują błąd dostarczenia.
- Przy wiadomościach dzielonych na fragmenty przypinany jest pierwszy dostarczony fragment, a nie końcowy fragment.
pin, unpin i pins nadal istnieją dla już istniejących
wiadomości, gdy dostawca obsługuje takie operacje.
Lista kontrolna dla autorów Pluginów
- Deklaruj
presentationzdescribeMessageTool(...), gdy kanał potrafi renderować albo bezpiecznie degradować semantyczną prezentację. - Dodaj
presentationCapabilitiesdo adaptera wychodzącego runtime. - Implementuj
renderPresentationw kodzie runtime, a nie w kodzie konfiguracji Pluginu w płaszczyźnie sterowania. - Nie przenoś natywnych bibliotek UI do gorących ścieżek setup/catalog.
- Zachowuj limity platformy w rendererze i testach.
- Dodaj testy fallbacku dla nieobsługiwanych przycisków, selectów, przycisków URL, duplikacji title/text
oraz wysyłek mieszanych
message+presentation. - Dodaj obsługę przypinania dostarczania przez
deliveryCapabilities.pinipinDeliveredMessagetylko wtedy, gdy dostawca potrafi przypiąć identyfikator wysłanej wiadomości. - Nie udostępniaj nowych natywnych pól kart/bloków/komponentów/przycisków dostawców przez współdzielony schemat akcji wiadomości.