フルフィルメントの移行

インテントとシーンを設定したら、アクション ビルダーのリクエストとレスポンスの形式の変更に対応するためにフルフィルメント コードを更新する必要があります。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. [Call your 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

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