Langsung: Membuat tindakan panduan TV untuk Asisten Google dengan Dialogflow dan Actions on Google

1. Pengantar

Anda sedang menonton TV, tetapi tidak dapat menemukan remote, atau mungkin Anda tidak ingin mengunjungi setiap saluran TV untuk mencari tahu apakah ada acara menarik di televisi? Ayo tanya Asisten Google apa yang ada di TV! Di lab ini, Anda akan membangun tindakan sederhana menggunakan Dialogflow dan mempelajari cara mengintegrasikannya dengan Asisten Google.

Latihan-latihan ini diurutkan untuk mencerminkan pengalaman developer cloud pada umumnya:

  1. Membuat agen Dialogflow v2
  2. Membuat entity kustom
  3. Membuat intent
  4. Menyiapkan webhook dengan Firebase Functions
  5. Menguji chatbot
  6. Mengaktifkan integrasi Asisten Google

Yang akan Anda buat

Kami akan membuat agen chatbot panduan TV interaktif untuk Asisten Google. Anda dapat bertanya kepada panduan TV, apa yang sedang ditayangkan di channel tertentu. Misalnya: "Apa yang ditayangkan di MTV?" Tindakan Panduan TV akan memberi tahu Anda apa yang sedang diputar dan apa yang akan tayang berikutnya.

Yang akan Anda pelajari

  • Cara membuat chatbot dengan Dialogflow v2
  • Cara membuat entity kustom dengan Dialogflow
  • Cara membuat percakapan linear dengan Dialogflow
  • Cara menyiapkan fulfillment webhook dengan Dialogflow dan Firebase Functions
  • Cara memasukkan aplikasi Anda ke Asisten Google dengan Actions on Google

Prasyarat

  • Anda memerlukan alamat Gmail / Identitas Google untuk membuat agen Dialogflow.
  • Pengetahuan dasar tentang JavaScript tidak diperlukan, tetapi dapat berguna jika Anda ingin mengubah kode fulfillment webhook.

2. Mempersiapkan

Mengaktifkan Aktivitas Web di browser Anda

  1. Klik: http://myaccount.google.com/activitycontrols

  1. Pastikan Web & Aktivitas Aplikasi diaktifkan:

bf8d16b828d6f79a.png

Membuat agen Dialogflow

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

  1. Di panel kiri, tepat di bawah logo, pilih "Create New Agent". Jika Anda memiliki agen yang sudah ada, klik dropdown terlebih dahulu.

1d7c2b56a1ab95b8.pngS

  1. Tentukan nama agen: your-name-tvguide (gunakan nama Anda sendiri)

35237b5c5c539ecc.pngS

  1. Sebagai bahasa default, pilih: Inggris - en
  2. Sebagai zona waktu default, pilih zona waktu yang paling dekat dengan lokasi Anda.
  3. Klik Buat

Mengonfigurasi Dialogflow

  1. Klik ikon roda gigi, di menu kiri, di samping nama project Anda.

1d7c2b56a1ab95b8.pngS

  1. Masukkan deskripsi agen berikut: Panduan TV Saya

26f262d359c49075.pngS

  1. Scroll ke bawah ke Log Settings, lalu geser kedua tombol ke Log interaksi Dialogflow dan catat semua interaksi di Google Cloud Stackdriver. Kita akan membutuhkannya nanti, jika kita ingin men-debug tindakan.

e80c17acc3cce993.png

  1. Klik Simpan

Mengonfigurasi Actions on Google

  1. Klik link Asisten Google di Lihat cara kerjanya di Asisten Google di panel sebelah kanan.

5a4940338fc351e3.pngS

Tindakan ini akan membuka: http://console.actions.google.com

Jika Anda baru menggunakan Actions on Google, Anda harus mengisi formulir ini terlebih dahulu:

3fd4e594fa169072.pngS

  1. Cobalah untuk membuka aksi Anda di simulator**, dengan mengklik nama proyek.**
  2. Pilih Test di panel menu

6adb83ffb7adeb78.pngS

  1. Pastikan simulator disetel ke Bahasa Inggris lalu Klik Bicara dengan aplikasi uji saya

Tindakan ini akan menyambut Anda, dengan intent default Dialogflow dasar. Artinya, penyiapan integrasi dengan Action on Google berhasil.

