Actions Builder を使用して Google アシスタントのアクションを構築する(レベル 2)

Google アシスタントのデベロッパー プラットフォームを使用すると、Google アシスタントのバーチャル パーソナル アシスタント機能を拡張するソフトウェアを作成し、スマート スピーカー、スマートフォン、自動車、テレビ、ヘッドフォンなど 10 億以上のデバイスで公開できます。ユーザーは、Google アシスタントとの会話を通じて、食料品の購入から乗車の予約までさまざまなタスクを実行できます。Google アシスタントのデベロッパー プラットフォームを使用することで、サードパーティ フルフィルメント サービスを開発し、ユーザーとの快適かつ効果的な会話型エクスペリエンスを簡単に作成、管理できます。

この Codelab では、Google アシスタントでの開発に関する中級レベルのコンセプトについて解説し、レベル 1 の Codelab で作成したアクションをベースにより高度なアクションを構築します。このチュートリアルを始める前に、レベル 1 の Codelab を完了することを強くおすすめします。

この Codelab で構築するのは、架空の地「グリフィンバーグ」の冒険に出掛けるユーザーが、旅に持っていくアイテムとして何を選んだかに応じて運勢を伝えるアクションです。

目標

この Codelab では、以下の機能を備えた高度な会話型アクションを構築します。

  • ユーザーからデータを収集し、値に応じて会話のプロンプトを変更する
  • 会話を続けるためにフォローアップの質問をする
  • ゲームループを作成し、ユーザーが運勢を聞いた後にアクションとやり取りできるようにする

構築を開始する前に、公開済みのアクションで会話を試すことができます。Google アシスタント対応デバイスを用意し、「OK Google, talk to Fate and Fortune」(OK Google, 旅の運勢を占う)と話しかけてください。このアクションにアクセスするのが 2 回目以降のユーザーの場合、デフォルトでは次のように会話が進行します。

dd6f5c61296b8b50.png

eba043f546aa8c51.png

演習内容

  • スロットを使用してユーザーからデータを収集する
  • 条件を使用してシーンにロジックを追加する
  • ゲームループを追加する
  • 補助的なパスを追加する

必要なもの

この Codelab に必要なもの(および前提条件)は以下のとおりです。

  • ウェブブラウザ(Chrome など)
  • レベル 1 の Codelab を完了し Actions プロジェクトを作成していること

この Codelab のフルフィルメント コードを理解するうえで、JavaScript(ES6)に精通していることを強く推奨しますが、必須ではありません。

レベル 1 の Codelab では、Start という 1 つのシーンのみの簡単な会話型アクションを作成しました。

この Codelab では、アクションの会話をさらに展開します。以降のセクションでは、アクションに変更を加えて以下の処理を行えるようにします。

  • ユーザーが運勢を聞きたいと応答したときに、新しい Fortune シーンに遷移する
  • 旅に持っていくアイテムを選ぶようユーザーに促す
  • ユーザーの選択に応じてカスタマイズされた運勢を返す

Fortune シーンを作成する

このセクションでは、Fortune シーンを作成し、会話中にユーザーがこのシーンに遷移する方法を定義します。

Fortune という新しいシーンを作成する手順は次のとおりです。

  1. Codelab レベル 1 で作成した Actions プロジェクトを開きます。
  2. ナビゲーションで [Develop](開発)をクリックします。
  3. [Scenes](シーン)で Start シーンをクリックします。
  4. yes インテント([If yes is matched](yes が一致した場合)ボックス)をクリックしてオプション ウィンドウを開きます。
  5. [Send prompts](プロンプトを送信)をオフにしてプロンプトを削除します。
  6. [Transition](遷移)でプルダウン メニューをクリックし、テキスト ボックスをクリックして「Fortune」と入力します。
  7. [Add](追加)をクリックします。これで、Fortune という新しいシーンが作成されるとともに、ユーザーが運勢を聞きたいと応答したときに Start シーンから Fortune シーンに移る遷移も追加されます。

56682a0c7459b98c.png

Fortune シーンの会話ロジックを定義する

この Codelab では Fortune シーンに変更を加え、ユーザーに「What do you choose to help you on your quest, a dragon, a translator, or a compass?」(冒険に持っていくアイテムを選んでください。ドラゴン、翻訳機、コンパスの中から選べます)と尋ねられるようにします。ユーザーから前もって必要な情報を収集するため、「スロットフィル」という機能を使用します。

