Travaux pratiques: créer une action TV Guide pour l'Assistant Google avec Dialogflow et Actions on Google

1. Introduction

Vous regardez la télévision, mais vous ne trouvez pas la télécommande, ou vous ne voulez peut-être pas consulter chaque chaîne pour savoir s'il y a quelque chose de joli à la télévision ? Demandez à l'Assistant Google ce qu'il y a à la télé ! Dans cet atelier, vous allez créer une action simple à l'aide de Dialogflow et apprendre à l'intégrer à l'Assistant Google.

Les exercices sont organisés selon une approche fréquemment suivie par les développeurs cloud :

  1. Créer un agent Dialogflow v2
  2. Créer une entité personnalisée
  3. Créer des intents
  4. Configurer un webhook avec Firebase Functions
  5. Tester le chatbot
  6. Activer l'intégration de l'Assistant Google

Objectif de cet atelier

Nous allons créer un agent chatbot interactif de guide TV pour l'Assistant Google. Vous pouvez demander au guide TV ce qui est actuellement diffusé sur une chaîne en particulier. Par exemple : "Qu'y a-t-il sur MTV ?" L'action TV Guide vous indique le contenu en cours de lecture et le prochain contenu.

Points abordés

  • Créer un chatbot avec Dialogflow v2
  • Créer des entités personnalisées avec Dialogflow
  • Créer une conversation linéaire avec Dialogflow
  • Configurer des fulfillments webhook avec Dialogflow et Firebase Functions
  • Intégrer votre application à l'Assistant Google avec Actions on Google

Prérequis

  • Pour créer un agent Dialogflow, vous devez disposer d'une adresse Gmail ou Google Identity.
  • Il n'est pas nécessaire de connaître JavaScript de base, mais cela peut s'avérer utile si vous souhaitez modifier le code de traitement du webhook.

2. Configuration

Activer l'activité sur le Web dans votre navigateur

  1. Cliquez sur http://myaccount.google.com/activitycontrols.

  1. Assurez-vous que le Web et Le paramètre "Activité dans les applications" est activé:

bf8d16b828d6f79a.png

Créer un agent Dialogflow

  1. Ouvrir: https://console.dialogflow.com

  1. Dans la barre de gauche, juste sous le logo, sélectionnez Create New Agent (Créer un agent). Si vous avez déjà des agents, cliquez d'abord sur le menu déroulant.

1d7c2b56a1ab95b8.png

  1. Indiquez un nom d'agent: your-name-tvguide (utilisez votre propre nom)

35237b5c5c539ecc.png

  1. Langue par défaut sélectionnée: Français – fr
  2. Sélectionnez le fuseau horaire le plus proche de vous comme fuseau horaire par défaut.
  3. Cliquez sur Créer.

Configurer Dialogflow

  1. Cliquez sur l'icône en forme de roue dentée dans le menu de gauche, à côté du nom de votre projet.

1d7c2b56a1ab95b8.png

  1. Saisissez la description d'agent suivante: My TV Guide

26f262d359c49075.png

  1. Faites défiler la page vers le bas jusqu'à Log Settings (Paramètres des journaux), puis activez les deux options "Log the interactions of Dialogflow" (Consigner les interactions de Dialogflow) et "Consigner toutes les interactions dans Google Cloud Stackdriver". Nous en aurons besoin plus tard, au cas où nous voudrions déboguer notre action.

e80c17acc3cce993.png

  1. Cliquez sur Enregistrer.

Configurer Actions on Google

  1. Cliquez sur le lien Assistant Google dans Découvrez son fonctionnement dans l'Assistant Google dans le panneau de droite.

5a4940338fc351e3.png

La page http://console.actions.google.com s'ouvre.

Si vous découvrez Actions on Google, vous devez d'abord remplir ce formulaire:

3fd4e594fa169072.png

  1. Essayez d'ouvrir votre action dans le simulateur** en cliquant sur le nom du projet.**
  2. Sélectionnez Test dans la barre de menu.

6adb83ffb7adeb78.png

  1. Vérifiez que le simulateur est défini sur English (Anglais) et cliquez sur Talk to my test-app (Parler à mon application test).

