components、Slack
blocks、Telegram buttons、Teams card、Feishu card のような新しいプロバイダーネイティブフィールドを追加しないでください。
それらはチャンネルプラグインが所有するレンダラー出力です。
契約
プラグイン作者は公開契約を次からインポートします。action.type: "command"はコアのコマンド パスを通じてネイティブのスラッシュコマンドを実行します。組み込みコマンドボタンとメニューにはこれを使用します。action.type: "callback"はチャンネルの インタラクションパスを通じて不透明なプラグインデータを運びます。チャンネルプラグインはコールバックデータをスラッシュ コマンドとして再解釈してはいけません。valueはレガシーの不透明なコールバック値です。新しいコントロールではactionを使用し、チャンネルプラグインがテキストから推測せずにコマンドとコールバックをマップできるようにしてください。urlはリンクボタンです。valueなしでも存在できます。webAppはチャンネルネイティブの Web アプリボタンを記述します。Telegram はこれをweb_appとしてレンダリングし、プライベートチャットでのみサポートします。互換性のため、緩い JSON ペイロードではweb_appも引き続き 受け入れられますが、TypeScript の生成側はwebAppを使用してください。labelは必須で、テキストフォールバックでも使用されます。styleは助言的なものです。レンダラーは未対応のスタイルを安全な デフォルトにマップし、送信を失敗させないでください。priorityは任意です。チャンネルがアクション制限を告知しており、コントロールを 削除する必要がある場合、コアは優先度の高いボタンを先に保持し、同じ優先度のボタン間では 元の順序を維持します。すべてのコントロールが収まる場合は、作者が指定した 順序が維持されます。disabledは任意です。チャンネルはsupportsDisabledで明示的に対応する必要があります。そうでない場合、 コアは無効化されたコントロールを非インタラクティブなフォールバックテキストに劣化させます。 無効化されたボタンは、commandアクションを持っている場合でも、 フォールバックテキストでは常にラベルのみとしてレンダリングされます。reusableは任意です。再利用可能なネイティブコールバックをサポートするチャンネルは、 成功したインタラクションの後もアクションを利用可能なままにできます。更新、確認、詳細表示のような 反復可能または冪等なアクションに使用し、 通常の一回限りの承認や破壊的アクションでは未設定のままにします。
options[].actionはボタンのactionと同じコマンド/コールバックの意味を持ちます。options[].valueはレガシーの選択済みアプリケーション値です。placeholderは助言的なもので、ネイティブの 選択サポートがないチャンネルでは無視されることがあります。- チャンネルが選択をサポートしない場合、フォールバックテキストはラベルを一覧表示します。
生成側の例
シンプルなカード:レンダラー契約
チャンネルプラグインは送信アダプター上でレンダリングサポートを宣言します。limits は、コアがレンダラーを呼び出す前に適応できる汎用エンベロープを記述します。
コアのレンダリングフロー
ReplyPayload またはメッセージアクションに presentation が含まれる場合、コアは次を行います。
- プレゼンテーションペイロードを正規化します。
- 対象チャンネルの送信アダプターを解決します。
presentationCapabilitiesを読み取ります。- アダプターが告知している場合、アクション数、ラベル長、 選択オプション数などの汎用機能制限を適用します。
- アダプターがペイロードをレンダリングできる場合、
renderPresentationを呼び出します。 - アダプターが存在しない、またはレンダリングできない場合、保守的なテキストへフォールバックします。
- 結果のペイロードを通常のチャンネル配信パスで送信します。
- 最初のメッセージ送信が成功した後、
delivery.pinなどの配信メタデータを適用します。
劣化ルール
プレゼンテーションは制限のあるチャンネルでも安全に送信できる必要があります。 フォールバックテキストには次が含まれます。- 最初の行としての
title - 通常の段落としての
textブロック - コンパクトなコンテキスト行としての
contextブロック - 視覚的な区切りとしての
dividerブロック - リンクボタンの URL を含むボタンラベル
- 選択オプションのラベル
ボタン値のフォールバック表示
チャンネルがインタラクティブコントロールをレンダリングできない場合、ボタンと選択の値は プレーンテキストへフォールバックします。フォールバック動作は、 不透明なコールバックデータを非公開に保ちながら使いやすさを維持します。command型アクション はlabel: \command“ としてレンダリングされるため、ユーザーは コマンドをコピーし、チャンネル入力で手動実行できます。callback型アクション とレガシーvalueフィールドは ラベルのみとしてレンダリングされます。不透明なコールバック値はフォールバックテキストに公開されません。url/webAppボタンは、URL がユーザー向けであるため、 ボタンラベルと並んで URL テキストをレンダリングします。- 選択オプション はラベルのみとしてレンダリングされます。基になるオプション値は フォールバックテキストに公開されません。
- インラインボタンが無効な Telegram はテキストフォールバックを送信します。
- 選択サポートのないチャンネルは、選択オプションをテキストとして一覧表示します。
- URL のみのボタンは、ネイティブリンクボタンまたはフォールバック URL 行になります。
- 任意のピン留め失敗は、配信済みメッセージを失敗にしません。
delivery.pin.required: true です。ピン留めが必須として要求され、
チャンネルが送信済みメッセージをピン留めできない場合、配信は失敗を報告します。
プロバイダーマッピング
現在バンドルされているレンダラー:| チャンネル | ネイティブレンダーターゲット | 注記 |
|---|---|---|
| Discord | コンポーネントとコンポーネントコンテナ | 既存のプロバイダーネイティブなペイロード生成元のために従来の channelData.discord.components を保持しますが、新しい共有送信では presentation を使用する必要があります。 |
| Feishu | インタラクティブカード | カードヘッダーでは title を使用できます。本文ではそのタイトルの重複を避けます。 |
| Matrix | テキストフォールバックと構造化イベントフィールド | ボタン/セレクトはサポート対象として通知されますが、現在すべてのブロックはネイティブのインタラクティブウィジェットではなく、com.openclaw.presentation イベントフィールドに入れられた renderMessagePresentationFallbackText 出力としてレンダーされます。 |
| Mattermost | テキストとインタラクティブプロパティ | セレクトと区切り線はサポートされません。これらのブロックはテキストに劣化します。 |
| Microsoft Teams | Adaptive Cards | message のプレーンテキストは、両方が指定された場合にカードと一緒に含まれます。セレクト、スタイル、無効状態はサポートされません。 |
| Slack | Block Kit | 既存のプロバイダーネイティブなペイロード生成元のために従来の channelData.slack.blocks を保持しますが、新しい共有送信では presentation を使用する必要があります。 |
| Telegram | テキストとインラインキーボード | ボタン/セレクトには対象サーフェスのインラインボタン機能が必要です。それ以外の場合はテキストフォールバックが使用されます。 |
| プレーンチャンネル | テキストフォールバック | レンダラーのないチャンネルでも読みやすい出力を受け取ります。 |
Presentation と InteractiveReply
InteractiveReply は、承認とインタラクションヘルパーで使用される古い内部サブセットです。これは次をサポートします。
- テキスト
- ボタン
- セレクト
MessagePresentation は標準の共有送信コントラクトです。これは次を追加します。
- タイトル
- トーン
- コンテキスト
- 区切り線
- URL専用ボタン
ReplyPayload.deliveryを通じた汎用配信メタデータ
openclaw/plugin-sdk/interactive-runtime のヘルパーを使用します。
OC_I18N_900011
新しいコードは MessagePresentation を直接受け入れるか生成する必要があります。既存の interactive ペイロードは presentation の非推奨サブセットです。古い生成元向けのランタイムサポートは維持されます。
知っておく価値のある非推奨ではないヘルパー:
normalizeMessagePresentation(raw)/hasMessagePresentationBlocks(value)は、型付けされていないペイロード(たとえば CLI の--presentationフラグからの JSON)を検証し、MessagePresentationに強制変換します。isMessagePresentationInteractiveBlock(block)はブロックをbuttons|selectユニオンに絞り込みます。resolveMessagePresentationActionValue(action)/resolveMessagePresentationControlValue(control)はactionから有効な コマンド/コールバック値を読み取ります。resolveMessagePresentationControlValueでは従来のvalueフィールドにフォールバックします。
InteractiveReply* 型と変換ヘルパーは SDK で
@deprecated とマークされています。
InteractiveReply,InteractiveReplyBlock,InteractiveReplyButton,InteractiveReplyOption,InteractiveReplySelectBlock, およびInteractiveReplyTextBlocknormalizeInteractiveReply(...)hasInteractiveReplyBlocks(...)interactiveReplyToPresentation(...)presentationToInteractiveReply(...)presentationToInteractiveControlsReply(...)resolveInteractiveTextFallback(...)reduceInteractiveReply(...)
presentationToInteractiveReply(...) と
presentationToInteractiveControlsReply(...) は、従来のチャンネル実装向けのレンダラー橋渡しとして引き続き利用できます。新しい生成元コードはこれらを呼び出すべきではありません。presentation を送信し、コア/チャンネル適応にレンダリングを処理させます。
承認ヘルパーにも presentation 優先の置き換えがあります。
buildApprovalInteractiveReplyFromActionDescriptors(...)の代わりにbuildApprovalPresentationFromActionDescriptors(...)を使用しますbuildApprovalInteractiveReply(...)の代わりにbuildApprovalPresentation(...)を使用しますbuildExecApprovalInteractiveReply(...)の代わりにbuildExecApprovalPresentation(...)を使用します
renderMessagePresentationFallbackText(...) は、区切り線のみの
presentation など、テキストフォールバックを持たない presentation ブロックに対して空文字列を返します。空でない送信本文を必要とするトランスポートは、デフォルトのフォールバックコントラクトを変更せずに最小限の本文を選択するため、emptyFallback を渡せます。
配信ピン留め
ピン留めは presentation ではなく配信動作です。channelData.telegram.pin のようなプロバイダーネイティブフィールドの代わりに delivery.pin を使用します。
セマンティクス:
pin: trueは、正常に配信された最初のメッセージをピン留めします。pin.notifyのデフォルトはfalseです。pin.requiredのデフォルトはfalseです。- 任意のピン留め失敗は劣化し、送信済みメッセージをそのまま残します。
- 必須のピン留め失敗は配信を失敗させます。
- 分割されたメッセージは末尾のチャンクではなく、最初に配信されたチャンクをピン留めします。
pin、unpin、および pins メッセージアクションは、プロバイダーがそれらの操作をサポートする既存メッセージ向けに引き続き存在します。
Plugin 作者チェックリスト
- チャンネルがセマンティック presentation をレンダーまたは安全に劣化できる場合、
describeMessageTool(...)からpresentationを宣言します。 - ランタイム送信アダプターに
presentationCapabilitiesを追加します。 - コントロールプレーンの Plugin セットアップコードではなく、ランタイムコードで
renderPresentationを実装します。 - ネイティブ UI ライブラリをホットなセットアップ/カタログパスから外します。
- 既知の場合は、
presentationCapabilities.limitsに汎用機能制限を宣言します。 - レンダラーとテストで最終的なプラットフォーム制限を保持します。
- サポートされていないボタン、セレクト、URL ボタン、タイトル/テキストの重複、および
messageとpresentationが混在する送信に対するフォールバックテストを追加します。 - プロバイダーが送信済みメッセージ ID をピン留めできる場合にのみ、
deliveryCapabilities.pinとpinDeliveredMessageを通じて配信ピン留めサポートを追加します。 - 共有メッセージアクションスキーマを通じて、新しいプロバイダーネイティブなカード/ブロック/コンポーネント/ボタンフィールドを公開しないでください。