Lanjutkan mem-build dengan fulfillment sisi klien atau server

Setelah mempelajari dasar-dasarnya, Anda dapat meningkatkan kualitas dan menyesuaikan Action dengan metode khusus Canvas. Anda dapat memilih untuk mengembangkan Action dengan model fulfillment klien atau model fulfillment sisi server saat membuat project Action Anda. Untuk mengetahui informasi selengkapnya tentang opsi ini, lihat Mengaktifkan Canvas Interaktif.

Jika memilih opsi model fulfillment klien, Anda dapat menggunakan hal berikut dalam Action:

Jika memilih opsi model fulfillment server, Anda dapat menggunakan yang berikut dalam Action Anda:

Beberapa Interactive Canvas API tidak direkomendasikan untuk digunakan dengan model fulfillment tertentu. Tabel berikut menunjukkan API yang diaktifkan saat Anda memilih opsi fulfillment klien, dan apakah API ini direkomendasikan atau tidak direkomendasikan untuk setiap model:

Nama API Didukung dalam model fulfillment server? Didukung dalam model fulfillment klien?
sendTextQuery() Ya Didukung tetapi tidak direkomendasikan (lihat sendtextQuery() untuk informasi selengkapnya)
outputTts() Ya Ya
triggerScene() Tidak Ya
createIntentHandler(), expect(), clearExpectations(), prompt() Tidak Ya
createNumberSlot(),createTextSlot, createConfirmationSlot, createOptionsSlot() Tidak Ya
setHomeParam(), getHomeParam(), setUserParam(), getUserParam() Tidak Ya

Bagian berikut menjelaskan cara menerapkan API untuk model fulfillment sisi server dan klien dalam Action Canvas Interaktif Anda.

Mem-build dengan fulfillment sisi klien

Anda dapat menerapkan Interactive Canvas API berikut dalam logika aplikasi web Anda:

outputTts()

API ini memungkinkan Anda menghasilkan output text-to-speech (TTS) dari perangkat tanpa mengirim perintah statis dari Actions Builder atau memanggil webhook. Jika tidak ada logika sisi server yang terkait dengan TTS, Anda dapat menggunakan outputTts() dari sisi klien untuk melewati perjalanan ke server dan memberikan respons yang lebih cepat kepada pengguna.

outputTts() sisi klien dapat mengganggu atau membatalkan TTS sisi server. Anda dapat menghindari gangguan TTS sisi server dengan melakukan tindakan pencegahan berikut:

  • Hindari memanggil outputTts() di awal sesi; sebagai gantinya, gunakan TTS sisi server pada giliran percakapan pertama Action Anda.
  • Hindari memanggil outputTts() secara berurutan tanpa memerlukan tindakan pengguna di antaranya.

Cuplikan berikut menunjukkan cara menggunakan outputTts() untuk menghasilkan TTS dari sisi klien:

interactiveCanvas.outputTts(
      '<speak>This is an example response.</speak>', true);

Anda juga dapat menggunakan outputTts() dengan onTtsMark() untuk menempatkan penanda SSML ke dalam urutan teks. Penggunaan onTtsMark() akan menyinkronkan animasi aplikasi web atau status game Anda pada titik tertentu dari string SSML TTS, seperti yang ditunjukkan dalam cuplikan berikut:

interactiveCanvas.outputTts(
      '<speak>Speak as <mark name="number" /> number <break time="700ms"/>' +
      '<say-as interpret-as="cardinal">12345</say-as> <break time="300ms"/> ' +
      'Speak as <mark name="digits" /> digits <break time="700ms"/>' +
      '<say-as interpret-as="characters">12345</say-as></speak>', true);

Pada contoh sebelumnya, dua tanda yang menyesuaikan respons Anda dikirim ke aplikasi web dengan TTS.

Menangani fulfillment intent pada klien

Dalam model fulfillment server untuk Canvas Interaktif, semua intent harus ditangani oleh webhook, yang meningkatkan latensi dalam Action Anda. Daripada memanggil webhook, Anda dapat menangani fulfillment intent dalam aplikasi web Anda.

