是否有任何通用方法可以满足 LUIS 对话框中的所有意图?

Is there any common method which will hit all the intents in the LUIS Dialog?

我想知道是否有人知道在调用任何 Luis Intent 方法时始终调用自定义方法的方法。基本上,当机器人从 LuisDialog 获取数据时,我试图向用户添加加载程序消息。

我有两个想法。

  1. 从您的消息控制器发送 "loader message"。
  2. 有一个从 MessagesController 调用的根对话框。它可以在对您的 LUIS 对话框 context.forward() 执行 context.forward() 之前发送您的加载程序消息

希望对您有所帮助。

如果您有一个将消息转发到 LuisDialog 的 RootDialog,您可以在 RootDialog 或 LuisDialog 的 StartAsync 方法中显示 "loader message"。另一种选择是覆盖 LuisDialog 的 MessageReceived,并在调用 base.MessageReceived.

之前发送加载器消息
[Serializable]
public class RootDialog : IDialog<object>
{
    public Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);
        return Task.CompletedTask;
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {
        var activity = await result as Activity;
        await context.PostAsync("RootDialog.MessageReceivedAsync");
        await context.Forward(new LuisTestDialog(), AfterLuisDialog, activity);            
    }

    private async Task AfterLuisDialog(IDialogContext context, IAwaitable<object> result)
    {
        await context.PostAsync("RootDialog.AfterLuisDialog");            
    }
}

[LuisModel("xxx", "xxx")]
[Serializable]
public class LuisTestDialog : LuisDialog<object>
{
    public async override Task StartAsync(IDialogContext context)
    {
        await context.PostAsync("LuisTestDialog.StartAsync");
        await base.StartAsync(context);
    }

    [LuisIntent("")]
    [LuisIntent("None")]
    public async Task None(IDialogContext context, LuisResult result)
    {
        await context.PostAsync("LuisTestDialog.None");
        context.Done(true);
    }

    protected async override Task MessageReceived(IDialogContext context, IAwaitable<IMessageActivity> item)
    {
        await context.PostAsync("LuisTestDialog.MessageReceived");
        await base.MessageReceived(context, item);
    }
}

以上将产生以下消息: