Prática: como criar uma ação de guia da TV para o Google Assistente com o Dialogflow e o Actions on Google

1. Introdução

Você está assistindo TV, mas não consegue encontrar o controle remoto ou não quer visitar cada canal para descobrir se tem algo interessante na televisão? Vamos perguntar ao Google Assistente o que está passando na TV! Neste laboratório, você vai criar uma ação simples usando o Dialogflow e aprender a integrá-la ao Google Assistente.

A ordem das tarefas simula uma experiência de desenvolvedor de nuvem:

  1. Criar um agente do Dialogflow v2
  2. Criar uma entidade personalizada
  3. Criar intents
  4. Configurar um webhook com o Firebase Functions
  5. Testar o chatbot
  6. Ativar a integração com o Google Assistente

O que você criará

Vamos criar um agente de chatbot de guia de TV interativo para o Google Assistente. Você pode perguntar ao guia de TV o que está sendo exibido em um canal específico. Por exemplo, "O que está passando na MTV?" A ação do Guia de TV vai informar o que está sendo exibido no momento e o que vai passar em seguida.

O que você vai aprender

  • Como criar um chatbot com o Dialogflow v2
  • Como criar entidades personalizadas com o Dialogflow
  • Como criar uma conversa linear com o Dialogflow
  • Como configurar fulfillments de webhook com o Dialogflow e o Firebase Functions
  • Como integrar seu aplicativo ao Google Assistente com as Actions on Google

Pré-requisitos

  • Você vai precisar de uma identidade do Google ou um endereço do Gmail para criar um agente do Dialogflow.
  • Não é necessário ter conhecimento básico de JavaScript, mas isso pode ser útil caso você queira mudar o código de atendimento do webhook.

2. Etapas da configuração

Ativar a Atividade na Web no navegador

  1. Clique em: http://myaccount.google.com/activitycontrols

  1. Confira se a Atividade na Web e de apps está ativada:

bf8d16b828d6f79a.png

Criar um agente do Dialogflow

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

  1. Na barra à esquerda, logo abaixo do logotipo, selecione Criar novo agente. Se você já tiver agentes, clique no menu suspenso primeiro.

1d7c2b56a1ab95b8.png

  1. Especifique um nome de agente: your-name-tvguide (use seu próprio nome)

35237b5c5c539ecc.png

  1. Como idioma padrão, escolha: Inglês - en
  2. Escolha o fuso horário mais próximo de você como o padrão.
  3. Clique em Criar.

Configurar o Dialogflow

  1. Clique no ícone de engrenagem no menu à esquerda, ao lado do nome do projeto.

1d7c2b56a1ab95b8.png

  1. Insira a seguinte descrição do agente: My TV Guide

26f262d359c49075.png

  1. Role a tela para baixo até Configurações de registro e ative as duas opções para registrar as interações do Dialogflow e todas as interações no Google Cloud Stackdriver. Vamos precisar disso mais tarde, caso queiramos depurar nossa ação.

e80c17acc3cce993.png

  1. Clique em Salvar.

Configurar o Actions on Google

  1. Clique no link Google Assistente em Saiba como funciona no Google Assistente no painel à direita.

5a4940338fc351e3.png

Isso vai abrir: http://console.actions.google.com

Se você não conhece o Actions on Google, preencha este formulário primeiro:

3fd4e594fa169072.png

  1. Tente abrir sua ação no simulador clicando no nome do projeto.
  2. Selecione Teste na barra de menus.

6adb83ffb7adeb78.png

  1. Verifique se o simulador está definido como inglês e clique em Falar com meu app de teste.

A ação vai cumprimentar você com a intent padrão básica do Dialogflow. Isso significa que a configuração da integração com o Action on Google funcionou.

3. Entidades personalizadas

As entidades são objetos em que seu app ou dispositivo realiza ações. Pense nisso como parâmetros / variáveis. No nosso guia de TV, vamos perguntar: "O que está passando na MTV?". MTV é a entidade e a variável. Também posso pedir outros canais, como "National Geographic" ou "Comedy Central". A entidade coletada será usada como um parâmetro na minha solicitação ao serviço da Web da API TV Guide.

Saiba mais sobre as entidades do Dialogflow.

Como criar a entidade de canal

  1. Clique no item de menu Entidades no console do Dialogflow.
  2. Clique em Criar entidade.
  3. Nome da entidade: channel (verifique se está tudo em minúsculas)
  4. Transmita um nome de canal. (alguns canais precisam de um sinônimo caso o Google Assistente entenda outra coisa). Você pode usar as teclas Tab e Enter enquanto digita. Insira o número do canal como um valor de referência. E os nomes dos canais como sinônimos, por exemplo:
  • 1 - 1, Net 1, Net Station 1

ee4e4955aa77232d.png

5**.** Mude para o modo **Edição bruta** clicando no botão de menu ao lado do botão azul de salvar.