このアクションでは、dragon(ドラゴン)、translator(翻訳機)、compass(コンパス)という 3 種類のアイテムそれぞれに応じた運勢を用意します。ユーザー入力からこの 3 つの選択肢を識別できるようアクションを設定するには、新しい「型」を作成する必要があります。

シーンのスロットフィル ステージでは、この型を使用してユーザーから収集する情報を定義します。NLU エンジンは、ユーザー入力内に一致するスロットを検出すると、そのスロットを型付きパラメータとして抽出します。取得した値は、シーン内でロジックの実行に使用できます。

available_options 型を作成する

このセクションでは、available_options という新しい型を作成します。この型は、プロンプトへの応答においてユーザーが選択できる 3 種類の選択肢(dragon、translator、compass)を指定するために使用します。また、選択肢の類義語が返された場合に備え、それぞれに似ている言葉もいくつか定義します。後のセクションで available_options 型をスロットに追加し、ユーザーが選んだアイテムを取得できるようにします。

available_options 型を作成する手順は次のとおりです。

  1. ナビゲーションで [Types](型)をクリックします。
  2. [+](プラス記号)をクリックして「available_options」と入力し、Enter キーを押します。
  3. [available_options] をクリックしてオプション ウィンドウを開きます。

型は、情報の Key-Value ペアとして設定されます。Key(キー)は型の名前、Value(値)はその Key の同義語です。キーを定義すると、それ自体が自動的に値として追加されます。

ユーザーが選択できる 3 つのアイテムを追加する手順は次のとおりです。

  1. [Add entries](エントリを追加)まで下にスクロールします。
  2. [New entry](新しいエントリ)欄に「dragon」と入力し、Enter キーを押します。これで dragon というキーが作成されます。
  3. [Add values](値を追加)欄に「hydra」と入力して Enter キーを押し、値(類義語)として追加します。次に、値 lizard を同じ手順で追加します。
  4. 残りのキーとそれに対応する値を追加します。
  • translator | translator, communicator, machine, decoder, translate
  • compass | compass, direction, guide

8333b1b67445f21.png

  1. [Save](保存)をクリックします。

これで、available_options が dragon、translator、compass であることをアクションが理解し、それぞれに対応するいくつかの類義語を認識できるようになりました。

スロットフィルを設定する

次に、Fortune シーンにスロットフィルを設定する必要があります。スロットフィル ロジックを設定する手順は次のとおりです。

  1. ナビゲーションの [Scenes] で [Fortune] をクリックします。
  2. Fortune シーンで、[Slot Filling](スロットフィル)の [+](プラス記号)をクリックします。
  3. [Enter slot name](スロット名を入力)欄に、スロット名として「chosenOptions」を入力します。
  4. [Select type](型を選択)プルダウンで、スロットの型として [available_options] を選択します。
  5. [This slot is required](このスロットを必須にする)を選択します。

a461b906476e244.png

  1. [Send prompts] をオンにして、次のメッセージと候補ワードを追加します。
 candidates:
  - first_simple:
      variants:
        - speech: >-
            What do you choose to help you on your quest, a dragon, a
            translator, or a compass?
    suggestions:
      - title: 'Dragon'
      - title: 'Translator'
      - title: 'Compass'
  1. [Save] をクリックします。

これで available_options 型をスロットに追加できました。このスロットを使用することで、会話を進める前にユーザーから収集する必要のある情報(ユーザーがどのアイテムを選択したか)をアクションに伝えることができます。スロット内に設定したプロンプトは、ユーザーがシーンのスロットフィル ステージに達したときにプロンプト キューに追加されます。

スロットの名前を chosenOptions に設定したので、[Customize slot value writeback](スロットの返事の値をカスタマイズ)欄はこの名前を使った値($session.params.chosenOptions)に更新されます。このパラメータにアクセスするには、Actions Builder で、またはクライアント ライブラリを使用したフルフィルメントで、この名前を検索します。

scene.slots.status == "FINAL" 条件を設定する

スロットを追加すると、条件 scene.slots.status == "FINAL" が条件リストに自動的に追加されます。

