【问题标题】:Multiple waterfall conversation in Microsoft Bot frameworkMicrosoft Bot 框架中的多个瀑布对话
【发布时间】:2020-06-08 17:19:50
【问题描述】:

是否可以在 Microsoft Bot 框架中进行多个瀑布对话?

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

例如,用户说

Flow1 --> 启动 Root 对话(用于登录过程)--> 启动 Flow1(瀑布)对话

Flow2 --> 启动 Root 对话(用于登录过程)--> 启动 Flow2(瀑布)对话

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

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

请让我知道我在这里缺少什么,在此先感谢

【问题讨论】:

    标签: botframework


    【解决方案1】:

    是的,很可能在 bot 框架中进行多个瀑布对话。在 bot framework v4 中有一个waterfall dialogs 的概念,其中一个瀑布接受一堆函数,这些函数将按顺序执行。对话的每个步骤都作为异步函数实现,该函数采用瀑布步骤上下文(步骤)参数。每个瀑布步骤都可以向用户提出一个问题,并且用户的响应将传递到瀑布中的下一步。您还拥有component dialogs,它允许您重用对话框集。

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

    希望这会有所帮助!

    【讨论】:

    • 感谢您的回复,但不幸的是,这并没有回答问题。两个示例(组件对话框和多轮提示)都使用瀑布对话框和瀑布步骤,但没有一个显示使用多个瀑布对话框。与我最初的问题一样,根据用户的输入,我想调用相应的瀑布对话框
    • 您需要保留或保存该初始消息才能调用相应的瀑布对话框。你可能想看看docs.microsoft.com/en-us/azure/bot-service/…
    • ranusharao,我认为这没有意义。状态对象完全不同。默认瀑布对话由 ASPController services.AddTransient>(); 调用
    【解决方案2】:

    我知道这篇文章有点老了,但我没有看到任何其他完整的答案,所以就这样吧。

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

    但是,如果您要问是否可以在单个 ComponentDialog 中拥有多个 WaterfallDialogs,是的,您当然可以。为此,您必须通过执行以下操作为每个 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() 将堆栈上的当前对话框替换为新对话框,这样可以更轻松地管理循环和重定向,因为堆栈不会被您不想在某些时候处理的旧对话框弄乱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多