שילוב של Dialogflow עם יומן Google כדי להבין את מילוי ההזמנות

1. לפני שמתחילים

ב-codelab הזה תלמדו איך Dialogflow מתחבר למערכות בק-אנד כדי לספק תשובות מפורטות ודינמיות לשאלות של משתמשים.

דרישות מוקדמות

לפני שממשיכים, צריך להשלים את ה-codelabs הבאים:

  1. איך יוצרים כלי לתזמון פגישות באמצעות Dialogflow
  2. שילוב של Dialogflow עם Actions on Google
  3. הסבר על ישויות ב-Dialogflow

כדאי גם להכיר את המושגים והמבנים הבסיסיים של Dialogflow. אפשר ללמוד עליהם מהסרטונים הבאים שנמצאים במסלול למידה פיתוח צ'אט בוט באמצעות Dialogflow.

מה תלמדו

  • מהו מילוי הזמנות
  • איך מגדירים חשבון שירות ליומן
  • איך מגדירים את היומן
  • איך מפעילים את התכונה 'ביצוע הזמנה' ב-Dialogflow
  • איך בודקים את תהליך השלמת ההזמנה

מה תפַתחו

  • השלמת בקשות באמצעות Cloud Functions
  • שילוב בין Dialogflow לבין היומן

הדרישות

  • דפדפן אינטרנט וכתובת אימייל כדי להיכנס למסוף Dialogflow
  • חשבון Google כדי לגשת ליומן

2. מהו מילוי הזמנות?

ה-fulfillment הוא קוד שמוטמע כ-webhook ומאפשר לסוכן שלכם ב-Dialogflow להפעיל לוגיקה עסקית על בסיס כוונת המשתמש. במהלך שיחה, מילוי מאפשר לכם להשתמש במידע שחולץ על ידי עיבוד השפה הטבעית של Dialogflow כדי ליצור תשובות דינמיות או להפעיל פעולות בשרת העורפי. רוב סוכני Dialogflow משתמשים ב-fulfillment.

הנה כמה דוגמאות למקרים שבהם אפשר להשתמש בביצוע הזמנה כדי להרחיב את היכולות של סוכן:

  • כדי ליצור תשובות דינמיות שמבוססות על מידע שנשלף ממסד נתונים
  • כדי לבצע הזמנות על סמך מוצרים שהלקוח ביקש
  • כדי להטמיע את הכללים ואת תנאי הזכייה במשחק

3. הפעלת Calendar API

  1. ב-Dialogflow console, לוחצים על d7d792687e597dd5.png.
  2. בכרטיסייה כללי, גוללים אל מזהה הפרויקט ולוחצים על Google Cloud f2bffd4fcdb84fa9.png.

34be16fcd4c5aeff.png

  1. במסוף Google Cloud, לוחצים על תפריט הניווט ☰ > APIs & Services (ממשקי API ושירותים) > Library (ספרייה).
  2. מחפשים את Google Calendar API ולוחצים על הפעלה כדי להשתמש ב-API בפרויקט Google Cloud.

4. הגדרה של חשבון שירות

  1. לוחצים על תפריט הניווט ☰ > APIs & Services (ממשקי API ושירותים) > Credentials (פרטי כניסה).
  2. לוחצים על Create Credentials (יצירת אמצעי אימות) > Service account (חשבון שירות).

86f51af0e7886fdd.png

  1. בקטע פרטי חשבון השירות, מזינים appointment-scheduler בתור שם חשבון השירות ולוחצים על יצירה.

845d25f3e07ff770.png

  1. בקטע הענקת גישה לחשבון השירות הזה לפרויקט, לוחצים על המשך כדי לדלג על השלב הזה.
  2. בקטע Grant users access to this service account (optional) (הענקת גישה למשתמשים לחשבון השירות הזה (אופציונלי)), לוחצים על Create Key (יצירת מפתח), בוחרים באפשרות JSON ולוחצים על Create (יצירה).

קובץ JSON יורד למחשב. תצטרכו אותו בשלבי ההגדרה הבאים. a424cec60144d707.png

5. הגדרת היומן

  1. עוברים אל יומן, לוחצים על תפריט ראשי ☰ > הוספת יומנים אחרים fbc354048b0a2c6c.png> יצירת יומן חדש.

d6ec2fcf0bd2ae22.png

  1. מזינים 'יומן פגישות' כשם היומן ולוחצים על יצירת יומן.
  2. טוענים מחדש את הדף, לוחצים על יומן פגישות, גוללים אל שיתוף עם אנשים ספציפיים ולוחצים על הוספת משתתפים.
  3. מעתיקים את client_email מקובץ ה-JSON שהורדתם כחלק מהגדרת חשבון השירות ומדביקים אותו בתיבת הדו-שיח.

7927f6fa675e3e87.png

  1. לוחצים על התפריט הנפתח הרשאות, ואז על ביצוע שינויים באירועים > שליחה.

2ee99d3d15eed97b.png

  1. בהגדרות, גוללים אל שילוב היומן ומעתיקים את מזהה היומן.

df8a731f0713c52.png

6. הגדרת מילוי בקשות ב-Dialogflow

הוספת חשבון שירות ומזהה יומן לניהול ההזמנות

  1. עוברים לסוכן Dialogflow‏ AppointmentScheduler ולוחצים על Fulfillment (השלמת בקשה).
  2. מפעילים את הכלי לעריכה מהאתר.

c8574c6ef899393f.png

  1. מעדכנים את הקובץ index.js באמצעות הקוד הבא:
'use strict';

// Import the Dialogflow module from Google client libraries.
const functions = require('firebase-functions');
const {google} = require('googleapis');
const {WebhookClient} = require('dialogflow-fulfillment');

