Cách viết code trong dialogflow fulfillment

Trong dialogflow, để việc điều khiển cho chatbot được thông minh và xử lý tình huống một cách flexible thì chúng ta cần phải lập trình cho nó thông qua webhook. Nếu có bạn nào chưa hiểu webhook thì hãy tra cứu thêm từ google nhé. 

Thay vì phải sử dụng các môi trường lập trình bên ngoài google cung cấp cho chúng ta bộ công cụ lập trình google tích hợp sẵn NODE.JS. Quá tiện quá đã phần còn lại là lưu ý giải thuật để cho chat bot của bạn thông minh. Tham khảo thư viện NODEJS cho Dialogflow tại đây nha https://dialogflow.com/docs/fulfillment/node-libraries.

NODE JS là gì, nó không phải là ngôn ngữ lập trình riêng như C, Java… NodeJS là một mã nguồn được xây dựng dựa trên nền tảng Javascript V8 Engine. Nó nhẹ, real time. Mình không đề cập đến cách lập trình node ở đây, các bạn có thể tham khảo thêm rất nhiều tutorials trên internet. https://nodejs.org/en/

Lập trình trong Inline Editor. Trong phần này mình sẽ hướng dẫn bạn 2 cách code, thực ra là 1 nhưng cách viết khác nhau cho các bạn không chuyên node.js. Vì sau này bạn có lỡ đọc code trên mạng hay github thì cũng dễ hiểu

Bạn click vào Fulfillment ở menu bên trái. Sẽ thấy 2 mục WEBHOOK  và INLINE EDITOR.

  • Webhook là nơi bạn đặt code thực thi tại một server bên ngoài google vd Heruku chẳng hạn. Với webhook bạn có thể sử dụng ngôn ngữ nào tuỳ ý C#, Python, Java…
  • Inline Editor sử dụng server của google và nó chỉ hỗ trợ NODE.JS thôi. Nếu bạn không chuyên nodeJS thì không quá quan trọng chỉ cần bạn đã từng lập trình và có nền tảng bất kỳ ngôn ngữ nào rồi, chỉ cần 1 buổi là có thể nắm cơ bản Nodejs 

Khi bạn Enable Inline Editor thì nó có mặc định đoạn code sau 

// 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?`);
  }

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

Nhìn đoạn code trên thì bạn thấy hơi rối. Đây là code mẫu google tạo sẵn cho bạn. Mình sẽ giải thích nó để bạn dễ hiểu. Để giải thích mình xoá bớt những đoạn code không cần thiết. Trong phần này chúng ta không sử dụng các hàm trong thư viện google action 

Để thực sử dụng Fulfillment trước hết bạn cần vào intent tương ứng và kích hoạt nó. Trong trường hợp này intent có tên là ‘Default Welcome Intent’ 

Hàm sau sẽ được gọi khi intent này được kích hoạt.

function welcome(agent) {
    agent.add(`welcome to Dialogflow Master dot com`);
  }
//khi intent 'Default Welcome Intent' được kích hoạt thì hàm welcome sẽ được gọi
let intentMap = new Map();
intentMap.set('Default Welcome Intent', welcome);

Toàn bộ code mẫu

'use strict';
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');
 
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });
 
 //Hàm thụ lý cho intent welcome khi người dùng click vào hộp chatbot hay gõ 'Hello' thì intent này được kích hoạt  
function welcome(agent) {
    agent.add(`welcome to Dialogflow Master dot com`);
  }
 
  function fallback(agent) {
    agent.add(`Hi I cannot understand what you said. Repeat again`);
  }

  let intentMap = new Map();

  //gán hàm thụ lý cho intent tương ứng
  intentMap.set('Default Welcome Intent', welcome);
  intentMap.set('Default Fallback Intent', fallback);
  agent.handleRequest(intentMap);
});

Cách viết khác, đây là một cách mà bạn có thể thấy trên những bài tutorial về dialogflow trên mạng. Mình giới thiệu để bạn tham khảo sau này gặp thì đỡ bỡ ngỡ

'use strict';
 
const functions = require('firebase-functions');
const {dialogflow} = require ('actions-on-google');
const WELCOME_INTENT = 'Default Welcome Intent';
const FALLBACK_INTENT = 'Default Fallback Intent';

const app = dialogflow();

//thụ lý welcome intent với conv là agent 
app.intent(WELCOME_INTENT, (conv) => {
    conv.ask("welcome to Dialogflow Master dot com");
});
app.intent(FALLBACK_INTENT, (conv) => {
    conv.ask("Hi I cannot understand what you said. Repeat again");
});
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

Qua bài này mình hy vọng bạn bước đầu làm quen với code trong fulfillment của Dialogflow. Đối với inline editor thì quá đủ. Nó có giới hạn cho bản miễn phí là file index.js không được quá 64K. Mình cũng thử con chatbot với khoảng hơn 4000 dòng lệnh vẫn chạy vi vu.

Mình sẽ gắng viết 1 bài chia sẽ cho các bạn cách sử dụng webhook để sau này tuỳ ý bạn có thể sử dụng server ngoài 

Mời bạn tham khảo thêm cách sử dụng webhook firebase function để code 

1 thought on “Cách viết code trong dialogflow fulfillment”

Leave a Comment