Entenda o fulfillment integrando o Dialogflow ao Google Agenda

1. Antes de começar

Neste codelab, você vai aprender como o Dialogflow se conecta a sistemas de back-end para fornecer respostas avançadas e dinâmicas às perguntas dos usuários.

Pré-requisitos

Antes de continuar, conclua os seguintes codelabs:

  1. Criar um agendador de consultas com o Dialogflow
  2. Integrar o Dialogflow ao Actions on Google
  3. Entenda as entidades no Dialogflow

Você também precisa entender os conceitos e construções básicos do Dialogflow, que podem ser aprendidos nos vídeos a seguir, encontrados no programa de treinamentos Criar um chatbot com o Dialogflow.

O que você vai aprender

  • O que é fulfillment
  • 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?

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 usar 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 o fulfillment.

Confira abaixo alguns exemplos de quando usar o fulfillment para ampliar um agente:

  • Para gerar respostas dinâmicas com base nas informações pesquisadas em um banco de dados
  • Para fazer pedidos com base nos produtos solicitados por um cliente
  • Para implementar regras e condições para vencer 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 do Google Agenda" e clique em Ativar para usar a API no projeto na nuvem 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, insira "appointment-scheduler" como o Nome da conta de serviço e clique em Criar.

845d25f3e07ff770.png

  1. Onde diz 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á baixado no seu computador, e você vai precisar dele nas próximas seções de configuração. a424cec60144d707.png

5. Configuração da Agenda

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

d6ec2fcf0bd2ae22.png

  1. Digite "Agenda de compromissos" como nome da agenda e clique em Criar agenda.
  2. Recarregue 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ê baixou como parte da configuração da conta de serviço e cole na caixa de diálogo.

7927f6fa675e3e87.png

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

2ee99d3d15eed97b.png

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

df8a731f0713c52.png

6. Configurar o fulfillment no Dialogflow

Adicionar conta de serviço e ID do Google Agenda ao atendimento

  1. Navegue até o agente do Dialogflow AppointmentScheduler 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 do Google Agenda que você copiou 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 timeZoneOffset de acordo com o fuso horário da Agenda de compromissos.
  4. Clique em Implantar.

Ativar resposta de fulfillment

  1. Acesse o console do Dialogflow e clique em Intents.
  2. Clique em Intent de agendamento de horário.
  3. Role para baixo até Fulfillment e ative a opção Ativar chamada de webhook para a intent.

a5b41336b5249e44.png

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

7. Teste o chatbot

Você pode testar o chatbot no simulador do Actions on Google ou usar a integração com a Web ou o Google Home que você aprendeu antes.

  1. Usuário: "Marque um horário para o registro do veículo às 14h de amanhã."
  2. Bot de bate-papo: "Ok, vamos ver se consigo encaixar você. 24 de abril, às 14h, está ótimo!"

96d3784c103daf5e.png

  1. A Agenda agenda a resposta.

b7da9da814271db8.png

8. Limpar

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

Excluir o agente do Dialogflow

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

520c1c6bb9f46ea6.png

  1. Na guia Geral, role até a parte de baixo e clique em Excluir este agente.
  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.