İstemci veya sunucu tarafı karşılama ile derlemeye devam edin

Temel bilgileri öğrendiğinize göre artık Tuval'e özgü yöntemlerle İşleminizi geliştirebilir ve özelleştirebilirsiniz. Actions projenizi oluştururken İşleminizi istemci karşılama modeli veya sunucu tarafı karşılama modeliyle geliştirmeyi seçebilirsiniz. Bu seçenekler hakkında daha fazla bilgi için Etkileşimli Tuvali Etkinleştirme bölümüne bakın.

Müşteri karşılama modeli seçeneğini belirlerseniz İşleminizde aşağıdakileri kullanabilirsiniz:

Sunucu karşılama modeli seçeneğini belirlerseniz aşağıdakileri kullanabilirsiniz:

Bazı Etkileşimli Tuval API'lerinin belirli bir istek karşılama modeliyle kullanılması önerilmez. Aşağıdaki tabloda, istemci istek karşılama seçeneğini belirttiğinizde etkinleştirilen API'ler ve bu API'lerin her model için önerilip önerilmediği gösterilmektedir:

API adı Sunucu istek karşılama modelinde destekleniyor mu? İstemci karşılama modelinde destekleniyor mu?
sendTextQuery() Evet Desteklenir ancak önerilmez (daha fazla bilgi için sendtextQuery() işlevini inceleyin)
outputTts() Evet Evet
triggerScene() Hayır Evet
createIntentHandler(), expect(), clearExpectations(), prompt() Hayır Evet
createNumberSlot(),createTextSlot, createConfirmationSlot, createOptionsSlot() Hayır Evet
setHomeParam(), getHomeParam(), setUserParam(), getUserParam() Hayır Evet

Aşağıdaki bölümlerde, Etkileşimli Tuval İşleminizdeki istemci ve sunucu tarafı karşılama modelleri için API'lerin nasıl uygulanacağı açıklanmaktadır.

İstemci taraflı istek karşılamayla derleme

Web uygulaması mantığınıza aşağıdaki Etkileşimli Tuval API'lerini uygulayabilirsiniz:

outputTts()

Bu API, Actions Builder'dan statik istem göndermeden veya bir webhook'u çağırmadan bir cihazdan metin okuma (TTS) çıkışı yapmanızı sağlar. TTS ile ilişkili bir sunucu tarafı mantığı gerekli değilse sunucunuza gitmeyi atlayıp kullanıcılarınıza daha hızlı yanıt sağlamak için istemci tarafındaki outputTts() öğesini kullanabilirsiniz.

İstemci tarafı outputTts(), sunucu tarafındaki TTS'yi kesintiye uğratabilir veya iptal edebilir. Aşağıdaki önlemleri alarak sunucu tarafı TTS'nin kesintiye uğramasını önleyebilirsiniz:

  • Oturumun başında outputTts() çağırmaktan kaçının. Bunun yerine İşleminizin ilk görüşme dönüşünde sunucu tarafı TTS kullanın.
  • outputTts() hizmetini arka arkaya çağırmayın (kullanıcı işlemi arasında bir işlem olmadan).

Aşağıdaki snippet'te, istemci tarafından TTS çıkışı yapmak için outputTts() hizmetinin nasıl kullanılacağı gösterilmektedir:

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

Metin dizisine SSML işaretçileri yerleştirmek için outputTts() onTtsMark() ile de kullanabilirsiniz. onTtsMark() kullanıldığında, web uygulaması animasyonunuz veya oyun durumunuz bir SSML TTS dizesinin belirli noktalarında (aşağıdaki snippet'te gösterildiği gibi) senkronize edilir:

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);

Önceki örnekte, yanıtınızı özelleştiren iki işaret, TTS ile web uygulamasına gönderilir.

İstemcide amaç karşılamayı yönetme

Etkileşimli Tuval için sunucu karşılama modelinde tüm amaçların bir webhook tarafından işlenmesi gerekir. Bu da İşleminizin gecikmesini artırır. Bir webhook'u çağırmak yerine, web uygulamanızda amaçların yerine getirilmesini sağlayabilirsiniz.

