Понимание выполнения заказов путем интеграции Dialogflow с Calendar

1. Прежде чем начать

В этом практическом занятии вы узнаете, как Dialogflow взаимодействует с бэкэнд-системами, чтобы предоставлять пользователям подробные и динамичные ответы на их вопросы.

Предварительные требования

Прежде чем продолжить, вам необходимо выполнить следующие практические задания:

  1. Создайте планировщик встреч с помощью Dialogflow.
  2. Интегрируйте Dialogflow с Actions on Google.
  3. Понимание сущностей в Dialogflow

Вам также необходимо понимать основные концепции и принципы работы Dialogflow, которые вы можете изучить в следующих видеороликах, входящих в курс «Создание чат-бота с помощью Dialogflow» .

Что вы узнаете

  • Что такое исполнение желаний?
  • Как настроить служебную учетную запись для календаря
  • Как настроить календарь
  • Как включить выполнение заказов в Dialogflow
  • Как проверить выполнение

Что вы построите

  • Выполнение заказов с использованием облачных функций
  • Интеграция между Dialogflow и Calendar

Что вам понадобится

  • Для входа в консоль Dialogflow вам потребуется веб-браузер и адрес электронной почты.
  • Для доступа к календарю потребуется учетная запись Google.

2. Что такое исполнение желаний?

Функция выполнения (Fulfillment) — это код, развернутый в виде веб-хука, который позволяет вашему агенту Dialogflow вызывать бизнес-логику для каждого намерения отдельно. Во время диалога функция выполнения позволяет использовать информацию, извлеченную обработкой естественного языка Dialogflow, для генерации динамических ответов или запуска действий на вашем бэкэнде. Большинство агентов Dialogflow используют функцию выполнения.

Ниже приведены несколько примеров того, когда можно использовать функцию выполнения для расширения возможностей агента:

  • Для генерации динамических ответов на основе информации, полученной из базы данных.
  • Размещать заказы на товары, которые запросил клиент.
  • Внедрить правила и условия победы в игре.

3. Включите API календаря.

  1. В консоли Dialogflow нажмите d7d792687e597dd5.png .
  2. На вкладке «Общие» прокрутите до раздела «Идентификатор проекта» , затем нажмите «Google Cloud». f2bffd4fcdb84fa9.png .

34be16fcd4c5aeff.png

  1. В консоли Google Cloud перейдите в меню навигации ☰ > API и сервисы > Библиотека .
  2. Найдите "Google Calendar API", затем нажмите " Включить" , чтобы использовать API в своем проекте Google Cloud.

4. Настройка служебной учетной записи

  1. Нажмите меню навигации ☰ > API и сервисы > Учетные данные .
  2. Нажмите «Создать учетные данные» > «Учетная запись службы» .

86f51af0e7886fdd.png

  1. В сведениях об учетной записи службы введите «appointment-scheduler» в качестве имени учетной записи службы , затем нажмите «Создать» .

845d25f3e07ff770.png

  1. В поле «Предоставить этой учетной записи службы доступ к проекту» нажмите «Продолжить» , чтобы пропустить этот шаг.
  2. В поле « Предоставить пользователям доступ к этой учетной записи службы (необязательно)» нажмите «Создать ключ» , затем выберите JSON и нажмите «Создать» .

На ваш компьютер будет загружен 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 и нажмите «Выполнение» .
  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. (Необязательно.) Измените значения констант timeZone и const timeZoneOffset в соответствии с часовым поясом для календаря встреч .
  4. Нажмите «Развернуть» .

Включить ответ на запрос выполнения

  1. Перейдите в консоль Dialogflow и нажмите «Интенты» .
  2. Нажмите «Запланировать встречу» .
  3. Прокрутите вниз до раздела «Выполнение» и включите параметр «Включить вызов веб-перехватчика для намерения» .

a5b41336b5249e44.png

  1. Нажмите « Сохранить ».
  2. Нажмите «Развернуть» .

7. Протестируйте своего чат-бота.

Вы можете протестировать своего чат-бота в симуляторе Actions или использовать интеграцию с веб-браузером или Google Home, о которой вы узнали ранее.

  1. Пользователь: «Записалась на регистрацию транспортного средства на завтра в 14:00».
  2. Чат-бот: "Хорошо, давайте посмотрим, сможем ли мы вас принять. 24 апреля, 14:00 — подходящее время!"

96d3784c103daf5e.png

  1. Календарь фиксирует ответ.

b7da9da814271db8.png

8. Уборка

Если вы планируете пройти другие практические занятия по Dialogflow, то пропустите этот раздел и вернитесь к нему позже.

Удалите агент Dialogflow.

  1. Нажмите dc4ac6f9c0ae94e9.png рядом с вашим текущим агентом.

520c1c6bb9f46ea6.png

  1. На вкладке «Общие» прокрутите вниз и нажмите «Удалить этого агента» .
  2. Введите «Delete» в диалоговое окно и нажмите «Delete» .

9. Поздравляем!

Вы создали чат-бота в Dialogflow и интегрировали его с Calendar. Теперь вы разработчик чат-ботов!

Узнать больше

Чтобы узнать больше, ознакомьтесь с примерами кода на странице Dialogflow в GitHub .