Práctica: Crea una acción de guía de TV para el Asistente de Google con Dialogflow y Actions on Google

1. Introducción

¿Estás mirando la TV, pero no encuentras el control remoto? ¿O tal vez no quieres visitar cada canal de TV para saber si hay algo interesante en la televisión? Preguntémosle al Asistente de Google qué hay en la TV. En este lab, compilarás una acción simple con Dialogflow y aprenderás a integrarla con el Asistente de Google.

Los ejercicios están ordenados para reflejar una experiencia común de desarrollador de la nube:

  1. Crea un agente de Dialogflow v2
  2. Crea una entidad personalizada
  3. Crea intents
  4. Configura un webhook con Firebase Functions
  5. Prueba el chatbot
  6. Habilita la integración de Asistente de Google

Qué compilarás

Compilaremos un agente de chatbot interactivo de guía de TV para Asistente de Google. Puedes preguntarle a la guía de TV qué se está transmitiendo en un canal en particular. Por ejemplo, "¿Qué hay en MTV?". La acción de la guía de TV te dirá qué se está reproduciendo y qué se reproducirá a continuación.

Qué aprenderás

  • Cómo crear un chatbot con Dialogflow v2
  • Cómo crear entidades personalizadas con Dialogflow
  • Cómo crear una conversación lineal con Dialogflow
  • Cómo configurar entregas con webhook con Dialogflow y Firebase Functions
  • Cómo llevar tu aplicación al Asistente de Google con Actions on Google

Requisitos previos

  • Necesitarás una identidad de Google o una dirección de Gmail para crear un agente de Dialogflow.
  • No se requieren conocimientos básicos de JavaScript, pero pueden ser útiles en caso de que desees cambiar el código de cumplimiento del webhook.

2. Cómo prepararte

Cómo habilitar la Actividad web en tu navegador

  1. Haz clic en: http://myaccount.google.com/activitycontrols

  1. Asegúrate de que la Actividad web y de aplicaciones esté habilitada:

bf8d16b828d6f79a.png

Crea un agente de Dialogflow

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

  1. En la barra izquierda, justo debajo del logotipo, selecciona "Create New Agent". Si ya tienes agentes, primero haz clic en el menú desplegable.

1d7c2b56a1ab95b8.png

  1. Especifica un nombre de agente: your-name-tvguide (usa tu propio nombre).

35237b5c5c539ecc.png

  1. Como idioma predeterminado, elige Inglés - en.
  2. Como zona horaria predeterminada, elige la más cercana a ti.
  3. Haz clic en Create.

Configura Dialogflow

  1. Haz clic en el ícono de ajustes, en el menú de la izquierda, junto al nombre de tu proyecto.

1d7c2b56a1ab95b8.png

  1. Ingresa la siguiente descripción del agente: Mi guía de TV

26f262d359c49075.png

  1. Desplázate hacia abajo hasta Log Settings y activa ambos interruptores para registrar las interacciones de Dialogflow y todas las interacciones en Google Cloud Stackdriver. La necesitaremos más adelante, en caso de que queramos depurar nuestra acción.

e80c17acc3cce993.png

  1. Haga clic en Guardar.

Configura Actions on Google

  1. Haz clic en el vínculo Asistente de Google en Descubre cómo funciona en Asistente de Google en el panel de la derecha.

5a4940338fc351e3.png

Se abrirá http://console.actions.google.com.

Si es la primera vez que usas Acciones en Google, primero deberás completar este formulario:

3fd4e594fa169072.png

  1. Intenta abrir tu acción en el simulador** haciendo clic en el nombre del proyecto.**
  2. Selecciona Test en la barra de menú.

6adb83ffb7adeb78.png

  1. Asegúrate de que el simulador esté configurado en inglés y haz clic en Hablar con mi app de prueba.

La acción te saludará con el intent predeterminado básico de Dialogflow. Esto significa que la configuración de la integración con Action on Google funcionó.

3. Entidades personalizadas