Amaçları istemci taraflı işlemek için aşağıdaki API'leri kullanabilirsiniz:

  • createIntentHandler(): Actions Builder'da tanımlanan özel amaçlar için web uygulaması kodunda amaç işleyicileri tanımlamanızı sağlayan bir yöntemdir.
  • expect(): Kullanıcının hedefle eşleşebilmesi için amaç işleyiciyi etkinleştiren/kaydeden bir yöntem.
  • clearExpectations(): Kullanıcı amaçla eşleşen bir ifade söylese bile, amaçların eşleştirilememesi için halihazırda etkin olan tüm amaçlara yönelik beklentileri temizleyen bir yöntem.
  • deleteHandler(): Bu niyetlerin eşleştirilmemesi için amaç işleyicileri tek tek devre dışı bırakan bir yöntem.

Bu API'lerle Etkileşimli Tuval İşleminizin farklı durumları için amaçları seçerek etkinleştirebilir veya devre dışı bırakabilirsiniz. Bu amaçları etkinleştirmek için amaç işleyicilerde expect() kullanmanız gerekir.

Amaç işleyicileri etkinleştir

Amaç işleyiciyi etkinleştirmek iki adımlı bir işlemdir. İlk olarak, Actions Builder'da niyeti tanımlamanız gerekir. Ardından, amacı eşleştirilebilir hale getirmek için amaç işleyicide expect() işlevini çağırmanız gerekir.

İstemci tarafında bir amaç işleyici yapılandırmak ve etkinleştirmek için şu adımları uygulayın:

  1. Actions Console'da projenizi açın ve Özel amaç ekleyin.
  2. Bu genel bir amaç mı? sorusu için Evet'i seçin.

  3. Niyetinizi yapılandırın ve Kaydet'i tıklayın.

  4. Aşağıdaki snippet'te gösterildiği gibi, web uygulaması mantığınızda amacın işleyicisini tanımlayın:

    /**
    * 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. Amaç işleyiciyi kaydetmek için aşağıdaki snippet'te gösterildiği gibi expect() yöntemini çağırın:

    /**
    * 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);
    

Amaç işleyicileri devre dışı bırak

Bir amaç işleyici tanımladıktan sonra, İşleminiz için gerektiği şekilde amacı etkinleştirebilir veya devre dışı bırakabilirsiniz. Bir amacı etkinleştirmek için expect() çağırdığınızda, yeni oluşturulan işleyiciyi devre dışı bırakmak için kullanabileceğiniz deleteHandler() yöntemine sahip bir nesne döndürür. Amaç o anda etkin olmasa bile amaç işleyici tanımı aynı kalır. Böylece gerektiğinde amacı yeniden etkinleştirebilirsiniz.

Bir amaç işleyiciyi devre dışı bırakmak için aşağıdaki snippet'te gösterildiği gibi amaç işleyicide deleteHandler() çağrısı yapın:

    /**
    * 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();
    

Aşağıdaki snippet'te gösterildiği gibi, devre dışı bırakılmış bir amaç işleyiciyi yeniden eklemek için expect() yöntemini çağırabilirsiniz:

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

Amaçları toplu olarak devre dışı bırakmak için clearExpectations() yöntemini kullanabilirsiniz. Bu yöntem, etkin durumdaki tüm amaçları devre dışı bırakır. Aşağıdaki snippet'te tüm intent işleyiciler için beklentilerin nasıl netleştirileceği gösterilmektedir:

interactiveCanvas.clearExpectations();

İstemcide slot doldurma işlemini işleme

Actions Builder'da bir sahneye alan doldurma işlemi eklemek yerine alan doldurma işlemini doğrudan web uygulamanızda yapabilirsiniz.

İstemci tarafındaki slot doldurma işlemini gerçekleştirmek için önce aşağıdaki API'lerden birini kullanarak bir alan oluşturmanız gerekir:

  • createNumberSlot(callback, hints): Web uygulaması kodunuzda bir sayı alanı tanımlamanızı sağlayan bir yöntemdir. Kullanıcıdan sayı istemek için kullanılır.
  • createTextSlot(callback, hints): Web uygulaması kodunuzda bir metin alanı tanımlamanızı sağlayan bir yöntemdir. Kullanıcıdan kelime istemek için kullanılır.
  • createConfirmationSlot(callback, hints): Web uygulaması kodunuzda onay alanı tanımlamanızı sağlayan bir yöntem. Kullanıcıdan onay istemek için kullanılır (evet/hayır).
  • createOptionsSlot(options, callback, hints): Web uygulaması kodunuzda bir seçenek alanı tanımlamanızı sağlayan bir yöntem. Kullanıcıdan önceden tanımlanmış seçenekler listesinden seçim yapmasını istemek için kullanılır.

Alan oluşturduğunuzda isteğe bağlı olarak triggerHints tanımlayabilirsiniz. Bu anahtar kelimeler, İşleminiz için doğal dil anlama (NLU) sistemini iyileştiren anahtar kelimelerdir. Bu anahtar kelimeler, kullanıcının bir alanı doldururken söyleyebileceği kısa kelimeler olmalıdır. Örneğin, bir sayı alanı için triggerHints anahtar kelimesi years olabilir. Bir kullanıcı, "Otuz yaşındayım" yanıtıyla sohbette yaşıyla ilgili bir soruya yanıt verdiğinde, İşleminizin kullanıcının alanı uygun şekilde doldurduğunu algılama olasılığı daha yüksek olur.

Slot oluşturduktan sonra prompt API'yi kullanarak kullanıcıdan slot isteğinde bulunabilirsiniz:

  • prompt(tts, slot): Kullanıcıya TTS çıkışını vererek beklenen bir alanın doldurulmasını isteyen yöntem.

prompt() çağrıldığında, doldurulan alanın durumunu ve değerini içeren bir söz döndürülür.

Sayı alanı oluştur

Sayı alanı, görüşme sırasında kullanıcıdan bir numara istemenize olanak tanır. Slot doldurma hakkında daha fazla bilgi için Actions Builder belgelerinin Slot doldurma bölümüne bakın.

Kullanıcıdan istemci tarafındaki bir sayı alanını doldurmasını istemek için aşağıdaki adımları uygulayın:

  1. Web uygulaması mantığınızda bir numara alanı oluşturmak için createNumberSlot() yöntemini çağırın:

    /**
     * Create number slot.
     */
    const triggerHints = { associatedWords: ['guess number', 'number'] };
    const slot = interactiveCanvas.createNumberSlot(
      number => {
        console.log(`Number guessed: ${number}.`);
      }, triggerHints);
    
    
  2. Kullanıcıdan slot'u istemek ve döndürülen sözdeki alan değerini aşağıdaki snippet'te gösterildiği gibi işlemek için prompt() yöntemini çağırın:

    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);
        }
      });
    