Untuk menangani intent sisi klien, Anda dapat menggunakan API berikut:

  • createIntentHandler(): Metode yang memungkinkan Anda menentukan pengendali intent dalam kode aplikasi web untuk intent kustom yang ditentukan di Action Builder.
  • expect(): Metode yang mengaktifkan/mendaftarkan pengendali intent agar pengguna dapat cocok dengan intent.
  • clearExpectations(): Metode yang menghapus ekspektasi untuk semua intent yang saat ini diaktifkan sehingga intent tidak dapat dicocokkan, meskipun pengguna mengucapkan ucapan yang cocok dengan intent.
  • deleteHandler(): Metode yang menonaktifkan pengendali intent individual sehingga intent tersebut tidak dapat dicocokkan.

Dengan API ini, Anda dapat mengaktifkan atau menonaktifkan intent secara selektif untuk berbagai status Action Canvas Interaktif. Anda harus menggunakan expect() pada pengendali intent untuk mengaktifkan intent tersebut.

Mengaktifkan pengendali intent

Mengaktifkan pengendali intent adalah proses dua langkah. Pertama, Anda harus menentukan intent di Action Builder. Selanjutnya, agar intent dapat dicocokkan, Anda harus memanggil expect() pada pengendali intent.

Untuk mengonfigurasi dan mengaktifkan pengendali intent di sisi klien, ikuti langkah-langkah berikut:

  1. Buka project Anda di konsol Actions dan tambahkan Intent kustom.
  2. Pilih Yes untuk Is this a global intent?

  3. Konfigurasi intent Anda, lalu klik Save.

  4. Tentukan pengendali untuk intent dalam logika aplikasi web Anda, seperti ditunjukkan dalam cuplikan berikut:

    /**
    * Define handler for intent.
    */
    const bookTableIntent = interactiveCanvas.createIntentHandler('reserveTable',
      matchedIntent => {
        console.log("Intent match handler to reserve a table was triggered!");
      });
    
    /**
    * Define handler for intent with an argument.
    */
    const bookTableIntent = interactiveCanvas.createIntentHandler('reserveTable',
      matchedIntent => {
        const numberOfPeople = matchedIntent.getIntentArg('numberOfPeople');
        console.log(`Intent match handler to reserve a table for ${number of people} was triggered!`);
      });
    
  5. Panggil metode expect() untuk mendaftarkan pengendali intent, seperti yang ditunjukkan dalam cuplikan berikut:

    /**
    * Define handler for intent and expect() it.
    */
    const bookTableIntent = interactiveCanvas.createIntentHandler('reserveTable',
      matchedIntent => {
        console.log("Intent match handler to reserve a table was triggered!");
      });
    var handler = interactiveCanvas.expect(bookTableIntent);
    

Menonaktifkan pengendali intent

Setelah menentukan pengendali intent, Anda dapat mengaktifkan atau menonaktifkan intent tersebut sesuai kebutuhan untuk Action Anda. Saat Anda memanggil expect() untuk mengaktifkan intent, fungsi tersebut akan menampilkan objek dengan metode deleteHandler(), yang dapat Anda gunakan untuk menonaktifkan pengendali yang baru dibuat. Definisi pengendali intent akan tetap ada meskipun intent saat ini tidak aktif, sehingga Anda dapat mengaktifkan kembali intent saat diperlukan.

Untuk menonaktifkan pengendali intent, panggil deleteHandler() pada pengendali intent, seperti yang ditunjukkan dalam cuplikan berikut:

    /**
    * Define handler for intent and expect() it.
    */
    const bookTableIntent = interactiveCanvas.createIntentHandler('reserveTable',
      matchedIntent => {
        console.log("Intent match handler to reserve a table was triggered!");
      });
    var handler = interactiveCanvas.expect(bookTableIntent);
    
    // Delete the handler for `bookTableIntent`.
    handler.deleteHandler();
    

Anda dapat memanggil expect() untuk menambahkan kembali pengendali intent yang telah dinonaktifkan, seperti yang ditunjukkan dalam cuplikan berikut:

    // Re-add the `bookTableIntent` handler.
    handler = interactiveCanvas.expect(bookTableIntent);

Untuk menonaktifkan intent secara massal, Anda dapat menggunakan metode clearExpectations(), yang menonaktifkan semua intent yang saat ini diaktifkan. Cuplikan berikut menunjukkan cara menghapus ekspektasi untuk semua pengendali intent:

interactiveCanvas.clearExpectations();

Menangani pengisian slot pada klien

Daripada menambahkan pengisian slot ke scene dalam Action Builder, Anda dapat menangani pengisian slot langsung di aplikasi web Anda.

