如何在 Microsoft Bot Framework 中创建分支对话框

How to make branching dialogs in Microsoft Bot Framework

我正在使用 MS 机器人框架,我正在尝试构建一个机器人来处理可以分支的对话,而不仅仅是一个平面场景。

例如,在第一条消息中,机器人向用户提问,并根据答案启动三个子对话框中的一个,而这些子对话框又可以根据用户输入启动自己的子对话框。

所以我正在寻找这样的东西:

if (userAnswer == "option 1") {
    LaunchSupportDialog();
}
else {
    LaunchNewOrderDialog();
}

Microsoft 提供的示例要么是平面的(例如,可以处理三明治订单的机器人,没有分支,连续执行每个步骤),要么是 LUIS 根据用户意图自动完成分支。

我正在寻找不太聪明的东西,所以看起来我只是缺少某种方法或 class 能够做到这一点。

文档状态:

Explicit management of the stack of active dialogs is possible through IDialogStack.Call and IDialogStack.Done, explicitly composing dialogs into a larger conversation. It is also possible to implicitly manage the stack of active dialogs through the fluent Chain methods.

但我没有找到任何示例来说明如何创建新的 IDialogStack 对象,或者如何显式调用 .Call() 或 .Done(),或者为此使用 Chain class 方法。

一种选择是使用 Chains,它提供 Switch 分支结构。

IDialog<string> MyDialog =
    Chain
    .PostToChain()
    .Switch(
        new Case<string, IDialog<string>>(userAnswer => userAnswer == "option 1", (ctx, _) => Option1Dialog),
        Chain.Default<string, IDialog<string>>((ctx, _) => DefaultDialog))
    .Unwrap()
    .Select(dialogResult => $"The result is: {dialogResult}")
    .PostToUser();

此示例等待来自用户的消息,根据消息(Option1DialogDefaultDialog,均为 IDialog<string> 类型)启动对话,转换对话结果并将其发回给用户。

请参阅文档的 this 部分以获取更多详细信息(尽管不幸的是,它没有很多示例)。