Las entidades son objetos sobre los que tu app o dispositivo realizan acciones. Piensa en ellos como parámetros o variables. En nuestra Guía de TV, preguntaremos: "¿Qué hay en MTV?". El MTV es la entidad y la variable. También podría pedir otros canales, como "National Geographic" o "Comedy Central". La entidad recopilada se usará como parámetro en mi solicitud al servicio web de la API de la Guía de TV.

Aquí encontrarás más información sobre las entidades de Dialogflow.

Cómo crear la entidad del canal

  1. En la consola de Dialogflow, haz clic en el elemento de menú Entities.
  2. Haz clic en Crear entidad.
  3. Nombre de la entidad: channel (asegúrate de que esté todo en minúsculas)
  4. Pasa un nombre de canal. (algunos canales necesitarán un sinónimo en caso de que Asistente de Google entienda otra cosa). Puedes usar las teclas Tab y Intro mientras escribes. Ingresa el número de canal como un valor de referencia. Y los nombres de los canales como sinónimos, por ejemplo:
  • 1 - 1, Net 1, Net Station 1

ee4e4955aa77232d.png

5**.** Haz clic en el botón de menú junto al botón azul de guardar para cambiar al modo **Edición sin procesar**.

e294b49b123e034f.png

  1. Copia y pega las otras entidades en formato 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. Haz clic en Guardar.

4. Intents

Dialogflow usa intents para categorizar las intenciones del usuario. Los intents incluyen frases de entrenamiento, que son ejemplos de lo que un usuario podría decirle a tu agente. Por ejemplo, un usuario que quiere saber qué hay en la TV podría preguntar: "¿Qué hay en la TV hoy?". "¿Qué se está reproduciendo?" o simplemente di "guía de TV".

Cuando un usuario escribe o dice algo, lo que se denomina expresión del usuario, Dialogflow hace coincidir la expresión del usuario con el mejor intent en tu agente. La búsqueda de intents coincidentes también se conoce como clasificación de intent.

Aquí encontrarás más información sobre las intenciones de Dialogflow.

Cómo modificar el intent de bienvenida predeterminado

Cuando creas un agente de Dialogflow nuevo, se crean automáticamente dos intents predeterminados. El intent de bienvenida predeterminado es el primer flujo al que accedes cuando inicias una conversación con el agente. El intent alternativo predeterminado es el flujo que obtendrás cuando el agente no pueda comprenderte o no pueda hacer coincidir un intent con lo que acabas de decir.

  1. Haz clic en Default Welcome Intent.

En el caso de Asistente de Google, se iniciará automáticamente con el intent de bienvenida predeterminado. Esto se debe a que Dialogflow está detectando el evento de bienvenida. Sin embargo, también puedes invocar el intent diciendo una de las frases de entrenamiento ingresadas.

6beee64e8910b85d.png

Este es el mensaje de bienvenida para el intent de bienvenida predeterminado:

Usuario

Agent

"Ok Google, habla con tu-nombre-tvguide".

"Bienvenido. Soy el agente de la guía de TV. Puedo decirte qué se está reproduciendo en un canal de TV. Por ejemplo, puedes preguntarme: "¿Qué hay en MTV?".

  1. Desplázate hacia abajo hasta Respuestas.
  2. Borra todas las respuestas de texto.
  3. Crea una nueva respuesta de texto que contenga el siguiente saludo:

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. Haga clic en Guardar.

Crea un intent de prueba temporal

Para fines de prueba, crearemos un intent de prueba temporal para poder probar el webhook más adelante.

  1. Vuelve a hacer clic en el elemento de menú Intents.
  2. Haz clic en Crear intent.
  3. Ingresa el nombre de la intención: Test Intent (asegúrate de usar una T mayúscula y una I mayúscula). - Si escribes la intención de otra manera, el servicio de backend no funcionará.

925e02caa4de6b99.png

  1. Haz clic en Agregar frases de entrenamiento.
  • Test my agent
  • Test intent