// Enter your calendar ID below and service account JSON below
const calendarId = "<INSERT YOUR CALENDAR ID>";
const serviceAccount = {<INSERT CONTENTS OF YOUr JSON FILE HERE>}; // Starts with {"type": "service_account",...

// Set up Google Calendar Service account credentials
const serviceAccountAuth = new google.auth.JWT({
 email: serviceAccount.client_email,
 key: serviceAccount.private_key,
 scopes: 'https://www.googleapis.com/auth/calendar'
});

const calendar = google.calendar('v3');
process.env.DEBUG = 'dialogflow:*'; // enables lib debugging statements

const timeZone = 'America/Los_Angeles';
const timeZoneOffset = '-07:00';

// Set the DialogflowApp object to handle the HTTPS POST request.
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
 const agent = new WebhookClient({ request, response });
 console.log("Parameters", agent.parameters);
 const appointment_type = agent.parameters.appointment_type;
 function makeAppointment (agent) {
   // Calculate appointment start and end datetimes (end = +1hr from start)
   const dateTimeStart = new Date(Date.parse(agent.parameters.date.split('T')[0] + 'T' + agent.parameters.time.split('T')[1].split('-')[0] + timeZoneOffset));
   const dateTimeEnd = new Date(new Date(dateTimeStart).setHours(dateTimeStart.getHours() + 1));
   const appointmentTimeString = dateTimeStart.toLocaleString(
     'en-US',
     { month: 'long', day: 'numeric', hour: 'numeric', timeZone: timeZone }
   );
    // Check the availability of the time, and make an appointment if there is time on the calendar
   return createCalendarEvent(dateTimeStart, dateTimeEnd, appointment_type).then(() => {
     agent.add(`Ok, let me see if we can fit you in. ${appointmentTimeString} is fine!.`);
   }).catch(() => {
     agent.add(`I'm sorry, there are no slots available for ${appointmentTimeString}.`);
   });
 }

// Handle the Dialogflow intent named 'Schedule Appointment'.
 let intentMap = new Map();
 intentMap.set('Schedule Appointment', makeAppointment);
 agent.handleRequest(intentMap);
});

//Creates calendar event in Google Calendar
function createCalendarEvent (dateTimeStart, dateTimeEnd, appointment_type) {
 return new Promise((resolve, reject) => {
   calendar.events.list({
     auth: serviceAccountAuth, // List events for time period
     calendarId: calendarId,
     timeMin: dateTimeStart.toISOString(),
     timeMax: dateTimeEnd.toISOString()
   }, (err, calendarResponse) => {
     // Check if there is a event already on the Calendar
     if (err || calendarResponse.data.items.length > 0) {
       reject(err || new Error('Requested time conflicts with another appointment'));
     } else {
       // Create event for the requested time period
       calendar.events.insert({ auth: serviceAccountAuth,
         calendarId: calendarId,
         resource: {summary: appointment_type +' Appointment', description: appointment_type,
           start: {dateTime: dateTimeStart},
           end: {dateTime: dateTimeEnd}}
       }, (err, event) => {
         err ? reject(err) : resolve(event);
       }
       );
     }
   });
 });
}
  1. מחליפים את <INSERT YOUR CALENDAR ID> במזהה היומן שהעתקתם בקטע הקודם.
  2. מחליפים את <INSERT CONTENTS OF YOUR JSON FILE HERE> בתוכן של קובץ ה-JSON.
  3. (אופציונלי). משנים את const timeZone ואת const timeZoneOffset בהתאם לאזור הזמן של יומן הפגישות.
  4. לוחצים על פריסה.

הפעלת תשובה על ביצוע

  1. עוברים למסוף Dialogflow ולוחצים על Intents (כוונות).
  2. לוחצים על Schedule Appointment Intent (כוונה לתזמן פגישה).
  3. גוללים למטה אל Fulfillment ומפעילים את האפשרות Enable webhook call for the intent.

a5b41336b5249e44.png

  1. לוחצים על שמירה.
  2. לוחצים על פריסה.

7. בדיקת הצ'אטבוט

אתם יכולים לבדוק את הצ'אטבוט באמצעות כלי ההדמיה של פעולות, או להשתמש באינטגרציה עם האינטרנט או עם Google Home שבהן למדתם להשתמש קודם.

  1. משתמש: "Set an appointment for vehicle registration at 2 PM tomorrow".
  2. צ'אטבוט: "אוקיי, אבדוק אם יש לנו אפשרות להוסיף אותך. ‫24 באפריל, בשעה 14:00 זה מצוין!"

96d3784c103daf5e.png

  1. התשובה נרשמת ביומן.

b7da9da814271db8.png

8. הסרת המשאבים

אם אתם מתכננים להשלים עוד סדנאות קוד של Dialogflow, אתם יכולים לדלג על הקטע הזה כרגע ולחזור אליו מאוחר יותר.

מחיקת סוכן Dialogflow

  1. לוחצים על הסמל dc4ac6f9c0ae94e9.png לצד הנציג הקיים.

520c1c6bb9f46ea6.png

  1. בכרטיסייה כללי, גוללים לחלק התחתון ולוחצים על מחיקת הסוכן הזה.
  2. כותבים מחיקה בתיבת הדו-שיח ולוחצים על מחיקה.

9. מזל טוב

יצרתם צ'אט בוט ב-Dialogflow ושילבתם אותו ביומן. הוגדרת כמפתח/ת צ'אטבוטים.

מידע נוסף

למידע נוסף, אפשר לעיין בדוגמאות הקוד בדף Dialogflow Github.