如何在MS Bot Framework V3中区分由自适应卡提交操作和用户键入的文本发送的活动?

时间:2018-10-09 05:50:31

标签: botframework

我正在将Bing Spell Check集成到我的机器人中,以自动更正拼写错误,然后再将其发送给 QnA Maker

我还实现了带有不同按钮的自适应卡响应,其中包含一些建议,如果Bot无法理解用户的话语,用户可以尝试这些建议。

现在的挑战是用户可以从建议列表中单击“自适应卡”按钮。在这种情况下,我不想打Bing Spell Check,因为理想情况下句子是正确的。

我正在使用MS Web聊天控件,并且Bot托管在网页上。问题是我无法根据活动中的任何属性来区分“操作提交”和“用户键入的文本”。我尝试在 AdaptiveSubmitAction 中添加 DataJson ,但是当我这样做时,单击的按钮的文本不会显示在漫游器中。使用“数据”属性,如果用户单击按钮,它将在漫游器中显示文本。

请指导我,让我知道是否有人需要对此问题进行更多的说明。

编辑:添加示例可复制代码。机器人作为响应返回的自适应卡模板,其中包含一些Action.Submit按钮。

public static AdaptiveCard GetQuestionSuggestionsCard(List<string> Questions)
        {
            AdaptiveCard card = new AdaptiveCard()
            {
                Body = new List<AdaptiveElement>()
                {
                    new AdaptiveContainer()
                    {
                        Items = new List<AdaptiveElement>()
                        {
                            new AdaptiveColumnSet()
                            {
                                Columns = new List<AdaptiveColumn>()
                                {
                                    new AdaptiveColumn()
                                    {
                                        Width = "stretch",
                                        Items = new List<AdaptiveElement>()
                                        {
                                            new AdaptiveTextBlock()
                                            {
                                                Text = string.Format("I am not sure what you are asking. \n\n I have {0} {1} that might help you find an answer.", Questions.Count, Questions.Count > 1 ? "suggestions" : "suggestion" ),
                                                Wrap = true
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                },
                // Buttons
                Actions = new List<AdaptiveAction>()
            };
            foreach (string question in Questions)
            {
                card.Actions.Add(new AdaptiveSubmitAction() { Title = question, Data = question });
            }
            //Add None choice if have suggestive questions
            if (Questions.Count > 0 && card.Actions.Count > 0)
            {
                card.Actions.Add(new AdaptiveSubmitAction() { Title = AppSettings.NoneSuggestionChoiceText, Data = AppSettings.NoneSuggestionChoiceText });
            }
            return card;
        }

自适应卡已返回机器人-

private Activity DisplaySuggestions(IDialogContext context, IMessageActivity message, QnAMakerResults result)
        { 
if (lstDisplaySuggestionQuestions.Count > 0)
                        {
                            //create the reply
                            Activity reply = ((Activity)context.Activity).CreateReply();
                            reply.Attachments = new List<Attachment>();
                            // Create the attachment.
                            Attachment attachment = new Attachment()
                            {
                                ContentType = AdaptiveCard.ContentType,
                                //take the max displayed suggestions configured from Config Key
                                Content = AdaptiveCardHelper.GetQuestionSuggestionsCard(lstDisplaySuggestionQuestions.Take(AppSettings.QnAMaxNumberOfDisplayedSuggestions).ToList())
                            };
                            reply.Attachments.Add(attachment);
                            return reply;
                        }
}

当用户单击“操作”按钮时,它将向机器人发布文本,该文本也将在对话中显示为发声。现在,我想唯一地确定是从文本输入框还是从自适应卡按钮单击中发出发言。

我希望,我会说得通。若要重现,请添加卡,然后键入一些文本,然后在Message Controller中检查Post方法,然后查看Activity对象,以创建一个机器人。然后对“操作按钮”执行相同的操作。单击并专注于“文本”属性。

1 个答案:

答案 0 :(得分:0)

v3自适应卡片示例机器人具有一个示例,该示例在收到卡片的响应后在机器人内整理出提交动作。基本上,“提交”响应将有一个value字段,而普通消息则没有。

For nodejs

if (session.message && session.message.value) {
    // A Card's Submit Action obj was received
    processSubmitAction(session, session.message.value);
    return;
}

For C#

if (message.Value != null)
    {
        // Got an Action Submit
        dynamic value = message.Value;
        string submitType = value.Type.ToString();
        ...

因此,如果您的漫游器不正确,则可以将其发送给拼写检查器。