L'action vous salue avec l'intent par défaut Dialogflow de base. Cela signifie que l'intégration avec Action on Google a fonctionné !

3. Entités personnalisées

Les entités sont des objets sur lesquels votre application ou votre appareil effectue des actions. Considérez-les comme des paramètres / variables. Dans notre guide TV, nous demandons : "Que se passe-t-il sur MTV ?". MTV est l'entité et la variable. Je pourrais également demander à écouter d'autres chaînes, par exemple "National Geographic". ou "Comedy Central". L'entité collectée sera utilisée comme paramètre dans ma requête adressée au service Web de l'API TV Guide.

Voici plus d'informations sur les entités Dialogflow.

Créer l'entité de la chaîne

  1. Dans la console Dialogflow, cliquez sur l'élément de menu Entities (Entités).
  2. Cliquez sur Créer une entité.
  3. Nom de l'entité: channel (veillez à écrire tout en minuscules)
  4. Transmettez un nom de chaîne. (certaines chaînes auront besoin d'un synonyme si l'Assistant Google comprend autre chose). Vous pouvez utiliser les touches Tabulation et Entrée pendant la saisie. Saisissez le numéro de la chaîne en tant que valeur de référence. Et les noms des chaînes en tant que synonymes, par exemple:
  • 1 - 1, Net 1, Net Station 1

ee4e4955aa77232d.png

5**.** Passez en mode **Raw Edit** (Modification brute) en cliquant sur le bouton de menu à côté du bouton bleu d'enregistrement.

e294b49b123e034f.png

  1. Copier et collez les autres entités au format CSV:
"2","2","Net 2, Net Station 2"
"3","3","Net 3, Net Station 3"
"4","4","RTL 4"
"5","5","Movie Channel"
"6","6","Sports Channel"
"7","7","Comedy Central"
"8","8","Cartoon Network"
"9","9","National Geographic"
"10","10","MTV"

ed78514afd5badef.png

  1. Cliquez sur Enregistrer.

4. Intents

Dialogflow utilise des intents pour classer les intentions d'un utilisateur. Les intents comportent des phrases d'entraînement, qui sont des exemples de ce qu'un utilisateur pourrait dire à votre agent. Par exemple, un utilisateur qui veut savoir ce qu'il y a à la télévision peut demander : "Qu'y a-t-il à la télévision aujourd'hui ?", "Qu'est-ce qui est en cours de lecture ?" ou dites simplement "tvguide".

Lorsqu'un utilisateur écrit ou dit quelque chose (appelé expression utilisateur), Dialogflow fait correspondre cette expression avec l'intent le plus adapté dans votre agent. La mise en correspondance des intents est également appelée classification des intents.

En savoir plus sur les intents Dialogflow

Modifier l'intent d'accueil par défaut

