Как определить, является ли ответ вводимым пользователем или предлагать действие щелчком - Bot Framework - PullRequest
1 голос
/ 21 апреля 2020

Мы создали бот QnA в нашей организации для внутреннего использования, используя BotFramework V4 и C# (. Net Core). Мы также хотим использовать проверку орфографии Bing, чтобы исправить опечатки в вопросах.

Но «исправление» создает проблемы в некоторых многооборотных разговорах: проверка орфографии Bing может заменить аберрацию и особые условия, тогда служба QnA может не перехватить правильный вопрос и ответ.

Мы взяли пример из учебника, который использует CardAction для подсказки связанных вопросов:

foreach (var prompt in result.Context.Prompts) {
    buttonList.Add(
        new CardAction()
        {
            Value = prompt.DisplayText,
            Type = ActionTypes.ImBack,
            Title = prompt.DisplayText,
        });
}

Следуя примеру (на французском) при использовании бота в командах Microsoft:

enter image description here

Мой вопрос: как я могу определить, пришло ли сообщение от пользователя, нажать кнопку подсказки ( например, получить объект CardAction и его свойство Type)? Я посмотрел параметр turnContext, предоставленный в методе OnMessageActivityAsync. но ничего не найдено.

Я хотел бы применить проверку орфографии Bing для непосредственного ввода данных пользователем, но не для подсказки действий.

Спасибо. (ps) я нашел похожий вопрос к botframework v3 без принятого ответа, я использую v4.

1 Ответ

1 голос
/ 21 апреля 2020

В таких каналах, как Команды, где есть определенный c imBack тип действия, отличный от postBack и messageBack, обычно нет способа отличить guish входящее imBack действие из напечатанного сообщения.

Чтобы получить желаемое поведение, вы должны использовать postBack или messageBack. Они работают так же, как друг с другом в командах, но messageBack будет лучше сообщать о ваших намерениях. Идея состоит в том, что вы будете отправлять видимый текст вместе с невидимыми метаданными в том же сообщении от пользователя боту.

foreach (var prompt in result.Context.Prompts) {
    buttonList.Add(
        new CardAction()
        {
            Type = ActionTypes.MessageBack,
            Value = new { source = "button" },
            Title = prompt.DisplayText,
            Text = prompt.DisplayText,
            DisplayText = prompt.DisplayText,
        });
}

Почему мы используем prompt.DisplayText три раза здесь? Заголовок отображается в виде метки на кнопке, текст заполняет свойство Text действия, а отображаемый текст - это то, что отображается в диалоге.

В командах свойство Value postBack или messageBack должен быть объектом, а не строкой. если бы вы попытались сказать Value = "button", вы бы получили пустой объект во входящей деятельности. Так как свойство Value действия заполняет свойство Value действия, вы можете определить, является ли входящее действие от кнопки, подобной этой:

if (turnContext.Activity.Value != null
    && JToken.FromObject(turnContext.Activity.Value) is JObject value
    && value["source"] == "button")

Поскольку мои тесты до сих пор указывали, что набранные сообщения никогда не заполняют свойство Value, вы можете упростить эту проверку до следующего:

if (turnContext.Activity.Value != null)

Обратите внимание, что этот ответ относится только к командам. Существуют разные правила определения того, поступило ли действие с кнопки на разных каналах, и эти правила в настоящее время нигде не документированы. Если вам интересно, Я написал метод для своей библиотеки карт, который выполняет задачу определения того, пришло ли действие от кнопки на каком-либо канале . После освобождения библиотеки вы можете вызвать этот метод и посмотреть, вернет ли он значение null.

...