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

Я хочу создать веб-перехватчик 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);
});


person Prisoner    schedule 24.08.2020    source источник


Ответы (1)


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

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

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
}
person Prisoner    schedule 24.08.2020