汎用エンゲージメント ハブへのハンドオフを構成する
Copilot Studio では、エンゲージメント ハブを通じて、コパイロットの会話をシームレスかつ状況に応じて人間のエージェントに引き渡すことができます。
一部のカスタム開発では、会話を任意のエンゲージメント ハブに渡すようにコパイロットを構成できます。 このガイドでは、この実行方法について説明します。
前提条件
- Copilot Studio を使用してコパイロットを構築 している必要があります。
- API または SDK を使用してプログラムで対話できるエンゲージメント ハブが必要です。
重要
このセクションの一部の手順では、ユーザーまたは開発者によるソフトウェア開発が必要です。 サードパーティのエンゲージメント ハブと 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>
}
}