Untuk menangani pengisian slot di sisi klien, Anda harus terlebih dahulu membuat slot menggunakan salah satu API berikut:

  • createNumberSlot(callback, hints): Metode yang memungkinkan Anda menentukan slot angka di kode aplikasi web Anda. Digunakan untuk meminta pengguna memasukkan nomor.
  • createTextSlot(callback, hints): Metode yang memungkinkan Anda menentukan slot teks di kode aplikasi web Anda. Digunakan untuk meminta pengguna memasukkan kata.
  • createConfirmationSlot(callback, hints): Metode yang memungkinkan Anda menentukan slot konfirmasi di kode aplikasi web Anda. Digunakan untuk meminta konfirmasi pengguna (ya/tidak).
  • createOptionsSlot(options, callback, hints): Metode yang memungkinkan Anda menentukan slot opsi di kode aplikasi web. Digunakan untuk meminta pengguna memilih dari daftar opsi yang telah ditentukan.

Saat membuat slot, Anda dapat secara opsional menentukan triggerHints, yang merupakan kata kunci yang meningkatkan sistem natural language understanding (NLU) untuk Action Anda. Kata kunci ini harus berupa kata singkat yang mungkin diucapkan pengguna saat mengisi slot. Misalnya, kata kunci triggerHints untuk slot angka bisa jadi years. Saat pengguna membalas pertanyaan tentang usianya dalam percakapan dengan respons "Saya tiga puluh tahun", Action Anda lebih cenderung mengenali bahwa pengguna mengisi slot dengan tepat.

Setelah membuat slot, Anda dapat meminta pengguna memasukkan slot menggunakan prompt API:

  • prompt(tts, slot): Metode yang akan menghasilkan TTS kepada pengguna, yang meminta mereka mengisi slot yang diharapkan.

Memanggil prompt() akan menampilkan promise dengan status dan nilai slot yang terisi.

Buat slot angka

Slot nomor memungkinkan Anda meminta nomor telepon kepada pengguna selama percakapan. Untuk informasi selengkapnya tentang pengisian slot, lihat bagian Pengisian slot dalam dokumentasi Action Builder.

Untuk meminta pengguna mengisi slot angka di sisi klien, ikuti langkah-langkah berikut:

  1. Panggil metode createNumberSlot() untuk membuat slot nomor dalam logika aplikasi web Anda:

    /**
     * Create number slot.
     */
    const triggerHints = { associatedWords: ['guess number', 'number'] };
    const slot = interactiveCanvas.createNumberSlot(
      number => {
        console.log(`Number guessed: ${number}.`);
      }, triggerHints);
    
    
  2. Panggil metode prompt() untuk meminta pengguna memasukkan slot, dan menangani nilai slot dari promise yang ditampilkan, seperti ditunjukkan dalam cuplikan berikut:

    const promptPromise = interactiveCanvas.prompt(
      { text: 'What number am I thinking of between 1 and 10?' }, slot);
    
    promptPromise.then(
      answer => {
        if (answer.status == interactiveCanvas.AnswerStatus.ANSWERED) {
          // answer === {value: 5, status: ANSWERED}
          // Do something with answer.value
        } else {
          console.error('Promise returned unsuccessful status ' + answer.status);
        }
      });
    

Buat slot teks

Slot teks memungkinkan Anda meminta kata kepada pengguna selama percakapan. Untuk informasi selengkapnya tentang pengisian slot, lihat bagian Pengisian slot dalam dokumentasi Action Builder.

Untuk meminta pengguna mengisi slot teks di sisi klien, ikuti langkah-langkah berikut:

  1. Panggil metode createTextSlot() untuk membuat slot teks dalam logika aplikasi web Anda:

    /**
     * Create text slot.
     */
    const triggerHints = { associatedWords: ['favorite color', 'color'] };
    const slot = interactiveCanvas.createTextSlot(
      text => {
        console.log(`Favorite color: ${text}.`);
      }, triggerHints);
    
    
  2. Panggil metode prompt() untuk meminta pengguna memasukkan slot, dan menangani nilai slot dari promise yang ditampilkan, seperti ditunjukkan dalam cuplikan berikut:

    const promptPromise = interactiveCanvas.prompt(
      { text: 'What is your favorite color?' }, slot);
    
    promptPromise.then(
      answer => {
        if (answer.status == interactiveCanvas.AnswerStatus.ANSWERED) {
          // answer === {value: "red", status: ANSWERED}
          // Do something with answer.value
        } else {
          console.error('Promise returned unsuccessful status ' + answer.status);
        }
      });
    

