Создание медленного ответа из Dialogflow

#dialogflow-es #dialogflow-es-fulfillment

#dialogflow-ы #dialogflow-es-выполнение

Вопрос:

Я хочу создать веб-хук Dialogflow, который медленно реагирует на пользователя, чтобы было больше ощущения, что кто-то находится на другом конце и для ответа требуется несколько секунд.

Я использую встроенный редактор кода и могу создать обработчик намерений (см. Код), но я просто не знаю, как заставить его отвечать медленнее.

 const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });

  function welcome (agent) {
    agent.add(`I'm replying too quickly!`);
  }

  function fallback (agent) {
    agent.add(`I didn't understand`);
    agent.add(`I'm sorry, can you try again?`);
  }

  // Run the proper function handler based on the matched Dialogflow intent name
  let intentMap = new Map();
  intentMap.set('Default Welcome Intent', welcome);
  intentMap.set('Default Fallback Intent', fallback);
  agent.handleRequest(intentMap);
});

  

Ответ №1:

Лучший способ справиться с этим — добавить задержку в код пользовательского интерфейса. Оставьте намерение Dialogflow таким, какое оно есть, и как только ответ бота будет получен во внешнем интерфейсе, покажите его с задержкой.

Ниже приведен пример того, как мы обрабатываем это в Kommunicate Ответ Dialogflow приходит без каких-либо задержек, затем в коде Javascript мы показываем анимацию индикатора ввода, добавляем некоторую задержку с помощью Javascript перед ее отображением.

Чат-бот Kommunicate, показывающий индикатор ввода для ответа бота

Ответ №2:

Если честно, необходимость отвечать медленнее редко бывает желаемой. Но самый простой способ сделать это — использовать setTimeout() и немного отложить. (Не откладывайте слишком долго — более 5 или 10 секунд, и Dialogflow отключится.)

Проблема с использованием setTimeout() , однако, заключается в том, что обработчику нужно будет вернуть обещание. Итак, вам нужно будет обернуть вызов в setTimeout() и agent.add() в обработчике обещаний. Функция, которая выполняет это, может выглядеть примерно так:

 function respondSlowly( agent, msg, ms ){
  return new Promise( resolve => {
    setTimeout( () => {
      agent.add( msg );
      resolve();
    }, ms );
  });
}
  

Затем вы бы вызвали это из своего обработчика, указав агент, сообщение и сколько миллисекунд нужно ждать ответа:

 function welcome( agent ){
  return respondSlowly( agent, `Hi there, slowly`, 2000 );  // Wait 2 seconds to reply
}