7

我的机器人有带有几个意图的 LUIS 对话框。我从我的 MessageController 调用 LUIS 对话框。如果检测到意图,我会启动一个子对话框。子对话框完成后,我调用context.Done("response from user").了该ChlildDialogDone任务之后。

ChildDialogDone任务内部,我想再次调用 LUIS 对话框来检测用户消息的意图(涉及到 ChildDialogDone)。现在在里面ChildDialogDone我有context.Wait(MessageReceived).当这行代码执行时,什么都没有发生,我的机器人正在等待用户的下一条消息。

这是代码:

    [Serializable]
        public partial class DefiningIntentDialog : LuisDialog<object>
        {

            [LuisIntent("")]
            public async Task NoIntent(IDialogContext context, LuisResult result)
            {        
                var dialog = new GreetingsDialog();
                dialog.InitialMessage = result.Query;
                context.Call(dialog, GreetingDialogDone);      
            }

            [LuisIntent("Email")]
            public virtual async Task ConfirmationEmail(IDialogContext context, LuisResult result)
            {
                await context.Forward(new EmailDialog, EmailDialogDone, "message", CancellationToken.None);
            }

            private async Task EmailDialogDone(IDialogContext context, IAwaitable<string> argument)
            {
                var messageHandled = await argument;

                context.Wait(MessageReceived);
            }
      }

所以在 EmailDialogDone 里面我有一些来自用户的消息,我想再次用这个消息执行 DefiningIntent 对话框。我该怎么做?

4

2 回答 2

4

您可以重复 LUIS 对话框的 MessegaReceived 上的逻辑,以实现您想要做的事情。基本上,这段代码应该非常符合您的需要:

var tasks = this.services.Select(s => s.QueryAsync(messageHandled, CancellationToken.None)).ToArray();
var winner = this.BestResultFrom(await Task.WhenAll(tasks));

IntentActivityHandler handler = null;
if (winner == null || !this.handlerByIntent.TryGetValue(winner.BestIntent.Intent, out handler))
{
    handler = this.handlerByIntent[string.Empty];
}

if (handler != null)
{
    await handler(context, null, winner?.Result);
}

使用“this”引用事物的代码片段是继承自的 LUIS 对话框的一部分。

  • services,是根据你的 LuisModel 属性实例化的 LuisServices 的集合。
  • IntentActivityHandler 是 LuisIntent 装饰方法使用方法签名“实现”的处理程序。
  • handlerbyIntent 是一个字典,键是对话的意图名称,处理程序是需要为该意图调用的方法。

检查以获取更多详细信息,并确保您使用的是最新版本的 BotBuilder SDK(在本文发布时:v3.2.1)

于 2016-09-30T17:14:57.773 回答
1

无需从 MessegaReceived 复制逻辑。你可以打电话给 MessegaReceived:

private async Task EmailDialogDone(IDialogContext context, IAwaitable<string> argument)
{
   await MessageReceived(context, new AwaitableFromItem<IMessageActivity>((IMessageActivity)context.Activity));
}
于 2017-07-26T23:19:23.563 回答