如何访问Microsoft Bot Framework LuisIntent方法中的原始消息文本

Gen*_*ick 10 c# botframework azure-language-understanding

我试图从标记为一个方法中获得完整的原始文本LuisIntent中的LuisDialog.

文档将这些方法显示为两个参数:

IDialogContext context, LuisResult result
Run Code Online (Sandbox Code Playgroud)

这两者都没有公开披露消息的原始文本.上下文对象确实包含消息但在私有属性(context.data.message.text)中是不可访问的.

有没有办法在中访问它context,还是可以将它传递给对话框构造函数?

fde*_*ose 9

使用新版本的Bot Framework(1.0.2),LuisResult对象现在有一个Query参数,其中包含发送到LUIS的原始查询.


小智 8

您可以覆盖LuisDialog的MessageReceived(...)函数,将您需要的消息字段保留为成员变量,并在您的intent处理程序中访问这些字段.下面我修改了SimpleAlarmDialog,以显示如何在其中一个intent处理程序中访问"message.Text":

[LuisModel("c413b2ef-382c-45bd-8ff0-f76d60e2a821", "6d0966209c6e4f6b835ce34492f3e6d9")]
[Serializable]
public class SimpleAlarmDialog : LuisDialog<object>
{
    private readonly Dictionary<string, Alarm> alarmByWhat = new Dictionary<string, Alarm>();

    [Serializable]
    public class PartialMessage
    {
        public string Text { set; get; }
    }

    private PartialMessage message;

    protected override async Task MessageReceived(IDialogContext context, IAwaitable<Message> item)
    {
        var msg =  await item;
        this.message = new PartialMessage { Text = msg.Text };
        await base.MessageReceived(context, item);
    }

    [LuisIntent("builtin.intent.alarm.delete_alarm")]
    public async Task DeleteAlarm(IDialogContext context, LuisResult result)
    {
        await context.PostAsync($"echo: {message.Text}");
        Alarm alarm;
        if (TryFindAlarm(result, out alarm))
        {
            this.alarmByWhat.Remove(alarm.What);
            await context.PostAsync($"alarm {alarm} deleted");
        }
        else
        {
            await context.PostAsync("did not find alarm");
        }

        context.Wait(MessageReceived);
    }
}
Run Code Online (Sandbox Code Playgroud)