dialogflow-esdialogflow-es-fulfillment

Creating a slow reply from Dialogflow


I want to create a Dialogflow webhook that responds to the user slowly, so it more feels like someone is on the other end and takes a few seconds to reply.

I'm using the built-in code editor, and can create an Intent handler (see code), but I just don't know how to get it to reply slower.

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);
});


Solution

  • Needing to reply slower is rarely a desired thing, to be honest. But the easiest way to do so is to use setTimeout() and delay for a little bit. (Don't delay too long - more than 5 or 10 seconds and Dialogflow will timeout.)

    The catch with using setTimeout(), however, is that the handler will need to return a Promise. So you'll need to wrap the call to setTimeout() and the agent.add() in a Promise handler. A function that does this might look something like:

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

    You would then call this from your handler, providing the agent, the message, and how many milliseconds to wait to reply:

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