Lorsque vous créez un agent Dialogflow, deux intents par défaut sont automatiquement créés. Default Welcome Intent (Intent d'accueil par défaut) est le premier flux auquel vous accédez lorsque vous démarrez une conversation avec l'agent. Default Fallback Intent (Intent de remplacement par défaut) est le flux que vous obtenez lorsque l'agent ne vous comprend pas ou ne peut pas faire correspondre un intent à ce que vous venez de dire.

  1. Cliquez sur Default Welcome Intent (Intent d'accueil par défaut).

Dans le cas de l'Assistant Google, il démarrera automatiquement avec l'intent d'accueil par défaut. En effet, Dialogflow écoute l'événement de bienvenue. Cependant, vous pouvez également appeler l'intent en énonçant l'une des phrases d'entraînement saisies.

6beee64e8910b85d.png

Voici le message de bienvenue de l'intent d'accueil par défaut:

Utilisateur

Agent

"Ok Google, parle à votre-nom-tvguide."

"Bienvenue, je suis l'agent TV Guide. Je peux vous dire ce qui est en cours de lecture sur une chaîne de télévision. Par exemple, demandez-moi: qu'est-ce qu'il y a sur MTV ?"

  1. Faites défiler la page jusqu'à Réponses.
  2. Effacer toutes les réponses textuelles.
  3. Créez une réponse textuelle contenant le message d'accueil suivant:

Welcome, I am the TV Guide agent. I can tell you what's currently playing on a TV channel. For example, you can ask me: What's on MTV?

84a1110a7f7edba2.png

  1. Cliquez sur Enregistrer.

Créer un intent de test temporaire

À des fins de test, nous allons créer un intent de test temporaire afin de pouvoir tester le webhook ultérieurement.

  1. Cliquez à nouveau sur l'élément de menu Intents.
  2. Cliquez sur Create Intent (Créer un intent).
  3. Saisissez le nom de l'intent: Test Intent (veillez à utiliser un T majuscule et un I majuscule. Si vous écrivez l'intent différemment, le service de backend ne fonctionnera pas.

925e02caa4de6b99.png

  1. Cliquez sur Add Training phrases (Ajouter des phrases d'entraînement).
  • Test my agent
  • Test intent

2e44ddb2fae3c841.png

  1. Cliquez sur Fulfillment > Activer le fulfillment

7eb73ba04d76140e.png

Cette fois, nous ne codons pas la réponse en dur. La réponse proviendra d'une fonction Cloud.

  1. Activez le bouton bascule Enable Webhook call for this intent (Activer l'appel webhook pour cet intent).

748a82d9b4d7d253.png

  1. Cliquez sur Enregistrer.

Créer l'intent de la chaîne

L'intent de chaîne contient cette partie de la conversation:

Utilisateur

Agent

"Qu'y a-t-il sur Comedy Central ?"

""Actuellement sur Comedy Central depuis 18h, la série "Les Simpson" est diffusée. Ensuite, à 19h, les Griffin commenceront."

  1. Cliquez à nouveau sur l'élément de menu Intents.
  2. Cliquez sur Create Intent (Créer un intent).
  3. Saisissez le nom de l'intent: Channel Intent (veillez à utiliser un T majuscule et un I majuscule. Si vous écrivez l'intent différemment, le service de backend ne fonctionnera pas.
  4. Cliquez sur Add Training phrases (Ajouter des phrases d'entraînement) et ajoutez les éléments suivants:
  • What's on MTV?
  • What's playing on Comedy Central?
  • What show will start at 8 PM on National Geographic?
  • What is currently on TV?
  • What is airing now.
  • Anything airing on Net Station 1 right now?
  • What can I watch at 7 PM?
  • What's on channel MTV?
  • What's on TV?
  • Please give me the tv guide.
  • Tell me what is on television.
  • What's on Comedy Central from 10 AM?
  • What will be on tv at noon?
  • Anything on National Geographic?
  • TV Guide

6eee02db02831397.png

  1. Faites défiler la page jusqu'à la section Action et paramètres.

b7e917026760218a.png

Notez la chaîne @channel & Entités @sys.time connues de Dialogflow. Plus tard dans votre webhook, le nom et la valeur du paramètre seront envoyés à votre service Web. Exemple :

channel=8

time=2020-01-29T19:00:00+01:00

  1. Marquez la chaîne comme requise.

Lorsque vous avez une conversation avec l'agent TV Guide, vous devez toujours indiquer le nom du paramètre d'emplacement channel. Si le nom du canal n'a pas été mentionné au début de la conversation, Dialogflow vous demande d'en savoir plus, jusqu'à ce qu'il remplisse tous les emplacements des paramètres. 6f36973fd789c182.png

Lorsque vous y êtes invité, saisissez:

  • For which TV channel do you want to hear the tv guide information?
  • In which TV channel are you interested?

cdb5601ead9423f8.png

  1. Ne définissez pas le paramètre temporel comme requis.

L'heure sera facultative. Si aucune heure n'est spécifiée, le service Web renvoie l'heure actuelle.

  1. Cliquez sur Fulfillment.

Cette fois, nous ne codons pas la réponse en dur. La réponse proviendra de la fonction Cloud. Inversez donc le bouton bascule Enable Webhook call for this intent (Activer l'appel Webhook pour cet intent).

  1. Cliquez sur Enregistrer.

5. Fulfillment webhook

Si votre agent a besoin de plus que des réponses d'intent statiques, vous devez utiliser le fulfillment pour connecter votre service Web à l'agent. La connexion à votre service Web vous permet d'effectuer des actions en fonction des expressions de l'utilisateur et de lui renvoyer des réponses dynamiques. Par exemple, si un utilisateur souhaite recevoir le programme TV de MTV, votre service Web peut vérifier dans votre base de données et répondre à l'utilisateur, le programme de MTV.

  1. Cliquez sur Fulfillment dans le menu principal
  2. Activez le bouton bascule Inline Editor (Éditeur intégré).

cc84351f0d03ab6f.png

Pour tester et implémenter facilement un webhook, vous pouvez utiliser l'éditeur intégré. Il exploite la solution sans serveur Cloud Functions for Firebase.

  1. Cliquez sur l'onglet index.js dans l'éditeur et copiez et collez cet extrait de code JavaScript pour Node.js:
'use strict';

process.env.DEBUG = 'dialogflow:debug';

const {
  dialogflow,
  BasicCard,
  Button,
  Image,
  List
 } = require('actions-on-google');

const functions = require('firebase-functions');
const moment = require('moment');
const TVGUIDE_WEBSERVICE = 'https://tvguide-e4s5ds5dsa-ew.a.run.app/channel';
const { WebhookClient } = require('dialogflow-fulfillment');
var spokenText = '';
var results = null;


/* When the Test Intent gets invoked. */
function testHandler(agent) {
    let spokenText = 'This is a test message, when you see this, it means your webhook fulfillment worked!';

    if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
        let conv = agent.conv();
        conv.ask(spokenText);
        conv.ask(new BasicCard({
            title: `Test Message`,
            subTitle: `Dialogflow Test`,
            image: new Image({
                url: 'https://dummyimage.com/600x400/000/fff',
                alt: 'Image alternate text',
            }),
            text: spokenText,
            buttons: new Button({
                title: 'This is a button',
                url: 'https://assistant.google.com/',
            }),
        }));
        // Add Actions on Google library responses to your agent's response
        agent.add(conv);
    } else {
        agent.add(spokenText);
    }
}

/* When the Channel Intent gets invoked. */
function channelHandler(agent) {
    var jsonResponse = `{"ID":10,"Listings":[{"Title":"Catfish Marathon","Date":"2018-07-13","Time":"11:00:00"},{"Title":"Videoclips","Date":"2018-07-13","Time":"12:00:00"},{"Title":"Pimp my ride","Date":"2018-07-13","Time":"12:30:00"},{"Title":"Jersey Shore","Date":"2018-07-13","Time":"13:00:00"},{"Title":"Jersey Shore","Date":"2018-07-13","Time":"13:30:00"},{"Title":"Daria","Date":"2018-07-13","Time":"13:45:00"},{"Title":"The Real World","Date":"2018-07-13","Time":"14:00:00"},{"Title":"The Osbournes","Date":"2018-07-13","Time":"15:00:00"},{"Title":"Teenwolf","Date":"2018-07-13","Time":"16:00:00"},{"Title":"MTV Unplugged","Date":"2018-07-13","Time":"16:30:00"},{"Title":"Rupauls Drag Race","Date":"2018-07-13","Time":"17:30:00"},{"Title":"Ridiculousness","Date":"2018-07-13","Time":"18:00:00"},{"Title":"Punk'd","Date":"2018-07-13","Time":"19:00:00"},{"Title":"Jersey Shore","Date":"2018-07-13","Time":"20:00:00"},{"Title":"MTV Awards","Date":"2018-07-13","Time":"20:30:00"},{"Title":"Beavis & Butthead","Date":"2018-07-13","Time":"22:00:00"}],"Name":"MTV"}`;
    var results = JSON.parse(jsonResponse);
    var listItems = {};
    spokenText = getSpeech(results);

    for (var i = 0; i < results['Listings'].length; i++) {
        listItems[`SELECT_${i}`] = {
            title: `${getSpokenTime(results['Listings'][i]['Time'])} - ${results['Listings'][i]['Title']}`,
            description: `Channel: ${results['Name']}`
        }
    }
    if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
        let conv = agent.conv();
        conv.ask(spokenText);
        conv.ask(new List({
            title: 'TV Guide',
            items: listItems
        }));
        // Add Actions on Google library responses to your agent's response
        agent.add(conv);
    } else {
        agent.add(spokenText);
    }
}

/**
 * Return a text string to be spoken out by the Google Assistant
 * @param {object} JSON tv results
 */
var getSpeech = function(tvresults) {
    let s = "";
    if(tvresults['Listings'][0]) {
        let channelName = tvresults['Name'];
        let currentlyPlayingTime = getSpokenTime(tvresults['Listings'][0]['Time']);
        let laterPlayingTime = getSpokenTime(tvresults['Listings'][1]['Time']);
        s = `On ${channelName} from ${currentlyPlayingTime}, ${tvresults['Listings'][0]['Title']} is playing.
        Afterwards at ${laterPlayingTime}, ${tvresults['Listings'][1]['Title']} will start.`
    }

    return s;
}

/**
 * Return a natural spoken time
 * @param {string} time in 'HH:mm:ss' format
 * @returns {string} spoken time (like 8 30 pm i.s.o. 20:00:00)
 */
var getSpokenTime = function(time){
    let datetime = moment(time, 'HH:mm:ss');
    let min = moment(datetime).format('m');
    let hour = moment(datetime).format('h');
    let partOfTheDay = moment(datetime).format('a');

    if (min == '0') {
        min = '';
    }

    return `${hour} ${min} ${partOfTheDay}`;
};

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
    var agent = new WebhookClient({ request, response });

    console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
    console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
   
    let channelInput = request.body.queryResult.parameters.channel;
    let requestedTime = request.body.queryResult.parameters.time;
    let url = `${TVGUIDE_WEBSERVICE}/${channelInput}`;

    var intentMap = new Map();
    intentMap.set('Test Intent', testHandler);
    intentMap.set('Channel Intent', channelHandler);
    agent.handleRequest(intentMap);
});

cc84351f0d03ab6f.png

  1. Cliquez sur l'onglet package.json dans l'éditeur et copiez et collez cet extrait de code JSON, qui importe toutes les bibliothèques du gestionnaire de packages Node.js (NPM) :
{
  "name": "tvGuideFulfillment",
  "description": "Requesting TV Guide information from a web service.",
  "version": "1.0.0",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": "8"
  },
  "scripts": {
    "start": "firebase serve --only functions:dialogflowFirebaseFulfillment",
    "deploy": "firebase deploy --only functions:dialogflowFirebaseFulfillment"
  },
  "dependencies": {
    "actions-on-google": "^2.2.0",
    "firebase-admin": "^5.13.1",
    "firebase-functions": "^2.0.2",
    "request": "^2.85.0",
    "request-promise": "^4.2.5",
    "moment" : "^2.24.0",
    "dialogflow-fulfillment": "^0.6.1"
  }
}

af01460c2a023e68.png

  1. Cliquez sur le bouton Deploy (Déployer). Cela prendra un moment, car le déploiement de votre fonction sans serveur est en cours. Au bas de l'écran, un pop-up vous indique votre état.
  2. Testons le webhook pour voir si le code fonctionne. Dans le simulateur de droite, saisissez ce qui suit:

Test my agent.

Lorsque tout est correct, le message "This is a test message" doit s'afficher.

  1. Testons l'intention de la chaîne. Posez maintenant la question:

What's on MTV?

Lorsque tout est correct, le message suivant doit s'afficher:

"Sur MTV à partir de 16h30, il y a MTV Unplugged. Ensuite, à 17h30, la course de dragsters de Rupauls commencera."

Étapes facultatives - Firebase

Si vous effectuez le test avec une autre chaîne, vous remarquerez que les résultats pour "TV" sont identiques. En effet, la fonction Cloud ne récupère pas encore les données d'un serveur Web réel.

Pour ce faire, nous devons établir une connexion réseau sortante.

Si vous souhaitez tester cette application avec un service Web, passez à la formule Firebase Blaze. Remarque: Ces étapes sont facultatives. Vous pouvez également passer aux étapes suivantes de cet atelier pour continuer à tester votre application dans Actions on Google.

  1. Accédez à la console Firebase: https://console.firebase.google.com

  1. En bas de l'écran, appuyez sur le bouton Mettre à niveau.

ad38bc6d07462abf.png

Sélectionnez la formule Blaze dans le pop-up.

  1. Maintenant que nous savons que le webhook fonctionne, nous pouvons continuer et remplacer le code de index.js par le code ci-dessous. Ainsi, vous pourrez demander des informations sur le guide TV au service Web:
'use strict';

process.env.DEBUG = 'dialogflow:debug';

const {
  dialogflow,
  BasicCard,
  Button,
  Image,
  List
 } = require('actions-on-google');

const functions = require('firebase-functions');
const moment = require('moment');
const { WebhookClient } = require('dialogflow-fulfillment');
const rp = require('request-promise');

const TVGUIDE_WEBSERVICE = 'https://tvguide-e4s5ds5dsa-ew.a.run.app/channel';
var spokenText = '';
var results = null;


/* When the Test Intent gets invoked. */
function testHandler(agent) {
    let spokenText = 'This is a test message, when you see this, it means your webhook fulfillment worked!';

    if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
        let conv = agent.conv();
        conv.ask(spokenText);
        conv.ask(new BasicCard({
            title: `Test Message`,
            subTitle: `Dialogflow Test`,
            image: new Image({
                url: 'https://dummyimage.com/600x400/000/fff',
                alt: 'Image alternate text',
            }),
            text: spokenText,
            buttons: new Button({
                title: 'This is a button',
                url: 'https://assistant.google.com/',
            }),
        }));
        // Add Actions on Google library responses to your agent's response
        agent.add(conv);
    } else {
        agent.add(spokenText);
    }
}