Buat slot konfirmasi

Slot konfirmasi memungkinkan Anda meminta konfirmasi pengguna (pengguna dapat merespons "Ya" atau "Tidak" untuk mengisi slot). Untuk informasi selengkapnya tentang pengisian slot, lihat bagian Pengisian slot dalam dokumentasi Action Builder.

Untuk meminta pengguna mengisi slot konfirmasi di sisi klien, ikuti langkah-langkah berikut:

  1. Panggil metode createConfirmationSlot() untuk membuat slot konfirmasi di logika aplikasi web Anda:

    /**
     * Create confirmation slot (boolean).
     */
    const triggerHints = { associatedWords: ['user confirmation', 'confirmation'] };
    const slot = interactiveCanvas.createConfirmationSlot(
      yesOrNo => {
        console.log(`Confirmation: ${yesOrNo}`);
      }, triggerHints);
    
    
  2. Panggil metode prompt() untuk meminta pengguna memasukkan slot, dan menangani nilai slot dari promise yang ditampilkan, seperti ditunjukkan dalam cuplikan berikut:

    const promptPromise = interactiveCanvas.prompt(
      { text: 'Do you agree to the Terms of Service?' }, slot);
    
    promptPromise.then(
      answer => {
        if (answer.status == interactiveCanvas.AnswerStatus.ANSWERED) {
          // answer === {value: true, status: ANSWERED}
          // Do something with answer.value
        } else {
          console.error('Promise returned unsuccessful status ' + answer.status);
        }
      });
    

Buat slot opsi

Slot opsi memungkinkan Anda meminta pengguna untuk memilih dari daftar opsi yang telah ditentukan. Untuk informasi selengkapnya tentang pengisian slot, lihat bagian Pengisian slot dalam dokumentasi Action Builder.

Untuk meminta pengguna mengisi slot opsi di sisi klien, ikuti langkah-langkah berikut:

  1. Panggil metode createOptionsSlot() untuk membuat slot opsi dalam logika aplikasi web Anda:

    /**
     * Create options slot (list selection).
     */
    const triggerHints = { associatedWords: ['select fruit', 'choose fruit'] };
    // Define selectable options
    const options = [{
      key: 'apple',
      synonyms: ['apple', 'large apple', 'gala apple'],
    }, {
      key: 'banana',
      synonyms: ['banana', 'green banana', 'plantain'],
    }];
    const slot = interactiveCanvas.createOptionsSlot(
      options,
      selectedOption => {
        console.log(`You have selected ${selectedOption} as your fruit.`);
      }, triggerHints);
    
    
  2. Panggil metode prompt() untuk meminta pengguna memasukkan slot, dan menangani nilai slot dari promise yang ditampilkan, seperti ditunjukkan dalam cuplikan berikut:

    const promptPromise = interactiveCanvas.prompt(
      { text: 'Would you like a banana or an apple?' }, slot);
    
    promptPromise.then(
      answer => {
        if (answer.status == interactiveCanvas.AnswerStatus.ANSWERED) {
          // answer === {value: 'apple', status: ANSWERED}
          // Do something with answer.value
        } else {
          console.error('Promise returned unsuccessful status ' + answer.status);
        }
      });
    

triggerScene()

API triggerScene() memungkinkan Anda bertransisi ke scene lain dalam Action Canvas Interaktif dari fulfillment sisi klien. Dengan triggerScene(), Anda juga dapat beralih dari fulfillment sisi klien ke fulfillment sisi server saat pengguna perlu mengakses adegan sistem di Action Builder yang memerlukan webhook. Misalnya, Anda dapat memanggil triggerScene() saat pengguna perlu menautkan akun mereka atau menerima notifikasi; kemudian, Anda dapat kembali dari adegan tersebut ke fulfillment sisi klien dengan perintah Canvas.

Cuplikan berikut menunjukkan cara mengimplementasikan triggerScene() dalam Action Anda:

interactiveCanvas.triggerScene('SceneName').then((status) => {
  console.log("sent the request to trigger scene.");
}).catch(e => {
  console.log("Failed to trigger a scene.");
})

