- テキストセクション
- 小さなコンテキスト/フッターテキスト
- 区切り線
- ボタン
- セレクトメニュー
- カードタイトルとトーン
components、Slack の
blocks、Telegram の buttons、Teams の card、Feishu の card のような、新しい provider-native フィールドを共有
message tool に追加してはいけません。これらはチャンネル Plugin が所有するレンダラー出力です。
契約
Plugin 作成者は次から公開契約を import します。valueはアプリケーション action 値であり、チャンネルがクリック可能なコントロールをサポートしている場合、チャンネルの既存 interaction path 経由で戻されます。urlはリンクボタンです。valueなしでも存在できます。labelは必須で、テキストフォールバックでも使われます。styleは advisory です。レンダラーは、サポートされていない style を失敗させるのではなく、安全なデフォルトにマップすべきです。
options[].valueは選択されたアプリケーション値です。placeholderは advisory であり、ネイティブなセレクトをサポートしないチャンネルでは無視されることがあります。- チャンネルがセレクトをサポートしない場合、フォールバックテキストはラベルを列挙します。
Producer の例
シンプルなカード:Renderer 契約
チャンネル Plugin は、その outbound adapter 上で render サポートを宣言します。Core のレンダーフロー
ReplyPayload または message action に presentation が含まれる場合、core は次を行います。
- presentation payload を正規化する。
- ターゲットチャンネルの outbound adapter を解決する。
presentationCapabilitiesを読む。- adapter が payload をレンダリングできる場合、
renderPresentationを呼ぶ。 - adapter がない、またはレンダリングできない場合は保守的なテキストへフォールバックする。
- 生成された payload を通常のチャンネル配信パスで送る。
- 最初に送信成功したメッセージの後で、
delivery.pinのような配信メタデータを適用する。
劣化ルール
プレゼンテーションは、制限されたチャンネルでも安全に送信できなければなりません。 フォールバックテキストには次が含まれます。- 最初の行としての
title - 通常段落としての
textブロック - コンパクトなコンテキスト行としての
contextブロック - 視覚的区切りとしての
dividerブロック - リンクボタンの URL を含むボタンラベル
- セレクト option ラベル
- inline button 無効の Telegram では、テキストフォールバックを送信する。
- セレクトをサポートしないチャンネルでは、セレクト option をテキストとして列挙する。
- URL のみボタンは、ネイティブリンクボタンまたはフォールバック URL 行のどちらかになる。
- 任意の pin 失敗は、配信済みメッセージを失敗させない。
delivery.pin.required: true です。pin が必須として要求され、
チャンネルが送信済みメッセージを pin できない場合、配信は失敗として報告されます。
Provider マッピング
現在の同梱レンダラー:| Channel | ネイティブレンダー対象 | 注記 |
|---|---|---|
| Discord | Components と component container | 既存の provider-native payload producer 向けに旧式の channelData.discord.components を保持しますが、新しい共有送信では presentation を使うべきです。 |
| Slack | Block Kit | 既存の provider-native payload producer 向けに旧式の channelData.slack.blocks を保持しますが、新しい共有送信では presentation を使うべきです。 |
| Telegram | テキスト + inline keyboard | ボタン/セレクトは、ターゲットサーフェスに inline button capability が必要です。なければテキストフォールバックが使われます。 |
| Mattermost | テキスト + interactive props | 他のブロックはテキストに劣化します。 |
| Microsoft Teams | Adaptive Cards | 両方が提供された場合、プレーンな message テキストもカードと一緒に含まれます。 |
| Feishu | Interactive cards | カードヘッダーは title を使えます。本文ではそのタイトルの重複を避けます。 |
| Plain channels | テキストフォールバック | レンダラーのないチャンネルでも読みやすい出力が得られます。 |
Presentation と InteractiveReply
InteractiveReply は、承認および interaction
helper で使われる古い内部サブセットです。サポートするもの:
- text
- buttons
- selects
MessagePresentation は正規の共有送信契約です。これにより次が追加されます。
- title
- tone
- context
- divider
- URL のみボタン
ReplyPayload.deliveryを通じた汎用配信メタデータ
openclaw/plugin-sdk/interactive-runtime の helper を使ってください。
MessagePresentation を直接受け取るか生成すべきです。
Delivery pin
pin は presentation ではなく配信動作です。channelData.telegram.pin のような
provider-native フィールドではなく delivery.pin を使ってください。
意味論:
pin: trueは、最初に正常配信されたメッセージを pin します。pin.notifyのデフォルトはfalseです。pin.requiredのデフォルトはfalseです。- 任意の pin 失敗は劣化し、送信済みメッセージはそのまま残ります。
- 必須 pin 失敗は配信失敗になります。
- chunk 化されたメッセージでは、tail chunk ではなく最初に配信された chunk を pin します。
pin, unpin, pins message action は、provider がそれらの操作をサポートする既存メッセージ用に引き続き存在します。
Plugin 作成者チェックリスト
- チャンネルがセマンティックプレゼンテーションをレンダリングできる、または安全に劣化できる場合は、
describeMessageTool(...)からpresentationを宣言する。 - ランタイム outbound adapter に
presentationCapabilitiesを追加する。 renderPresentationは control-plane Plugin setup コードではなく、ランタイムコード内に実装する。- ネイティブ UI ライブラリを hot setup/catalog パスに入れない。
- プラットフォーム制限をレンダラーとテスト内で保持する。
- 未対応のボタン、セレクト、URL ボタン、title/text
重複、および
messageとpresentationの混在送信に対するフォールバックテストを追加する。 - provider が送信済みメッセージ id を pin できる場合にのみ、
deliveryCapabilities.pinとpinDeliveredMessageにより配信 pin サポートを追加する。 - 新しい provider-native card/block/component/button フィールドを、 共有 message action schema 経由で公開しない。