/* When the Channel Intent gets invoked. */
function channelHandler(agent) {
    var listItems = {};
    spokenText = getSpeech(results);

    for (var i = 0; i < results['Listings'].length; i++) {
        listItems[`SELECT_${i}`] = {
            title: `${getSpokenTime(results['Listings'][i]['Time'])} - ${results['Listings'][i]['Title']}`,
            description: `Channel: ${results['Name']}`

        }
    }
    if (agent.requestSource === agent.ACTIONS_ON_GOOGLE) {
        let conv = agent.conv();
        conv.ask(spokenText);
        conv.ask(new List({
            title: 'TV Guide',
            items: listItems
        }));
        // Add Actions on Google library responses to your agent's response
        agent.add(conv);
    } else {
        agent.add(spokenText);
    }
}

/**
 * Return a text string to be spoken out by the Google Assistant
 * @param {object} JSON tv results
 */
var getSpeech = function(tvresults) {
    let s = "";
    if(tvresults && tvresults['Listings'][0]) {
        let channelName = tvresults['Name'];
        let currentlyPlayingTime = getSpokenTime(tvresults['Listings'][0]['Time']);
        let laterPlayingTime = getSpokenTime(tvresults['Listings'][1]['Time']);
        s = `On ${channelName} from ${currentlyPlayingTime}, ${tvresults['Listings'][0]['Title']} is playing.
        Afterwards at ${laterPlayingTime}, ${tvresults['Listings'][1]['Title']} will start.`
    }

    return s;
}

