突然ですが、Conversation webhookって知っていますか? Google Homeのアプリ開発におけるプロトコル仕様の一つです。
https://developers.google.com/actions/reference/rest/conversation-webhook
こちらのドキュメントがそれなのですが、Fulfillmentとも書かれています。 Dialogflowのwebhook (fulfillment)とは別物です。 位置付けは同じですがプロトコルは異なります。
The conversation webhook defines how the Assistant sends you requests when users engage in a conversation with your app.
Conversation webhookはGoogleアシスタントにおいてアプリを動作させる口です。 Conversation webhookでやり取りするrequestとresponseのJSON形式が定義されています。 想像ですが、DialogflowもこのConversation webhookを使っているのではないかと 思われます。(もしかしたら別の口が用意されているのかもしれませんが)
requestのJSONは、無駄なものをそぎ落とすと、次のようになります。
{
"conversation": {
"conversationId": "12345",
"type": "NEW"
},
"inputs": [{
"intent": "actions.intent.MAIN",
"rawInputs": [{
"inputType": "VOICE",
"query": "何々と話したい"
}]
}]
}
また、responseのJSONも、無駄なものをそぎ落とすと、次のようになります。
{
"expectUserResponse": true,
"expectedInputs": [{
"inputPrompt": {
"richInitialPrompt": {
"items": [{
"simpleResponse": {
"textToSpeech": "ようこそ"
}
}]
}
},
"possibleIntents": [{
"intent": "actions.intent.TEXT"
}]
}]
}
これらJSONの仕様は、 ここ とか ここ に書かれています。
しかし、Node.jsのライブラリを使えば、特に気にすることなく使えます。 とは言っても、ライブラリのマニュアルを読むかプロトコルの仕様を読むかの 違いなので大差ないかもしれません。
どちらが読みやすいかは好みの問題なのですが、一方で、 情報の更新は意外とライブラリのマニュアルの方が早かったりします。 また、Conversation webhookの場合は、プロトコル仕様上は拡張 (extension)として用意されているだけで、中身がなく、 少し特殊な書き方をするものもあります。例えば、Node.jsでは、
conv.ask(new Confirmation('何々でよろしいですか?'))
とできるものが、Conversation webhookのresponse JSONでは、
{
"expectUserResponse": true,
"expectedInputs": [{
"inputPrompt": {
"richInitialPrompt": {
"items": [{
"simpleResponse": {
"textToSpeech": "PLACEHOLDER_FOR_CONFIRMATION"
}
}]
}
},
"possibleIntents": [{
"intent": "actions.intent.CONFIRMATION",
"inputValueData": {
"@type": "type.googleapis.com/google.actions.v2.ConfirmationValueSpec",
"dialogSpec": {
"requestConfirmationText": "何々でよろしいですか?"
}
}
}]
}]
}
のようにだいぶ複雑になったりします。
Conversation webhookのrequestとresponseは、
Actions on Googleのsimulatorの REQUEST
/ RESPONSE
タブでも見えます。
今見てみたところ、requestに
"requestType": "SIMULATOR"
という仕様には載っていないフィールドを発見してしまいました。
以上、Conversation webhookの紹介でした。