Jeeva Bharathi
Jeeva Bharathi

Reputation: 554

Why does this fulfillment code for Dialogflow does not work?

I am playing around a bit with the Dialogflow. As I was trying to figure out the options in the responses, I also wanted to test if Dialogflow has dynamic response. For example, fetch a data from Database (Firebase Database or MongoDB) and show it as a response instead of hard coding every response.

I have learnt that Fulfillment can do that job. When I enabled the Inline editor in Fulfillment in Dialogflow, it already has some code to be deployed. I figured, just for testing, I would write some very basic function in Fulfillment and see if it works.

// See https://github.com/dialogflow/dialogflow-fulfillment-nodejs
// for Dialogflow fulfillment library docs, samples, and to report issues
'use strict';

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

process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });
  console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
  console.log('Dialogflow Request body: ' + JSON.stringify(request.body));

  function welcome(agent) {
    agent.add(`Welcome to my agent!`);
  }

  function fallback(agent) {
    agent.add(`I didn't understand`);
    agent.add(`I'm sorry, can you try again?`);
  }
  function test(agent){
  agent.add('test confirmed!');
  }
  // // Uncomment and edit to make your own intent handler
  // // uncomment `intentMap.set('your intent name here', yourFunctionHandler);`
  // // below to get this function to be run when a Dialogflow intent is matched
  // function yourFunctionHandler(agent) {
  //   agent.add(`This message is from Dialogflow's Cloud Functions for Firebase editor!`);
  //   agent.add(new Card({
  //       title: `Title: this is a card title`,
  //       imageUrl: 'https://developers.google.com/actions/images/badges/XPM_BADGING_GoogleAssistant_VER.png',
  //       text: `This is the body text of a card.  You can even use line\n  breaks and emoji! 💁`,
  //       buttonText: 'This is a button',
  //       buttonUrl: 'https://assistant.google.com/'
  //     })
  //   );
  //   agent.add(new Suggestion(`Quick Reply`));
  //   agent.add(new Suggestion(`Suggestion`));
  //   agent.setContext({ name: 'weather', lifespan: 2, parameters: { city: 'Rome' }});
  // }

  // // Uncomment and edit to make your own Google Assistant intent handler
  // // uncomment `intentMap.set('your intent name here', googleAssistantHandler);`
  // // below to get this function to be run when a Dialogflow intent is matched
  // function googleAssistantHandler(agent) {
  //   let conv = agent.conv(); // Get Actions on Google library conv instance
  //   conv.ask('Hello from the Actions on Google client library!') // Use Actions on Google library
  //   agent.add(conv); // Add Actions on Google library responses to your agent's response
  // }
  // // See https://github.com/dialogflow/dialogflow-fulfillment-nodejs/tree/master/samples/actions-on-google
  // // for a complete Dialogflow fulfillment library Actions on Google client library v2 integration sample

  // 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);
  intentMap.set('test-intent',test);
  // intentMap.set('your intent name here', yourFunctionHandler);
  // intentMap.set('your intent name here', googleAssistantHandler);
  agent.handleRequest(intentMap);
});

The function test is the only thing I have added to the already pre existing code along with the intentMap.set('test-intent', test);.

I have the intent as follows:

{
  "id": "3fea3cec-d3f0-4d4e-a838-b4134894ea05",
  "name": "test-intent",
  "auto": true,
  "contexts": [],
  "responses": [
    {
      "resetContexts": false,
      "affectedContexts": [],
      "parameters": [
        {
          "id": "de3d79b3-b062-445a-8c55-d499a2d7b12d",
          "required": false,
          "dataType": "",
          "name": "sample",
          "value": "1",
          "promptMessages": [],
          "noMatchPromptMessages": [],
          "noInputPromptMessages": [],
          "outputDialogContexts": [],
          "isList": false
        }
      ],
      "messages": [
        {
          "type": "simple_response",
          "platform": "google",
          "textToSpeech": "t",
          "ssml": "",
          "displayText": ""
        }
      ],
      "defaultResponsePlatforms": {},
      "speech": []
    }
  ],
  "priority": 500000,
  "webhookUsed": false,
  "webhookForSlotFilling": false,
  "fallbackIntent": false,
  "events": [],
  "userSays": [
    {
      "id": "d8aee895-8326-4454-b0f4-c2237984d968",
      "data": [
        {
          "text": "testing...",
          "userDefined": false
        }
      ],
      "isTemplate": false,
      "count": 0,
      "updated": 0,
      "isAuto": false
    }
  ],
  "followUpIntents": [],
  "liveAgentHandoff": false,
  "endInteraction": false,
  "templates": []
}

It is bare bones with nothingness. I just wanted to test the response in Actions on Google.

I only get the response I have manually entered in the 'testing-intent' in Actions on Google..

What am I doing wrong?

Upvotes: 0

Views: 2576

Answers (1)

Jeeva Bharathi
Jeeva Bharathi

Reputation: 554

I already figured out the problem I have when I looked at the testing-intent's json before posting this question. I had to Enable webhook call for this intent.

  1. Go to bottom portion of the selected intent page you want to enable Fulfillment.
  2. Click Fulfillment to expand it.
  3. Click Enable webhook call for this intent

Upvotes: 1

Related Questions