プロアクティブ メッセージとは、ユーザーからの要求に応答しないエージェントによって送信されたメッセージです。 このメッセージには、次のような内容を含めることができます。
- ウェルカム メッセージ
- 通知
- 予定されたメッセージ
ユーザー、グループ チャット、またはチームにプロアクティブなメッセージを送信するには、エージェントがメッセージを送信するために必要なアクセス権を持っている必要があります。 グループ チャットまたはチームの場合は、エージェントを含むアプリをその場所に最初にインストールする必要があります。
必要に応じて、チームで Microsoft Graph を使用してアプリを事前にインストールすることも、カスタム アプリ ポリシーを使用してチームと organization のユーザー向けにアプリをインストールすることもできます。 特定のシナリオでは、Graph を使用してアプリをプロアクティブにインストールする必要があります。 ユーザーがプロアクティブ メッセージを受信するには、そのユーザー用にアプリをインストールするか、アプリがインストールされているチームの一員にユーザーを参加させます。
プロアクティブ メッセージの送信は、通常のメッセージの送信とは異なります。 プロアクティブ メッセージはアプリ経由で送信されます。Send() をアクティビティ ハンドラーの外部で使用します。 アプリを呼び出すと、SDK によって自動的に会話が作成されます。Send() を使用します。
conversationIdが必要です。SDK はサービス URL を自動的に解決します。 たとえば、新しい 1 対 1 のチャットや、チャネルでの新しい会話スレッドなどです。 プロアクティブ メッセージングでは、新しいグループ チャットやチーム内の新しいチャネルを作成することはできません。
プロアクティブ メッセージを送信するには、次の手順に従います。
- 必要に応じて、Microsoft Entra ユーザー ID、ユーザー ID、チーム ID、またはチャネル ID を取得します。
- 必要に応じて会話を作成します。
- 会話ID を取得します。
- メッセージを送信します。
サンプル セクションのコード スニペットは、1 対 1 の会話を作成するためのものです。 1 対 1 の会話とグループまたはチャネル メッセージの両方のサンプルへのリンクについては、「 コード サンプル」を参照してください。 プロアクティブ メッセージを効果的に使用するには、「 プロアクティブ メッセージングのベスト プラクティス」を参照してください。
Microsoft Entra ユーザー ID、ユーザー ID、チーム ID、またはチャネル ID を取得する
ユーザーまたはチャネル内の会話スレッドとの新しい会話を作成できます。その場合は、正しい ID が必要です。 この ID は、次のいずれかの方法で取得できます。
- アプリが特定のコンテキストにインストールされると、
onMembersAddedアクティビティが発生します。 - アプリがインストールされているコンテキストに新しいユーザーが追加されると、
onMembersAddedアクティビティが発生します。 - エージェントが受信するすべてのイベントには、エージェント コンテキスト (アクティビティ コンテキスト) から取得できる必要な情報が含まれています。
- アプリがインストールされているチームでチャネルのリストを取得することができます。
- アプリがインストールされているチームでメンバー リストを取得することができます。
情報の取得方法に関係なく、 tenantId を保存してから、 userIdまたは channelId を保存して、新しい会話を作成します。
teamId を使って、チームの一般チャネルや既定のチャネルに新しい会話スレッドを作成することもできます。 チャネルにプロアクティブ メッセージを送信する前に、エージェントがチームにインストールされていることを確認してください。
aadObjectIdはユーザーに固有のものであり、個人用チャットで新しい会話を作成するために Graph API を使用して取得できます。 プロアクティブ メッセージを送信する前に、エージェントが個人用スコープにインストールされていることを確認してください。aadObjectIdを使用してプロアクティブ メッセージを送信するときにエージェントが個人用スコープにインストールされていない場合、エージェントはForbiddenOperationExceptionメッセージで403エラーを返します。userIdは、エージェント ID および特定のユーザーに固有です。 エージェント間でuserIdを再利用することはできません。channelIdはグローバルです。
ユーザーまたはチャネル情報を取得した後で、会話を作成します。
注:
aadObjectId を使用したプロアクティブ メッセージの送信は、個人用スコープでのみサポートされます。
会話を作成する
会話が存在しない場合、または conversationIdがわからない場合は、会話を作成できます。 会話を 1 回だけ作成し、将来のプロアクティブ メッセージのために結果の conversationId を保存します。
会話を作成するには、 aadObjectId または userId、 tenantId、および serviceUrlが必要です。
注:
会話を作成するには、Id パラメーターに aadObjetId 値を渡します。
serviceUrlには、フローをトリガーする受信アクティビティの値、またはグローバル サービス URL のいずれかを使用します。 プロアクティブなシナリオをトリガーする受信アクティビティから serviceUrl を使用できない場合は、次のグローバル URL エンドポイントを使用します。
- パブリック:
https://smba.trafficmanager.net/teams/ - GCC:
https://smba.infra.gcc.teams.microsoft.com/teams - GCC High:
https://smba.infra.gov.teams.microsoft.us/teams - DoD:
https://smba.infra.dod.teams.microsoft.us/teams
警告
これらの URL は、プロアクティブ メッセージ専用です。 ハードコーディングは避けてください。 代わりに、受信アクティビティまたは会話の参照から
serviceUrlを使用します。 利用できない場合は、リージョンとクラウドに基づくグローバル URL を使用します。メッセージへの返信には、受信要求の
serviceURLを使用します。 詳細については、 Activity.ServiceUrl プロパティを参照してください。
アプリが初めてインストールされたときに会話を取得できます。 会話が作成されたら、 会話 ID を取得します。
conversationId は、会話更新イベントで使用できます。
会話 ID は、マルチテナント環境でも、特定のチャネル内の各エージェントに一意です。 この ID により、エージェントのメッセージが適切なチャネルに送信され、同じ組織内または異なる組織間で他のエージェントまたはチャネルに中断されません。
conversationIdがない場合は、Graph を使用してアプリを事前にインストールし、conversationIdを取得できます。
会話 ID を取得する
メッセージを送信するには、conversationReference オブジェクトまたは conversationId か tenantId のいずれかを使用します。 この ID は、会話を作成するか、そのコンテキストから送信されたアクティビティから保存することで取得することができます。 参照用にこの ID を格納します。
適切なアドレス情報を取得したら、メッセージを送信できます。
メッセージを送信する
正しいアドレス情報を取得したので、メッセージを送信することができます。 SDK を使用している場合は、 app.Send() メソッドと conversationId を使用して直接 API 呼び出しを行う必要があります。 メッセージを送信するには、 conversationParametersを設定します。
サンプルのセクションを参照するか、コード サンプルのセクションに記載されているサンプルのいずれかを使用します。
チャネル内のスレッドへの返信としてメッセージを積極的に送信するには、会話 ID とスレッドのルート メッセージの ID の両方で app.Reply() を使用します。
注:
Teams では、メールまたはユーザー プリンシパル名 (UPN) を使用したプロアクティブ メッセージの送信はサポートされていません。
プロアクティブ メッセージを送信したので、ユーザーとエージェント間の情報交換を改善するために、プロアクティブ メッセージを送信する際にこれらのベスト プラクティスに従う必要があります。
エージェントをブロック、ミュート、またはアンインストールしたユーザーを理解する
開発者は、organization内のどのユーザーがエージェントをブロック、ミュート、またはアンインストールしたかを把握するためのレポートを作成できます。 この情報は、organization の管理者が組織全体にメッセージをブロードキャストしたり、アプリの使用を促進したりするのに役立つ可能性があります。
Teams を使用すると、ユーザーがエージェントをブロックまたはアンインストールしたかどうかを確認するために、エージェントにプロアクティブ メッセージを送信できます。 エージェントがブロックまたはアンインストールされている場合、Teams はsubCode: MessageWritesBlocked付きの403応答コードを返します。 この応答は、エージェントによって送信されたメッセージがユーザーに配信されていないことを示します。
応答コードはユーザーごとに送信され、ユーザーの ID が含まれます。 各ユーザーの応答コードとその ID をコンパイルして、エージェントをブロックしたすべてのユーザーのレポートを作成できます。
次のコード サンプルは、403 応答コードの例です。
HTTP/1.1 403 Forbidden
Cache-Control: no-store, must-revalidate, no-cache
Pragma: no-cache
Content-Length: 196
Content-Type: application/json; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
Strict-Transport-Security: max-age=31536000; includeSubDomains
MS-CV: NXZpLk030UGsuHjPdwyhLw.5.0
ContextId: tcid=0,server=msgapi-canary-eus2-0,cv=NXZpLk030UGsuHjPdwyhLw.5.0
Date: Tue, 29 Mar 2022 17:34:33 GMT
{"errorCode":209,"message":"{\n \"subCode\": \"MessageWritesBlocked\",\n \"details\": \"Thread is blocked from message writes.\",\n \"errorCode\": null,\n \"errorSubCode\": null\n}"}
プロアクティブ メッセージングのベスト プラクティス
ユーザーにプロアクティブ メッセージを送信するのは、ユーザーと効果的なコミュニケーションを行うのに役立ちます。 ただし、ユーザーの観点からは、メッセージはプロンプトなしで表示されます。 ウェルカム メッセージがある場合は、アプリとの最初の対話を示します。 この機能を使用し、このメッセージの目的を理解するためにユーザーに完全な情報を提供することが重要です。
ウェルカム メッセージ
プロアクティブ メッセージングを使用してユーザーにウェルカム メッセージを送信する場合、ユーザーがメッセージを受信する理由のコンテキストはありません。 また、これはユーザーとアプリの最初の対話です。 第一印象を良くするチャンスです。 優れたユーザー エクスペリエンスは、アプリのより良い導入を保証します。 ウェルカム メッセージが不十分な場合、ユーザーはアプリをブロックする可能性があります。 明確なウェルカム メッセージを記述し、目的の効果が得られない場合は、ウェルカム メッセージを繰り返します。
適切なウェルカム メッセージには、次の情報を含めることができます。
メッセージの理由 - メッセージを受信する理由がユーザーにとって明確である必要があります。 エージェントがチャネルにインストールされ、すべてのユーザーにウェルカム メッセージを送信した場合は、エージェントがインストールされたチャネルとインストール者を知らせます。
オファー - ユーザーは、アプリで何ができるか、どのような価値をもたらすことができるかを特定できなければなりません。
次の手順 - ユーザーは次の手順を理解する必要があります。 たとえば、ユーザーを招待して、コマンドを試したり、アプリを操作したりします。
通知メッセージ
プロアクティブ メッセージングを使用して通知を送信するには、通知に基づいて一般的なアクションを実行するための明確なパスがユーザーにあることを確認してください。 タブ アプリでユーザーのアクションが必要な場合は、エージェントの代わりにアクティビティ フィード通知を使用します。 ユーザーが通知を受け取った理由を明確に理解していることを確認してください。 適切な通知メッセージには、次のものが含まれます。
何が起こったのでしょうか? 何が原因で通知が発生したのかを明確に示しています。
結果はどうでしたか? 通知を受け取るためにどのアイテムが更新されているかを明確にする必要があります。
誰が/何がトリガーになったのですか? 通知が送信される原因となったアクションを起こしたユーザーまたは対象。
ユーザーが対応できることは何ですか? ユーザーが通知に基づいてアクションを取ることを容易にします。
ユーザーはどのようにオプトアウトできますか? ユーザーがその他の通知をオプトアウトするためのパスを提供する必要があります。
組織などの大規模なユーザー グループにメッセージを送信するには、 Graph を使用してアプリをプロアクティブにインストールします。
通知のみのエージェントによって送信されたプロアクティブ メッセージを更新または削除するには:
プロアクティブ メッセージを送信するときに、メッセージ ID または会話参照を保存して、送信されたメッセージを追跡します。
元のメッセージを更新または削除するには、
context.Api.Conversations.Activities.UpdateAsync(conversationId, activityId, updatedActivity)またはcontext.Api.Conversations.Activities.DeleteAsync(conversationId, activityId)メソッドを使用します。
予定されたメッセージ
プロアクティブ メッセージングを使用してスケジュールされたメッセージをユーザーに送信する場合は、タイム ゾーンがユーザーのタイム ゾーンに更新されていることを確認してください。 これにより、メッセージが適切な時間にユーザーに確実に配信されます。 スケジュール メッセージには、次のものが含まれます。
ユーザがメッセージを受信する理由。 ユーザーがメッセージを受信する理由を簡単に理解できるようにします。
ユーザーは次に何ができますか? ユーザーは、メッセージの内容に基づいて必要なアクションを実行できます。
Graph を使用してアプリをプロアクティブにインストール
Graph API を使用して、ユーザー向けにアプリを事前にインストールできます。 インストール時にアプリが受け取る conversationUpdate イベントから必要な値をキャッシュします。
組織のアプリ カタログまたは Microsoft Teams ストアにあるアプリのみをインストールすることができます。
「Graph ドキュメントのユーザー 用アプリをインストールする 」および「 Graph を使用した Teams でのプロアクティブ エージェントのインストールとメッセージング」を参照してください。
例
REST API を使用して新しい会話を作成する前に、認証を行い、 ベアラー トークン を持っていることを確認してください。 以下は、さまざまなコンテキストで会話を作成するための REST API です。
会話内のメッセージを更新するための REST API: 会話内の既存のアクティビティを更新するには、要求エンドポイントに conversationId と activityId を含めます。 このシナリオを完了するには、元の POST 呼び出しによって返されたアクティビティ ID をキャッシュする必要があります。
PUT {Service URL of your agent}/v3/conversations/{conversationId}/activities/{activityId}{ "type": "message", "text": "This message has been updated" }会話内の既存のアクティビティを更新するには、リクエスト エンドポイントに
conversationIdとactivityIdを含めます。 このシナリオを完了するには、元の POST 呼び出しによって返されたactivity IDをキャッシュする必要があります。 呼び出しに成功した場合、API は以下の応答オブジェクトを返します。{ "id": "{{activityID}}" }
サンプル
次のコードは、Teams SDK (Teams AI ライブラリ) を使用してプロアクティブ メッセージを送信する方法を示しています。
// Save the conversation ID and schedule a proactive reminder on install
teams.OnInstall(async (context, cancellationToken) =>
{
context.Storage.Set(context.Activity.From.AadObjectId!, context.Activity.Conversation.Id);
await context.Send("Hi! I am going to remind you to say something to me soon!", cancellationToken);
notificationQueue.AddReminder(context.Activity.From.AadObjectId!, Notifications.SendProactive, 10_000);
});
// Send proactive message using stored conversation ID
public static class Notifications
{
public static async Task SendProactive(string userId)
{
var conversationId = (string?)storage.Get(userId);
if (conversationId is null) return;
await app.Send(conversationId, "Hey! It's been a while. How are you?");
}
}
コード サンプル
次の表に、Teams SDK を使用して基本的な会話フローとプロアクティブ メッセージングを Teams アプリケーションに組み込むコード サンプルを示します。
| サンプルの名前 | 説明 | .NET | Node.js | Python | マニフェスト |
|---|---|---|---|---|---|
| Teams での会話の基本 | このサンプル アプリでは、Teams SDK v2 for personal および teams スコープで使用可能なさまざまなエージェント会話イベントを使用する方法を示します。 | 表示 | 表示 | 表示 | 表示 |
| ボット プロアクティブ メッセージ | このサンプルでは、インストール アクティビティから会話 ID をキャプチャして保存し、それを使用して、即時および遅延のプロアクティブ メッセージをユーザーに送信する方法を示します。 | 表示 | 表示 | 表示 | 該当なし |
次の手順
関連項目
Platform Docs