1. Introduction
Dans cet article, nous allons découvrir comment Dialogflow se connecte à BigQuery et stocke les informations collectées lors de l'expérience conversationnelle. Nous allons utiliser le même agent que celui que nous avons créé dans les ateliers précédents " Planificateur de rendez-vous". Dans le projet GCP de l'agent, nous allons créer un ensemble de données et une table dans BigQuery. Nous allons ensuite modifier l'exécution d'origine avec les ID de l'ensemble de données et de la table BigQuery. Enfin, nous allons tester si les interactions sont enregistrées dans BigQuery.
Voici le diagramme de séquence des événements, de l'utilisateur à l'exécution et à BigQuery.

Points abordés
- Créer un ensemble de données et une table dans BigQuery
- Configurer les informations de connexion BigQuery dans le traitement Dialogflow
- Tester le fulfillment
Prérequis
- Concepts et constructs de base de Dialogflow. Pour des tutoriels vidéo d'introduction à Dialogflow qui couvrent la conception de conversations de base, consultez les vidéos suivantes :
- Créez un chatbot de planification de rendez-vous à l'aide de Dialogflow.
- Comprendre les entités dans Dialogflow
- Traitement : intégrer Dialogflow à Google Agenda.
2. Créer un ensemble de données et une table dans BigQuery
- Accédez à la console Google Cloud.
- Dans la console Cloud, accédez à l'icône de menu ☰ > Big Data > BigQuery.
- Sous "Ressources" dans le volet de gauche, cliquez sur l'ID du projet. Une fois sélectionné, vous verrez "CRÉER UN ENSEMBLE DE DONNÉES" sur la droite.
- Cliquez sur CRÉER UN ENSEMBLE DE DONNÉES et donnez-lui un nom.

- Une fois l'ensemble de données créé, cliquez dessus dans le panneau de gauche. L'option "CREATE TABLE" (CRÉER UNE TABLE) s'affiche sur la droite.
- Cliquez sur "CRÉER UNE TABLE", saisissez le nom de la table, puis cliquez sur "Créer une table" en bas de l'écran.

- Une fois la table créée, cliquez dessus dans le panneau de gauche. Le bouton Modifier le schéma s'affiche sur la droite.
- Cliquez sur le bouton "Modifier le schéma", puis sur le bouton "Ajouter un champ". Ajoutez le champ date, puis répétez l'opération pour les champs time et type.
- Notez les valeurs DatasetID et tableID.