e294b49b123e034f.png

  1. Copie e cole as outras entidades no 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. Clique em Salvar.

4. Intents

O Dialogflow usa intents para categorizar as intenções de um usuário. As intents têm frases de treinamento, que são exemplos do que um usuário pode dizer ao agente. Por exemplo, um usuário que quer saber o que está passando na TV pode perguntar: "O que está passando na TV hoje?", "O que está tocando agora?" ou apenas "guia de TV".

Quando um usuário escreve ou diz algo, o que é chamado de expressão do usuário, o Dialogflow corresponde o conteúdo à melhor intent do seu agente. Essa correspondência também é conhecida como classificação de intent.

Saiba mais sobre as intents do Dialogflow.

Modificar a intent de boas-vindas padrão

Quando você cria um agente do Dialogflow, duas intents padrão são criadas automaticamente. A intent de boas-vindas padrão é o primeiro fluxo que aparece quando você inicia uma conversa com o agente. A intent de fallback padrão é o fluxo que você recebe quando o agente não consegue entender ou associar uma intent ao que você acabou de dizer.

  1. Clique em Intent de boas-vindas padrão

No caso do Google Assistente, ele será iniciado automaticamente com a Intent de boas-vindas padrão. Isso acontece porque o Dialogflow está detectando o evento de boas-vindas. No entanto, também é possível invocar o intent dizendo uma das frases de treinamento inseridas.

6beee64e8910b85d.png

Esta é a mensagem de boas-vindas para a intent de boas-vindas padrão:

Usuário

Agente

"Ok Google, fale com o guia de TV do seu nome."

"Olá, sou o agente do Guia de TV. Posso dizer o que está passando em um canal de TV. Por exemplo, você pode perguntar: "O que está passando na MTV?"

  1. Role a tela para baixo até Respostas.
  2. Limpar todas as respostas de texto.
  3. Crie uma nova resposta de texto com a seguinte saudação:

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. Clique em Salvar.

Criar uma intent de teste temporária