/**
 * Return a natural spoken time
 * @param {string} time in 'HH:mm:ss' format
 * @returns {string} spoken time (like 8 30 pm i.s.o. 20:00:00)
 */
var getSpokenTime = function(time){
    let datetime = moment(time, 'HH:mm:ss');
    let min = moment(datetime).format('m');
    let hour = moment(datetime).format('h');
    let partOfTheDay = moment(datetime).format('a');

    if (min == '0') {
        min = '';
    }

    return `${hour} ${min} ${partOfTheDay}`;
};

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
    var agent = new WebhookClient({ request, response });

    console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
    console.log('Dialogflow Request body: ' + JSON.stringify(request.body));
   
    let channelInput = request.body.queryResult.parameters.channel;
    let requestedTime = request.body.queryResult.parameters.time;
    let url = `${TVGUIDE_WEBSERVICE}/${channelInput}`;

    if (requestedTime) {
        console.log(requestedTime);
        let offsetMin = moment().utcOffset(requestedTime)._offset;
        console.log(offsetMin);
        let time = moment(requestedTime).utc().add(offsetMin,'m').format('HH:mm:ss');
        url = `${TVGUIDE_WEBSERVICE}/${channelInput}/${time}`;
      }
    
      console.log(url);
  
      var options = {
          uri: encodeURI(url),
          json: true
      };
       
      // request promise calls an URL and returns the JSON response.
      rp(options)
        .then(function(tvresults) {
            console.log(tvresults);
            // the JSON response, will need to be formatted in 'spoken' text strings.
            spokenText = getSpeech(tvresults);
            results = tvresults;
        })
        .catch(function (err) {
            console.error(err);
        })
        .finally(function(){
            // kick start the Dialogflow app
            // based on an intent match, execute
            var intentMap = new Map();
            intentMap.set('Test Intent', testHandler);
            intentMap.set('Channel Intent', channelHandler);
            agent.handleRequest(intentMap);
        });
});