3. Entity Khusus

Entity adalah objek yang mengambil tindakan oleh aplikasi atau perangkat Anda. Anggap saja sebagai parameter / variabel. Di Panduan TV, kita akan menanyakan: "Apa yang ditayangkan di MTV". MTV adalah entity dan variabel. Saya juga dapat meminta channel lain, seperti: "National Geographic" atau "Pusat Komedi". Entitas yang dikumpulkan akan digunakan sebagai parameter dalam permintaan saya ke layanan web TV Guide API.

Berikut informasi selengkapnya tentang Entitas Dialogflow.

Membuat Entitas Saluran

  1. Klik item menu di Konsol Dialogflow: Entity
  2. Klik Create Entity
  3. Nama entitas: channel (pastikan semua huruf kecil)
  4. Teruskan nama channel. (beberapa saluran akan memerlukan sinonim jika Asisten Google memahami hal lain). Anda dapat menggunakan tab dan menekan tombol enter saat mengetik. Masukkan nomor saluran sebagai nilai referensi. Dan nama saluran sebagai sinonim, seperti:
  • 1 - 1, Net 1, Net Station 1

ee4e4955aa77232d.png

5**.** Beralih ke mode **Raw Edit** dengan mengklik tombol menu di samping tombol simpan berwarna biru.

e294b49b123e034f.png

  1. Salin & tempelkan entitas lain dalam 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. Tekan Simpan

4. Intent

Dialogflow menggunakan intent untuk mengategorikan niat pengguna. Intent memiliki Frasa Pelatihan, yang merupakan contoh ucapan pengguna kepada agen Anda. Misalnya, pengguna yang ingin mengetahui apa yang ditayangkan di TV dapat bertanya, "Apa yang ditayangkan di TV hari ini?", "Apa yang sedang diputar?", atau cukup ucapkan "tvguide".

Saat pengguna menulis atau mengucapkan sesuatu, yang disebut sebagai ekspresi pengguna, Dialogflow akan mencocokkan ekspresi pengguna dengan intent terbaik dalam agen Anda. Mencocokkan intent juga dikenal sebagai klasifikasi intent.

Berikut informasi selengkapnya tentang Intent Dialogflow.

Mengubah Intent Selamat Datang Default

Saat Anda membuat agen Dialogflow baru, dua intent default akan dibuat secara otomatis. Intent Selamat Datang Default, adalah alur pertama yang Anda dapatkan saat memulai percakapan dengan agen. Intent Penggantian Default, adalah alur yang akan Anda dapatkan setelah agen tidak dapat memahami Anda atau tidak dapat mencocokkan intent dengan apa yang baru saja Anda ucapkan.

  1. Klik Default Welcome Intent

Dalam kasus Asisten Google, Asisten akan otomatis dimulai dengan Intent Selamat Datang Default. Hal ini karena Dialogflow memproses peristiwa Selamat datang. Namun, Anda juga dapat memanggil intent dengan mengucapkan salah satu frasa latihan yang dimasukkan.

6beee64e8910b85d.pngS

Berikut adalah pesan selamat datang untuk Intent Selamat Datang Default:

Pengguna

Agen

"Ok Google, bicara dengan nama-Anda-tvguide."

"Selamat datang, saya agen Panduan TV. Saya bisa beri tahu Anda apa yang sedang diputar di channel TV. Misalnya, Anda bisa bertanya: Apa yang ada di MTV".

  1. Scroll ke bawah ke Respons.
  2. Hapus semua Respons Teks.
  3. Buat satu respons teks baru, yang berisi salam berikut:

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.pngS

  1. Klik Simpan

Membuat intent pengujian sementara

Untuk tujuan pengujian, kita akan membuat intent pengujian sementara agar nantinya kita dapat menguji webhook.

  1. Klik item menu Intent lagi.
  2. Klik Create Intent
  3. Masukkan Nama Intent: Test Intent (pastikan Anda menggunakan huruf besar T dan huruf I besar. - Jika Anda mengeja intent dengan cara berbeda, layanan backend tidak akan berfungsi.)

925e02caa4de6b99.pngS

  1. Klik Tambahkan Frasa pelatihan
  • Test my agent
  • Test intent

2e44ddb2fae3c841.pngS

  1. Klik Fulfillment > Aktifkan Fulfillment

