1. לפני שמתחילים
בשיעור Codelab הזה נסביר איך Dialogflow מתחבר למערכות בק-אנד כדי לספק תשובות מפורטות ודינמיות לשאלות של משתמשים.
דרישות מוקדמות
לפני שממשיכים, צריך להשלים את ה-codelabs הבאים:
- יצירת כלי לקביעת פגישות באמצעות Dialogflow
- שילוב של Dialogflow עם Actions on Google
- הסבר על ישויות ב-Dialogflow
כדאי גם להכיר את המושגים והמבנים הבסיסיים של Dialogflow. אפשר ללמוד עליהם מהסרטונים הבאים שנמצאים בתוכנית הלימודים יצירת צ'אטבוט באמצעות Dialogflow.
מה תלמדו
- מהו מילוי הזמנות
- איך מגדירים חשבון שירות ליומן
- איך מגדירים את היומן
- איך מפעילים מילוי בקשות ב-Dialogflow
- איך בודקים את תהליך השלמת ההזמנה
מה תפַתחו
- השלמת הזמנה באמצעות Cloud Functions
- שילוב בין Dialogflow לבין יומן
הדרישות
- דפדפן אינטרנט וכתובת אימייל כדי להיכנס למסוף Dialogflow
- חשבון Google כדי לגשת ליומן
2. מהו מילוי הזמנות?
ה-fulfillment הוא קוד שמוטמע כ-webhook ומאפשר לסוכן של Dialogflow לקרוא ללוגיקה עסקית על בסיס כוונת המשתמש. במהלך שיחה, מילוי מאפשר לכם להשתמש במידע שחולץ על ידי עיבוד השפה הטבעית של Dialogflow כדי ליצור תשובות דינמיות או להפעיל פעולות בשרת העורפי. רוב הסוכנים של Dialogflow משתמשים ב-fulfillment.
הנה כמה דוגמאות למקרים שבהם אפשר להשתמש בביצוע הזמנה כדי להרחיב את היכולות של סוכן:
- כדי ליצור תשובות דינמיות על סמך מידע שנשלף ממסד נתונים
- כדי לבצע הזמנות על סמך מוצרים שהלקוח ביקש
- כדי להטמיע את הכללים ותנאי הזכייה במשחק
3. הפעלת Calendar API
- ב-Dialogflow console, לוחצים על
. - בכרטיסייה כללי, גוללים אל מזהה הפרויקט ולוחצים על Google Cloud
.
- במסוף Google Cloud, לוחצים על תפריט הניווט ☰ > APIs & Services (ממשקי API ושירותים) > Library (ספרייה).
- מחפשים את Google Calendar API ולוחצים על הפעלה כדי להשתמש ב-API בפרויקט Google Cloud.
4. הגדרה של חשבון שירות
- לוחצים על תפריט הניווט ☰ > APIs & Services (ממשקי API ושירותים) > Credentials (פרטי כניסה).
- לוחצים על Create Credentials (יצירת אמצעי אימות) > Service account (חשבון שירות).

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

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

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

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

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

6. הגדרת מילוי בקשות ב-Dialogflow
הוספה של חשבון שירות ומזהה יומן לניהול ההזמנות
- עוברים לסוכן Dialogflow AppointmentScheduler ולוחצים על Fulfillment (השלמת בקשה).
- מפעילים את העורך המוטבע.

- מעדכנים את הקובץ
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);
}
);
}
});
});
}
- מחליפים את
<INSERT YOUR CALENDAR ID>במזהה היומן שהעתקתם בקטע הקודם. - מחליפים את
<INSERT CONTENTS OF YOUR JSON FILE HERE>בתוכן של קובץ ה-JSON. - (אופציונלי). משנים את const timeZone ואת const timeZoneOffset בהתאם לאזור הזמן של יומן הפגישות.
- לוחצים על פריסה.
הפעלת תשובה על ביצוע
- עוברים למסוף של Dialogflow ולוחצים על Intents (כוונות).
- לוחצים על Schedule Appointment Intent (כוונה לתזמן פגישה).
- גוללים למטה אל Fulfillment ומפעילים את האפשרות Enable webhook call for the intent.

- לוחצים על שמירה.
- לוחצים על פריסה.
7. בדיקת הצ'אטבוט
אתם יכולים לבדוק את הצ'אטבוט בסימולטור הפעולות, או להשתמש באינטגרציה עם האינטרנט או עם Google Home שדיברנו עליה קודם.
- משתמש: "תגדיר פגישה לרישום רכב מחר בשעה 14:00".
- צ'אטבוט: "אוקיי, בוא נבדוק אם אפשר להוסיף אותך. התאריך 24 באפריל בשעה 14:00 מתאים לי".

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

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

- בכרטיסייה כללי, גוללים לחלק התחתון ולוחצים על מחיקת הסוכן הזה.
- כותבים מחיקה בתיבת הדו-שיח ולוחצים על מחיקה.
9. מזל טוב
יצרתם צ'אטבוט ב-Dialogflow ושילבתם אותו עם יומן Google. עכשיו אתם מפתחים של צ'אטבוטים.
מידע נוסף
למידע נוסף, אפשר לעיין בדוגמאות הקוד בדף Dialogflow Github.