6. Actions associées à Google

Actions on Google est une plate-forme de développement pour l'Assistant Google. Elle permet le développement tiers d'"actions", c'est-à-dire des applets pour l'Assistant Google qui offrent des fonctionnalités étendues.

Vous devez appeler une action Google en demandant à Google d'ouvrir une application ou de lui parler.

L'action s'ouvre, la voix change, et vous quittez le mode natif. Champ d'application de l'Assistant Google. Autrement dit, vous devez créer toutes les questions que vous posez à l'agent. Vous ne pouvez plus demander soudainement à l'Assistant Google des informations météo Google si c'est ce que vous souhaitez : vous devez d'abord laisser (fermer) la portée de votre action (votre application).

Tester votre action dans le simulateur de l'Assistant Google

Testons la conversation suivante:

Utilisateur

Assistant Google

"Hey Google, parle à your-name-tv-guide."

"Bien sûr. Je vais trouver your-name-tv-guide."

Utilisateur

Agent du guide TV de votre nom

-

"Bienvenue, je suis le guide de la télé..."

Tester mon agent

"Ce message est un message de test. Lorsque vous voyez ceci, cela signifie que le fulfillment de votre webhook a fonctionné."

Qu'y a-t-il sur MTV ?

Sur MTV à partir de 16h30, il y a MTV Unplugged. Ensuite, à 17h30, la course de dragsters de Rupauls commencera.

  1. Revenir au simulateur de l'Assistant Google

