DialogflowのフルフィルメントWebhookで会話をすぐに終了させる方法


Google Homeを活用しようと思い、Google Cloud Functionsで外部APIを叩き、テキストを整形してその結果をGoogle Homeに喋らせるようなサンプルコードを作っています。

Webhookでレスポンスを返すと、会話待機状態になってしまう

サンプル通りにActions On Googleでプロジェクトを作り、
Dialogflowのfulfillment Webhookを設定するような連携です。
Cloud Functionsを使用したのは、Always Free枠がたくさんあるのでWebhook endpointとして使うのにリーズナブルだったためです。

Google Home -> Actions On Google -> Dialogflow -> Cloud Functions -> 外部API
Google Home <- Actions On Google <- Dialogflow <- Cloud Functions <-

Google Homeに喋らせることはできたのですが、 レスポンスを喋ったあと、会話待機状態になり、次の会話を受け付けようとする という現象が発生しました。
レスポンスとして返却していたのは、喋らせたいテキストだけの非常にシンプルなJSONです。


{
  "fulfillmentText": "今日のタスクは1件で、期限切れタスクが3件あります。..."
}

フルフィルメントだからなのかどうかまでは調べられていませんが、サンプルとして作ったGoogle Home用アプリは、アプリに接続し、接続状態を維持するようなアプリの挙動になっていました。
この状態のGoogle Homeアプリは、わざわざ「ねぇ、Google、ストップ」と話しかけないっとアプリが終了してくれないので、使い勝手が悪いです。

会話を終わらせるWebhookレスポンス

会話を終わらせる方法を調べると、とても簡単な方法がありました。
以下は、Dialogflowの Webhookフォーマットの会話を終了させるレスポンス例として載っていたものです。

End conversation example - Dialogflow Webhook Format  |  Conversational Actions  |  Google Developers

End conversation example

The snippet below shows an example of a simple response to end a conversation session in the Dialogflow webhook format. The expectUserResponse value of false in the response message signals to the Assistant that no further user input is expected and that it should end the current conversation.

{
  "payload": {
    "google": {
      "expectUserResponse": false,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Goodbye!"
            }
          }
        ]
      }
    }
  }
}

上記のサンプルのとおりに、 payload.google.expectUserResponsefalse を指定します。そうすると、Google Homeに話しかけてレスポンスを喋ったあとに、アプリ自体が終了します。接続状態を維持するようなことがなくなりました。