使用检测中间件调试机器人
适用于: SDK v4
本文介绍如何使用检测中间件来调试机器人。 有了此功能,Bot Framework Emulator 就可以调试出入机器人的流量并查看机器人的当前状态。 可以使用跟踪消息将数据发送给 Emulator,然后检查任意给定聊天轮次中机器人的状态。
在创建机器人快速指南 中,我们使用 EchoBot(使用 Bot Framework v4 在本地构建)来演示如何调试并检查机器人的消息状态。 也可使用 IDE 来调试机器人,或者使用 Bot Framework Emulator 进行调试,但若要调试状态,则需为机器人添加检测中间件。 提供了用于 C#、JavaScript、Java 和 Python 的检测机器人示例。
注意
Bot Framework JavaScript、C# 和 Python SDK 将继续受支持,但 Java SDK 即将停用,最终长期支持将于 2023 年 11 月结束。
使用 Java SDK 构建的现有机器人将继续正常运行。
要生成新的机器人,请考虑使用 Microsoft Copilot Studio 并阅读选择正确的助理解决方案。
有关详细信息,请参阅机器人构建的未来。
先决条件
- 具备机器人中间件和管理状态方面的知识
- 具备如何调试 SDK 优先机器人以及使用 Emulator 测试和调试方面的知识
- 安装 Bot Framework Emulator
- 安装开发隧道(如果你想调试在 Azure 中配置的机器人以使用其他通道)
- 用于 C#、JavaScript、Java 或 Python 的检测机器人样本的副本
将 Emulator 更新到最新版本
在使用机器人检测中间件调试机器人之前,请将 Emulator 更新到 4.15 版本或更高版本。 检查更新的最新版本。
若要查看 Emulator 的版本,请在菜单中选择“帮助”,然后选择“关于”。 此时就会看到 Emulator 的当前版本。
更新机器人代码
检测状态和检测中间件在 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++;
}
在本地测试机器人
更新代码后,即可在本地运行机器人并使用两个 Emulator 来测试调试功能:一个用于发送和接收消息,另一个用于在调试模式下检测消息的状态。 若要在本地测试机器人:
转到机器人在终端的目录,执行以下命令,在本地运行机器人:
dotnet run
打开 Emulator。 选择“打开机器人”。 在“机器人 URL”中填充
http://localhost:3978/api/messages
以及 MicrosoftAppId 和 MicrosoftAppPassword 值。 如果使用 JavaScript 机器人,则可在机器人的 .env 文件中找到这些值。 如果使用 C# 机器人,则可在 appsettings.json 文件中找到这些值。 对于 Java 机器人,可以在 application.properties 文件中找到这些值。 选择“连接” 。现在,打开另一个 Emulator 窗口。 这第二个 Enulator 窗口将充当调试器。 请按上一步的说明操作。 勾选“在调试模式下打开”,然后单击“连接”。
此时,你将在调试 Emulator 中看到带有唯一标识符 (
/INSPECT attach <identifier>
) 的命令。 从调试模拟器复制带有该标识符的整个命令,并将其粘贴到第一个模拟器的聊天框中。注意
将检测中间件添加到机器人的代码中后,每次在调试模式下启动 Emulator 时,都会生成一个唯一标识符。
现在可以将消息发送到第一个 Emulator 的聊天框中,并在调试 Emulator 中检测消息。 若要检测消息的状态,请单击调试模拟器中的“机器人状态”,然后在右侧的 JSON 窗口中展开“values”。 你将在调试 Emulator 中看到机器人的状态:
检测在 Azure 中配置的机器人的状态
如果想检查在 Azure 中配置并连接到通道(如 Teams)的机器人的状态,则需要安装并运行开发隧道。
运行 devtunnel
目前,你已将 Emulator 更新到最新版本,并在机器人的代码中添加了检测中间件。 下一步是运行 devtunnel,并配置本地机器人。 在运行 devtunnel 之前,需要在本地运行机器人。
若要在本地运行机器人:
转到机器人在终端中的文件夹,将 npm 注册设置为使用最新版本
在本地运行机器人。 可以看到机器人公开了一个端口号(例如
3978
)。打开另一个命令提示符,并转到机器人的项目文件夹。 运行下面的命令:
devtunnel host -a -p 3978
Devtunnel 现在已连接到本地运行的机器人。 复制安全 (HTTPS) 公共 URL。
更新机器人资源
现在,本地机器人已连接到 devtunnel,可以在 Azure 中配置机器人资源以使用 devtunnel URL。
在 Azure 中转到你的机器人资源。 在左侧菜单上,选择“设置”下的“配置”。
将消息传送终结点设置为复制的 devtunnel URL 地址。 根据需要在 IP 地址后添加 /api/messages。 例如,
https://0qg12llz-3978.usw2.devtunnels.ms/api/messages
。选择“启用流式处理终结点”。
选择“应用”以保存所做的更改。
提示
如果“应用”未启用,则可取消勾选“启用流式处理终结点”并选择“应用,”,然后再次勾选“启用流式处理终结点”并选择“保存”。 需确保“启用流式处理终结点”已选中且终结点配置已保存。
请转到机器人的资源组。
选择“部署”,然后选择以前成功部署的机器人资源。 从左侧菜单中选择“模板”,获取与机器人关联的 Web 应用的 MicrosoftAppId 和 MicrosoftAppPassword。
使用 MicrosoftAppId 和 MicrosoftAppPassword 更新机器人的配置文件(C# 的 appsettings.json 或 JavaScript 的 .env)。
启动 Emulator,选择“打开机器人”,并在“机器人 URL“中输入
http://localhost:3978/api/messages
。 使用添加到机器人配置文件的相同 MicrosoftAppId 和 MicrosoftAppPassword 填充 Microsoft 应用 ID 和 Microsoft 应用密码。 然后选择“连接” 。正在运行的机器人现已连接到 Azure 中的机器人资源。 若要在Web 聊天中测试 Azure 中的机器人,请转到机器人资源,选择“在Web 聊天中测试”,然后将消息发送到机器人。
启用调试模式
在 Emulator 中,选择“调试”,然后选择“开始调试”。
为机器人 URL(例如
https://4jj51x75-51865.usw2.devtunnels.ms/api/messages
)输入 devtunnel URL(别忘了添加 /api/messages)。- 对于“Microsoft 应用 ID”,请输入机器人的应用 ID。
- 对于“Microsoft 应用密码”,请输入机器人的应用机密。
- 确保还勾选“在调试模式下打开”。
- 选择“连接” 。
启用调试模式后,Emulator 将生成 UUID。 UUID 是一个独一无二的 ID,每次在 Emulator 中启动调试模式时,就会生成它。
复制 UUID 并将其粘贴到通道聊天框的“在 Web 聊天中进行测试。 此时会在聊天框中看到“已附加到会话,将复制所有流量进行检测”这条消息。
可以将消息发送到已配置通道的聊天框中,开始调试机器人。 本地 Emulator 会自动使用所有用于调试的详细信息来更新消息。 若要检测机器人的消息状态,请单击“机器人状态”,然后在右侧的 JSON 窗口中展开“values”。
后续步骤
- 了解如何使用脚本文件调试机器人。
- 了解如何调试技能或技能使用者。