7eb73ba04d76140e.pngS

Kali ini kita tidak melakukan hardcoding respons. Responsnya akan berasal dari fungsi cloud.

  1. Geser tombol Aktifkan panggilan Webhook untuk intent ini.

748a82d9b4d7d253.pngS

  1. Tekan Simpan

Membuat Intent Channel

Intent Channel akan berisi bagian percakapan berikut:

Pengguna

Agen

"Apa yang ada di Comedy Central?"

""Saat ini di Comedy Central mulai pukul 18.00, The Simpsons sedang bermain. Setelah itu pada pukul 19.00, Family Guy akan dimulai.""

  1. Klik item menu Intent lagi.
  2. Klik Create Intent
  3. Masukkan Nama Intent: Channel Intent (pastikan Anda menggunakan huruf besar T dan huruf I besar. - Jika Anda mengeja intent dengan cara berbeda, layanan backend tidak akan berfungsi.)
  4. Klik Add Training strategy, lalu tambahkan perintah berikut:
  • 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.pngS

  1. Scroll ke bawah ke Tindakan dan parameter

b7e917026760218a.png

Perhatikan @channel & Entity @sys.time yang dikenal oleh Dialogflow. Kemudian di webhook Anda, nama parameter dan nilai parameter akan dikirim ke layanan web Anda. Contoh:

channel=8

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

  1. Tandai channel sebagai required

Saat melakukan percakapan dengan agen Panduan TV, Anda harus selalu mengisi nama parameter slot channel. Jika nama channel tidak disebutkan di awal percakapan, Dialogflow akan bertanya lebih lanjut, sampai semua slot parameter terisi. 6f36973fd789c182.pngS

Sebagai perintah, masukkan:

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

cdb5601ead9423f8.png

  1. Jangan menyetel parameter waktu sebagaimana diperlukan.

Waktu akan bersifat opsional. Jika tidak ada waktu yang ditentukan, layanan web akan menampilkan waktu saat ini.

  1. Klik Fulfillment

Kali ini kita tidak melakukan hardcoding respons. Responsnya akan berasal dari fungsi cloud. Jadi, alihkan tombol Enable Webhook call for this intent.

  1. Tekan Simpan

5. Pemenuhan Webhook

Jika agen membutuhkan lebih dari sekadar respons intent statis, Anda harus menggunakan fulfillment untuk menghubungkan layanan web ke agen Anda. Menghubungkan layanan web memungkinkan Anda mengambil tindakan berdasarkan ekspresi pengguna dan mengirim respons dinamis kembali kepada pengguna. Misalnya, jika pengguna ingin menerima jadwal TV untuk MTV, layanan web Anda dapat memeriksa database Anda dan merespons pengguna, jadwal untuk MTV.

  1. Klik Fulfillment di menu utama
  2. Mengaktifkan tombol Inline Editor

cc84351f0d03ab6f.png

Untuk pengujian dan implementasi webhook sederhana, Anda dapat menggunakan editor inline. Cloud Functions menggunakan Cloud Functions for Firebase serverless.

  1. Klik tab index.js di editor dan salin tempel bagian JavaScript untuk kode Node.js ini:
'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. Klik tab package.json di editor dan salin tempel bagian kode JSON ini, yang mengimpor semua library Node.js Package Manager (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. Klik tombol Deploy. Proses ini memerlukan waktu beberapa saat karena perintah tersebut men-deploy fungsi serverless Anda. Di bagian bawah layar, akan ada pop-up yang memberi tahu status Anda.
  2. Mari kita uji webhook, untuk melihat apakah kodenya berfungsi. Pada simulator di sisi kanan, ketik:

Test my agent.

Jika semuanya sudah benar, Anda akan melihat: "Ini adalah pesan pengujian".

  1. Mari kita uji Intent Saluran, sekarang ajukan pertanyaan:

What's on MTV?

Jika semuanya sudah benar, Anda akan melihat:

"Di MTV mulai pukul 16.30, MTV keaslian sedang diputar. Setelah itu pada pukul 17.30, Rupauls Drag Race akan dimulai."

Langkah Opsional - Firebase

Jika mengujinya dengan saluran lain, Anda akan melihat bahwa hasil TV akan sama. Ini karena fungsi cloud belum mengambil data dari server web yang sebenarnya.

