ボットの対話は、テキスト、音声、画像、またはビデオを使用できます。 ユーザーの入力を処理して要求を理解し、関連するタスクを実行するために入力を評価します。 ボットは、情報を要求したり、サービスへのアクセスを有効にしたりして、ユーザーに応答することができます。
ボットスコープ
Microsoft Teams のボットは、1 対 1 の会話、グループ チャット、チーム内のチャネルで扱うことができます。 各スコープに、会話ボット向けの機能と条件があります。
| チャネル | グループ チャット | 1 対 1 のチャット |
|---|---|---|
| 大規模なリーチ | 減少したメンバー | 従来の方法 |
| 簡潔な個々のやり取り | @mention ボットへ | Q&A ボット |
| @mention ボットへ | チャネルと同様 | ジョークを言ったり、メモを取ったりするボット |
チャネル
チャネルには、最大 2000 人まで、複数のユーザー間のスレッド化された会話が含まれています。 これにより、ボットが大規模になる可能性がでてきますが、それぞれの対話を簡潔にする必要があります。 従来のマルチターン操作は機能しません。 代わりに、対話型のカードまたはダイアログ (TeamsJS v1.x ではタスク モジュールと呼ばれます) を使用するか、会話を 1 対 1 の会話に移動して多くの情報を収集する必要があります。 ボットは、 @mentionedされているメッセージにのみアクセスできます。 Microsoft Graph および組織レベルのアクセス許可を使用して会話から追加のメッセージを取得できます。
ボットは、次の場合にチャネルで適切に機能します。
- ユーザーが追加情報を取得するための対話型カードを提供する通知。
- 投票やアンケート調査などのフィードバック シナリオ。
- 単一の要求または応答サイクルは対話を解決し、結果は複数のメンバーで会話をする場合に役立ちます。
- 素晴らしい猫の画像を取得したり、勝者をランダムに選んだりできる、交流または娯楽を目的としたボット。
グループ チャット
グループ チャットは、3 人以上のユーザー同士で行われる非スレッドの会話です。 チャネルよりもメンバーは少なく、一時的な会話が多いのが特徴です。 チャネルと同様に、ボットは直接 @mentioned されるメッセージにのみアクセスできます。
チャネルで優れた機能を持つボットは、グループ チャットでもより適切に機能します。
1 対 1 のチャット
1 対 1 のチャットは、会話ボットがユーザーとやり取りする従来の方法です。 1 対 1 の会話ボットの例を次に示します。
- Q&A ボット
- 他のシステムでワークフローを開始するボット。
- ジョークを伝えるボット。
- メモを取るボット。 1 対 1 のチャットボットを作成する前に、会話ベースのインターフェイスが機能を提示する最善の方法であるかどうかを検討してください。
アクティビティ ハンドラーとボット ロジック
ニーズを満たすボット アプリを作成するには、アクティビティ ハンドラーとボット ロジックMicrosoft Teams理解することが不可欠です。 これら 2 つの主要なコンポーネントが連携して、会話ロジックを整理します。
Teams アクティビティ ハンドラー: チャネルの作成、チーム メンバーの追加、Teams 環境固有のその他のアクションなど、Teams 固有のイベントと相互作用を処理します。 Teams SDK v2 では、ハンドラーはクラス継承ではなく、
Appインスタンスに直接登録されます。ボット ロジック:
Appオブジェクトはボットの会話ロジックを格納し、ユーザー入力に基づいて意思決定を行います。 受信アクティビティは、アクティビティの種類とオプションのパターン マッチングに基づいて、適切なハンドラーにルーティングされます。
Teams アクティビティ ハンドラー
アクティビティ ハンドラーは、ボットの機能の中核であり、ユーザーの操作を管理および処理します。 Teams SDK v2 で次の手順を実行します。
-
Appオブジェクトをインスタンス化し、そのオブジェクトにハンドラーを登録します。 - ハンドラーは、型指定されたコンテキスト オブジェクト (TypeScript では
IActivityContext、C# ではIContext<TActivity>、Python ではActivityContext[TActivity]) を受け取ります。 - 応答とプロアクティブ メッセージは、
ctx.reply()またはctx.send()経由で送信されます。
Teams ボットがアクティビティを受け取ると、SDK は登録されたハンドラーを介してアクティビティをルーティングします。 Teams 固有のイベント (チャネル ライフサイクル、メンバーの変更など) は個別の名前付きイベントとして表示されるため、手動で channelData.eventType を検査する必要はありません。
注:
ボット アクティビティの処理に 15 秒以上かかる場合、Teams はボット エンドポイントに再試行要求を送信するため、重複した要求が表示される場合があります。
アクティビティ ハンドラーのコード スニペット
次のスニペットは、チャネル イベントとチーム ライフサイクル イベントの Teams アクティビティ ハンドラーを示しています。
ボットは、 @microsoft/teams.apps パッケージを使用して構築されます。
Appをインスタンス化し、ハンドラーを app.on(eventName, handler) に登録します。 SDK は、イベント名の文字列に基づいてアクティビティを正しいハンドラーにルーティングします。
channelCreated
import { App } from '@microsoft/teams.apps';
const app = new App();
app.on('channelCreated', async ({ activity }) => {
const channel = activity.channelData.channel; // { id, name }
const team = activity.channelData.team; // { id, name }
// Code logic here
});
channelDeleted
app.on('channelDeleted', async ({ activity }) => {
// Code logic here
});
channelRenamed
app.on('channelRenamed', async ({ activity }) => {
// Code logic here
});
teamRenamed
app.on('teamRenamed', async ({ activity }) => {
// Code logic here
});
membersAdded / membersRemoved
app.on('membersAdded', async ({ activity, send }) => {
for (const member of activity.membersAdded) {
await send(`Welcome, ${member.name}!`);
}
});
app.on('membersRemoved', async ({ activity }) => {
// Code logic here
});
messageUpdate / messageDelete
メッセージの編集は、 messageUpdateとして表示されます。 論理的な削除は messageDelete として表示されます。 activity.channelData.eventType は 'softDeleteMessage'されます。
app.on('messageUpdate', async ({ activity }) => {
// Code logic here
});
app.on('messageDelete', async ({ activity }) => {
// activity.channelData.eventType === 'softDeleteMessage' for soft deletes
// Code logic here
});
ボット アクティビティ ハンドラーの例
次のコードは、ボット アクティビティの例を示しています。
import { App } from '@microsoft/teams.apps';
const app = new App();
app.on('message', async ({ activity, reply }) => {
const senderName = activity.from.name;
await send(`Hello <at>${senderName}</at>.`);
});
app.start().catch(console.error);
ボット ロジック
ボット ロジックには、ボットのアクションと相互作用を決定する基本的なルールと意思決定フレームワークが組み込まれています。 ボットがユーザー入力を解釈し、応答を作成し、会話に参加する方法について説明します。
Teams SDK v2 では、ボット ロジックは 1 つ以上のボット チャネルからの受信アクティビティを処理し、送信アクティビティを生成します。 すべてのアクティビティ ルーティングは、 App インスタンスによって処理されます。ハンドラーを登録すると、SDK によってアクティビティが自動的にディスパッチされます。
コア アクティビティ ハンドラー
app.on()でサポートされているイベント名の一覧には、次のものが含まれます。
| イベント | イベント名の文字列 | 説明 |
|---|---|---|
| 任意のアクティビティの種類を受信しました | 'activity' |
すべてのアクティビティに対して呼び出される Catch-all ハンドラー。 |
| メッセージ アクティビティを受信しました | 'message' |
受信テキスト メッセージを処理します。 正規表現の照合には app.message(pattern, handler) を使用します。 |
| 受信した会話の更新 | 'conversationUpdate' |
未加工の会話更新アクティビティ。 |
| インストールの追加 | 'install.add' |
ボットがインストールされました。 |
| インストールが削除されました | 'install.remove' |
ボットがアンインストールされました。 |
| メンバーが追加されました | 'membersAdded' |
1 人以上のメンバーが会話に参加しました。 |
| 削除されたメンバー | 'membersRemoved' |
1 人以上のメンバーが会話を終了しました。 |
| 編集されたメッセージ | 'messageUpdate' |
会話内のメッセージが編集されました。 |
| 論理的に削除されたメッセージ | 'messageDelete' |
メッセージが論理的に削除されました (activity.channelData.eventType === 'softDeleteMessage')。 |
| 受信した開封確認 | 'readReceipt' |
開封確認メッセージが受信されました。 |
Teams 固有のイベント ハンドラー
app.on() では、次の Teams 固有のイベント名文字列がサポートされています。
| イベント | イベント名の文字列 | 説明 |
|---|---|---|
channelCreated |
'channelCreated' |
Teams チャネルが作成されました。 |
channelDeleted |
'channelDeleted' |
Teams チャネルが削除されました。 |
channelRenamed |
'channelRenamed' |
Teams チャネルの名前が変更されました。 |
channelRestored |
'channelRestored' |
Teams チャネルが復元されました。 |
channelMemberAdded |
'channelMemberAdded' |
メンバーがチャネルに追加されました。 |
channelMemberRemoved |
'channelMemberRemoved' |
メンバーがチャネルから削除されました。 |
teamRenamed |
'teamRenamed' |
チームの名前が変更されました。 |
teamArchived |
'teamArchived' |
チームはアーカイブされました。 |
teamDeleted |
'teamDeleted' |
チームが削除されました。 |
teamRestored |
'teamRestored' |
チームが復元されました。 |
| 会議の開始 | 'meetingStart' |
会議が開始されました。 |
| 会議が終了しました | 'meetingEnd' |
会議が終了しました。 |
| 参加している参加者 | 'meetingParticipantJoin' |
参加者が会議に参加しました。 |
| 参加者が左へ | 'meetingParticipantLeave' |
参加者が会議を離れた。 |
Teams の呼び出しアクティビティ
次の表に、 app.on()で使用できる呼び出しアクティビティ ハンドラーの一覧を示します。
| 呼び出しの種類 | イベント名の文字列 | 説明 |
|---|---|---|
CardAction.Invoke |
'card.action' |
カード アクション呼び出しアクティビティが受信されました (adaptiveCard/action)。 |
signin/verifyState |
SDK によって自動的に処理される (OAuth フロー) | サインインの状態の確認アクティビティ。 |
task/fetch |
'dialog.open' |
ダイアログ (タスク モジュール) がフェッチされました。 |
task/submit |
'dialog.submit' |
ダイアログ (タスク モジュール) が送信されました。 |
ボット アクティビティ ハンドラーについて理解したので、会話と、ボットが受信または送信するメッセージに応じてボットがどのように動作するかを確認しましょう。
推奨事項
ボットとユーザーの間のダイアログが広範になると、タスクの完了に要する時間が長くなり、複雑になります。 過剰なコマンド (特に広範なコマンド) をサポートするボットは、成功しないか、ユーザーによって肯定的に表示されます。
チャットでのマルチターン エクスペリエンスを回避 する広範なダイアログでは、開発者が状態を維持する必要があります。 この状態を終了するには、ユーザーがタイムアウトするか、[ キャンセル] を選択する必要があります。 また、このプロセスは面倒です。 たとえば、次の会話シナリオを参照してください。
ユーザー: Megan との会議をスケジュールして。
BOT: 200 件の結果が見つかりました。姓と名を含めます。
ユーザー: Megan Bowen との会議をスケジュールして。
ボット: かしこまりました。Megan Bowen との会議を何時にご希望ですか?
ユーザー: 午後 1 時に。
ボット: 何日のですか?
6 つ以下のコマンドをサポート する現在のボット メニューには表示されるコマンドが 6 つしかないため、それ以上のコマンドを頻度で使用する可能性は低くなります。 幅広いアシストを提供するボットより、特定の分野を深く掘り下げるボットの方がうまくいきます。
より迅速な対話のためにサポート情報のサイズを最適化する ボットの欠点の 1 つは、ランクなしの応答で大規模な取得サポート情報を維持することが困難であるということです。 ボットは、長いリストから答えを調べ出すようなものではなく、短く簡潔なやり取りに最適です。
注:
Teams プラットフォームでは、トランスポート層セキュリティ (TLS) バージョン 1.2 のみがサポートされています。 それに応じてボット環境を構成してください。
その他のボット機能を調べる
従来のボット機能に加えて、Teams ボット アプリで使用できる高度な機能を調べることができます。
コード サンプル
| サンプルの名前 | 説明 | TypeScript | C# | Python |
|---|---|---|---|---|
| Teams 会話ボット | このアプリは、基本的なボット イベントを示します。 | 表示 | 表示 | 表示 |
Platform Docs