Metin alanı oluştur

Metin alanı, görüşme sırasında kullanıcıdan bir kelime istemenize olanak tanır. Slot doldurma hakkında daha fazla bilgi için Actions Builder belgelerinin Slot doldurma bölümüne bakın.

Kullanıcıdan istemci tarafında bir metin alanını doldurmasını istemek için aşağıdaki adımları uygulayın:

  1. Web uygulaması mantığınızda bir metin alanı oluşturmak için createTextSlot() yöntemini çağırın:

    /**
     * Create text slot.
     */
    const triggerHints = { associatedWords: ['favorite color', 'color'] };
    const slot = interactiveCanvas.createTextSlot(
      text => {
        console.log(`Favorite color: ${text}.`);
      }, triggerHints);
    
    
  2. Kullanıcıdan slot'u istemek ve döndürülen sözdeki alan değerini aşağıdaki snippet'te gösterildiği gibi işlemek için prompt() yöntemini çağırın:

    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);
        }
      });
    

Onay aralığı oluştur

Onay alanı, kullanıcıdan onay istemesini sağlar (kullanıcı alanı doldurmak için "Evet" veya "Hayır" yanıtını verebilir). Slot doldurma hakkında daha fazla bilgi için Actions Builder belgelerinin Slot doldurma bölümüne bakın.

Kullanıcıdan istemci tarafında bir onay yuvasını doldurmasını istemek için aşağıdaki adımları uygulayın:

  1. Web uygulaması mantığınızda bir onay yuvası oluşturmak için createConfirmationSlot() yöntemini çağırın:

    /**
     * Create confirmation slot (boolean).
     */
    const triggerHints = { associatedWords: ['user confirmation', 'confirmation'] };
    const slot = interactiveCanvas.createConfirmationSlot(
      yesOrNo => {
        console.log(`Confirmation: ${yesOrNo}`);
      }, triggerHints);
    
    
  2. Kullanıcıdan slot'u istemek ve döndürülen sözdeki alan değerini aşağıdaki snippet'te gösterildiği gibi işlemek için prompt() yöntemini çağırın:

    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);
        }
      });
    

