Представлення повідомлень
Представлення повідомлень — це спільний контракт OpenClaw для розширеного інтерфейсу вихідного чату. Він дає змогу агентам, командам CLI, потокам погодження та plugin-ам описати намір повідомлення один раз, тоді як кожен plugin каналу рендерить найкращу нативну форму, яку він підтримує. Використовуйте представлення для переносного інтерфейсу повідомлень:- текстові секції
- короткий контекстний текст/текст нижнього колонтитула
- роздільники
- кнопки
- меню вибору
- заголовок картки та тон
components, Slack
blocks, Telegram buttons, Teams card або Feishu card, до спільного
інструмента повідомлень. Це результати рендерингу, якими володіє plugin каналу.
Контракт
Автори plugin-ів імпортують публічний контракт із:value— це значення дії застосунку, яке спрямовується назад через наявний шлях взаємодії каналу, коли канал підтримує натискні елементи керування.url— це кнопка-посилання. Вона може існувати безvalue.labelє обов’язковим і також використовується в текстовому резервному варіанті.styleє рекомендаційним. Рендерери мають зіставляти непідтримувані стилі з безпечним значенням за замовчуванням, а не завершувати надсилання з помилкою.
options[].value— це вибране значення застосунку.placeholderє рекомендаційним і може ігноруватися каналами без нативної підтримки вибору.- Якщо канал не підтримує меню вибору, резервний текст перелічує мітки.
Приклади продюсера
Проста картка:Контракт рендерера
Plugin-и каналів оголошують підтримку рендерингу у своєму вихідному адаптері:Основний потік рендерингу
КолиReplyPayload або дія повідомлення містить presentation, ядро:
- Нормалізує payload представлення.
- Визначає вихідний адаптер цільового каналу.
- Зчитує
presentationCapabilities. - Викликає
renderPresentation, коли адаптер може рендерити payload. - Повертається до консервативного тексту, якщо адаптер відсутній або не може рендерити.
- Надсилає отриманий payload звичайним шляхом доставлення каналу.
- Застосовує метадані доставлення, такі як
delivery.pin, після першого успішно надісланого повідомлення.
Правила деградації
Представлення має бути безпечним для надсилання в обмежених каналах. Резервний текст містить:titleяк перший рядок- блоки
textяк звичайні абзаци - блоки
contextяк компактні контекстні рядки - блоки
dividerяк візуальний роздільник - мітки кнопок, включно з URL для кнопок-посилань
- мітки варіантів вибору
- Telegram із вимкненими вбудованими кнопками надсилає текстовий резервний варіант.
- Канал без підтримки меню вибору перелічує варіанти вибору як текст.
- Кнопка лише з URL стає або нативною кнопкою-посиланням, або резервним рядком URL.
- Необов’язкові збої закріплення не призводять до збою доставленого повідомлення.
delivery.pin.required: true; якщо закріплення запитується як
обов’язкове і канал не може закріпити надіслане повідомлення, доставлення повідомляє про збій.
Відображення провайдерів
Поточні вбудовані рендерери:| Канал | Ціль нативного рендерингу | Примітки |
|---|---|---|
| Discord | Components і контейнери компонентів | Зберігає застаріле channelData.discord.components для наявних продюсерів payload, нативних для провайдера, але нові спільні надсилання мають використовувати presentation. |
| Slack | Block Kit | Зберігає застаріле channelData.slack.blocks для наявних продюсерів payload, нативних для провайдера, але нові спільні надсилання мають використовувати presentation. |
| Telegram | Текст плюс вбудовані клавіатури | Кнопки/меню вибору вимагають можливості вбудованих кнопок для цільової поверхні; інакше використовується текстовий резервний варіант. |
| Mattermost | Текст плюс інтерактивні props | Інші блоки деградують до тексту. |
| Microsoft Teams | Adaptive Cards | Простий текст message включається разом із карткою, коли надано обидва. |
| Feishu | Інтерактивні картки | Заголовок картки може використовувати title; тіло уникає дублювання цього заголовка. |
| Прості канали | Текстовий резервний варіант | Канали без рендерера все одно отримують читабельний вивід. |
Presentation проти InteractiveReply
InteractiveReply — це старіша внутрішня підмножина, яка використовується засобами погодження та взаємодії. Вона підтримує:
- текст
- кнопки
- меню вибору
MessagePresentation — це канонічний спільний контракт надсилання. Він додає:
- заголовок
- тон
- контекст
- роздільник
- кнопки лише з URL
- загальні метадані доставлення через
ReplyPayload.delivery
openclaw/plugin-sdk/interactive-runtime під час мосту зі старішим
кодом:
MessagePresentation.
Закріплення доставлення
Закріплення — це поведінка доставлення, а не представлення. Використовуйтеdelivery.pin замість
нативних для провайдера полів, таких як channelData.telegram.pin.
Семантика:
pin: trueзакріплює перше успішно доставлене повідомлення.pin.notifyза замовчуванням дорівнюєfalse.pin.requiredза замовчуванням дорівнюєfalse.- Необов’язкові збої закріплення деградують і залишають надіслане повідомлення недоторканим.
- Обов’язкові збої закріплення призводять до збою доставлення.
- Фрагментовані повідомлення закріплюють перший доставлений фрагмент, а не хвостовий.
pin, unpin і pins усе ще існують для наявних
повідомлень, де провайдер підтримує ці операції.
Контрольний список автора plugin-а
- Оголосіть
presentationзdescribeMessageTool(...), коли канал може рендерити або безпечно деградувати семантичне представлення. - Додайте
presentationCapabilitiesдо runtime вихідного адаптера. - Реалізуйте
renderPresentationу runtime коді, а не в control-plane коді налаштування plugin-а. - Не допускайте потрапляння нативних бібліотек інтерфейсу в гарячі шляхи налаштування/каталогу.
- Зберігайте платформні обмеження в рендерері та тестах.
- Додайте резервні тести для непідтримуваних кнопок, меню вибору, кнопок URL, дублювання title/text і змішаних надсилань
messageплюсpresentation. - Додайте підтримку закріплення доставлення через
deliveryCapabilities.pinіpinDeliveredMessageлише тоді, коли провайдер може закріпити id надісланого повідомлення. - Не відкривайте нові нативні для провайдера поля card/block/component/button через спільну схему дій повідомлень.