条件 scene.slots.status == "FINAL" は、スロットフィルが完了したかどうかをチェックします。すべてのスロットが埋まると、条件は Webhook をトリガーしたり、新しいシーンに遷移したり、プロンプト キューにプロンプトを追加したりできるようになります。

このセクションでは、スロットが埋まったときにプロンプトをプロンプトキューに追加するように scene.slots.status == "FINAL" を設定します。

このプロンプトを FINAL 条件に追加する手順は次のとおりです。

  1. scene.slots.status == "FINAL" 条件をクリックしてオプション ウィンドウを開きます。
  2. [Send prompts] をオンにして、次のプロンプトを追加します。
candidates:
  - first_simple:
      variants:
        - speech: You picked $session.params.chosenOptions.
  1. [Save] をクリックします。

シミュレータでアクションをテストする

ここまでの変更により、スロットフィルにおいてユーザーが選ぶアイテムを定義できました。ユーザーからこの情報を入手した後、選択肢に応じてプロンプトが返されるはずです。

次の手順でアクションをテストしてみましょう。

  1. ナビゲーション バーで、[Test](テスト)をクリックします。
  2. [Talk to my test app] をクリックまたは入力欄に入力し、Enter キーを押します。
  3. 入力欄に「Yes」と入力し、Enter キーを押します。または、候補ワードの [Yes] をクリックします。

a899d45c542668f6.png

  1. dragon」をクリック、入力、または音声入力します。「You picked dragon」(ドラゴンを選択しました)というプロンプトが返されます。

次のセクションでは、ユーザーが選択できるアイテムごとのプロンプトをカスタマイズします。

条件を使用してプロンプトをカスタマイズする

このセクションでは、ユーザーに示す選択肢ごとに条件を追加し、それぞれの条件に応じたカスタム プロンプトを追加します。

dragon の運勢をカスタマイズする

ユーザーが「dragon」を選択した場合に対応するよう条件を編集し、プロンプトをカスタマイズする手順は次のとおりです。

  1. ナビゲーションで [Develop] をクリックします。
  2. ナビゲーションで Fortune シーンをクリックします。
  3. scene.slots.status == "FINAL" 条件をクリックしてオプション ウィンドウを開きます。
  4. 条件文を次のように編集します。scene.slots.status == "FINAL" && session.params.chosenOptions == "dragon"
  5. [Send prompts] をオンにします。
  6. コードエディタで、プロンプトの内容を、運勢を占う次のメッセージに変更します。
 candidates:
  - first_simple:
      variants:
        - speech: >-
            The people of Gryffinberg will be awestruck by the beauty and power
            of the ancient dragon. Much to your dismay, the townspeople fall
            into dispute over who will receive the honor of riding the dragon
            first. You return home from your quest without everlasting glory or
            a dragon.
  1. [Save] をクリックします。

d31767232ad908bd.png

これで、ユーザーの応答が「dragon」またはその類義語のときに、その選択に応じた運勢を返せるようになりました。続いて、残り 2 つの選択肢に対応する条件を追加します。

translator の運勢をカスタマイズする

ユーザーが「translator」を選択した場合に対応するよう条件を追加し、プロンプトをカスタマイズする手順は次のとおりです。

  1. [Condition](条件)の横にある[+](プラス記号)をクリックします。
  2. [else if](条件)欄に scene.slots.status == "FINAL" && session.params.chosenOptions == "translator" を追加します。
  3. [Send prompts] をオンにします。
  4. コードエディタに次のプロンプトを追加します。
candidates:
  - first_simple:
      variants:
        - speech: >-
            With the help of the translator, the rival factions in Gryffinberg
            are finally able to communicate with each other and resolve their
            disputes. You will complete your quest to restore peace in the town.
            The translator will be used on many subsequent journeys across the
            earth. After its work is done, it retires honorably to a premier
            location in the Gryffinberg History Museum.
  1. [Save] をクリックします。

c1af65e70dbf3dfe.png

compass の運勢をカスタマイズする

