首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何控制Microsoft Bot Framework对话框通过重新开始或单步执行特定步骤来重复对话框序列?

如何控制Microsoft Bot Framework对话框通过重新开始或单步执行特定步骤来重复对话框序列?
EN

Stack Overflow用户
提问于 2019-05-30 14:22:39
回答 1查看 1.4K关注 0票数 1

当来自机器人对话的对话开始时,它似乎走在一条路径上,即1 2 3 4。我想在点2本身返回到路径标记1,并重新开始该过程,甚至可能从3转到标记2,再次重新寻址/回答标记2……

我曾尝试使用if语句( ==“匹兹堡”)返回到前一个方法,但我注意到,通过机器人仿真器,对话框继续移动,而不管我是否重写了前一个方法。

简而言之,我问的是如何遍历瀑布对话框,并根据与机器人的对话结果和luis响应返回到我选择的任何对话点。也就是说,如果我从1到5单步执行,并且从3开始,我需要重新开始,我如何才能符合瀑布对话框来具体执行此操作?我遇到的问题是,即使我将前面的方法称为对话链,它也不会正式从调用的方法开始。这是我特别关心的。

代码语言:javascript
复制
       private async Task<DialogTurnResult> DestinationStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            var bookingDetails = (BookingDetails)stepContext.Options;

            if (bookingDetails.Destination == null)
            {
                return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Where would you like to travel to Christian?") }, cancellationToken);
            }
            else
            {
                Console.WriteLine("testing christian" + bookingDetails);
                return await stepContext.NextAsync(bookingDetails.Destination, cancellationToken);
            }
        }

        private async Task<DialogTurnResult> OriginStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
            Console.WriteLine("testing paul");
            var bookingDetails = (BookingDetails)stepContext.Options;

            //await LuisHelper.ExecuteLuisQuery(Configuration, Logger, stepContext.Context, cancellationToken);

            if ((string)stepContext.Result == "Pittsburgh")
            {
               return await DestinationStepAsync(stepContext, cancellationToken);
            }

            bookingDetails.Destination = (string)stepContext.Result;

            if (bookingDetails.Origin == null)
            {
                Console.WriteLine("testing tall" + bookingDetails.Destination);
                return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Where are you traveling from?") }, cancellationToken);
            }
            else
            {
                return await stepContext.NextAsync(bookingDetails.Origin, cancellationToken);
            }
        }
EN

回答 1

Stack Overflow用户

发布于 2019-05-31 23:53:26

要将这句话塞进答案中并从评论中获取它:

瀑布不是被设计成以任何方式遍历的,而是一步一步/向下的。您可以在每个瀑布步骤中嵌套迷你瀑布,这将允许循环单个步骤shown here,或者有条件检查以跳过某些步骤shown here

您似乎正在寻找的是ComponentDialogs或使用ReplaceDialogAsync。组件对话框是botbuilder- dialog库的一部分,它允许您将机器人的逻辑分解为组件(片段),这些组件可以添加到DialogSet中,甚至可以添加到另一个组件对话框中。例如,这是bot框架samples github存储库上Core-Bot示例的Cancel/Help组件。此组件用于描述当用户在另一个瀑布中间说“取消”或“帮助”时会发生什么。

代码语言:javascript
复制
public class CancelAndHelpDialog : ComponentDialog
    {
        public CancelAndHelpDialog(string id)
            : base(id)
        {
        }

        protected override async Task<DialogTurnResult> OnBeginDialogAsync(DialogContext innerDc, object options, CancellationToken cancellationToken)
        {
            var result = await InterruptAsync(innerDc, cancellationToken);
            if (result != null)
            {
                return result;
            }

            return await base.OnBeginDialogAsync(innerDc, options, cancellationToken);
        }

        protected override async Task<DialogTurnResult> OnContinueDialogAsync(DialogContext innerDc, CancellationToken cancellationToken)
        {
            var result = await InterruptAsync(innerDc, cancellationToken);
            if (result != null)
            {
                return result;
            }

            return await base.OnContinueDialogAsync(innerDc, cancellationToken);
        }

        private async Task<DialogTurnResult> InterruptAsync(DialogContext innerDc, CancellationToken cancellationToken)
        {
            if (innerDc.Context.Activity.Type == ActivityTypes.Message)
            {
                var text = innerDc.Context.Activity.Text.ToLowerInvariant();

                switch (text)
                {
                    case "help":
                    case "?":
                        await innerDc.Context.SendActivityAsync($"Show Help...");
                        return new DialogTurnResult(DialogTurnStatus.Waiting);

                    case "cancel":
                    case "quit":
                        await innerDc.Context.SendActivityAsync($"Cancelling");
                        return await innerDc.CancelAllDialogsAsync();
                }
            }

            return null;
        }
    }

正如@Matt-Stannett提到的:截至5/22/19 here,有一个关于如何制作包括组件对话框在内的复杂对话框的教程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56372747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档