当来自机器人对话的对话开始时,它似乎走在一条路径上,即1 2 3 4。我想在点2本身返回到路径标记1,并重新开始该过程,甚至可能从3转到标记2,再次重新寻址/回答标记2……
我曾尝试使用if语句( ==“匹兹堡”)返回到前一个方法,但我注意到,通过机器人仿真器,对话框继续移动,而不管我是否重写了前一个方法。
简而言之,我问的是如何遍历瀑布对话框,并根据与机器人的对话结果和luis响应返回到我选择的任何对话点。也就是说,如果我从1到5单步执行,并且从3开始,我需要重新开始,我如何才能符合瀑布对话框来具体执行此操作?我遇到的问题是,即使我将前面的方法称为对话链,它也不会正式从调用的方法开始。这是我特别关心的。
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);
}
}发布于 2019-05-31 23:53:26
要将这句话塞进答案中并从评论中获取它:
瀑布不是被设计成以任何方式遍历的,而是一步一步/向下的。您可以在每个瀑布步骤中嵌套迷你瀑布,这将允许循环单个步骤shown here,或者有条件检查以跳过某些步骤shown here。
您似乎正在寻找的是ComponentDialogs或使用ReplaceDialogAsync。组件对话框是botbuilder- dialog库的一部分,它允许您将机器人的逻辑分解为组件(片段),这些组件可以添加到DialogSet中,甚至可以添加到另一个组件对话框中。例如,这是bot框架samples github存储库上Core-Bot示例的Cancel/Help组件。此组件用于描述当用户在另一个瀑布中间说“取消”或“帮助”时会发生什么。
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,有一个关于如何制作包括组件对话框在内的复杂对话框的教程。
https://stackoverflow.com/questions/56372747
复制相似问题