ユーザーが「compass」を選択した場合に対応するよう条件を追加し、プロンプトをカスタマイズする手順は次のとおりです。

  1. [Condition] の横にある[+](プラス記号)をクリックします。
  2. [else if] テキスト ボックスに scene.slots.status == "FINAL" && session.params.chosenOptions == "compass" を追加します。
  3. [Send prompts] をオンにします。
  4. コードエディタに次のプロンプトを追加します。
 candidates:
  - first_simple:
      variants:
        - speech: >-
            The compass will help you find the mystical and ancient Library of
            Gryffinberg. Among its infinite stacks of dusty books, you find one
            entitled "Wisdom of the Ages". By the time you've read the
            50,000-page tome, the townspeople have forgotten their problems. You
            will write a second edition of "Wisdom of the Ages", but have
            limited commercial success.
  1. [Save] をクリックします。

シミュレータでアクションをテストする

ここまでの変更により、ユーザーの選択に応じてカスタマイズされた運勢を返せるようになりました。

次の手順でアクションをテストしてみましょう。

  1. ナビゲーション バーで、[Test] をクリックします。
  2. 入力欄に「Talk to my test app」と入力し、Enter キーを押します。
  3. 入力欄に「Yes」と入力し、Enter キーを押します。または、候補ワードの [Yes] をクリックします。
  4. Translator」をクリック、入力、または音声入力します。

29e17f950bd0dd71.png

「translator」を選択した場合の運勢が返されます。

このセクションでは、ユーザーが別のアイテムを選び直せるようにアクションを変更し、選び直した後に別の運勢が返されるようにします。この変更は、ゲームの最後に「もう一度プレイしますか?」というメッセージを表示するようなものです。このループを作成するには、以前に作成した yes インテントと no インテントを、Again という新しいシーンに追加します。

Again シーンを作成する

このセクションでは、新しいシーン Again を作成し、別のアイテムを選ぶかどうかをユーザーに尋ねるプロンプトを追加します。

Again シーンを作成する手順は次のとおりです。

  1. ナビゲーションで [Develop] をクリックします。
  2. [Scenes] の [+](プラス記号)をクリックします。
  3. Again」と入力して Enter キーを押します。
  4. ナビゲーションで Again シーンをクリックします。
  5. [On enter](開始時)の横にある [+](プラス記号)をクリックします。
  6. [Send prompts] をオンにして、次のプロンプトと候補ワードを追加します。
candidates:
  - first_simple:
      variants:
        - speech: >-
            That is what I see for you. Would you like to choose a different option and
            explore another future?
    suggestions:
      - title: 'Yes'
      - title: 'No'
  1. [Save] をクリックします。

Fortune シーンから Again シーンへの遷移を追加する

ユーザーに運勢を伝えたら、会話を新しい Again シーンに遷移させる必要があります。

Fortune から Again へのシーンの遷移を追加する手順は次のとおりです。

  1. Fortune シーンをクリックします。
  2. 最初の条件(scene.slots.status == "FINAL" && session.params.chosenOptions == "dragon")をクリックしてオプション ウィンドウを開きます。
  3. スクロールして、[Transition] で [Again] を選択します。
  4. [Save] をクリックします。
  5. 2 番目の条件をクリックしてオプション ウィンドウを開きます。
  6. スクロールして、[Transition] で [Again] を選択します。
  7. [Save] をクリックします。
  8. 3 番目の条件をクリックしてオプション ウィンドウを開きます。
  9. スクロールして、[Transition] で [Again] を選択します。
  10. [Save] をクリックします。

シミュレータでアクションをテストする

ここまでの変更により、ユーザーに運勢を伝えた後に「That is what I see for you. Would you like to choose a different option and explore another future?」(これが私に見えるあなたの運勢です。違うアイテムを選んで、別の運勢を占ってみますか?)というプロンプトを返せるようになりました。

次の手順でアクションをテストしてみましょう。

  1. ナビゲーション バーで、[Test] をクリックします。
  2. 入力欄に「Talk to my test app」と入力し、Enter キーを押します。
  3. 入力欄に「Yes」と入力し、Enter キーを押します。または、候補ワードの [Yes] をクリックします。
  4. dragon」をクリック、入力、または音声入力します。

b299e9fed9aedb69.png dragon を選んだ場合の運勢と Again プロンプトが返されます。

インテントと Again シーンへの遷移を追加する

