在 LuisIntent 方法中处理自适应卡片按钮



我正在使用 MS 机器人框架和 LUIS 开发一个机器人,我的聊天流中有很多带有按钮的自适应卡片。我需要一种方法来处理带有按钮(准确地说是 Action.Submit 按钮(的流。

我第一次尝试:

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
if (activity.Type == ActivityTypes.Message)
{
if (activity.Text != null & activity.Value == null)
{
await Conversation.SendAsync(activity, () => new RootLuisDialog());
}
else if (activity.Text == null & activity.Value != null)
{
await Conversation.SendAsync(activity, () => new ButtonHandler());
}
}
else
{
this.HandleSystemMessage(activity);
}
var response = Request.CreateResponse(HttpStatusCode.OK);
return response;
}

因为单击自适应卡片上的按钮时activity.Value包含 Action.Submit 按钮的属性。

这个想法是能够分离按钮控制器和RootLuisDialog()意图控制器。但它没有用,我不知道为什么:使用此代码,总是采取RootLuisDialog()退出。换句话说,对话框保留在RootLuisDialog()

第二个想法是像这样使用NoneLuis Intent:

[LuisIntent("")]
[LuisIntent("None")]
public async Task None(IDialogContext context, LuisResult result)
{
var act = context.Activity as IMessageActivity;
string message = String.Empty;
if (act.Text != null & act.Value == null)
{
message = $"Sorry, I did not understand '{act.Text}'. Type 'help' if you need assistance.";
}
else if (act.Text == null & act.Value != null)
{
Button btn = JsonConvert.DeserializeObject<Button>(act.Value.ToString());
message = $"You clicked on {btn.Type}";
}
await context.PostAsync(message);
context.Wait(this.MessageReceived);
}

虽然这有效,但在意图下按下按钮代码None看起来并不对。

我还尝试context.Wait(buttonHandler)buttonHandler是处理按钮按下的异步函数,但后来我收到此错误消息:

"exceptionMessage": "Object reference not set to an instance of an object.",
"exceptionType": "System.NullReferenceException",

我确信我想要实现的目标已经有一个很好的答案,但这是我的第一个 C# 项目/任务,我需要帮助来解决这个问题。 提前非常感谢!!

我认为,如果您想将按钮的处理与LUIS意图分开,更好的设计可能是拥有一个可以做 3 件事的 RootDialog:

  1. 检查传入的活动
  2. 如果activity.Value为 null,则将活动 FWD 到 LuisDialog(使用context.Forward。假设你想要检查所有消息中的 1(,则必须在使用context.Done执行逻辑后"结束"LUIS 对话框(而不是执行context.Wait(...)(
  3. 如果activity.Value不为 null,则可以在 RootDialog 中处理消息并以context.Wait(...)结尾;

最新更新