毎日の更新(Dialogflow)

スマートフォンでアクションの毎日の通知を登録しようとしているユーザー

アクションが毎日ユーザーに価値を提供する場合は、毎日の更新を構成することで、ユーザーにアクションを促すリマインダーを提供します。アクションの日次更新にユーザーが登録すると、プッシュ通知が送信されます。ユーザーはこれをタップして、アクションのインテントのいずれかを呼び出すことができます。

これに伴うユーザーのエクスペリエンスの流れは次のとおりです。

  1. ユーザーが、日次更新として設定したアクションのインテントのいずれかを呼び出しました。
  2. ユーザーは毎日の通知を登録するためのプロンプトに従います。このプロンプトは、会話中に提示されるか、会話の終了時に候補ワードとして表示されます。
  3. ユーザーは、毎日の最新情報を受け取る時刻をスケジュールし、Google アシスタントに更新情報を登録します。
  4. ユーザーは、毎日スケジュールされている時刻に、モバイル デバイスにアシスタント通知を受け取ります。
  5. ユーザーがこの通知を開くと、日次更新として構成したインテントが呼び出され、アクションが操作されます。

デフォルトでは、毎日の更新の登録プロンプトは、ユーザーがアクションを正常に終了したときに候補ワードとして表示されます。また、会話中に登録プロンプトを追加したり、ユーザーの更新をカスタマイズしたりすることもできます。

ユースケース

毎日の最新情報はエンゲージメント ツールとして役立ちますが、すべてのアクションに組み入れるべきではありません。日次更新のサブスクリプションをアクションに追加するかどうかを決定する際は、次のヒントを参考にしてください。

  • 毎日の更新により、ユーザーに毎日異なる役立つ情報が表示されるようにします。日次更新をタップすると毎回同じプロンプトが表示される場合、ユーザーは数日後に登録解除する可能性があります。
  • ユーザーが日次更新のインテントに直接移動する場合は、ダイアログが意味をなすようにしてください。ユーザーが必ずしも会話を最初からやり直すとは限らないため、多くのコンテキストを持つことをユーザーに期待しないでください。
  • 日次更新の登録を促す前に、アクションのメリットをユーザーに示します。定期購読の選択肢があるとき、ユーザーは「このコンテンツを毎日欲しがる」と考える必要があります。
  • ユーザーに何度も繰り返し登録をすすめないでください。日次更新の定期購入は、ユーザーが定期購入する内容を示した直後に提供し、他の状況では特典を繰り返さないようにします。
  • 更新インテントがトリガーされた後の会話は短くします。ほとんどの日次更新は、1 つのレスポンスのみで構成され、ユーザー入力なしで閉じるようにします。

毎日の通知を設定する

Dialogflow で調べる

[続行] をクリックして、Dialogflow に日次更新のサンプルをインポートします。次に、以下の手順に沿ってサンプルをデプロイしてテストします。

  1. エージェント名を入力し、サンプル用に新しい Dialogflow エージェントを作成します。
  2. エージェントのインポートが完了したら、[Go to agent] をクリックします。
  3. メインのナビゲーション メニューから [Fulfillment] に移動します。
  4. [インライン エディタ] を有効にして、[デプロイ] をクリックします。エディタにはサンプルコードが含まれています。
  5. メインのナビゲーション メニューから [Integrations] に移動し、[Google Assistant] をクリックします。
  6. 表示されたモーダル ウィンドウで [変更の自動プレビュー] を有効にし、[Test] をクリックして Actions シミュレータを開きます。
  7. シミュレータで「Talk to my test app」と入力してサンプルをテストします。
続行

アクションのインテントの 1 つを日次更新のインテントとして構成する手順は次のとおりです。

1. 更新インテントを準備する

アクションのインテントの 1 つをトリガー インテントとして構成します。このインテントによって、毎日の更新をユーザーに送信できるようになります。ユーザーが毎日の更新の通知を開くと、インテントがトリガーされ、そこから会話が続行されます。

Dialogflow でトリガー インテントを定義する手順は次のとおりです。

  1. Dialogflow コンソールで、[Integrations] をクリックします。
  2. [Google Assistant](Google アシスタント)セクションで、[Integration Settings](統合設定)をクリックします。
  3. [Discovery] > [Implicit invocation] で、[Add intent] をクリックし、トリガー インテントがまだ存在しない場合は選択します。
  4. [Auto-preview](自動プレビュー)をオンにして変更の自動プレビューを有効にします(まだ有効にしていない場合)。
  5. [閉じる] をクリックします。

Actions SDK で、アクション パッケージで、更新インテントをトリガー インテントとして定義します。

2. 通知を有効にする

