Entenda o fulfillment integrando o Dialogflow ao Google Agenda

1. Antes de começar

Neste codelab, você vai aprender como o Dialogflow se conecta com sistemas de back-end para fornecer respostas avançadas e dinâmicas aos perguntas.

Pré-requisitos

Antes de continuar, você precisa concluir os seguintes codelabs:

  1. Criar um agendamento de horários com o Dialogflow
  2. Integrar o Dialogflow com o Actions on Google
  3. Entenda as entidades no Dialogflow

Você também precisa entender os conceitos e construções básicos do Dialogflow, extraídos dos vídeos a seguir no programa Criar um bot de bate-papo com o Dialogflow.

O que você vai aprender

  • O que é atendimento de pedidos
  • Como configurar uma conta de serviço para o Google Agenda
  • Como configurar o Google Agenda
  • Como ativar o fulfillment no Dialogflow
  • Como testar o fulfillment

O que você vai criar

  • Fulfillment usando o Cloud Functions
  • Uma integração entre o Dialogflow e o Google Agenda

O que é necessário

  • Um navegador da Web e um endereço de e-mail para fazer login no console do Dialogflow
  • Uma Conta do Google para acessar o Google Agenda

2. O que é atendimento de pedidos?

Fulfillment é o código implantado como um webhook que permite que o agente do Dialogflow chame a lógica de negócios de intent a intent. Durante uma conversa, o fulfillment permite que você use as informações extraídas pelo processamento de linguagem natural do Dialogflow para gerar respostas dinâmicas ou acionar ações no back-end. A maioria dos agentes do Dialogflow usa fulfillment.

Confira a seguir alguns exemplos de quando é possível usar o fulfillment para estender um agente:

  • Gerar respostas dinâmicas com base nas informações pesquisadas em um banco de dados.
  • Para fazer pedidos com base nos produtos que um cliente pediu
  • Para implementar as regras e condições vencedoras para um jogo

3. Ativar a API Calendar

  1. No Console do Dialogflow, clique em d7d792687e597dd5.png.
  2. Na guia Geral, role até ID do projeto e clique em Google Cloud f2bffd4fcdb84fa9.png.

34be16fcd4c5aeff.png

  1. No console do Google Cloud, clique em Menu de navegação ☰ > APIs e Serviços > Biblioteca.
  2. Pesquise "API Google Calendar" Depois clique em Ativar para usar a API no projeto do Google Cloud.

4. Configurar conta de serviço

  1. Clique em Menu de navegação ☰ > APIs e Serviços > Credenciais.
  2. Clique em Criar credenciais > Conta de serviço.

86f51af0e7886fdd.png

  1. Em Detalhes da conta de serviço, digite "appointment-scheduler". como o Nome da conta de serviço e, em seguida, clique em Criar.

845d25f3e07ff770.png

  1. Em Conceda a essa conta de serviço acesso ao projeto, clique em Continuar para ignorar.
  2. Em Conceda aos usuários acesso a essa conta de serviço (opcional), clique em Criar chave, selecione JSON e clique em Criar.

Um arquivo JSON será salvo no seu computador e será necessário nas próximas seções de configuração. a424cec60144d707.png

5. Configuração do Google Agenda

  1. Acesse o Google Agenda e clique em Menu principal ☰ > Adicionar outras agendas fbc354048b0a2c6c.png> Criar nova agenda.

d6ec2fcf0bd2ae22.png

  1. Digite "Agenda de horários" como o nome da agenda e clique em Criar agenda.
  2. Atualize a página, clique em Agenda de horários, role até Compartilhar com pessoas específicas e clique em Adicionar pessoas.
  3. Copie o client_email do arquivo JSON que você salvou como parte da configuração da conta de serviço e cole-o na caixa de diálogo.

7927f6fa675e3e87.png

  1. Clique na lista suspensa Permissões e em Fazer alterações nos eventos > Enviar.

2ee99d3d15eed97b.png

  1. Ainda em Configurações, role até Integrar agenda e copie o ID da agenda.

df8a731f0713c52.png

6. Configure o fulfillment no Dialogflow

Adicionar conta de serviço e ID da agenda ao fulfillment

  1. Navegue até o agente AppointmentScheduler do Dialogflow e clique em Fulfillment.
  2. Ative o Editor in-line.

c8574c6ef899393f.png

  1. Atualize o arquivo index.js com o seguinte código:
'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. Substitua <INSERT YOUR CALENDAR ID> pelo ID da agenda copiado na seção anterior.
  2. Substitua <INSERT CONTENTS OF YOUR JSON FILE HERE> pelo conteúdo do arquivo JSON.
  3. Opcional. Mude const timeZone e const timeZoneZone de acordo com o fuso horário da Agenda de horários.
  4. Clique em Implantar.

Ativar resposta de fulfillment

  1. Navegue até o console do Dialogflow e clique em Intents.
  2. Clique em Programar intent de agendamento.
  3. Role para baixo até Fulfillment e ative a opção Enable webhook call for the intent (Ativar chamada de webhook para a intent).

a5b41336b5249e44.png

  1. Clique em Salvar.
  2. Clique em Implantar.

7. Teste o chatbot

É possível testar o chatbot no simulador do Actions ou usar a integração com a Web ou o Google Home que você já conheceu.

  1. Usuário: "Agende o registro de veículos às 14h de amanhã."
  2. Bot de bate-papo: "Ok, vamos ver se podemos encaixar você. 24 de abril, as 14h está tudo bem!"

96d3784c103daf5e.png

  1. O Google Agenda reserva a resposta.

b7da9da814271db8.png

8. Limpar

Se você planeja concluir outros codelabs do Dialogflow, pule esta seção por enquanto e volte mais tarde.

Exclua o agente do Dialogflow

  1. Clique no dc4ac6f9c0ae94e9.png ao lado do agente.

520c1c6bb9f46ea6.png

  1. Na guia General, role até a parte inferior e clique em Delete This Agent.
  2. Digite Excluir na caixa de diálogo e clique em Excluir.

9. Parabéns

Você criou um chatbot no Dialogflow e o integrou ao Google Agenda. Você já sabe como desenvolver um chatbot.

Saiba mais

Para saber mais, confira os exemplos de código na página do Dialogflow no GitHub.