Copilot Studio では、エンゲージメント ハブを通じて、エージェントの会話をシームレスかつ状況に応じて人間のエージェントに引き渡すことができます。
一部のカスタム開発では、会話を任意のエンゲージメント ハブに渡すようにエージェントを構成できます。 このガイドでは、この実行方法について説明します。
重要
このセクションの一部の手順では、ユーザーまたは開発者によるソフトウェア開発が必要です。 サードパーティのエンゲージメント ハブと Copilot Studio の統合を検討している開発者ツール、ユーティリティ、および IDE を十分に理解している IT 管理者または開発者などの経験豊富な IT プロフェッショナルを対象としています。
エンゲージメント ハブへの完全なハンドオフは、次のパターンに従います:
- 顧客は、エンゲージメント ハブのチャット キャンバスを操作します。
- エンゲージメント ハブは、組み込みのチャット ルーティング機能を通じて受信チャットをエージェントにルーティングします。
- ユーザー定義アダプターは、エンゲージメント ハブからの受信チャット メッセージを Copilot Studio エージェントに渡します。
- 顧客がハンドオフをトリガーすると、Copilot Studio は完全な会話コンテキストでハンドオフを開始します。
- ユーザー定義のアダプターはハンドオフ メッセージを傍受したり、完全な会話コンテキストを解析したり、エスカレーションされた会話を、可用性に基づいて熟練した人間のエージェントにシームレスにルーティングします。
- 顧客のチャットは、シームレスかつ状況に応じて会話を再開できる人間のエージェントに渡されます。
会話を人間のエージェントに渡すには、ユーザー定義のハンドオフ アダプターを構築する必要があります。
アダプターは、顧客、エージェント、人間のエージェント間でメッセージを中継したり変換することにより、エージェント エンゲージメント ハブとの間の会話を橋渡しします。
最も人気のあるエージェント エンゲージメント ハブは、ソフトウエア開発キット (SDK) を提供するか、API を公開してドキュメント化して、そのようなアダプターを構築できるようにします。
カスタム アダプタの内容については、このドキュメントの範囲外です。 ただし、次のサンプル ハンドオフ メッセージは、Copilot Studio は ライブ チャット オペレーターへの標準的なハンドオフ の一部として生成される内容に基づいており、開始する際に役立ちます。
これらのコード スニペットとサンプルを使用すると、エージェントの会話からコンテキストを抽出して、エージェントの会話をシームレスかつ状況に応じて汎用エンゲージメント ハブに渡すことができます。
ハンドオフは現在、Direct Line でのみサポートされています。 詳細については、Direct Line 上でのエージェントとのやり取りをご参照ください。 ハンドオフで handoff.initiate
というイベント活動が発生し、アダプターに送信されます。
GitHub サイトでのハンドオフ メッセージ活動の完全なサンプル を確認できます。
会話コンテキストを使用するには、handoff.initiate
イベント活動を解析する必要があります。
次のコードのスニペットは、handoff.initiate
イベント活動を解析し、会話コンテキストを抽出します。
GitHub の完全なサンプル コードを参照してください。
public void InitiateHandoff(string botresponseJson)
{
BotResponse response = JsonConvert.DeserializeObject<BotResponse>(botresponseJson);
// Look for Handoff Initiate Activity. This indicates that conversation needs to be handed off to agent
Activity handoffInitiateActivity = response.Activities.ToList().FirstOrDefault(
item => string.Equals(item.Type, ActivityTypes.Event, System.StringComparison.Ordinal)
&& string.Equals(item.Name, HandoffInitiateActivityName, System.StringComparison.Ordinal));
if (handoffInitiateActivity != null)
{
// Read transcript from attachment
if (handoffInitiateActivity.Attachments?.Any() == true)
{
Attachment transcriptAttachment = handoffInitiateActivity.Attachments.FirstOrDefault(a => string.Equals(a.Name.ToLowerInvariant(), TranscriptAttachmentName, System.StringComparison.Ordinal));
if (transcriptAttachment != null)
{
Transcript transcript = JsonConvert.DeserializeObject<Transcript>(transcriptAttachment.Content.ToString());
}
}
// Read handoff context
HandoffContext context = JsonConvert.DeserializeObject<HandoffContext>(handoffInitiateActivity.Value.ToString());
// Connect to Agent Hub
// <YOUR CUSTOM ADAPTER CODE GOES HERE>
}
}