トリガー インテントの毎日の通知を有効にする手順は次のとおりです。

  1. Actions Console で、[Develop] > [Actions] に移動します。
  2. トリガー インテントを選択します。インテントがリストにない場合は、そのインテントがトリガー インテントとして構成されており、Dialogflow のアシスタント統合が変更の自動プレビューに設定されていることを確認してください。
  3. [User engagement](ユーザー エンゲージメント)セクションまでスクロールして、[Would you like to offer daily updates to users](ユーザーに毎日の通知を提供する)をオンにします。
  4. コンテンツのタイトルを入力します。
  5. [保存] をクリックします。

これで、インテントの日次更新サブスクリプションを提供するようにアクションを構成できました。この毎日の通知を自分のモバイル デバイスでテストできます。

通知の登録をカスタマイズする(省略可)

候補ワードとアシスタントによる日次更新の登録フローに加えて、独自のダイアログと登録プロンプトを使用して、毎日の更新にユーザーをサブスクライブします。

オプションの日次更新機能を処理するアクションの詳細な例については、Actions on Google ユーザー エンゲージメントのサンプル(Node.js および Java)をご覧ください。

カスタムの日次更新登録プロンプトを会話に追加するには、次の手順を行います。

1. 登録プロンプトを追加する

ユーザーに日次更新の通知への登録を促すときに、ダイアログと候補ワードを会話に追加します。ユーザーが毎日の更新の内容を理解できるように、更新インテントを操作した後にこれらのプロンプトを表示します。

次のサンプルコードは、毎日の予想気温が最低気温に達する日次更新情報にサブスクライブするようユーザーに促します。

Node.js
app.intent('Daily Lowest Temperature', (conv, params) => {
  const today = DAYS[new Date().getDay()];
  const lowestTemperature = lowestTemperatures[today];
  conv.ask(`The lowest temperature for today is ${lowestTemperature}`);
  conv.ask('I can send you daily updates with the lowest temperature' +
    ' of the day. Would you like that?');
  conv.ask(new Suggestions('Send daily updates'));
});
Java
@ForIntent("Daily Lowest Temperature")
public ActionResponse dailyLowestTemperature(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  Integer lowestTemperature =
      LOWEST_TEMPERATURES.get(LocalDate.now().getDayOfWeek());
  responseBuilder
      .add("The lowest temperature for today is " +  lowestTemperature + " degrees Fahrenheit.")
      .add("I can send you daily updates with the lowest temperature of " +
          "the day. Would you like that?")
      .addSuggestions(new String[] {
          "Send daily updates"
      });
  return responseBuilder.build();
}
Dialogflow JSON

下記の JSON は Webhook レスポンスを示します。

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "The lowest temperature for today is 75 degrees Fahrenheit"
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "I can send you daily updates with the lowest temperature of the day. Would you like that?"
            }
          }
        ],
        "suggestions": [
          {
            "title": "Send daily updates"
          }
        ]
      }
    }
  }
}
Actions SDK JSON

下記の JSON は Webhook レスポンスを示します。

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "The lowest temperature for today is 75 degrees Fahrenheit"
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": "I can send you daily updates with the lowest temperature of the day. Would you like that?"
              }
            }
          ],
          "suggestions": [
            {
              "title": "Send daily updates"
            }
          ]
        }
      }
    }
  ]
}

2. 通知の登録を処理する

ユーザーが登録プロンプトに沿って操作したときにトリガーされる新しいインテントを設定します。この新しいインテントのフルフィルメントで、次のパラメータを使用して actions_intent_CONFIGURE_UPDATES 組み込みインテントをトリガーします。

  • intent - 構成した更新インテントに設定します。
  • frequency - 「DAILY」に設定します。

次のコードは、「Daily Lowest Temperature」インテントの日次更新を登録します。

Dialogflow Node.js
app.intent('Subscribe to Daily Updates', (conv) => {
  conv.ask(new RegisterUpdate({
    intent: 'Daily Lowest Temperature',
    frequency: 'DAILY',
  }));
});
Actions SDK Node.js
conv.ask(new RegisterUpdate({
  intent: 'Daily Lowest Temperature',
  frequency: 'DAILY',
}));
Dialogflow Java
@ForIntent("Subscribe to Daily Updates")
public ActionResponse subscribeToDailyUpdates(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  return responseBuilder.add(new RegisterUpdate()
      .setIntent("Daily Lowest Temperature")
      .setFrequency("DAILY"))
      .build();
}
Actions SDK Java
ResponseBuilder responseBuilder = getResponseBuilder(request);
return responseBuilder.add(new RegisterUpdate()
    .setIntent("Daily Lowest Temperature")
    .setFrequency("DAILY"))
    .build();