Para fins de teste, vamos criar uma intent de teste temporária para testar o webhook mais tarde.

  1. Clique novamente no item de menu Intents.
  2. Clique em Criar intent.
  3. Insira o nome da intenção: Test Intent (use um T e um I maiúsculos. - Se você escrever a intenção de forma diferente, o serviço de back-end não vai funcionar.

925e02caa4de6b99.png

  1. Clique em Adicionar frases de treinamento.
  • Test my agent
  • Test intent

2e44ddb2fae3c841.png

  1. Clique em Fulfillment > Ativar fulfillment.

7eb73ba04d76140e.png

Desta vez, não vamos codificar uma resposta. A resposta vai vir de uma função do Cloud.

  1. Mova a chave Ativar chamada de webhook para esta intent.

748a82d9b4d7d253.png

  1. Clique em Salvar.

Criar a intent do canal

A intent do canal vai conter esta parte da conversa:

Usuário

Agente

"O que está passando no Comedy Central?"

""No momento, no Comedy Central, às 18h, está passando Os Simpsons. Depois, às 19h, vai começar Family Guy.""

  1. Clique novamente no item de menu Intents.
  2. Clique em Criar intent.
  3. Insira o nome da intenção: Channel Intent (use um T e um I maiúsculos. - Se você escrever a intenção de forma diferente, o serviço de back-end não vai funcionar.
  4. Clique em Adicionar frases de treinamento e inclua o seguinte:
  • 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. Role a tela para baixo até Ação e parâmetros.

b7e917026760218a.png

Observe as entidades @channel e @sys.time conhecidas pelo Dialogflow. Mais tarde no webhook, o nome e o valor de parâmetro serão enviados ao serviço da Web. Exemplo:

channel=8

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

  1. Marcar canal como obrigatório

Ao conversar com o agente do Guia de TV, você sempre precisa preencher o nome do parâmetro de slot channel. Se o nome do canal não for mencionado no início da conversa, o Dialogflow vai fazer mais perguntas até preencher todos os slots de parâmetros. 6f36973fd789c182.png

Insira o seguinte comando:

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

cdb5601ead9423f8.png

  1. Não defina o parâmetro de tempo conforme necessário.

O horário será opcional. Quando nenhum horário é especificado, o serviço da Web retorna o horário atual.

  1. Clique em Fulfillment.

Desta vez, não vamos codificar uma resposta. A resposta vai vir da função do Cloud. Assim, vire a chave Ativar chamada de webhook para esta intent.

  1. Clique em Salvar.

5. Fulfillment de webhook

Se o agente precisar de mais do que respostas de intent estáticas, use o fulfillment para conectar o serviço da Web ao agente. Ao conectar seu serviço da Web, é possível realizar ações com base nas expressões do usuário e enviar respostas dinâmicas para ele. Por exemplo, se um usuário quiser receber a programação da MTV, seu serviço da Web poderá verificar o banco de dados e responder com a programação da MTV.

  1. Clique em Fulfillment no menu principal.
  2. Ative a chave do Editor in-line.

cc84351f0d03ab6f.png

Para testes e implementação simples do webhook, use o editor in-line. Ele usa o Cloud Functions para Firebase sem servidor.

  1. Clique na guia index.js no editor e copie e cole este trecho de código 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. Clique na guia package.json no editor e copie e cole este trecho de código JSON, que importa todas as bibliotecas do gerenciador de pacotes 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. Clique no botão Implantar. Isso vai levar um tempo, porque está implantando sua função sem servidor. Na parte de baixo da tela, um pop-up vai mostrar seu status.
  2. Vamos testar o webhook para ver se o código funciona. No simulador à direita, digite:

Test my agent.

Quando tudo estiver correto, você verá: "Esta é uma mensagem de teste".

  1. Vamos testar o objetivo do canal. Faça a pergunta:

What's on MTV?

Quando tudo estiver correto, você verá:

"Na MTV, a partir das 16h30, está passando o MTV Unplugged. Depois, às 17h30, começa o RuPaul's Drag Race".

Etapas opcionais: Firebase

Ao testar com um canal diferente, você vai notar que os resultados da TV são os mesmos. Isso acontece porque a função do Cloud ainda não está buscando dados de um servidor da Web real.

Para isso, vamos precisar fazer uma conexão de rede de saída.

Se quiser testar esse aplicativo com um serviço da Web, faça upgrade do seu plano do Firebase para o Blaze. Observação: essas etapas são opcionais. Você também pode seguir para as próximas etapas deste laboratório e continuar testando seu aplicativo no Actions on Google.

  1. Acesse o console do Firebase: https://console.firebase.google.com

  1. Na parte de baixo da tela, pressione o botão Fazer upgrade.

ad38bc6d07462abf.png

Selecione o plano Blaze no pop-up.

  1. Agora que sabemos que o webhook funciona, podemos continuar e substituir o código de index.js pelo código abaixo. Isso garante que você possa solicitar informações do guia de TV do serviço da 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. Ações no Google

Actions on Google é uma plataforma de desenvolvimento para o Google Assistente. Ela permite o desenvolvimento de "ações" por terceiros, ou seja, applets para o Google Assistente que oferecem funcionalidade estendida.

Você precisa invocar uma Google Ação pedindo ao Google para abrir ou conversar com um app.

Isso vai abrir a ação, mudar a voz e sair do escopo nativo do Google Assistente. Isso significa que tudo o que você pedir ao agente a partir desse momento precisa ser criado por você. Não é possível pedir informações sobre o clima do Google ao Google Assistente de repente. Primeiro, você precisa sair (fechar) o escopo da sua ação (seu app).

Testar sua ação no simulador do Google Assistente

Vamos testar a seguinte conversa:

Usuário

Google Assistente

"Ok Google, fale com your-name-tv-guide."

"Claro! Deixe-me abrir your-name-tv-guide."

Usuário

Agente Your-Name-TV-Guide

-

"Olá, sou o guia de TV..."

Testar meu agente

"Esta é uma mensagem de teste. Se você estiver vendo isso, significa que o atendimento do webhook funcionou!"

O que está passando na MTV?

Na MTV, a partir das 16h30, está passando o MTV Unplugged. Depois, às 17h30, começa o RuPaul's Drag Race.

  1. Voltar para o simulador do Google Assistente

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

  1. Clique no ícone de microfone e pergunte o seguinte:

c3b200803c7ba95e.png

  • Talk to my test agent
  • Test my agent

O Google Assistente vai responder com:

5d93c6d037c8c8eb.png

  1. Agora vamos perguntar:
  • What's on Comedy Central?

Isso retornará:

No momento, no Comedy Central, às 18h, está passando Os Simpsons. Depois, às 19h, vai começar Family Guy.

7. Parabéns

Você criou sua primeira ação do Google Assistente com o Dialogflow. Parabéns!

Como você deve ter notado, sua ação estava sendo executada no modo de teste, que está vinculado à sua Conta do Google. Se você fizer login no dispositivo Nest ou no app Google Assistente no smartphone iOS ou Android com a mesma conta. Você também pode testar sua ação.

Agora, esta é uma demonstração de workshop. Mas, quando você estiver criando aplicativos para o Google Assistente de verdade, poderá enviar sua ação para aprovação. Leia este guia para mais informações.

O que vimos

  • Como criar um chatbot com o Dialogflow v2
  • Como criar entidades personalizadas com o Dialogflow
  • Como criar uma conversa linear com o Dialogflow
  • Como configurar fulfillments de webhook com o Dialogflow e o Firebase Functions
  • Como integrar seu aplicativo ao Google Assistente com as Actions on Google

Qual é a próxima etapa?

Gostou deste codelab? Confira estes laboratórios incríveis!

Continue este codelab integrando-o ao Google Chat:

Criar um guia de programação de TV no Google Chat com o G Suite e o Dialogflow