検査ミドルウェアを使用してボットをデバッグする
この記事の対象: SDK v4
この記事では、検査ミドルウェアを使用してボットをデバッグする方法について説明します。 この機能を使用すると、Bot Framework Emulator で、ボットの現在の状態を確認でき、さらにボットの内外のトラフィックをデバッグできます。 トレース メッセージを使用してエミュレーターにデータを送信し、会話のある特定のターンでのボットの状態を調べることができます。
「ボット クイックスタートを作成する」で、Bot Framework v4 を用いてローカルに構築された EchoBot を使用し、ボットのメッセージの状態をデバッグおよび検査する方法を示します。 また、IDE を使用してボットをデバッグしたり、Bot Framework Emulator を使用してデバッグしたりすることもできますが、状態をデバッグするには、検査ミドルウェアをボットに追加する必要があります。 C#、JavaScript、Java、および Python の検査ボット サンプルを取得できます。
Note
Bot Framework JavaScript SDK、C#、Python SDK は引き続きサポートされますが、Java SDK については、最終的な長期サポートは 2023 年 11 月に終了する予定です。
Java SDK を使用して構築された既存のボットは引き続き機能します。
新しいボットを構築する場合は、Microsoft Copilot Studio の使用をご検討ください。また、適切なコパイロット ソリューションの選択に関する記事もお読みください。
詳細については、「The future of bot building」をご覧ください。
前提条件
- ボットのミドルウェアと管理状態に関する知識。
- SDK 優先ボットをデバッグし、エミュレーターを使用してテストおよびデバッグする方法に関する知識
- Bot Framework Emulator のインストール
- 開発トンネルのインストール (他のチャンネルを使用するために、Azure に構成されているボットをデバッグする場合)
- C#、JavaScript、Java または Python の検索ボットサンプルのコピー。
エミュレーターを最新バージョンに更新する
ボット検査ミドルウェアを使用してボットをデバッグする前に、エミュレーターをバージョン 4.15 以降に更新します。 最新バージョンで更新プログラムを確認してください。
エミュレーターのバージョンを確認するには、メニューで [Help]、それから [About] の順に選択します。 お使いのエミュレーターの現在のバージョンが表示されます。
ボット コードを更新する
[Startup.cs] ファイル内で検査状態と検索ミドルウェアを設定し、アダプターが使用します。
Startup.cs
});
services.AddSingleton<ConversationState>();
// Create the Bot Framework Authentication to be used with the Bot Adapter.
AdapterWithInspection.cs
{
public class AdapterWithInspection : CloudAdapter
{
public AdapterWithInspection(BotFrameworkAuthentication auth, IConfiguration configuration, InspectionState inspectionState, UserState userState, ConversationState conversationState, ILogger<IBotFrameworkHttpAdapter> logger)
: base(auth, logger)
{
// Inspection needs credentials because it will be sending the Activities and User and Conversation State to the emulator
var credentials = new MicrosoftAppCredentials(configuration["MicrosoftAppId"], configuration["MicrosoftAppPassword"]);
Use(new InspectionMiddleware(inspectionState, userState, conversationState, credentials));
OnTurnError = async (turnContext, exception) =>
{
// Log any leaked exception from the application.
logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}");
// Send a message to the user
await turnContext.SendActivityAsync("The bot encountered an error or bug.");
await turnContext.SendActivityAsync("To continue to run this bot, please fix the bot source code.");
// Send a trace activity, which will be displayed in the Bot Framework Emulator
await turnContext.TraceActivityAsync("OnTurnError Trace", exception.Message, "https://www.botframework.com/schemas/error", "TurnError");
};
}
EchoBot.cs ファイル内のボット クラスを更新します。
EchoBot.cs
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
var conversationStateProp = _conversationState.CreateProperty<CustomState>("customState");
var convProp = await conversationStateProp.GetAsync(turnContext, () => new CustomState { Value = 0 }, cancellationToken);
var userStateProp = _userState.CreateProperty<CustomState>("customState");
var userProp = await userStateProp.GetAsync(turnContext, () => new CustomState { Value = 0 }, cancellationToken);
await turnContext.SendActivityAsync(MessageFactory.Text($"Echo: {turnContext.Activity.Text} conversation state: {convProp.Value} user state: {userProp.Value}"), cancellationToken);
convProp.Value++;
userProp.Value++;
}
ボットをローカルでテストする
コードを更新した後、ボットをローカルで実行し、2 つのエミュレーター (1 つはメッセージを送受信するためのもので、もう 1 つはデバッグ モードでメッセージの状態を検査するためのもの) を使用してデバッグ機能をテストできます。 ボットをローカルでテストする:
ターミナルでボットのディレクトリに移動し、次のコマンドを実行してボットをローカルで実行します。
dotnet run
エミュレーターを開きます。 [ボットを開く] を選択します。 [ボット URL]に [
http://localhost:3978/api/messages
] を入力し、MicrosoftAppId と MicrosoftAppPassword の値を入力します。 JavaScript ボットの場合、これらの値はボットの .env ファイルにあります。 C# ボットの場合、これらの値は appsettings.json ファイルにあります。 Java ボットの場合は、application.properties ファイルでこれらの値を見つけることができます。 [接続] を選択します。次に、別のエミュレーター ウィンドウを開きます。 この 2 つ目のエミュレーター ウィンドウは、デバッガーとして機能します。 前の手順で説明した指示に従います。 [デバッグ モードで開く] をオンにし、[接続] をクリックします。
この時点で、デバッグ エミュレーターに一意識別子 (
/INSPECT attach <identifier>
) を持つコマンドが表示されます。 デバッグ エミュレーターから識別子と共にコマンド全体をコピーし、最初のエミュレーターのチャット ボックスに貼り付けます。Note
一意識別子は、ボットのコードに検査ミドルウェアを追加した後、デバッグ モードでエミュレーターを起動するたびに生成されます。
これで、最初のエミュレーターのチャット ボックスでメッセージを送信し、デバッグ エミュレーターでメッセージを検査できるようになりました。 メッセージの状態を確認するには、デバッグ エミュレーターで [ボットの状態] を選択し、右側の [JSON] ウィンドウで [値] を展開します。 デバッグ エミュレーターにボットの状態が表示されます。
Azure に構成されたボットの状態を検査する
Azure に構成され、チャネル (Teams など) に接続されているボットの状態を調べるには、開発トンネルをインストールして実行する必要があります。
devtunnel を実行する
この時点で、エミュレーターが最新バージョンに更新され、ボットのコードに検査ミドルウェアが追加されました。 次のステップは、devtunnel を実行してローカル ボットを構成することです。 devtunnel を実行する前に、ボットをローカルで実行する必要があります。
ボットをローカルで実行するには以下を行います。
ターミナルでボットのフォルダーに移動し、[最新のビルド] を使用するように npm 登録を設定します。
ボットをローカルで実行します。 ボットで
3978
のようなポート番号が公開されるのを確認できます。別のコマンド プロンプトを開き、ボットのプロジェクト フォルダーに移動します。 次のコマンドを実行します。
devtunnel host -a -p 3978
これで、ローカル実行されているボットに devtunnel が接続されました。 セキュアな (HTTPS) パブリック URL をコピーします。
ボット リソースの更新
ローカル ボットが devtunnel に接続されたので、devtunnel の URL を使用するように Azure でボット リソースを構成できます。
Azure でボット リソースに移動します。 左側のメニューの [設定] で [構成] を選択します。
メッセージング エンドポイントを、コピーした devtunnel の URL アドレスに設定します。 必要な場合、IP アドレスの後に /api/messages を追加します。 たとえば、
https://0qg12llz-3978.usw2.devtunnels.ms/api/messages
のようにします。[ストリーミング エンドポイントを有効にする] を選択 します。
[適用] を選択して変更を保存します。
ヒント
[Apply] が有効になっていない場合は、[ストリーミング エンドポイントを有効にする] をオフにして [Apply] を選択してから、再び [ストリーミング エンドポイントを有効にする] をオンにして、再度 [Apply] を選択します。 [Enable Streaming Endpoint]\(ストリーミング エンドポイントを有効にする\) がオンになっており、エンドポイントの構成が保存されていることを確認する必要があります。
ボットの リソース グループにアクセスします。
[デプロイ] を選択し、以前に正常にデプロイされたボット リソースを選択します。 左側のメニューから [テンプレート] を選択して、ボットに関連付けられている Web アプリの MicrosoftAppId と MicrosoftAppPassword を取得します。
ボットの構成ファイル (C# の場合は appsettings.json 、JavaScript の場合は .env) を MicrosoftAppId と MicrosoftAppPassword で更新します。
エミュレーターを開始し、[ボットを開く] を選択し、[ボット URL] に [
http://localhost:3978/api/messages
] を入力します。 Microsoft アプリ ID と Microsoft App パスワードには、こちらがボットの構成ファイルに追加したのと同じ MicrosoftAppId と MicrosoftAppPassword を入力します。 次に、 [接続](Connect) を選択します。これで、実行中のボットが Azure のボットリソースに接続されました。 Web チャットで Azure でボットをテストするには、ボット リソースに移動し、[Web チャットでテスト] を選択し、ボットにメッセージを送信します。
デバッグ モードを有効にします
エミュレーターで、[Debug] (デバッグ) を選択し、次に [Start Debugging] (デバッグを開始) を選択します。
[ボット URL] に devtunnel の URL を入力します。/api/messages を忘れずに追加してください (例:
https://4jj51x75-51865.usw2.devtunnels.ms/api/messages
)。- Microsoft アプリ ID には、ボットのアプリ ID を入力します。
- Microsoft Appsのパスワードには、ボットのアプリ シークレットを入力します。
- また、[Open in debug mode]\(デバッグ モードで開く\) がオンになっていることも確認します。
- [接続] を選択します。
デバッグ モードを有効にすると、エミュレーターによって UUID が生成されます。 UUID は、エミュレーターでデバッグ モードを開始するたびに生成される一意の ID です。
UUID をコピーして [Web チャットでのテスト] チャット ボックス、またはお使いのチャネルのチャット ボックスに貼り付けます。 チャット ボックスに、「セッションに接続しました。すべてのトラフィックは検査のためにレプリケートされています」というメッセージが表示されます。
構成済みチャネルのチャット ボックスでメッセージを送信することにより、ボットのデバッグを開始できます。 ローカル エミュレーターは、デバッグのためのすべての詳細情報でメッセージを自動的に更新します。 ボットのメッセージの状態を検査するには、[ボットの状態]をクリックし、右側の JSON ウィンドウの値を展開します。
次のステップ
- 「トランスクリプト ファイルを使用してお使いのボットをデバッグする」方法を説明します。
- 「スキルまたはスキル コンシューマーをデバッグする」方法を説明します。