Seçenek alanı oluştur

Seçenekler alanı, kullanıcıdan önceden tanımlanmış seçenekler listesinden seçim yapmasını istemenize olanak tanır. Slot doldurma hakkında daha fazla bilgi için Actions Builder belgelerinin Slot doldurma bölümüne bakın.

Kullanıcıdan istemci tarafındaki seçenekler alanını doldurmasını istemek için şu adımları uygulayın:

  1. Web uygulaması mantığınızda seçenek alanı oluşturmak için createOptionsSlot() yöntemini çağırın:

    /**
     * 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. Kullanıcıdan slot'u istemek ve döndürülen sözdeki alan değerini aşağıdaki snippet'te gösterildiği gibi işlemek için prompt() yöntemini çağırın:

    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()

triggerScene() API, istemci tarafı istek karşılamanızdan Etkileşimli Tuval İşleminizdeki başka bir sahneye geçiş yapmanıza olanak tanır. triggerScene() sayesinde, kullanıcının Actions Builder'da webhook gerektiren bir sistem sahnesine erişmesi gerektiğinde, istemci taraflı istek karşılamadan sunucu tarafı karşılamaya da geçebilirsiniz. Örneğin, bir kullanıcının hesabını bağlaması veya bildirim alması gerektiğinde triggerScene() yöntemini çağırabilir, ardından bu düzenden Canvas istemiyle istemci taraflı sipariş karşılamaya dönebilirsiniz.

Aşağıdaki snippet, triggerScene() işlemini İşleminize nasıl uygulayacağınızı gösterir:

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

İstemcide ev ve kullanıcı depolama alanı

Ana sayfa ve kullanıcı depolama alanı değerlerini almak ve ayarlamak için webhook kullanmak yerine, web uygulamanızda ana sayfa ve kullanıcı depolama alanını işlemek için istemci tarafı API'leri çağırabilirsiniz. Böylece web uygulamanız, depolanan bu değerleri birden çok oturumda (ör. istem ve koşullarda) kullanabilir ve gerektiğinde belirli bir hane veya kullanıcının değerlerine erişebilir. Bu API'leri kullanmak, depolama alanı değerlerini almak ve ayarlamak için artık webhook çağırmanız gerekmediğinden Etkileşimli Tuval İşleminizdeki gecikmeyi azaltabilir.

Web uygulamasındaki ana sayfa ve kullanıcı depolama alanı, webhook'taki depolama alanıyla aynı genel ilkelere uyar. Ev ve kullanıcı depolama alanı hakkında daha fazla bilgi edinmek için Ev depolama alanı ve Kullanıcı depolama alanı belgelerine bakın.

İstemci tarafı ev depolama alanı

Ev depolama alanı, ana sayfa grafiğine göre hane kullanıcıları için değerleri depolamanıza olanak tanır ve hanedeki tüm oturumlar genelinde paylaşılır. Örneğin, bir kullanıcı bir hanede Etkileşimli Tuval oyunu oynarsa oyunun skoru evin depolama alanında saklanabilir ve diğer hane üyeleri bu skorla oyunu oynamaya devam edebilir.

İşleminizin evde depolama alanını desteklemesini sağlamak için şu adımları uygulayın:

  1. Actions konsolunda, Dağıtma > Dizin bilgileri > Ek Bilgiler'e gidin.
  2. İşlemleriniz ev depolama alanını kullanıyor mu? sorusu için Evet kutusunu işaretleyin.

Web uygulamanızda ev depolama alanına bir değer yazmak için aşağıdaki snippet'te gösterildiği gibi setHomeParam() yöntemini çağırın:

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

Web uygulamanızda ev depolama alanındaki bir değeri okumak için aşağıdaki snippet'te gösterildiği gibi getHomeParam() yöntemini çağırın:

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

Mevcut ev depolama alanının tamamını temizlemek için aşağıdaki snippet'te gösterildiği gibi resetHomeParam() yöntemini çağırın:

interactiveCanvas.resetHomeParam();

İstemci tarafı kullanıcı depolama alanı

Kullanıcı depolama alanı, birden fazla oturumda belirli ve doğrulanmış bir kullanıcıya ait parametre değerlerini depolamanıza olanak tanır. Örneğin, kullanıcı oyun oynuyorsa oyunun skoru bu kullanıcı için depolanabilir. Sonraki bir oyun oturumunda, kullanıcı aynı skorla oyunu oynamaya devam edebilir.

Web uygulamanızda kullanıcı depolama alanına bir değer yazmak için aşağıdaki snippet'te gösterildiği gibi setUserParam() yöntemini çağırın:

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

Web uygulamanızda kullanıcı depolama alanından bir değer okumak için aşağıdaki snippet'te gösterildiği gibi getUserParam() yöntemini çağırın:

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

Mevcut kullanıcı depolama alanının tamamını temizlemek için aşağıdaki snippet'te gösterildiği gibi resetUserParam() yöntemini çağırın:

interactiveCanvas.resetUserParam();

setCanvasState()

setCanvasState() yöntemi, durum verilerini Etkileşimli Canvas web uygulamanızdan sipariş karşılama uygulamanıza göndermenizi sağlar ve Asistan'a, web uygulamasının durumunu güncellediğini bildirir. Web uygulaması, güncellenmiş durumunu JSON nesnesi olarak gönderir.

setCanvasState() çağrıldığında bir amaç çağrılmaz. setCanvasState() çağrıldıktan sonra, sendTextQuery() çağrılırsa veya kullanıcı sorgusu görüşmedeki bir amaçla eşleşirse önceki görüşme sırasında setCanvasState() ile ayarlanan veriler sonraki görüşme dönüşlerinde kullanılabilir.

Aşağıdaki snippet'te web uygulaması, Tuval durumu verilerini ayarlamak için setCanvasState() değerini kullanır:

JavaScript

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

Webhook'tan referans Tuval durumu

Sipariş karşılama kodunuzda, depolanan Canvas durum değerlerine referans verebilirsiniz. Değere referans vermek için conv.context.canvas.state.KEY söz dizimini kullanın. Burada KEY, Canvas durumu değeri ayarlandığında verilen anahtardır.

Örneğin, daha önce Canvas durumunda bir oyun için score parametresi olarak yüksek puan değeri depoladıysanız istek karşılamada bu değere erişmek için conv.context.canvas.state.score kullanarak bu değere referans verin:

Node.js

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

İstemlerde referans Tuval durumu

Bir istemde, depolanan Canvas durumu değerlerine referans verebilirsiniz. Değere referans vermek için $canvas.state.KEY söz dizimini kullanın. Burada KEY, Canvas durumu değeri ayarlandığında verilen anahtardır.

Örneğin, daha önce Canvas durumunda bir oyun için rekor değerini score parametresi olarak depoladıysanız bu değere istemde erişmek için $canvas.state.score kullanarak bu değere referans verin:

JSON

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

Koşullar dahilinde referans Tuval durumu

Koşullarda, depolanan Canvas durum değerlerine de referans verebilirsiniz. Değeri referans almak için canvas.state.KEY söz dizimini kullanın. Burada KEY, Canvas durum değeri ayarlandığında verilen anahtardır.

Örneğin, daha önce Canvas durumunda bir oyun için score parametresi olarak yüksek puan değeri depoladıysanız ve bunu bir koşuldaki 999 değeriyle karşılaştırmak istiyorsanız canvas.state.score kullanarak koşulunuzdaki depolanan değere başvuruda bulunabilirsiniz. Koşul ifadeniz aşağıdaki gibi görünür:

Koşul söz dizimi

canvas.state.score >= 999
    

sendTextQuery()

sendTextQuery() yöntemi, bir niyeti programatik olarak eşleştirmek için Conversational Action'a metin sorguları gönderir. Bu örnekte, kullanıcı bir düğmeyi tıkladığında üçgen dönen oyunu yeniden başlatmak için sendTextQuery() kullanılmıştır. Kullanıcı "Oyunu yeniden başlat" düğmesini tıkladığında sendTextQuery(), Restart game amacıyla eşleşen bir metin sorgusu gönderir ve bir söz döndürür. Bu söz, amaç tetiklenirse SUCCESS ve etkin değilse BLOCKED ile sonuçlanır. Aşağıdaki snippet amacı eşleştirir ve vaatin başarılı ve başarısız durumlarını yönetir:

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;
}
…
    

Vaat, SUCCESS ile sonuçlanırsa Restart game webhook işleyicisi, web uygulamanıza Canvas yanıtı gönderir:

JavaScript

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

Bu Canvas yanıtı, aşağıdaki RESTART_GAME kod snippet'indeki kodu yürüten onUpdate() geri çağırmasını tetikler:

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;
},
…
    

Sunucu tarafı istek karşılama ile derleme

Webhook'unuza aşağıdaki Etkileşimli Tuval API'lerini uygulayabilirsiniz:

Tam ekran modunu etkinleştirme

Varsayılan olarak, Etkileşimli Tuval web uygulamaları ekranın üst kısmında İşleminizin adını içeren bir başlık içerir. Başlığı kaldırmak ve yükleme ekranında görünen geçici bir durum mesajıyla değiştirmek için enableFullScreen kullanabilirsiniz. Bu, kullanıcınızın İşleminizle etkileşimde bulunurken tam ekran deneyimi yaşamasına olanak tanır. Bildirim mesajında İşlemin görünen adı, geliştiricinin adı ve İşlem'den çıkma talimatları gösterilir. Bildirim rengi, kullanıcının cihazında tema olarak seçtiği öğeye göre değişir.

Şekil 1. Bir işlemin yükleme ekranında kısa mesaj mesajı.

Bir kullanıcı İşleminizle sık sık etkileşimde bulunursa durum mesajı mesajının yükleme ekranında gösterilmesi geçici olarak durdurulur. Kullanıcı bir süre boyunca İşleminizle etkileşimde bulunmazsa İşlemi başlattığında durum mesajı mesajı yeniden gösterilir.

Tam ekran modunu webhook'unuzda veya İşlemler Oluşturucu'daki statik bir istemde etkinleştirebilirsiniz.

Webhook'unuzda tam ekran modunu etkinleştirmek için şu adımı uygulayın:

  1. Bir oturumdaki webhook tarafından döndürülen ilk canvas yanıtında enableFullScreen alanını true olarak ayarlayın. Aşağıdaki snippet, Node.js istemci kitaplığının kullanıldığı bir örnek uygulamadır:

     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);
    

Actions Builder'daki statik bir istemde tam ekran modunu etkinleştirmek için şu adımları uygulayın:

  1. Actions Console'da projenizi açın.
  2. Gezinme çubuğunda Geliştir'i tıklayın ve ilk canvas yanıtını içeren istemi açın.
  3. enable_full_screen öğesini, aşağıdaki snippet'te gösterildiği gibi true olarak ayarlayın:

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

continueTtsDuringTouch

Varsayılan olarak, kullanıcı Etkileşimli Tuval İşlemini kullanırken ekrana dokunduğunda TTS oynatmayı durdurur. Kullanıcılar continueTtsDuringTouch ile ekrana dokunduğunda TTS'nin oynatmaya devam etmesini sağlayabilirsiniz. Bu davranış aynı oturumda açılıp kapatılamaz.

Bu davranışı webhook'unuzda veya Actions Builder'daki statik bir istemde uygulayabilirsiniz.

Kullanıcı webhook'unuzdaki ekrana dokunduktan sonra TTS'nin devam etmesini sağlamak için şu adımı uygulayın:

  • Bir oturumdaki webhook tarafından döndürülen ilk canvas yanıtında continueTtsDuringTouch alanını true olarak ayarlayın. Aşağıdaki snippet, Node.js istemci kitaplığının kullanıldığı bir örnek uygulamadır:

    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);
    

Kullanıcı, İşlemler Oluşturucu'da statik bir istemde ekrana dokunduktan sonra TTS'nin devam etmesini sağlamak için şu adımları uygulayın:

  1. Actions Console'da projenizi açın.
  2. Gezinme çubuğunda Geliştir'i tıklayın ve ilk canvas yanıtını içeren istemi açın.
  3. continue_tts_during_touch öğesini, aşağıdaki snippet'te gösterildiği gibi true olarak ayarlayın:

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