1

我正在尝试“暂停”机器人对话并通过主动消息恢复它。

我一直试图这样做的方法是结束对话转向“暂停”对话。下面我ContinueDialogAsync在我的 ProActive 消息中使用“恢复”对话。以下是我如何在 ProActive 消息中执行此操作:

DialogManager dialogManager = new DialogManager(this.resourceExplorer.LoadType<AdaptiveDialog>(this.resourceExplorer.GetResource("echobot-final.dialog")));
dialogManager.UseResourceExplorer(this.resourceExplorer);
dialogManager.UseLanguageGeneration();

var conversationStateAccessors = conversationState.CreateProperty<DialogState>(nameof(DialogState));
var dialogSet = new DialogSet(conversationStateAccessors);
dialogSet.Add(dialogManager.RootDialog);
var dialogContext = await dialogSet.CreateContextAsync(turnContext, cancellationToken);

但是,在ContinueDialogAsync 先前结束对话框轮次之后运行时,我遇到了这个错误:

System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=Microsoft.Bot.Builder.Dialogs.Adaptive
  StackTrace:
   at Microsoft.Bot.Builder.Dialogs.Adaptive.Generators.ResourceMultiLanguageGenerator.TryGetGenerator(DialogContext dialogContext, String locale, LanguageGenerator& languageGenerator)

尽管从对话框中删除 EndTurn 时,我没有收到此 NullReferenceException,所以我相信我的 dialogContext 对象应该是正确的?

我是否误解了结束对话回合的概念?

暂停对话并稍后恢复对话的正确方法是什么?

4

1 回答 1

2

在 Bot Framework 中,回合是 bot 接收 HTTP 请求中的活动和 bot 响应该请求之间的时间。请注意,响应 HTTP 请求与响应活动不同。bot 可以通过在自己的 HTTP 请求中向 ABS 发送新活动来进行回复,并且可以轮流执行多次。HTTP 响应不是另一个活动,它只是表示回合结束的状态代码(如 200 OK)。

实际上并没有“对话转向”的概念。瀑布对话框和自适应对话框中有“步骤”,尽管它们与转弯无关,因为一个步骤可以跨越多个转弯,而一个转弯可以跨越多个步骤。自适应对话中有一个“结束对话转”动作,我认为这就是你在说的,但它只是结束了回合。那里的“对话”一词可能是多余的/具有误导性的。

实际上也没有“暂停”对话的概念。对话被理解为机器人与一个或多个用户之间交换的一系列轮次和活动。您的机器人始终需要知道如何处理到达其端点的每个请求,因此由您来定义暂停对话的含义。

我猜您希望机器人在对话暂停时做出不同的响应或根本不响应。您将需要某种机器人状态,让机器人知道它已为给定的用户或对话暂停,并且对话使用机器人状态,因此对话会这样做。无论您向机器人表明对话已暂停,您都可以撤消它以取消暂停。仅仅结束回合是行不通的,因为这不会向状态添加任何内容,并且下一回合将在用户发送消息后立即开始。

于 2020-07-03T23:53:51.320 回答