Penyimpanan rumah dan pengguna di klien

Daripada menggunakan webhook untuk mendapatkan dan menetapkan nilai penyimpanan rumah dan pengguna, Anda dapat memanggil API sisi klien untuk menangani penyimpanan rumah dan pengguna di aplikasi web Anda. Aplikasi web Anda kemudian dapat menggunakan nilai yang disimpan ini di beberapa sesi (misalnya, dalam prompt dan kondisi), dan dapat mengakses nilai untuk anggota keluarga atau pengguna tertentu saat diperlukan. Menggunakan API ini dapat mengurangi latensi dalam Action Canvas Interaktif karena Anda tidak perlu lagi memanggil webhook untuk mendapatkan dan menetapkan nilai penyimpanan.

Penyimpanan rumah dan pengguna di aplikasi web mengikuti prinsip umum yang sama seperti penyimpanan di webhook. Untuk informasi selengkapnya tentang penyimpanan rumah dan pengguna, lihat dokumentasi untuk Penyimpanan rumah dan Penyimpanan pengguna.

Penyimpanan rumah sisi klien

Penyimpanan rumah memungkinkan Anda menyimpan nilai untuk pengguna anggota keluarga berdasarkan grafik rumah, dan dibagikan ke semua sesi anggota keluarga. Misalnya, jika seorang pengguna memainkan game Canvas Interaktif dalam satu keluarga, skor game dapat disimpan di penyimpanan rumah, dan anggota keluarga lainnya dapat terus memainkan game dengan skor yang tersimpan tersebut.

Untuk mengaktifkan Action Anda agar mendukung penyimpanan rumah, ikuti langkah-langkah berikut:

  1. Di konsol Actions, buka Deploy > Directory information > Additional Information.
  2. Centang kotak Ya untuk Apakah Action Anda menggunakan penyimpanan rumah?

Untuk menulis nilai ke penyimpanan home di aplikasi web Anda, panggil metode setHomeParam(), seperti ditunjukkan dalam cuplikan berikut:

interactiveCanvas.setHomeParam('familySize',  10).then(
      result => {
        console.log('Set home param success');
      },
      fail => {
        console.error(err);
      });

Untuk membaca nilai dari penyimpanan rumah di aplikasi web Anda, panggil metode getHomeParam(), seperti ditunjukkan dalam cuplikan berikut:

interactiveCanvas.getHomeParam('familySize').then(
      value => {
        console.log(JSON.stringify(result));
      },
      err => {
        console.error(err);
      }
  );

Untuk menghapus semua penyimpanan rumah yang ada, panggil metode resetHomeParam(), seperti ditunjukkan dalam cuplikan berikut:

interactiveCanvas.resetHomeParam();

Penyimpanan pengguna sisi klien

Penyimpanan pengguna memungkinkan Anda menyimpan parameter value untuk pengguna tertentu yang terverifikasi di beberapa sesi. Misalnya, jika pengguna bermain game, skor game dapat disimpan untuk pengguna tersebut. Pada sesi gameplay berikutnya, pengguna dapat terus memainkan game dengan skor yang sama.

Untuk menulis nilai ke penyimpanan pengguna di aplikasi web Anda, panggil metode setUserParam(), seperti ditunjukkan dalam cuplikan berikut:

interactiveCanvas.setUserParam('color',  'blue').then(
      result => {
        console.log('Set user param success');
      },
      err => {
        console.error(err);
      });

Untuk membaca nilai dari penyimpanan pengguna di aplikasi web Anda, panggil metode getUserParam(), seperti ditunjukkan dalam cuplikan berikut:

interactiveCanvas.getUserParam('color').then(
      value => {
        console.log(JSON.stringify(result));
      },
      err => {
        console.error(err);
      }
  );

Untuk menghapus semua penyimpanan pengguna yang ada, panggil metode resetUserParam(), seperti ditunjukkan dalam cuplikan berikut:

interactiveCanvas.resetUserParam();

setCanvasState()

Metode setCanvasState() memungkinkan Anda mengirim data status dari aplikasi web Canvas Interaktif ke fulfillment Anda, dan memberi tahu Asisten bahwa aplikasi web telah memperbarui statusnya. Aplikasi web mengirim statusnya yang diperbarui sebagai objek JSON.