Dialogflow JSON
{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "systemIntent": {
        "intent": "actions.intent.REGISTER_UPDATE",
        "data": {
          "@type": "type.googleapis.com/google.actions.v2.RegisterUpdateValueSpec",
          "intent": "Daily Lowest Temperature",
          "triggerContext": {
            "timeContext": {
              "frequency": "DAILY"
            }
          }
        }
      }
    }
  }
}
Actions SDK JSON
{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.REGISTER_UPDATE",
          "inputValueData": {
            "@type": "type.googleapis.com/google.actions.v2.RegisterUpdateValueSpec",
            "intent": "Daily Lowest Temperature",
            "triggerContext": {
              "timeContext": {
                "frequency": "DAILY"
              }
            }
          }
        }
      ]
    }
  ]
}

3. 結果を処理する

アシスタントが会話を引き継ぎ、毎日の更新の残りの設定をユーザーに案内します。登録が完了すると、アシスタントは登録が成功したかどうかを示すパラメータでインテントをトリガーします。

この手順の手順は、開発に Dialogflow と Actions SDK のどちらを使用するかによって異なります。

Dialogflow

次の手順に従って、登録結果を処理するインテントを作成します。

  1. Dialogflow コンソールで、新しいインテントを作成します。
  2. actions_intent_REGISTER_UPDATE イベントを追加します。
  3. インテントの Webhook フルフィルメントを有効にします。
  4. [保存] をクリックします。
インテントのフルフィルメントで、結果の registered パラメータを確認し、それに応じて会話をピボットします。
Dialogflow Node.js
app.intent('Confirm Daily Updates Subscription', (conv, params, registered) => {
  if (registered && registered.status === 'OK') {
    conv.close(`Ok, I'll start giving you daily updates.`);
  } else {
    conv.close(`Ok, I won't give you daily updates.`);
  }
});
Dialogflow Java
@ForIntent("Confirm Daily Updates Subscription")
public ActionResponse confirmDailyUpdatesSubscription(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  if (request.isUpdateRegistered()) {
    responseBuilder.add("Ok, I'll start giving you daily updates.");
  } else {
    responseBuilder.add("Ok, I won't give you daily updates.");
  }
  return responseBuilder.endConversation().build();
}
Dialogflow JSON
{
  "payload": {
    "google": {
      "expectUserResponse": false,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Ok, I'll start giving you daily updates."
            }
          }
        ]
      }
    }
  }
}
Actions SDK

フルフィルメント コードで、actions.intent.REGISTER.UPDATE 組み込みインテントの処理を追加します。結果の registered パラメータを確認し、それに応じて会話を方向転換します。

Actions SDK Node.js
app.intent('actions.intent.REGISTER_UPDATE', (conv, params, registered) => {
  if (registered && registered.status === 'OK') {
    conv.close(`Ok, I'll start giving you daily updates.`);
  } else {
    conv.close(`Ok, I won't give you daily updates.`);
  }
});
Actions SDK Java
@ForIntent("actions.intent.REGISTER_UPDATE")
public ActionResponse confirmDailyUpdatesSubscription(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  if (request.isUpdateRegistered()) {
    responseBuilder.add("Ok, I'll start giving you daily updates.");
  } else {
    responseBuilder.add("Ok, I won't give you daily updates.");
  }
  return responseBuilder.endConversation().build();
}
Actions SDK JSON
{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "simpleResponse": {
            "textToSpeech": "Ok, I'll start giving you daily updates."
          }
        }
      ]
    }
  }
}

更新をカスタマイズする(省略可)

アップデート インテントをカスタマイズするには、ユーザーが日次更新を登録する際にカスタム パラメータを追加します。更新インテントを遂行するときは、これらのパラメータを参照して、そのユーザーの日次更新をカスタマイズします。

この機能の手順は、Dialogflow と Actions SDK のどちらを開発に使用するかによって異なります。

Dialogflow

更新のカスタム パラメータを処理する Dialogflow エンティティを定義し、パラメータ値を更新インテントの引数として渡します。Dialogflow でパーソナライズされた更新を設定する手順は次のとおりです。

  1. Dialogflow コンソールで、新しいエンティティを作成します。
  2. パラメータに関連のあるエントリと同義語を追加します。
  3. [Save](保存)をクリックしてから、更新インテントを開きます。
  4. [アクションとパラメータ] セクションで、actions.intent.CONFIGURE_UPDATES をイベントとして設定します。同じセクションで、新しいエンティティと同じタイプを持つパラメータを追加します。
  5. CONFIGURE_UPDATES 組み込みインテントを処理する「update registration」インテントを開きます。
  6. [Actions and parameters] セクションで必須パラメータを追加し、そのタイプを前のステップで作成したエンティティに設定します。
  7. 登録インテントのフルフィルメント コードを更新して、次の内容の arguments オブジェクトを含めます。
    • name - Dialogflow で構成されたパラメータの名前。
    • textValue - パラメータの値。