3. Ajouter les détails de la connexion BigQuery à Dialogflow Fulfillment
- Ouvrez l'agent Dialogflow et activez l'éditeur intégré de fulfillment. Si vous avez besoin d'aide, reportez-vous à l'atelier précédent .
- Assurez-vous que le fichier package.json de l'éditeur intégré de fulfillment Dialogflow contient une dépendance BigQuery. "@google-cloud/bigquery": "0.12.0". Assurez-vous d'utiliser la dernière version de BigQuery lorsque vous suivez cet article.
- Dans index.js, créez la fonction addToBigQuery pour ajouter la date, l'heure et le type de rendez-vous dans la table BigQuery.
- Ajoutez projectID, datasetID et tableID dans la section "TODO" du fichier index.js pour connecter correctement votre table et votre ensemble de données BigQuery à votre traitement.
{
"name": "dialogflowFirebaseFulfillment",
"description": "Dialogflow fulfillment for the bike shop sample",
"version": "0.0.1",
"private": true,
"license": "Apache Version 2.0",
"author": "Google Inc.",
"engines": {
"node": "6"
},
"scripts": {
"lint": "semistandard --fix \"**/*.js\"",
"start": "firebase deploy --only functions",
"deploy": "firebase deploy --only functions"
},
"dependencies": {
"firebase-functions": "2.0.2",
"firebase-admin": "^5.13.1",
"actions-on-google": "2.2.0",
"googleapis": "^27.0.0",
"dialogflow-fulfillment": "0.5.0",
"@google-cloud/bigquery": "^0.12.0"
}
}
'use strict';
const functions = require('firebase-functions');
const {google} = require('googleapis');
const {WebhookClient} = require('dialogflow-fulfillment');
const BIGQUERY = require('@google-cloud/bigquery');
// Enter your calendar ID below and service account JSON below
const calendarId = "XXXXXXXXXXXXXXXXXX@group.calendar.google.com";
const serviceAccount = {}; // 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';
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
const agent = new WebhookClient({ request, response });
console.log("Parameters", agent.parameters);
const appointment_type = agent.parameters.AppointmentType;
// Function to create appointment in calendar
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!.`);
// Insert data into a table
addToBigQuery(agent, appointment_type);
}).catch(() => {
agent.add(`I'm sorry, there are no slots available for ${appointmentTimeString}.`);
});
}
let intentMap = new Map();
intentMap.set('Schedule Appointment', makeAppointment);
agent.handleRequest(intentMap);
});
//Add data to BigQuery
function addToBigQuery(agent, appointment_type) {
const date_bq = agent.parameters.date.split('T')[0];
const time_bq = agent.parameters.time.split('T')[1].split('-')[0];
/**
* TODO(developer): Uncomment the following lines before running the sample.
*/
//const projectId = '<INSERT your own project ID here>';
//const datasetId = "<INSERT your own dataset name here>";
//const tableId = "<INSERT your own table name here>";
const bigquery = new BIGQUERY({
projectId: projectId
});
const rows = [{date: date_bq, time: time_bq, type: appointment_type}];
bigquery
.dataset(datasetId)
.table(tableId)
.insert(rows)
.then(() => {
console.log(`Inserted ${rows.length} rows`);
})
.catch(err => {
if (err && err.name === 'PartialFailureError') {
if (err.errors && err.errors.length > 0) {
console.log('Insert errors:');
err.errors.forEach(err => console.error(err));
}
} else {
console.error('ERROR:', err);
}
});
agent.add(`Added ${date_bq} and ${time_bq} into the table`);
}
// Function to create appointment 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);
}
);
}
});
});
}
Comprendre la séquence d'événements à partir du code
- La carte d'intent appelle la fonction makeAppointment pour planifier un rendez-vous dans Google Agenda.
- Dans la même fonction, un appel est effectué à la fonction addToBigQuery pour envoyer les données à enregistrer dans BigQuery.
4. Testez votre chatbot et la table BigQuery.
Testons notre chatbot. Vous pouvez le tester dans le simulateur ou utiliser l'intégration Web ou Google Home que nous avons apprise dans les articles précédents.
- Utilisateur : "Prends rendez-vous pour l'immatriculation du véhicule à 14h demain"
- Réponse du chatbot : "Ok, voyons si nous pouvons vous trouver une place. Le 6 août à 14h me convient."

- Vérifiez la table BigQuery après la réponse. Utiliser la requête "SELECT * FROM
projectID.datasetID.tableID"

5. Nettoyage
Si vous prévoyez de suivre les autres ateliers de cette série, ne procédez pas au nettoyage maintenant. Faites-le une fois que vous aurez terminé tous les ateliers de la série.
Supprimer l'agent Dialogflow
- Cliquez sur l'icône en forme de roue dentée
à côté de votre agent existant.

- Dans l'onglet Général, faites défiler la page jusqu'en bas, puis cliquez sur Supprimer cet agent.
- Saisissez SUPPRIMER dans la fenêtre qui s'affiche, puis cliquez sur Supprimer.
6. Félicitations !
Vous avez créé un chatbot et l'avez intégré à BigQuery pour obtenir des insights. Vous êtes maintenant développeur de chatbots !
Consultez ces ressources supplémentaires :
- Consultez les exemples de code sur la page Dialogflow GitHub.