このセクションでは、yes インテントと no インテントを Again シーンに追加します。これにより、ユーザーがアイテムを選び直したいかどうかを確認できます。また、yes インテントと no インテントに適切な遷移を追加します。yes インテントは Fortune シーンに、no インテントはシステム シーン End conversation に遷移するようにします。

インテントと Again シーンへの遷移を追加する手順は次のとおりです。

  1. ナビゲーションで [Develop] をクリックします。
  2. Again シーンをクリックします。
  3. [User intent handling](ユーザー インテントの処理)の横にある [+](プラス記号)をクリックします。
  4. インテントのプルダウン メニューから [yes] を選択します。
  5. [Transition] プルダウン メニューから [Fortune] を選択します。
  6. [Save] をクリックします。

c2efba35ea881b0d.png

  1. [User intent handling] の横にある [+](プラス記号)をクリックします。
  2. インテントのプルダウン メニューから [no] を選択します。
  3. [Transition] プルダウン メニューから [End conversation](会話を終了)を選択します。
  4. [Send prompts] をオンにして、コードエディタに次のプロンプトを追加します。
candidates:
  - first_simple:
      variants:
        - speech: >-
            It pleases me that you are satisfied with your choice. Best of luck on your quest. Farewell.
  1. [Save] をクリックします。

シミュレータでアクションをテストする

ここまでの変更により、ユーザーがアイテムを選び直したいのか、あるいは会話を終了したいのかを認識できるようになりました。

次の手順で yes インテントをテストしてみましょう。

  1. ナビゲーション バーで、[Test] をクリックします。
  2. 入力欄に「Talk to my test app」と入力し、Enter キーを押します。
  3. 入力欄に「Yes」と入力し、Enter キーを押します。または、候補ワードの [Yes] をクリックします。
  4. 選択肢をクリック、入力、または音声入力します。
  5. 入力欄に「Yes」と入力し、Enter キーを押します。

5d0690332efe2e29.png

「What do you choose to help you on your quest, a dragon, a translator, or a compass?」というプロンプトが返されます。

次の手順で no インテントをテストしてみましょう。

  1. 選択肢をクリック、入力、または音声入力します。
  2. 入力欄に「No」と入力し、Enter キーを押します。