Ouvrir: https://console.actions.google.com

  1. Cliquez sur l'icône représentant un micro et posez les questions suivantes:

c3b200803c7ba95e.png

  • Talk to my test agent
  • Test my agent

L'Assistant Google doit répondre en fournissant les informations suivantes:

5d93c6d037c8c8eb.png

  1. Maintenant, demandons:
  • What's on Comedy Central?

Cette opération devrait renvoyer les valeurs ci-dessous :

Les Simpsons sont actuellement diffusés sur Comedy Central à partir de 18h. Ensuite, à 19h, les Griffin commencera.

7. Félicitations

Vous avez créé votre première action dans l'Assistant Google avec Dialogflow. Félicitations !

Comme vous l'avez peut-être remarqué, votre action était exécutée en mode test, qui est associé à votre compte Google. Si vous utilisez le même compte sur votre appareil Nest ou dans l'application Assistant Google sur votre téléphone iOS ou Android, Vous pouvez également tester votre action.

Voici maintenant une démonstration dans un atelier. Toutefois, lorsque vous créez réellement des applications pour l'Assistant Google, vous pouvez envoyer votre action pour approbation. Lisez ce guide pour en savoir plus.

Points abordés

  • Créer un chatbot avec Dialogflow v2
  • Créer des entités personnalisées avec Dialogflow
  • Créer une conversation linéaire avec Dialogflow
  • Configurer des fulfillments webhook avec Dialogflow et Firebase Functions
  • Intégrer votre application à l'Assistant Google avec Actions on Google

Et ensuite ?

Vous avez apprécié cet atelier de programmation ? Découvrez ces ateliers très utiles !

Continuez cet atelier de programmation en l'intégrant à Google Chat:

Créer un guide TV Google Chat à l'aide de G Suite et Dialogflow