Memanggil setCanvasState() tidak memanggil intent. Setelah memanggil setCanvasState(), jika sendTextQuery() dipanggil atau kueri pengguna cocok dengan intent dalam percakapan, data yang ditetapkan dengan setCanvasState() pada giliran percakapan sebelumnya akan tersedia di giliran percakapan berikutnya.

Dalam cuplikan berikut, aplikasi web menggunakan setCanvasState() untuk menetapkan data status Canvas:

JavaScript

this.action.canvas.setCanvasState({ score: 150 })
    

Mereferensikan status Canvas dari webhook

Anda dapat mereferensikan nilai status Canvas yang tersimpan dalam kode fulfillment Anda. Untuk mereferensikan nilai ini, gunakan sintaksis conv.context.canvas.state.KEY, dengan KEY adalah kunci yang diberikan saat nilai status Canvas ditetapkan.

Misalnya, jika sebelumnya Anda menyimpan nilai skor tinggi untuk game dalam status Canvas sebagai parameter score, referensikan nilai tersebut menggunakan conv.context.canvas.state.score untuk mengakses nilai tersebut dalam fulfillment:

Node.js

app.handle('webhook-name', conv => {
    console.log(conv.context.canvas.state.score);
})
    

Mereferensikan status Canvas dalam perintah

Anda dapat mereferensikan nilai status Canvas yang tersimpan dalam perintah. Untuk mereferensikan nilai ini, gunakan sintaksis $canvas.state.KEY, dengan KEY adalah kunci yang diberikan saat nilai status Canvas ditetapkan.

Misalnya, jika sebelumnya Anda menyimpan nilai skor tinggi untuk game dalam status Canvas sebagai parameter score, rujuk nilai tersebut menggunakan $canvas.state.score untuk mengakses nilai tersebut dalam perintah:

JSON

{
  "candidates": [{
    "first_simple": {
      "variants": [{
        "speech": "Your high score is $canvas.state.score."
      }]
    }
  }]
}
    

Mereferensikan status Canvas dalam kondisi

Anda juga dapat mereferensikan nilai status Canvas yang tersimpan dalam kondisi. Untuk mereferensikan nilai, gunakan sintaksis canvas.state.KEY, dengan KEY adalah kunci yang diberikan saat nilai status Canvas ditetapkan.

Misalnya, jika sebelumnya Anda menyimpan nilai skor tinggi untuk game dalam status Canvas sebagai parameter score dan ingin membandingkannya dengan nilai 999 dalam kondisi, Anda dapat mereferensikan nilai yang disimpan dalam kondisi Anda menggunakan canvas.state.score. Ekspresi kondisi Anda terlihat seperti berikut:

Sintaksis kondisi

canvas.state.score >= 999
    

sendTextQuery()

Metode sendTextQuery() mengirim kueri teks ke Action Percakapan untuk mencocokkan intent secara terprogram. Contoh ini menggunakan sendTextQuery() untuk memulai ulang game berputar segitiga saat pengguna mengklik tombol. Saat pengguna mengklik tombol "Mulai ulang game", sendTextQuery() akan mengirimkan kueri teks yang cocok dengan intent Restart game dan menampilkan promise. Promise ini menghasilkan SUCCESS jika intent dipicu dan BLOCKED jika tidak. Cuplikan berikut cocok dengan intent dan menangani kasus keberhasilan dan kegagalan dari promise:

JavaScript

…
/**
* Handle game restarts
*/
async handleRestartGame() {
    console.log(`Request in flight`);
    this.button.texture = this.button.textureButtonDisabled;
    this.sprite.spin = false;
    const res = await this.action.canvas.sendTextQuery('Restart game');
    if (res.toUpperCase() !== 'SUCCESS') {
        console.log(`Request in flight: ${res}`);
        return;
    }
    console.log(`Request in flight: ${res}`);
    this.button.texture = this.button.textureButtonDisabled;
    this.sprite.spin = false;
}
…
    

Jika promise menghasilkan SUCCESS, pengendali webhook Restart game akan mengirim respons Canvas ke aplikasi web Anda:

JavaScript

…
app.handle('restart', conv => {
  conv.add(new Canvas({
    data: {
      command: 'RESTART_GAME'
    }
  }));
});
…
    

Respons Canvas ini memicu callback onUpdate(), yang mengeksekusi kode dalam cuplikan kode RESTART_GAME di bawah:

JavaScript

