フルフィルメントの移行

インテントとシーンをセットアップしたら、アクション ビルダーのリクエスト形式とレスポンス形式の変化に対応するために、フルフィルメント コードを更新する必要があります。この機会に、Actions Builder のその他の機能の活用もご検討ください。このページでは、フルフィルメント コードを更新する際の一般的な手順と考慮事項について説明します。

フルフィルメント アプローチを検討する

プロジェクトのフルフィルメント コードは、会話モデルと開発プラットフォームの機能によって異なります。Actions Builder には、新しい会話モデルと機能が導入されています。これにより、会話の作成方法が変わり、プロジェクトのフルフィルメントのアプローチ方法も変わる可能性があります。このセクションでは、Dialogflow とは異なる Actions Builder の機能と、それらの違いによってフルフィルメント コードの実装方法がどのように変わるかについて説明します。

  • 会話の実装に関する変更

    • Dialogflow は、インテント ツー インテント、コンテキストに基づいて駆動される会話フローを使用します。このフローでは、トレーニング フレーズと前のインテントの入出力コンテキストに基づいて個々のインテントが照合されます。
    • Actions Builder の会話フローでは、会話ターンのコンテナとしてシーンが使用されています。Dialogflow のコンテキストと同様に、シーン内で特定のインテントをマッチングできます。遷移は、一致したインテントに基づいて、遷移するシーンを定義します。
  • 再利用可能な Webhook 関数

    • Dialogflow では、Webhook ハンドラは個々のインテントに関連付けられます。追加のロジックが必要な場合は、新しい関数を処理する別のインテントを作成する必要があります。
    • Webhook ハンドラには、Actions Builder でカスタムのハンドラ名が設定されています。この機能を使用すると、プロジェクト全体で複数のシーンから関数を呼び出すことができます。
  • Webhook を呼び出すその他の方法

    • Dialogflow のインテントごとに 1 つの Webhook を使用するには、プロジェクトのフルフィルメントでの会話ロジックを強化するために、追加のインテントが必要になります。
    • Action Builder を使用すると、開始時、条件に基づく条件、スロットフィルに基づく、カスタム インテントとシステム インテント マッチングなど、シーン内の複数の場所から Webhook 呼び出しを行うことができます。

フルフィルメント コードを更新する

各アクションのフルフィルメント コードは、アクションの複雑さや目的によって異なりますが、コードを更新する際には一般的な手順があります。

  1. 最新バージョンのクライアント ライブラリをダウンロードしてインストールします。

    npm install @assistant/conversation
    
  2. コードの require ステートメントを更新します。例:

    const {
      SimpleResponse,
      BasicCard,
      Image,
    } = require('actions-on-google');
    

    上記のコードは、次のように更新されます。

    const {
      conversation,
      Simple,
      Card,
      Image,
    } = require('@assistant/conversation');
    
  3. 新しいメソッドを使用するようにコードをリファクタリングします。

    • インテント ハンドラ: app.intentapp.handle
    • レスポンス/プロンプト: conv.askconv.add
    • サーフェス/デバイスの機能: conv.surface.capabilities.has('actions.capability.SCREEN_OUTPUT')conv.device.capabilities.includes('RICH_RESPONSE')
    • データ ストレージ: conv.dataconv.session.params
    • レスポンス タイプ:

      • SimpleResponseSimple
      • BasicCardCard
      • SuggestionsSuggestion
    • インテント パラメータ: conv.parameters[KEY]conv.intent.parameters[KEY].resolved

    • コンテキストやシーンの遷移: conv.contexts.set(content_name, 5);conv.scene.next.name = 'context_name'

    • 会話の終了: conv.close(response)conv.add.response; conv.scene.next.name = 'actions.page.END_CONVERSATION'

  4. Builder の新しいレスポンス プリミティブを利用するようにレスポンス コードを更新しました。例:

    conv.ask(new Suggestions (['a', 'b']));
    

    上記のコードは、次のように更新されます。

    for (suggestion of ['a', 'b']) {
      conv.add.(new Suggestion({title: suggestion}))
    }
    

メソッドの完全なリストについては、以下のフルフィルメント コードの変換マップをご覧ください。

リクエストとレスポンスのペイロードを比較するには、次のページを使用します。

Webhook を設定する

フルフィルメントを更新したら、プロジェクトのシーン全体で Webhook 呼び出しを有効にします。移行ツールは Dialogflow インテントの Webhook 設定を移行しますが、リファクタリングされたフルフィルメント コードと Webhook 関数が変更される可能性があるため、これらの設定を確認する必要があります。

Dialogflow ではインテントで Webhook が有効になり、インテントが一致したときに実行するハンドラと関数がフルフィルメント コードに含まれています。Actions Builder では、Webhook は呼び出しインテントまたはシーン内でトリガーされ、フルフィルメント エンドポイントにリクエストを送信します。フルフィルメントには、リクエスト内の JSON ペイロードを処理する Webhook ハンドラが含まれています。Webhook は、次のような状況でトリガーできます。

  • 呼び出しインテントが一致した後
  • シーンの開始ステージ
  • シーンの条件ステージで条件が true と評価された後
  • シーンのスロット ファイリング ステージ
  • シーンの入力ステージでインテント マッチングが発生した後

Dialogflow から Actions Builder に移行する際は、会話フローの変更を考慮する必要があります。Webhook 呼び出しを行うタイミングと場所が変わる可能性があるためです。

Webhook 呼び出しを有効にする手順は次のとおりです。

  1. Webhook を呼び出すシーンを選択します。
  2. Webhook を有効にする状態を選択します。Webhook は、次の 1 つ以上の状態に対して有効にできます。

    • 開始時
    • 条件
    • スロットフィル
    • ユーザーのインテント処理
    • システム インテント処理
  3. [Webhook の呼び出し] オプションをオンにします。

  4. フルフィルメント コード内で定義した Webhook ハンドラを入力します。

  5. [保存] をクリックします。

  6. [Test] に移動して、Webhook の呼び出しとフルフィルメントの変更をテストします。

フルフィルメント コードの変換マップ

以下の表は、Dialogflow のフルフィルメント コードの構文が Actions Builder のコードにどのように変換されるかを示しています。メソッドの完全なリストについては、Actions Builder と SDK リファレンスのドキュメントをご覧ください。

Dialogflow アクション ビルダー
conv.data conv.session.params
conv.ask conv.add
conv.close conv.scene.next.name = 'actions.scene.END_CONVERSATION'
conv.user.storage conv.user.params
conv.input.raw conv.intent.query
conv.parameters conv.intent.params[key].resolved
conv.arguments.get('MEDIA_STATUS')
mediaStatus.status==='FINISHED'
conv.intent.params['MEDIA_STATUS']
mediaStatus.resolved==='FINISHED'
イベント システム インテントの処理:
MEDIA_STATUS_FINISHED
MEDIA_STATUS_FAILED
conv.device.capabilities.has("actions.capability.SCREEN_OUTPUT") conv.device.capabilities.includes("RICH_RESPONSE")
app.intent app.handler
app.middleware app.middleware
シンプル レスポンス prompt -firstSimple
リッチ レスポンス prompt -content -card: object -image: object -table: object -media: object -suggestions -link

その他のツールについては、以下をご覧ください。