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:
- Crea un pianificatore di appuntamenti con Dialogflow
- Integrare Dialogflow con Actions on Google
- 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
- Nella console di Dialogflow, fai clic su
. - Nella scheda Generali, scorri fino a ID progetto, quindi fai clic su Google Cloud
.

- Nella console Google Cloud, fai clic sul menu di navigazione ☰ > API e servizi > Libreria.
- Cerca "API Google Calendar", quindi fai clic su Abilita per utilizzare l'API nel tuo progetto Google Cloud.
4. Configura service account
- Fai clic su menu di navigazione ☰ > API e servizi > Credenziali.
- Fai clic su Crea credenziali > Service account.

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

- Nella sezione Concedi a questo service account l'accesso al progetto, fai clic su Continua per saltare il passaggio.
- 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. 
5. Configurazione di Calendar
- Vai a Calendario, poi fai clic su Menu principale ☰ > Aggiungi altri calendari
> Crea nuovo calendario.

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

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

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

6. Configurare il fulfillment in Dialogflow
Aggiungere il service account e l'ID calendario all'evasione
- Vai all'agente Dialogflow AppointmentScheduler e fai clic su Fulfillment.
- Attiva l'editor in linea.

- Aggiorna il file
index.jscon 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);
}
);
}
});
});
}
- Sostituisci
<INSERT YOUR CALENDAR ID>con l'ID calendario che hai copiato nella sezione precedente. - Sostituisci
<INSERT CONTENTS OF YOUR JSON FILE HERE>con i contenuti del file JSON. - (Facoltativo) Modifica const timeZone e const timeZoneOffset in base al fuso orario di Calendario appuntamenti.
- Fai clic su Esegui il deployment.
Abilita risposta di evasione
- Vai alla console Dialogflow e fai clic su Intent.
- Fai clic su Intento di pianificazione appuntamento.
- Scorri verso il basso fino a Fulfillment e attiva Abilita chiamata webhook per l'intent.

- Fai clic su Salva.
- 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.
- Utente: "Fissa un appuntamento per l'immatricolazione del veicolo per domani alle 14:00."
- Chatbot: "Ok, vediamo se possiamo trovarti un posto. Il 24 aprile alle 14:00 va benissimo."

- Calendar registra la risposta.

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
- Fai clic su
accanto all'agente esistente.

- Nella scheda Generali, scorri fino in fondo e fai clic su Elimina questo agente.
- 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.