…
RESTART_GAME: (data) => {
    this.scene.button.texture = this.scene.button.textureButton;
    this.scene.sprite.spin = true;
    this.scene.sprite.tint = 0x00FF00; // green
    this.scene.sprite.rotation = 0;
},
…
    

Mem-build dengan fulfillment sisi server

Anda dapat menerapkan Interactive Canvas API berikut di webhook:

Mengaktifkan mode layar penuh

Secara default, aplikasi web Canvas Interaktif menyertakan header di bagian atas layar dengan nama Action Anda. Anda dapat menggunakan enableFullScreen untuk menghapus header dan menggantinya dengan toast sementara yang muncul di layar pemuatan, yang memungkinkan pengguna memiliki pengalaman layar penuh saat berinteraksi dengan Action Anda. Pesan toast menampilkan nama tampilan Action, nama developer, serta petunjuk untuk keluar dari Action, dan warna toast akan berubah bergantung pada apa yang dipilih pengguna sebagai tema di perangkatnya.

Gambar 1. Pesan toast di layar pemuatan untuk Action.

Jika pengguna sering berinteraksi dengan Action Anda, pesan toast untuk sementara berhenti muncul di layar pemuatan. Jika pengguna tidak berinteraksi dengan Action Anda untuk beberapa waktu, pesan toast akan muncul kembali saat mereka meluncurkan Action.

Anda dapat mengaktifkan mode layar penuh di webhook atau di perintah statis di Actions Builder.

Untuk mengaktifkan mode layar penuh di webhook, ikuti langkah ini:

  1. Tetapkan kolom enableFullScreen ke true dalam respons canvas pertama yang ditampilkan oleh webhook dalam sesi. Cuplikan berikut adalah contoh implementasi menggunakan library klien Node.js:

     const { conversation, Canvas } = require('@assistant/conversation');
     const functions = require('firebase-functions');
    
     const app = conversation();
    
     app.handle('invocation_fullscreen', conv => {
       conv.add(new Canvas(
         {
           url: 'https://example-url.com',
           enableFullScreen: true
         }));
     });
    
     exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app);
    

Untuk mengaktifkan mode layar penuh pada perintah statis di Action Builder, ikuti langkah-langkah berikut:

  1. Buka project Anda di Konsol Actions.
  2. Klik Develop di menu navigasi dan buka perintah yang berisi respons canvas pertama.
  3. Tetapkan enable_full_screen ke true, seperti yang ditunjukkan dalam cuplikan berikut:

     {
      "candidates": [
        {
          "canvas": {
            "url": "https://example-url.com",
            "enable_full_screen": true
          }
        }
      ]
    }
    

continueTtsDuringTouch

Secara default, saat pengguna mengetuk layar saat menggunakan Action Canvas Interaktif, TTS akan berhenti diputar. Anda dapat mengaktifkan TTS untuk terus bermain saat pengguna menyentuh layar dengan continueTtsDuringTouch. Perilaku ini tidak dapat diaktifkan dan dinonaktifkan dalam sesi yang sama.

Anda dapat menerapkan perilaku ini di webhook atau di perintah statis di Action Builder.

Untuk mengaktifkan TTS agar dapat dilanjutkan setelah pengguna mengetuk layar di webhook, ikuti langkah ini:

  • Tetapkan kolom continueTtsDuringTouch ke true dalam respons canvas pertama yang ditampilkan oleh webhook dalam sesi. Cuplikan berikut adalah contoh implementasi menggunakan library klien Node.js:

    const { conversation, Canvas } = require('@assisant/conversation');
    const functions = require('firebase-functions');
    
    const app = conversation();
    
    app.handle('intent-name', conv => {
      conv.add(new Canvas(
        {
          url: 'https://example-url.com',
          continueTtsDuringTouch: true
        }));
    });
    
    exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app);
    

Agar TTS dapat dilanjutkan setelah pengguna mengetuk layar pada perintah statis di Action Builder, ikuti langkah-langkah berikut:

  1. Buka project Anda di Konsol Actions.
  2. Klik Develop di menu navigasi dan buka perintah yang menyertakan respons canvas pertama.
  3. Tetapkan continue_tts_during_touch ke true, seperti yang ditunjukkan dalam cuplikan berikut:

      {
       "candidates": [
         {
           "canvas": {
             "url": "https://example-url.com",
             "continue_tts_during_touch": true
           }
         }
       ]
     }