次のコードは、パラメータの値を読み取り、更新登録リクエストで使用しています。

Dialogflow Node.js
app.intent('setup_update', (conv) => {
  conv.ask(new RegisterUpdate({
    intent: 'update_of_the_day',
    arguments: [
      {
        name: 'category',
        textValue: 'Daily_lowest_temperature',
      },
    ],
    frequency: 'DAILY',
  }));
});
Dialogflow Java
@ForIntent("setup_update")
public ActionResponse setupUpdate2(ActionRequest request) {
  List<Argument> args =
      Arrays.asList(
          new Argument()
              .setName("category")
              .setTextValue(request.getParameter("category").toString()));
  return getResponseBuilder(request)
      .add(new RegisterUpdate().setIntent("intent_name").setArguments(args).setFrequency("DAILY"))
      .build();
}
Dialogflow JSON
{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "PLACEHOLDER"
            }
          }
        ]
      },
      "userStorage": "{\"data\":{}}",
      "systemIntent": {
        "intent": "actions.intent.REGISTER_UPDATE",
        "data": {
          "@type": "type.googleapis.com/google.actions.v2.RegisterUpdateValueSpec",
          "intent": "update_of_the_day",
          "arguments": [
            {
              "name": "category",
              "textValue": "Daily_lowest_temperature"
            }
          ],
          "triggerContext": {
            "timeContext": {
              "frequency": "DAILY"
            }
          }
        }
      }
    }
  },
  "outputContexts": [
    {
      "name": "/contexts/_actions_on_google",
      "lifespanCount": 99,
      "parameters": {
        "data": "{}"
      }
    }
  ]
}
Actions SDK

インテント フルフィルメントでユーザーに追加情報をリクエストし、更新インテントの引数としてその情報を渡します。Actions SDK でパーソナライズされた更新を設定するには、次の手順を行います。

  1. パーソナライズに使用する情報をユーザーに求めます。
  2. CONFIGURE UPDATES を処理する「登録の更新」インテントのフルフィルメント コードに、次の内容の arguments オブジェクトを含めます。
    • name - 引数の名前。
    • textValue - ユーザーから提供される情報。引数として渡されます。

次のコードは、更新登録リクエストで引数を送信します。

Actions SDK Node.js
app.intent('actions.intent.TEXT', (conv) => {
  if (conv.input.raw === 'Send daily') {
    conv.ask(new RegisterUpdate({
      intent: 'update_of_the_day',
      arguments: [
        {
          name: 'category',
          textValue: 'Daily_lowest_temperature',
        },
      ],
      frequency: 'DAILY',
    }));
  }
});
Actions SDK Java
@ForIntent("actions.intent.CONFIGURE_UPDATES")
public ActionResponse configureUpdatesActionsSdk(ActionRequest request) {
  List<Argument> args =
      Arrays.asList(
          new Argument()
              .setName("category")
              .setTextValue(request.getParameter("category").toString()));
  return getResponseBuilder(request)
      .add(new RegisterUpdate().setIntent("intent_name").setArguments(args).setFrequency("DAILY"))
      .build();
}

@ForIntent("actions.intent.TEXT")
public ActionResponse text(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  String input = request.getRawInput().getQuery();
  if (input.equals("DAILY_NOTIFICATION_SUGGESTION")) {
    rb.add("For which category do you want to receive daily updates?");
  } else {
    rb.add("Sorry, I didn't get that. Please try again later").endConversation();
  }
  return rb.build();
}
Actions SDK JSON
{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "PLACEHOLDER"
              }
            }
          ]
        }
      },
      "possibleIntents": [
        {
          "intent": "actions.intent.REGISTER_UPDATE",
          "inputValueData": {
            "@type": "type.googleapis.com/google.actions.v2.RegisterUpdateValueSpec",
            "intent": "update_of_the_day",
            "arguments": [
              {
                "name": "category",
                "textValue": "Daily_lowest_temperature"
              }
            ],
            "triggerContext": {
              "timeContext": {
                "frequency": "DAILY"
              }
            }
          }
        }
      ]
    }
  ],
  "conversationToken": "{\"data\":{}}",
  "userStorage": "{\"data\":{}}"
}

これで、ユーザーが日次アップデートを呼び出したときに、登録時にユーザーが指定した値を含む引数が更新インテントに含まれるようになりました。これらの値を使用して、ユーザーごとに更新をパーソナライズします。

毎日の通知をテストする

アクションの作成に使用した Google アカウントと同じアカウントで Google アシスタントを搭載したモバイル デバイスを使用し、毎日の更新をテストします。アクションを呼び出し、毎日の通知に登録して、更新時刻前後にデバイスの通知を確認します。