Microsoft Bot框架中的多个瀑布对话

时间:2020-06-08 17:19:50

标签: botframework

Microsoft Bot框架中是否可能有多个瀑布对话?

我有一个 Rootdialog (来自ComponentDialog(WaterfallDialog)),它接受用户的初始输入。我想使用此对话框来启动到外部服务的登录过程。登录成功后,我将根据用户的初始输入启动特定的瀑布对话。

例如,用户说

Flow1 ->“启动根对话框”(用于登录过程)->“启动Flow1(瀑布)”对话框

Flow2 ->“启动根对话框”(用于登录过程)->“启动Flow2(瀑布)”对话框

我尝试这样做,但是当我从Root对话框调用 BeginDialogAsync 时,它挂起了

return await stepContext.BeginDialogAsync("flow1", null, cancellationToken);

请让我知道我在这里想念的东西,在此先感谢

2 个答案:

答案 0 :(得分:3)

是的,很可能在bot框架中进行多个瀑布对话。 Bot框架v4中有一个waterfall dialogs概念,其中瀑布接受将按顺序执行的功能栈。对话的每个步骤都实现为一个异步函数,该异步函数采用瀑布式步骤上下文(step)参数。每个瀑布步骤都可以询问用户一个问题,并且用户的响应将传递到瀑布中的下一个步骤。您还可以使用component dialogs来重用对话框集。

请参阅multi-turn prompt示例,该示例使用瀑布对话框,一些提示和组件对话框来创建简单的交互,向用户询问一系列问题和bot-authentication示例。 / p>

希望这会有所帮助!

答案 1 :(得分:0)

我知道这篇文章有点旧,但我没有看到任何其他完整的答案,所以在这里。

在阅读原始问题时,我可以看到您可能希望如何将其实现为从主对话框启动的单独对话框,在这种情况下,您希望创建单独的 ComponentDialogs 来实现它们自己的 WaterfallDialog 来解决问题.

但是,如果您要问是否可以在单个 ComponentDialog 中拥有多个 WaterfallDialog,那么您当然可以。为此,您必须通过执行以下操作为每个 WaterfallDialog 分配一个 Id 属性值:

var flow1steps= new WaterfallStep[] { step1, step2, step3 };
var flow2steps = new WaterfallStep[] { step1, step2, step3 };
var flow1Dialog= new WaterfallDialog(nameof(WaterfallDialog), flow1steps) { Id = "flow1" };
var flow2Dialog = new WaterfallDialog(nameof(WaterfallDialog), flow2steps) { Id = "flow2" };

在这种情况下,如果您想从“flow1Dialog”开始,您可以将构造函数中的 InitialDialogId 设置为“flow1Dialog”,如下所示:

InitialDialogId = "flow1Dialog";

然后,当您准备好将对话框重定向到“flow2”时,您可以使用 flow2Dialog 的 WaterfallDialog.Id。例如,要从根对话框或 flow1Dialog 中的任何其他步骤重定向到 flow2Dialog,请执行以下操作:

return await stepContext.BeginDialogAsync("flow2");

BeingDialogAsync() 与 ReplaceDialogAsync()

您可以使用 BeginDialogAsync(),但除非您需要控制以最终返回原始对话框,否则这可能会导致您不希望的对话框堆栈混乱。使用 ReplaceDialogAsync() 将堆栈上的当前对话框替换为新对话框,这可以更轻松地管理循环和重定向,因为堆栈不会被您不想在某些时候处理的旧对话框弄得乱七八糟。