Comprendi il fulfillment integrando Dialogflow con Calendar

1. Prima di iniziare

In questo codelab imparerai come Dialogflow si connette ai sistemi di backend per fornire risposte ricche e dinamiche alle domande degli utenti.

Prerequisiti

Prima di procedere, devi completare i seguenti codelab:

  1. Crea un pianificatore di appuntamenti con Dialogflow
  2. Integrare Dialogflow con Actions on Google
  3. Informazioni sulle entità in Dialogflow

Devi anche comprendere i concetti e le strutture di base di Dialogflow, che puoi apprendere dai seguenti video disponibili nel percorso Crea un chatbot con Dialogflow.

Obiettivi didattici

  • Che cos'è il fulfillment
  • Come configurare un service account per Calendar
  • Come configurare Calendar
  • Come attivare l'evasione in Dialogflow
  • Come testare il fulfillment

Cosa creerai

  • Fulfillment utilizzando Cloud Functions
  • Integrazione tra Dialogflow e Calendar

Che cosa ti serve

  • Un browser web e un indirizzo email per accedere alla console Dialogflow
  • Un Account Google per accedere a Calendar

2. Che cos'è l'evasione ordini?

Il fulfillment è un codice implementato come webhook che consente all'agente Dialogflow di chiamare la logica di business in base all'intent. Durante una conversazione, il fulfillment ti consente di utilizzare le informazioni estratte dall'elaborazione del linguaggio naturale di Dialogflow per generare risposte dinamiche o attivare azioni sul backend. La maggior parte degli agenti Dialogflow utilizza l'evasione.

Di seguito sono riportati alcuni esempi di casi in cui puoi utilizzare l'evasione per estendere un agente:

  • Generare risposte dinamiche in base alle informazioni recuperate da un database
  • Per effettuare ordini in base ai prodotti richiesti da un cliente
  • Per implementare le regole e le condizioni di vittoria di un gioco

3. Abilita l'API Calendar

  1. Nella console di Dialogflow, fai clic su d7d792687e597dd5.png.
  2. Nella scheda Generali, scorri fino a ID progetto, quindi fai clic su Google Cloud f2bffd4fcdb84fa9.png.

34be16fcd4c5aeff.png

  1. Nella console Google Cloud, fai clic sul menu di navigazione ☰ > API e servizi > Libreria.
  2. Cerca "API Google Calendar", quindi fai clic su Abilita per utilizzare l'API nel tuo progetto Google Cloud.

4. Configura service account

  1. Fai clic su menu di navigazione ☰ > API e servizi > Credenziali.
  2. Fai clic su Crea credenziali > Service account.

86f51af0e7886fdd.png

  1. In Dettagli service account, inserisci "appointment-scheduler" come Nome service account, quindi fai clic su Crea.

845d25f3e07ff770.png

  1. Nella sezione Concedi a questo service account l'accesso al progetto, fai clic su Continua per saltare il passaggio.
  2. Nella sezione Concedi agli utenti l'accesso a questo service account (facoltativo), fai clic su Crea chiave, quindi seleziona JSON e fai clic su Crea.

Sul computer verrà scaricato un file JSON, che ti servirà nelle sezioni di configurazione successive. a424cec60144d707.png

5. Configurazione di Calendar

  1. Vai a Calendario, poi fai clic su Menu principale ☰ > Aggiungi altri calendari fbc354048b0a2c6c.png> Crea nuovo calendario.

d6ec2fcf0bd2ae22.png

  1. Inserisci "Calendario appuntamenti" come nome del calendario e fai clic su Crea calendario.
  2. Ricarica la pagina, quindi fai clic su Calendario degli appuntamenti, scorri fino a Condividi con persone specifiche, quindi fai clic su Aggiungi persone.
  3. Copia client_email dal file JSON che hai scaricato durante la configurazione dell'account di servizio e incollalo nella finestra di dialogo.

7927f6fa675e3e87.png

  1. Fai clic sul menu a discesa Autorizzazioni, poi su Apporta modifiche agli eventi > Invia.

2ee99d3d15eed97b.png

  1. Sempre in Impostazioni, scorri fino a Integra calendario e copia l'ID calendario.

df8a731f0713c52.png

6. Configurare il fulfillment in Dialogflow

Aggiungere il service account e l'ID calendario all'evasione

  1. Vai all'agente Dialogflow AppointmentScheduler e fai clic su Fulfillment.
  2. Attiva l'editor in linea.

c8574c6ef899393f.png

  1. Aggiorna il file index.js con il seguente codice:
'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. Sostituisci <INSERT YOUR CALENDAR ID> con l'ID calendario che hai copiato nella sezione precedente.
  2. Sostituisci <INSERT CONTENTS OF YOUR JSON FILE HERE> con i contenuti del file JSON.
  3. (Facoltativo) Modifica const timeZone e const timeZoneOffset in base al fuso orario di Calendario appuntamenti.
  4. Fai clic su Esegui il deployment.

Abilita risposta di evasione

  1. Vai alla console Dialogflow e fai clic su Intent.
  2. Fai clic su Intento di pianificazione appuntamento.
  3. Scorri verso il basso fino a Fulfillment e attiva Abilita chiamata webhook per l'intent.

a5b41336b5249e44.png

  1. Fai clic su Salva.
  2. Fai clic su Esegui il deployment.

7. Testare il chatbot

Puoi testare il chatbot nel simulatore di Azioni o utilizzare l'integrazione web o Google Home di cui hai appreso in precedenza.

  1. Utente: "Fissa un appuntamento per l'immatricolazione del veicolo per domani alle 14:00."
  2. Chatbot: "Ok, vediamo se possiamo trovarti un posto. Il 24 aprile alle 14:00 va benissimo."

96d3784c103daf5e.png

  1. Calendar registra la risposta.

b7da9da814271db8.png

8. Esegui la pulizia

Se prevedi di completare altri codelab di Dialogflow, salta questa sezione per ora e torna a completarla in un secondo momento.

Elimina l'agente Dialogflow

  1. Fai clic su dc4ac6f9c0ae94e9.png accanto all'agente esistente.

520c1c6bb9f46ea6.png

  1. Nella scheda Generali, scorri fino in fondo e fai clic su Elimina questo agente.
  2. Digita Elimina nella finestra di dialogo e fai clic su Elimina.

9. Complimenti

Hai creato un chatbot in Dialogflow e lo hai integrato con Calendar. Ora sei uno sviluppatore di chatbot.

Scopri di più

Per saperne di più, consulta gli esempi di codice nella pagina GitHub di Dialogflow.