2e44ddb2fae3c841.png

  1. Haz clic en Fulfillment > Enable Fulfillment.

7eb73ba04d76140e.png

Esta vez, no codificaremos una respuesta de forma rígida. La respuesta provendrá de una Cloud Function.

  1. Activa el interruptor Enable Webhook call for this intent.

748a82d9b4d7d253.png

  1. Haz clic en Guardar.

Crea el intent del canal

El Channel Intent contendrá esta parte de la conversación:

Usuario

Agent

"¿Qué hay en Comedy Central?"

""Actualmente, en Comedy Central, desde las 6 p.m., se está reproduciendo Los Simpson. Después, a las 7 p.m., comenzará Padre de familia".

  1. Vuelve a hacer clic en el elemento de menú Intents.
  2. Haz clic en Crear intent.
  3. Ingresa el nombre de la intención: Channel Intent (asegúrate de usar una T mayúscula y una I mayúscula. - Si escribes la intención de otra manera, el servicio de backend no funcionará.
  4. Haz clic en Add Training phrases y agrega lo siguiente:
  • 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. Desplázate hacia abajo hasta Action and parameters.

b7e917026760218a.png

Observa las entidades @channel y @sys.time que Dialogflow conoce. Más adelante en tu webhook, el nombre y el valor del parámetro se enviarán a tu servicio web. Por ejemplo:

channel=8

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

  1. Marcar el canal como obligatorio

Cuando tengas una conversación con el agente de la Guía de TV, siempre deberás completar el nombre del parámetro de ranura channel. Si no se mencionó el nombre del canal al comienzo de la conversación, Dialogflow hará más preguntas hasta que se completen todos los espacios de parámetros. 6f36973fd789c182.png

Ingresa la siguiente instrucción:

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

cdb5601ead9423f8.png

  1. No configures el parámetro de tiempo según sea necesario.

La hora será opcional. Cuando no se especifica una hora, el servicio web devolverá la hora actual.

  1. Haz clic en Fulfillment.

Esta vez, no codificaremos una respuesta de forma rígida. La respuesta provendrá de la Cloud Function. Por lo tanto, activa el interruptor Enable Webhook call for this intent.

  1. Haz clic en Guardar.

5. Entrega por webhook

Si tu agente necesita más que respuestas de intent estáticas, debes usar la entrega para conectar tu servicio web con el agente. Conectar tu servicio web te permite realizar acciones basadas en las expresiones del usuario y enviarle respuestas dinámicas. Por ejemplo, si un usuario quiere recibir la programación de MTV, tu servicio web puede consultar tu base de datos y responderle al usuario con la programación de MTV.

  1. Haz clic en Fulfillment en el menú principal.
  2. Habilita el interruptor del Editor intercalado.

cc84351f0d03ab6f.png

Para una implementación y prueba simple del webhook, puedes usar el editor directo. Utiliza Cloud Functions para Firebase sin servidores.

  1. Haz clic en la pestaña index.js en el editor y copia y pega este fragmento de código de JavaScript para 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. Haz clic en la pestaña package.json en el editor y copia y pega este fragmento de código JSON, que importa todas las bibliotecas del administrador de paquetes de 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. Haga clic en el botón Implementar. Esto tardará un momento, ya que se está implementando tu función sin servidores. En la parte inferior de la pantalla, aparecerá una ventana emergente que indicará tu estado.
  2. Probemos el webhook para ver si el código funciona. En el simulador de la derecha, escribe lo siguiente:

Test my agent.

Cuando todo esté correcto, deberías ver el mensaje "Este es un mensaje de prueba".

  1. Probemos la intención del canal. Ahora, haz la siguiente pregunta:

What's on MTV?

Cuando todo esté correcto, deberías ver lo siguiente:

"En MTV, desde las 4:30 p.m., se está reproduciendo MTV Unplugged. Luego, a las 5:30 p.m., comenzará RuPaul's Drag Race".

Pasos opcionales: Firebase

Cuando pruebes esto con un canal diferente, notarás que los resultados de la TV son los mismos. Esto se debe a que la Cloud Function aún no recupera datos de un servidor web real.

Para ello, deberemos establecer una conexión de red saliente.

En caso de que quieras probar esta aplicación con un servicio web, actualiza tu plan de Firebase a Blaze. Nota: Estos pasos son opcionales. También puedes continuar con los siguientes pasos de este lab para seguir probando tu aplicación en Actions on Google.

  1. Ve a Firebase console: https://console.firebase.google.com

  1. En la parte inferior de la pantalla, presiona el botón Actualizar.

ad38bc6d07462abf.png

Selecciona el plan Blaze en la ventana emergente.

  1. Ahora que sabemos que el webhook funciona, podemos continuar y reemplazar el código de index.js por el siguiente código. Esto garantizará que puedas solicitar información de la guía de TV desde el servicio 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. Acciones en Google

Actions on Google es una plataforma de desarrollo para el Asistente de Google. Permite el desarrollo de "acciones" de terceros, que son applets para el Asistente de Google que proporcionan funcionalidad extendida.

Deberás invocar una Acción de Google pidiéndole a Google que abra una app o que hable con ella.

Se abrirá tu acción, se cambiará la voz y saldrás del alcance "nativo" del Asistente de Google. Es decir, todo lo que le pidas a tu agente a partir de este punto lo tendrás que crear tú. No puedes pedirle de repente al Asistente de Google información sobre el clima de Google si eso es lo que quieres. Primero, debes salir (cerrar) el alcance de tu acción (tu app).

Cómo probar tu acción en el simulador del Asistente de Google

Probemos la siguiente conversación:

Usuario

Asistente de Google

"Hey Google, habla con your-name-tv-guide".

"Por supuesto. Déjame buscar your-name-tv-guide".

Usuario

Agente de la guía de TV de TuNombre

-

"Bienvenido. Soy la guía de TV…"

Probar mi agente

"Este es un mensaje de prueba. Cuando lo veas, significa que tu webhook de cumplimiento funcionó".

¿Qué hay en MTV?

En MTV, desde las 4:30 p.m., se transmite MTV Unplugged. Luego, a las 5:30 p.m., comenzará RuPaul’s Drag Race.

  1. Cómo volver al simulador de Asistente de Google

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

  1. Haz clic en el ícono de micrófono y pregunta lo siguiente:

c3b200803c7ba95e.png

  • Talk to my test agent
  • Test my agent

Asistente de Google debería responder con lo siguiente:

5d93c6d037c8c8eb.png

  1. Ahora, preguntemos lo siguiente:
  • What's on Comedy Central?

Se debería mostrar lo siguiente:

Actualmente, en Comedy Central desde las 6 p.m., se está reproduciendo Los Simpson. Luego, a las 7 p.m., comenzará Padre de familia.

7. Felicitaciones

Creaste tu primera acción para el Asistente de Google con Dialogflow. ¡Felicitaciones!

Como habrás notado, tu acción se ejecutó en modo de prueba, que está vinculado a tu Cuenta de Google. Si accedes a tu dispositivo Nest o a la app del Asistente de Google en tu teléfono iOS o Android con la misma cuenta También puedes probar tu acción.

Ahora, esta es una demostración del taller. Sin embargo, cuando crees aplicaciones para el Asistente de Google de verdad, podrás enviar tu Acción para su aprobación. Lee esta guía para obtener más información.

Temas abordados

  • Cómo crear un chatbot con Dialogflow v2
  • Cómo crear entidades personalizadas con Dialogflow
  • Cómo crear una conversación lineal con Dialogflow
  • Cómo configurar entregas con webhook con Dialogflow y Firebase Functions
  • Cómo llevar tu aplicación al Asistente de Google con Actions on Google

¿Qué sigue?

¿Te gustó este codelab? Echa un vistazo a estos excelentes labs.

Continúa este codelab integrándolo en Google Chat:

Crea una guía de TV de Google Chat con G Suite y Dialogflow