Search code examples
node.jswebhooksdialogflow-cx

Dialogflow CX webhook for fulfilment to reply user using nodejs


I tried using dialogflow-fulfillment library but I guess it is for Dialogflow ES so now I am using @google-cloud/dialogflow-cx library but I don't know how to use this library for webhook connection to reply to users using fulfilments, there is very little material available for Dialogflow CX.

// use credentials or keyFilename i'm using keyFile
    credentials: {
        private_key: "-----BEGIN PRIVATE KEY-----==\n-----END PRIVATE KEY-----\n",
 
        client_email:"pro1a3711.iam.gserviceaccount.com",
    },                                                                                                                                                                                                                                                                                                                                                                              
        keyFilename: './pr.json'
}

const {SessionsClient} = require('@google-cloud/dialogflow-cx');
const projectId = 'pro1-293711';
const location = 'global';
const agentId = 'da2271f5-0221-4dce-98d3-efa----9dd';
const languageCode = 'en';
 const query = ['hello'];
// Imports the Google Cloud Some API library
//console.log(WebhooksClient)
const client = new SessionsClient(config);
   //console.log("client",client)
     async function detectIntentText() {
        const sessionId = Math.random().toString(36).substring(7);
    const sessionPath = client.projectLocationAgentSessionPath(
      projectId,
      location,
      agentId,
      sessionId
    );
    console.info(sessionPath);
    const request = {
        session: sessionPath,
        queryInput: {
          text: {
            text: query,
          },
          languageCode,
        },
      };
      const [response] = await client.detectIntent(request);
      console.log(`User Query: ${query}`);
      for (const message of response.queryResult.responseMessages) {
        if (message.text) {
          console.log(`Agent Response: ${message.text.text}`);
        }
      }
      if (response.queryResult.match.intent) {
        console.log(
          `Matched Intent: ${response.queryResult.match.intent.displayName}`
        );
      }
      console.log(
        `Current Page: ${response.queryResult.currentPage.displayName}`
      );
    }

 detectIntentText()```

Solution

  • Note that the dialogflow-fulfillment library only supports Dialogflow ES and the @google-cloud/dialogflow-cx library is only used for node.js applications to access Dialogflow CX API.

    As there are no fulfillment libraries available yet for Dialogflow CX, you can refer to the Dialogflow CX webhook request and webhook response for building webhook services for your Dialogflow CX agent.

    You can also refer to the sample webhook service code for Dialogflow CX using Node.js and express below:

    const express = require("express");
    const app = express();
    const bodyParser = require("body-parser");
    
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));
    
    app.post("/webhook", (request, response) => {
      let tag = request.body.fulfillmentInfo.tag;
      let jsonResponse = {};
      if (tag == "welcome tag") {
        //fulfillment response to be sent to the agent if the request tag is equal to "welcome tag"
        jsonResponse = {
          fulfillment_response: {
            messages: [
              {
                text: {
                  //fulfillment text response to be sent to the agent
                  text: ["Hi! This is a webhook response"]
                }
              }
            ]
          }
        };
      } else {
        jsonResponse = {
          //fulfillment text response to be sent to the agent if there are no defined responses for the specified tag
          fulfillment_response: {
            messages: [
              {
                text: {
                  ////fulfillment text response to be sent to the agent
                  text: [
                    `There are no fulfillment responses defined for "${tag}"" tag`
                  ]
                }
              }
            ]
          }
        };
      }
      response.json(jsonResponse);
    });
    
    const listener = app.listen(process.env.PORT, () => {
      console.log("Your app is listening on port " + listener.address().port);
    });