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

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

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

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

כדי להמשיך, עליכם להשלים את ה-Codelabs הבאים:

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

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

מה תלמדו

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

מה תפַתחו

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

למה תזדקק?

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

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

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

ברשימה הבאה מפורטות דוגמאות למקרים שבהם אפשר להשתמש במילוי האוטומטי כדי לצרף נציג:

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

3. הפעלת Calendar API

  1. במסוף של Dialogflow, לוחצים על d7d792687e597dd5.png.
  2. בכרטיסייה General, גוללים אל Project ID ולוחצים על Google Cloud f2bffd4fcdb84fa9.png.

34be16fcd4c5aeff.png

  1. במסוף Google Cloud, לוחצים על תפריט הניווט TODO > ממשקי API שירותים > ספרייה.
  2. מחפשים את Google Calendar API, לוחצים על Enable כדי להשתמש ב-API בפרויקט ב-Google Cloud.

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

  1. לוחצים על תפריט הניווט myactivity > ממשקי API שירותים > פרטי כניסה.
  2. לוחצים על Create Credentials > חשבון שירות.

86f51af0e7886fdd.png

  1. בקטע Service account details (פרטי חשבון השירות), מזינים 'appointment-Scheduler' בתור Service account name, ולאחר מכן לוחצים על Create.

845d25f3e07ff770.png

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

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

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

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

d6ec2fcf0bd2ae22.png

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

7927f6fa675e3e87.png

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

2ee99d3d15eed97b.png

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

df8a731f0713c52.png

6. איך מגדירים מילוי הזמנה ב-Dialogflow

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

  1. עוברים לנציג של AppointmentScheduler של Dialogflow ולוחצים על 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. לוחצים על Deploy (פריסה).

הפעלת התשובה להזמנה

  1. נכנסים למסוף Dialogflow ולוחצים על Intents.
  2. לוחצים על קביעת כוונה לפגישה.
  3. גוללים למטה אל מילוי ומפעילים את האפשרות הפעלת קריאה לפעולה מאתר אחר (webhook) עבור Intent.

a5b41336b5249e44.png

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

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

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

  1. משתמש: "Set a meeting for an Vehicle registration at 2 PM tomorrow"
  2. צ'אט בוט: "אוקיי, אבדוק אם נוכל להתאים לך. זה בסדר, 24 באפריל, 14:00!"

96d3784c103daf5e.png

  1. היומן יזמין את התשובה.

b7da9da814271db8.png

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

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

מחיקת הנציג של Dialogflow

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

520c1c6bb9f46ea6.png

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

9. מזל טוב

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

מידע נוסף

מידע נוסף זמין בדוגמאות בדף Dialogflow GitHub.