End conversation プロンプト(「It pleases me that you are satisfied with your choice. Best of luck on your quest. Farewell」(お気に召したようで何よりです。旅の幸運を祈ります。それでは)が返されます。

ここまでの変更により、このアクションでほとんどのユーザーが選択するメインパスを作成できました。ただし、Fortune シーンのプロンプト「What do you choose to help you on your quest, a dragon, a translator, or a compass?」に対して、選択肢以外のアイテムを答えるユーザーがいるかもしれません。

このセクションではアクションにさらに変更を加え、ユーザーが「magic」(魔法)、「money」(お金)、「horse」(馬)、「phone」(スマートフォン)などと答えたことを認識し、既定の 3 つの選択肢から選ぶようユーザーに促せるようにします。このロジックを設定するには、選択できないアイテムを含む新しい type(型)と、ユーザーがそれらのアイテムを選んだ場合に一致する新しいインテント other_option を作成する必要があります。また、「インテント パラメータ」を識別して抽出するには、other_option インテント内のトレーニング フレーズに「アノテーション」を付ける必要があります。

アシスタントの NLU エンジンは、ユーザー入力内に一致するパラメータを検出すると、その値を型付きパラメータとして抽出します。取得した値は、シーン内でロジックの実行に使用できます。この Codelab では、ユーザーが選択したアイテムを抽出し、その選択をプロンプト内で参照できるようにします。

unavailable_options 型を作成する

これで、さまざまなアイテムを含む unavailable_options 型を作成し、ユーザー入力内のデータを識別するための準備が整いました。

unavailable_options 型を作成する手順は次のとおりです。

  1. ナビゲーションで [Develop] をクリックします。
  2. [Types] の [+](プラス記号)をクリックします。
  3. unavailable_options」と入力して Enter キーを押します。
  4. [unavailable_options] をクリックしてオプション ウィンドウを開きます。
  5. [Add entries] で、次のエントリと対応する値を入力します。

horse

horse, stallion, steed

magic

magic, enchanted, spells

money

money, cash, gold

phone

phone, cell, apps

Key-Value テーブルは以下のようになります。

c9e119e0f5fb2a47.png

  1. [Save] をクリックします。

other_option インテントを作成する

次に、other_option というインテントを作成し、unavailable_options 型のアイテムを含むトレーニング フレーズを追加します。ユーザーが unavailable_options 型に含まれるアイテムを選ぶと、このインテントに一致します。

other_option インテントを作成して設定する手順は次のとおりです。

  1. [Intents](インテント)で [+](プラス記号)をクリックします。
  2. other_option」と入力して Enter キーを押します。
  3. [other_option] をクリックしてオプション ウィンドウを開きます。
  4. 次のトレーニング フレーズを追加します。1 つ入力するごとに Enter キーを押します。
  • I want to use spells
  • I really really want to use a phone
  • magic!
  • cash
  • I want to ride a horse
  1. [Add intent parameters](インテント パラメータを追加)で、パラメータ名を chosenUnavailableOption に更新します。
  2. [Save] をクリックします。

トレーニング フレーズを入力すると、Actions Builder は unavailable_options 型の spellsphonemagiccashhorse を認識し、その単語を自動的にハイライト表示(アノテーションを付加)します。[Add intent parameters] には、以下の画像に示すとおり、インテント パラメータが自動的に追加されます。

このインテント パラメータを指定すると、アイテムの名前を抽出してプロンプト内で使用できるようになります。

df61d4489f0910.png

other_option インテントを Fortune シーンに追加する

これで、ユーザーが選択肢以外のアイテムを選んだ場合に対応できるインテント other_option を作成できました。このセクションでは、この other_option インテントを Fortune シーンに追加します。ユーザー入力に基づいてプロンプトをカスタマイズするには、インテント パラメータを使用します。

other_option インテントを Fortune シーンに追加する手順は次のとおりです。

  1. Fortune シーンをクリックします。
  2. [User intent handling] の横にある [+](プラス記号)をクリックします。
  3. インテントのプルダウン メニューから [other_option] を選択します。
  4. [Send prompts] をオンにして、次のプロンプトを追加します。
candidates:
  - first_simple:
      variants:
        - speech: >-
            I have seen the future and a $intent.params.chosenUnavailableOption.original
            will not aid you on your journey.

$intent.params.chosenUnavailableOption はインテント パラメータ オブジェクト、$intent.params.chosenUnavailableOption.original はそのオブジェクトの値です。original プロパティは、ユーザーが指定した未加工の入力です。

  1. [Save] をクリックします。

4bab1efbe21056aa.png

Fortune シーンでユーザーが unavailable_options 型のアイテムを選択すると、other_option インテントに一致してプロンプトがプロンプト キューに追加されます。遷移が指定されていないため、シーンは条件ステージを再評価することによって実行ループを続行します。その後、chosenOptions スロットによってプロンプトがプロンプト キューに追加され、プロンプト キューがユーザーに配信されます。

シミュレータでアクションをテストする

これで、ユーザーが unavailable_options 型のアイテムを選択したときに適切に応答できるようになりました。アクションは、ユーザーが選択したアイテムを識別してから、ユーザーに元々の選択肢(dragon、translator、compass)のいずれかを選ぶよう促すプロンプトを返すはずです。

シミュレータでアクションをテストする手順は次のとおりです。

  1. ナビゲーション バーで、[Test] をクリックします。
  2. 入力欄に「Talk to my test app」と入力し、Enter キーを押します。
  3. 入力欄に「Yes」と入力し、Enter キーを押します。または、候補ワードの [Yes] をクリックします。
  4. 入力欄に「magic」と入力し、Enter キーを押します。

3a42c33eca435f32.png

英語のプロンプトで、ユーザーが「magic」を選んだ場合に冠詞の「a」が付くのは違和感があります。以降のセクションでは、この問題に対処する方法を説明します。

unavailable_options ハンドラを追加する

unavailable_options 型のアイテムの前に冠詞「a」を必要に応じて挿入するには、ユーザーが選んだアイテムの前に「a」が必要かどうかを確認するためのイベント ハンドラをフルフィルメント ロジックに設定します。まず、アクションがハンドラを呼び出すようにコンソールで設定する必要があります。

unavailable_options ハンドラを追加する手順は次のとおりです。

  1. ナビゲーションで [Develop] をクリックします。
  2. Fortune シーンをクリックします。
  3. [User intent handling] で [when other_option matches](other_option が一致した場合)をクリックしてオプション ウィンドウを開きます。
  4. [Send prompts] をオフにします。
  5. [Call your webhook](Webhook を呼び出す)をオンにします。
  6. イベント ハンドラのテキスト ボックスに「unavailable_options」と入力します。

52a0fba115f1b377.png

  1. [Save] をクリックします。

フルフィルメントを更新してデプロイする

これで、unavailable_options イベント ハンドラが呼び出されるように設定できたので、フルフィルメント内のハンドラを更新してデプロイします。

フルフィルメントを更新する手順は次のとおりです。

  1. ナビゲーションで [Webhook] をクリックします。
  2. 次のコードを greeting ハンドラの下に追加します。
app.handle('unavailable_options', conv => {
  const option = conv.intent.params.chosenUnavailableOption.original;
  const optionKey = conv.intent.params.chosenUnavailableOption.resolved;
  let message = 'I have seen the future and ';
  if(optionsNeedA.has(optionKey)){
    message = message + 'a ';
  }
  message = message + `${option} will not aid you on your journey. `;
  conv.add(message);
});
  1. const app = conversation(); の下に次のコードを追加します。
const optionsNeedA = new Set();
optionsNeedA.add('horse').add('phone');
  1. [Save Fulfillment](フルフィルメントを保存)をクリックします。
  2. [Deploy Fulfillment](フルフィルメントをデプロイ)をクリックします。デプロイが完了すると、エディタの上に「Your Cloud Function deployment is up to date」(Cloud Functions のデプロイは最新です)というメッセージが表示されます。

コードを理解する

unavailable_options ハンドラは以下の処理を行います。

  • conv オブジェクトから option データを取得し、optionoriginal プロパティ(ユーザーからの未加工の入力)に割り当てる
  • optionKeyresolved プロパティ(unavailable_options 型のキー)に割り当てる
  • optionKey が「a」を付加する必要があるアイテムかどうかをチェックし、該当する場合はメッセージに「a」を挿入する
  • conv.add(message) でメッセージを追加する

シミュレータでアクションをテストする

ここまでの変更により、ユーザーが unavailable_options 型から選択したアイテムに冠詞「a」が必要かどうかに応じて、プロンプトを調整できるようになりました。

次の手順でアクションをテストしてみましょう。

  1. ナビゲーション バーで、[Test] をクリックします。
  2. [Talk to my test app] をクリックまたは入力欄に入力し、Enter キーを押します。
  3. 入力欄に「Yes」と入力し、Enter キーを押します。または、候補ワードの [Yes] をクリックします。
  4. 入力欄に「magic」と入力し、Enter キーを押します。
  5. 入力欄に「horse」と入力し、Enter キーを押します。

54ee24c5c3c56e.png

「horse」を選択した場合はその前に冠詞「a」が追加され、「magic」を選択した場合は冠詞「a」なしでプロンプトが生成されます。

これで完了です。

この Codelab では、Google アシスタントのアクションを構築するために必要な、中級レベルのスキルについて学びました。

学習した内容

  • Node.js フルフィルメント ライブラリを使用して会話型アクションを開発する方法
  • スロットを使用してユーザーからデータを収集する方法
  • 条件を使用してシーンにロジックを追加する方法
  • ゲームループを追加する方法
  • 補助的なパスを追加する方法

その他の学習リソース

Google アシスタントのアクションの構築については、以下のリソースをご覧ください。

プロジェクトをクリーンアップする(推奨)

料金が発生するのを避けるため、使用する予定のないプロジェクトは削除することをおすすめします。この Codelab で作成したプロジェクトを削除する手順は次のとおりです。

  1. Cloud プロジェクトとリソースを削除する手順については、プロジェクトのシャットダウン(削除)をご覧ください。
  1. 省略可: プロジェクトを Actions Console からすぐに削除したい場合は、プロジェクトを削除する手順を完了してください。この手順で削除していないプロジェクトは、約 30 日後に自動的に削除されます。

Twitter で @ActionsOnGoogle をフォローして最新情報をチェックしてください。また、作成したアクションについて、ハッシュタグ #AoGDevs でツイートしてください。

アンケート

最後に、簡単なアンケートにご協力ください。