Получение Facebook Messenger для отображения подсказок QnA Follow-Up в BotFramework v4 с использованием Node.js

Я пытаюсь понять, как заставить Facebook Messenger отображать последующие запросы от QnA Maker с помощью BotFramework v4 и Node.js.

Мне удалось получить следующие подсказки, отображаемые в WebChat:  изображение

Мне это удалось после того, как я последовал замечательному совету Мэтта Стэннетта из этой ветки: Как использовать карточки в вопросе QnA, который содержит подсказки и использует их в карточках

Однако когда дело доходит до их появления в Facebook Messenger, мне очень трудно.

Я надеялся, что это будет так же просто, как определение некоторых channelData для быстрых ответов Facebook в моем коде onMessage, поскольку мне просто нужно, чтобы Facebook вернул простую текстовую полезную нагрузку. Я думал, что смогу сделать это так же, как я получил подсказки для веб-чата, код ниже:

this.onMessage(async (context, next) => {
        this.logger.log('Processing a Message Activity');

        const qnaResults = await this.qnaMaker.getAnswers(context);

        // Show choices if the Facebook Payload from ChannelData is not handled
        if (!await this.processFacebookPayload(context, context.activity.channelData)) {
            if (context.activity.channelId == 'facebook') {
              if (qnaResults[0]) {
                const { answer, context: { prompts }} = qnaResults[0];

                let reply;
                if (prompts.length) {

                  const quickReply = {
                    channelData: {
                      "messaging_type":"RESPONSE",
                      "message":{
                        "text":"test1", //answer,
                        "quick_replies":[
                          {
                            "content_type":"text",
                            "title":"test2",//prompts.map({ displayText }),
                            "payload":"test3",//prompts.map({ displayText })
                          }
                        ]
                      }
                    }
                  }

                    reply = quickReply;
                  } else {
                    reply = answer;
                  }

                  await context.sendActivity(reply);

              // If no answers were returned from QnA Maker, reply with help.
              } else {
                  await context.sendActivity('I\'m sorry, I don\'t have an answer for that. Please ask me something else, such as: \n\n "What Is Mental Health?" \n\n "What Is NeuroDiversity" \n\n "Help"');
              }

            } else {

            // If an answer was received from QnA Maker, send the answer back to the user.
            if (qnaResults[0]) {
              const { answer, context: { prompts }} = qnaResults[0];

              let reply;
              if (prompts.length) {

                const card = {
                  "type": "AdaptiveCard",
                  "body": [
                    {
                      "type": "TextBlock",
                      "text": answer,
                      wrap: true
                    }
                ],
                "actions": prompts.map(({ displayText }) => ({ type: "Action.Submit", title: displayText, data: displayText })),
                "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
                "version": "1.1"
                }

                  reply = { attachments: [CardFactory.adaptiveCard(card)] };
                } else {
                  reply = answer;
                }

                await context.sendActivity(reply);

            // If no answers were returned from QnA Maker, reply with help.
            } else {
                await context.sendActivity('I\'m sorry, I don\'t have an answer for that. Please ask me something else, such as: \n\n "What Is Mental Health?" \n\n "What Is NeuroDiversity" \n\n "Help"');
            }
            }

        }

        // By calling next() you ensure that the next BotHandler is run.
        await next();
    });

Но это не работает. Что я действительно получаю, так это ответы QnA на любые вопросы, которые я задаю, для которых в QnA Maker не заданы дополнительные подсказки, поэтому я знаю, что оператор IF правильно идентифицирует Facebook как канал и что в ответе есть последующие подсказки. связанные с ним. Думаю, у меня просто нет правильного кода для быстрых ответов в Facebook.

Кто-нибудь может помочь?

Заранее спасибо!


person Sean    schedule 29.06.2019    source источник


Ответы (1)


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

const quickReply = {
                    channelData: {
                        text: answer,
                        quick_replies: [
                          {
                            content_type: "text",
                            title: "Prompt 1",
                            payload: "Prompt 1"
                          },{
                            content_type: "text",
                            title: "Prompt 2",
                            payload: "Prompt 2"
                          }
                        ]
                    }
                  }

Затем вы можете создать переменную для вставки последующего запроса в данные канала:

var qnaPrompts = null;
if(qnaResults[0].context != null){
   qnaPrompts = qnaResults[0].context.prompts;
}

Затем вам нужно повторно сопоставить массив с новым массивом в правильном формате для быстрых ответов:

var qnaPromptsArray = qnaPrompts.map(obj =>{
   return {content_type: "text", title: obj.displayText, payload: obj.displayText}
});

Теперь при обновлении quickReply в Facebook Messenger отображается запрос QnA в виде быстрого ответа:

const quickReply = {
   channelData: {
      text: answer,
      quick_replies: qnaPromptsArray
   }
}

И последнее, что нужно решить, - как повторно отформатировать полезную нагрузку в QnA в формат, который он принимает. Для этого вам нужно настроить свой TurnContext на строку в Activity.Text следующим образом, а затем вызвать QnA:

turnContext.activity.text = quickReply.payload;
const qnaResults = await this.qnaMaker.getAnswers(turnContext);
person Sean    schedule 30.06.2019
comment
Похоже, QnA предлагает несколько методов при запросе ответа: docs.microsoft.com/en-us/rest/api/cognitiveservices/ Я считаю, что мне нужно выбрать приглашение, которое я хочу показать, используя массив displayOrder, и использовать displayText для отображения текста приглашения. - person Sean; 30.06.2019