Untuk melakukannya, kita perlu membuat koneksi jaringan keluar.

Jika Anda ingin menguji aplikasi ini dengan layanan web, upgrade paket Firebase ke Blaze. Catatan: langkah-langkah ini bersifat opsional. Anda juga dapat melanjutkan ke langkah berikutnya di lab ini untuk melanjutkan pengujian aplikasi di Actions on Google.

  1. Buka Firebase console: https://console.firebase.google.com

  1. Di bagian bawah layar, tekan tombol Upgrade

ad38bc6d07462abf.png

Pilih paket Blaze di pop-up.

  1. Setelah mengetahui bahwa webhook berfungsi, kita dapat melanjutkan dan mengganti kode index.js dengan kode di bawah. Tindakan ini akan memastikan bahwa Anda dapat meminta informasi panduan TV dari layanan 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 on Google

Actions on Google adalah platform pengembangan untuk Asisten Google. Layanan ini memungkinkan pengembangan "tindakan" pihak ketiga—applet untuk Asisten Google yang menyediakan fungsi tambahan.

Anda perlu memanggil Google Action, dengan meminta Google untuk membuka atau berbicara dengan aplikasi.

Tindakan ini akan membuka tindakan Anda, mengubah suara, dan Anda akan keluar dari ‘native’ Cakupan Asisten Google. Artinya, semua yang Anda tanyakan kepada agen mulai saat ini harus Anda buat sendiri. Anda tidak dapat menanyakan informasi cuaca Google secara tiba-tiba ke Asisten Google, jika itu yang Anda inginkan; Anda harus meninggalkan (menutup) cakupan tindakan (aplikasi Anda) terlebih dahulu.

Menguji tindakan di simulator Asisten Google

Mari kita uji percakapan berikut:

Pengguna

Asisten Google

"Ok Google, bicara dengan your-name-tv-guide".

"Oke. Saya akan mendapatkan your-name-tv-guide."

Pengguna

Agen Panduan TV untuk Anda

-

"Selamat datang, saya adalah pemandu TV...."

Uji agen saya

"Ini adalah pesan percobaan. Jika Anda melihat ini, artinya fulfillment webhook Anda berhasil".

Apa yang ditayangkan di MTV?

Di MTV mulai pukul 16.30, MTV keaslian sedang diputar. Setelah itu pada pukul 17.30, Rupauls Drag Race akan dimulai.

  1. Beralih kembali ke simulator Asisten Google

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

  1. Klik ikon mikrofon dan tanyakan hal berikut:

c3b200803c7ba95e.png

  • Talk to my test agent
  • Test my agent

Asisten Google akan merespons dengan:

5d93c6d037c8c8eb.pngS

  1. Sekarang mari kita tanyakan:
  • What's on Comedy Central?

Ini akan menampilkan:

Saat ini di Comedy Central mulai pukul 18.00, The Simpsons sedang bermain. Setelah itu pada pukul 19.00, Family Guy akan dimulai.

7. Selamat

Bagus, Anda telah membuat tindakan Asisten Google pertama Anda dengan Dialogflow.

Seperti yang mungkin telah Anda ketahui, tindakan Anda sedang berjalan dalam mode pengujian yang dikaitkan dengan Akun Google Anda. Jika Anda akan login di perangkat Nest atau aplikasi Asisten Google di ponsel iOS atau Android, dengan akun yang sama. Anda juga bisa menguji aksi Anda.

Ini adalah demo workshop. Namun, saat membuat aplikasi untuk Asisten Google secara nyata, Anda dapat mengirimkan Action untuk mendapatkan persetujuan. Baca panduan ini untuk mengetahui informasi selengkapnya.

Yang telah kita bahas

  • Cara membuat chatbot dengan Dialogflow v2
  • Cara membuat entity kustom dengan Dialogflow
  • Cara membuat percakapan linear dengan Dialogflow
  • Cara menyiapkan fulfillment webhook dengan Dialogflow dan Firebase Functions
  • Cara memasukkan aplikasi Anda ke Asisten Google dengan Actions on Google

Apa selanjutnya?

Suka dengan codelab ini? Lihatlah lab-lab hebat ini!

Lanjutkan codelab ini dengan mengintegrasikannya untuk Google Chat:

Membuat panduan TV Google Chat dengan G Suite dan Dialogflow