タスク モジュールの送信アクションに応答する
重要
このセクションのコード サンプルは、v4.6 以降のバージョンの Bot Framework SDK に基づいています。 以前のバージョンのドキュメントをお探しの場合は、ドキュメントの Resources フォルダーにある メッセージ拡張機能 - v3 SDK セクションを参照してください。
このドキュメントでは、ユーザーのタスク モジュール送信アクションなどのアクション コマンドに対するアプリの応答について説明します。
ユーザーがタスク モジュールを送信すると、Web サービスはコマンド ID とパラメーター値を含む composeExtensions/submitAction
呼び出しメッセージを受信します。 アプリには、呼び出しに応答する 5 秒があります。
対応には、以下のオプションがあります。
- 応答なし: 送信アクションを使用して、外部システムでプロセスをトリガーし、ユーザーにはフィードバックを提供しません。 これは、実行時間の長いプロセスに役立ち、フィードバックを代替的に提供する場合に便利です。 たとえば、プロアクティブ メッセージを使用してフィードバックを送信できます。
- 別のタスク モジュール: 複数のステップがある操作の一部として、追加のタスク モジュールで応答します。
- カードによる応答: ユーザーが操作したり、メッセージに挿入したりできるカードで応答できます。
- ボットからのアダプティブ カード: アダプティブ カードを会話に直接挿入します。
- ユーザーに認証を要求します。
- 追加の構成をユーザーに要求します。
アプリが 5 秒以内に応答しない場合、Teams クライアントは要求を 2 回再試行してから、 アプリに到達できませんというエラー メッセージを送信します。 タイムアウト後にボットが応答した場合、応答は無視されます。
注:
- ボットが呼び出し要求に応答した後、アプリは実行時間の長いアクションを延期する必要があります。 実行時間の長いアクションの結果は、メッセージとして配信できます。
- アプリには、呼び出しメッセージに応答する 5 秒があります。
認証または構成の場合、ユーザーがプロセスを完了すると、元の呼び出しが Web サービスに再送信されます。 次の表は、メッセージ拡張機能の呼び出し場所 commandContext
に基づいて、使用可能な応答の種類を示しています。
応答の種類 | 作成 | コマンド バー | メッセージ |
---|---|---|---|
カードの応答 | ✔️ | ✔️ | ✔️ |
別のタスク モジュール | ✔️ | ✔️ | ✔️ |
アダプティブ カードを使用したボット | ✔️ | ❌ | ✔️ |
応答なし | ✔️ | ✔️ | ✔️ |
注:
- [Action.Submit through ME card] を選択すると、composeExtensions という名前の呼び出しアクティビティが送信されます。値は通常のペイロードと等しくなります。
- 会話を通して Action.Submit を選択すると、値は通常のペイロードと等しくなる onCardButtonClicked という名前のメッセージ アクティビティを受け取ります。
アプリに会話ボットが含まれている場合は、会話にボットをインストールし、タスク モジュールを読み込みます。 ボットは、タスク モジュールの追加のコンテキストを取得するのに役立ちます。 会話型ボットをインストールするには、「会話型ボットのインストールを要求する」を参照してください。
submitAction 呼び出しイベント
呼び出しメッセージを受信する例を次に示します。
protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionSubmitActionAsync(
ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken) {
//code to handle the submit action
}
メッセージ作成領域にカードを挿入して応答する
composeExtensions/submitAction
の要求に応答する最も一般的な方法は、作成メッセージ領域にカードを挿入することです。 ユーザーは、カードを会話に送信します。 カードの使用に関する詳細については、「カードとカード アクション」を参照してください。
protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionSubmitActionAsync(
ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
var response = new MessagingExtensionActionResponse
{
ComposeExtension = new MessagingExtensionResult
{
AttachmentLayout = "list",
Type = "result",
},
};
var createCardData = ((JObject)action.Data).ToObject<CreateCardData>();
var card = new HeroCard
{
Title = createCardData.Title,
Subtitle = createCardData.Subtitle,
Text = createCardData.Text,
};
var attachments = new List<MessagingExtensionAttachment>();
attachments.Add(new MessagingExtensionAttachment
{
Content = card,
ContentType = HeroCard.ContentType,
Preview = card.ToAttachment(),
});
response.ComposeExtension.Attachments = attachments;
return response;
}
別のタスク モジュールで応答する
追加のタスク モジュールを使用して submitAction
イベントに応答するように選択できます。 これは、次のシナリオで役立ちます。
- 大量の情報を収集する。
- ユーザー入力に基づいて情報コレクションを動的に変更する。
- ユーザーが送信した情報を検証し、問題が発生した場合は、エラー メッセージでフォームを再送信します。
対応方法は、 としての最初のfetchTask
イベントへの対応と同じです。 Bot Framework SDK を使用している場合は、両方の送信アクションに対して同じイベント トリガーが発生します。 これを機能させるには、正しい応答を決定するロジックを追加する必要があります。
アダプティブ カードを使用したボットの応答
注:
アダプティブ カードを使用してボットの応答を取得する前提条件は、bot
オブジェクトをアプリ マニフェストに追加し、ボットに必要なスコープを定義する必要があるということです。 ボットのメッセージ拡張機能と同じ ID を使用します。
また、ボットを使用してアダプティブ カードを含むメッセージをチャネルに挿入することで、submitAction
に応答することもできます。 ユーザーは、メッセージを送信する前にプレビューできます。 これは、アダプティブ カード応答を作成する前にユーザーから情報を収集するシナリオや、他のユーザーが応答した後にカードを更新する場合に便利です。
次のシナリオは、アプリ Polly がチャネル会話に構成手順を含めずに投票を構成する方法を示しています。
投票を構成するには、以下の操作を行います。
ユーザーは、タスク モジュールを呼び出すメッセージ拡張機能を選択します。
ユーザーは、タスク モジュールを使用して投票を構成します。
タスク モジュールを送信した後、アプリは提供された情報を使用してアダプティブ カードとして投票を構築し、クライアントに
botMessagePreview
応答として送信します。その後、ユーザーは、ボットがチャネルに挿入する前に、アダプティブ カード メッセージをプレビューできます。 アプリがチャネルのメンバーでない場合は、 を選択
Send
して追加します。注:
- ユーザーは
Edit
にメッセージを選択して、元のタスク モジュールに返すこともできます。 - アダプティブ カードとの対話では、メッセージの送信前に変更されます。
- ユーザーは
ユーザーが を選択
Send
すると、ボットはチャネルにメッセージを投稿します。
最初の送信アクションに応答する
タスク モジュールは、ボットがチャネルに送信するカードのプレビューを使用して、最初の composeExtensions/submitAction
メッセージに応答する必要があります。 ユーザーは送信前にカードを確認し、ボットが既にインストールされている場合は会話にボットをインストールしてみてください。
protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionSubmitActionAsync(
ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
dynamic createCardData = ((JObject) action.Data).ToObject(typeof(JObject));
var response = new MessagingExtensionActionResponse
{
ComposeExtension = new MessagingExtensionResult
{
Type = "botMessagePreview",
ActivityPreview = MessageFactory.Attachment(new Attachment
{
Content = new AdaptiveCard("1.0")
{
Body = new List<AdaptiveElement>()
{
new AdaptiveTextBlock() { Text = "FormField1 value was:", Size = AdaptiveTextSize.Large },
new AdaptiveTextBlock() { Text = Data["FormField1"] as string }
},
Height = AdaptiveHeight.Auto,
Actions = new List<AdaptiveAction>()
{
new AdaptiveSubmitAction
{
Type = AdaptiveSubmitAction.TypeName,
Title = "Submit",
Data = new JObject { { "submitLocation", "messagingExtensionFetchTask" } },
},
}
},
ContentType = AdaptiveCard.ContentType
}) as Activity
}
};
return response;
}
botMessagePreview によるイベントの送信と編集
メッセージ拡張機能は、composeExtensions/submitAction
呼び出しの 2 つの新しい種類である value.botMessagePreviewAction = "send"
と value.botMessagePreviewAction = "edit"
に応答する必要があります。
protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionBotMessagePreviewEditAsync(
ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
//handle the event
}
protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionBotMessagePreviewSendAsync(
ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
//handle the event
}
botMessagePreview の編集に応答する
[編集] を選択してユーザーが送信する前にカードを編集した場合は、value.botMessagePreviewAction = edit
を含む composeExtensions/submitAction
の呼び出しを受信します。 対話を開始した最初の composeExtensions/fetchTask
呼び出しに応答して、送信したタスク モジュールを返すことで応答します。 ユーザーは、元の情報を再入力してプロセスを開始できます。 使用可能な情報を使用して、ユーザーが最初からすべての情報を入力する必要がないようにタスク モジュールを更新します。
最初の fetchTask
イベントへの応答に関する詳細については、「最初の fetchTask
イベントに応答する」を参照してください。
botMessagePreview 送信に応答する
ユーザーが [送信] を選択すると、value.botMessagePreviewAction = send
を含む composeExtensions/submitAction
の呼び出しを受信します。 Web サービスは、アダプティブ カードを使用したプロアクティブ メッセージを作成して会話に送信し、呼び出しに返信する必要があります。
protected override async Task<MessagingExtensionActionResponse> OnTeamsMessagingExtensionBotMessagePreviewSendAsync(
ITurnContext<IInvokeActivity> turnContext, MessagingExtensionAction action, CancellationToken cancellationToken)
{
var activityPreview = action.BotActivityPreview[0];
var attachmentContent = activityPreview.Attachments[0].Content;
var previewedCard = JsonConvert.DeserializeObject<AdaptiveCard>(attachmentContent.ToString(),
new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
previewedCard.Version = "1.0";
var responseActivity = Activity.CreateMessageActivity();
Attachment attachment = new Attachment()
{
ContentType = AdaptiveCard.ContentType,
Content = previewedCard
};
responseActivity.Attachments.Add(attachment);
// Attribute the message to the user on whose behalf the bot is posting
responseActivity.ChannelData = new {
OnBehalfOf = new []
{
new
{
ItemId = 0,
MentionType = "person",
Mri = turnContext.Activity.From.Id,
DisplayName = turnContext.Activity.From.Name
}
}
};
await turnContext.SendActivityAsync(responseActivity);
return new MessagingExtensionActionResponse();
}
ボット メッセージのユーザー属性
ボットがユーザーに代わってメッセージを送信するシナリオでは、メッセージをそのユーザーに帰属させることでエンゲージメントを高め、より自然な対話フローを示すのに役立ちます。 この機能を使用すると、ボットから送信されたメッセージを、送信先のユーザーに属性付けできます。
次の画像では、画像の左側は、ユーザー属性を持たないボットによって送信されたカード メッセージであり、画像の右側は、ユーザー属性を持つボットによって送信されるカードです。
チームでユーザー属性を使用するには、Teams に送信される Activity
ペイロードで ChannelData
に OnBehalfOf
メンション エンティティを追加する必要があります。
OnBehalfOf = new []
{
new
{
ItemId = 0,
MentionType = "person",
Mri = turnContext.Activity.From.Id,
DisplayName = turnContext.Activity.From.Name
}
}
エンティティ スキーマの OnBehalfOf
詳細
次のセクションは、OnBehalfOf
配列内のエンティティの説明です。
フィールド | 種類 | 説明 |
---|---|---|
itemId |
整数 | アイテムの識別について説明します。 その値は 0 にする必要があります。 |
mentionType |
String | "ユーザー" のメンションについて説明します。 |
mri |
String | メッセージが送信されたユーザーのメッセージ リソース識別子 (MRI)。 メッセージの送信者名は、"ボット名>を使用した<ユーザー>"< として表示されます。 |
displayName |
String | ユーザーの名前。 ケース名の解決が利用できない場合にフォールバックとして使用されます。 |
コード サンプル
サンプルの名前 | 説明 | .NET | Node.js | マニフェスト |
---|---|---|---|---|
Teams メッセージ拡張機能アクション | このサンプルでは、アクション コマンドを定義し、タスク モジュールを作成し、タスク モジュールの送信アクションに応答する方法を示します。 | 表示 | 表示 | 表示 |
メッセージ拡張機能アクション プレビュー | このサンプルでは、Bot Framework v4 を使用してメッセージング拡張機能でアクション プレビューを使用する方法を示します。 | 表示 | 表示 | 表示 |
Teams メッセージ拡張機能検索 | このサンプルでは、検索ベースのメッセージ拡張機能を構築する方法を示します。 これは、ナッゲット パッケージを検索し、検索ベースのメッセージング拡張機能で結果を表示します。 | 表示 | 表示 | 表示 |