actions-on-google - 谷歌操作/对话流 : how to ask for geolocation

标签 actions-on-google dialogflow-es

我正在尝试为 Google Assistant 实现一个简单的应用。 一切正常,但现在我遇到了“权限”助手的问题: https://developers.google.com/actions/assistant/helpers#helper_intents

我有一个通过 webhook 连接到我的 java 应用程序的意图。当用户输入类似于“靠近我”的句子时,我想询问他的位置,然后使用lat/lon进行搜索。

es:我附近的巴西餐厅

  1. 我的意图“searchRestaurant”被触发

  2. 我收到 webhook 请求并解析它

  3. 如果我发现一个参数连接到“靠近我”之类的句子,那么我会返回一个代表帮助器请求的 JSON,而不是使用“Card”或“List”进行响应:


{
"conversationToken": "[]",
"expectUserResponse": true,
"expectedInputs": [
    {
        "inputPrompt": {
            "initialPrompts": [
                {
                    "textToSpeech": "PLACEHOLDER_FOR_PERMISSION"
                }
            ],
            "noInputPrompts": []
        },
        "possibileIntents": [
            {
                "intent": "actions.intent.PERMISSION",
                "inputValueData": {
                    "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec",
                    "optContext": "Posso accedere alla tua posizione?",
                    "permission": [
                        "NAME",
                        "DEVICE_PRECISE_LOCATION"
                    ]
                }
            }
        ]
    }
]
}

但似乎出了问题,我收到一个错误:

"{\n \"responseMetadata\": {\n \"status\": {\n \"code\": 10,\n \"message\": \"Failed to parse Dialogflow response into AppResponse because of empty speech response\",\n \"details\": [{\n \"@type\": \"type.googleapis.com/google.protobuf.Value\",\n \"value\": \"{\\"id\\":\\"1cc45c5e-c398-4ea7-98a5-408f31ce142d\\",\\"timestamp\\":\\"2018-08-02T14:45:05.752Z\\",\\"lang\\":\\"it\\",\\"result\\":{},\\"alternateResult\\":{},\\"status\\":{\\"code\\":206,\\"errorType\\":\\"partial_content\\",\\"errorDetails\\":\\"Webhook call failed. Error: Failed to parse webhook JSON response: Cannot find field: conversationToken in message google.cloud.dialogflow.v2.WebhookResponse.\\"},\\"sessionId\\":\\"1533221100163\\"}\"\n }]\n }\n }\n}"

“conversationToken”已填满,所以我不明白错误消息。 也许我试图以错误的方式执行操作。

那么,调用这个助手的正确方法是什么?

--> 我创建了第二个意图“askGeolocation”,其中 “actions_intent_PERMISSION” 作为“事件”,并且...如果我正确理解了文档,如果对助手的请求正确,应该被触发。

我怎样才能让它工作?

更新:

我找到了一些请求许可的 json 响应示例,似乎它应该与我正在使用的上面的不同:

https://github.com/dialogflow/fulfillment-webhook-json/blob/master/responses/v2/ActionsOnGoogle/AskForPermission.json

{
"payload": {
"google": {
  "expectUserResponse": true,
  "systemIntent": {
    "intent": "actions.intent.PERMISSION",
    "data": {
      "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec",
      "optContext": "To deliver your order",
      "permissions": [
        "NAME",
        "DEVICE_PRECISE_LOCATION"
      ]
        }
      }
    }
  }
}

所以,我已经实现了它,现在响应似乎很好(解析它时不再出现错误),但我仍然收到验证错误:

UnparseableJsonResponse API 版本 2:无法解析 JSON 响应字符串,并出现“INVALID_ARGUMENT”错误:“权限:找不到字段。”

所以,问题仍然存在。 有谁知道原因吗?

谢谢

最佳答案

经过一些测试我发现了问题。 我用“permission”而不是“permissions”返回了错误的 json 响应:

"permission**s**": [
    "NAME",
    "DEVICE_PRECISE_LOCATION"
]

所以询问位置的步骤是正确的。我在这里将它们作为一个小教程来报告,以帮助那些第一次面对它的人:

1) 在 DialogFlow 中,向您的 Intent 添加一些逻辑,以便了解何时可以询问用户的位置。就我而言,我添加了一个“参数”来标识“附近”等句子。

2)当我的 Intent 被触发时,我的 java 应用程序收到如下请求:

...
"queryResult": {
"queryText": "ristorante argentino qui vicino",
"action": "bycategory",
"parameters": {
  "askgeolocation": "qui vicino",
  "TipoRistorante": ["ristorante", "argentino"]
},
...

3) 如果填写了“askgeolocation”参数,则返回一个“简单消息”或其他类型的消息,我会返回一个 json 来请求地理定位权限:

{
"payload": {
"google": {
  "expectUserResponse": true,
  "systemIntent": {
    "intent": "actions.intent.PERMISSION",
    "data": {
      "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec",
      "optContext": "To deliver your order",
      "permissions": [
        "NAME",
        "DEVICE_PRECISE_LOCATION"
     ]
        }
      }
    }
  }
}

4) 您必须有第二个 Intent,并配置了“actions_intent_PERMISSION”事件:

enter image description here

  • 没有训练短语
  • 无操作和参数
  • 没有回应

但在履行事件处于事件状态时:

enter image description here

5) 当您的回复到达 Google Assistant 后,将显示以下消息:

enter image description here

6) 现在,如果用户回答“ok”,您会在 webhook 上收到此 json :

     {
   "responseId": "32cf46cf-80d8-xxxxxxxxxxxxxxxxxxxxx",
   "queryResult": {
     "queryText": "actions_intent_PERMISSION",
     "action": "geoposition",
     "parameters": {
     },
 "allRequiredParamsPresent": true,
 "fulfillmentMessages": [{
   "text": {
     "text": [""]
   }
 }],
 "outputContexts": [{
   "name": "projects/xxxxxxxxxxxxxxxxxxxxx"
 }, {
   "name": "projects/xxxxxxxxxxxxxxxxxxxxx",
   "parameters": {
     "PERMISSION": true
   }
 }, {
   "name": "projects/xxxxxxxxxxxxxxxxxxxxx"
 }, {
   "name": "projects/xxxxxxxxxxxxxxxxxxxxx"
 }, {
   "name": "projects/xxxxxxxxxxxxxxxxxxxxx"
 }, {
   "name": "projects/xxxxxxxxxxxxxxxxxxxxx"
 }],
 "intent": {
   "name": "projects/xxxxxxxxxxxxxxxxxxxxx",
   "displayName": "geoposition"
 },
 "intentDetectionConfidence": 1.0,
 "languageCode": "it"
 },
 "originalDetectIntentRequest": {
 "source": "google",
 "version": "2",
 "payload": {
   "isInSandbox": true,
   "surface": {
     "capabilities": [{
       "name": "actions.capability.MEDIA_RESPONSE_AUDIO"
     }, {
       "name": "actions.capability.SCREEN_OUTPUT"
     }, {
       "name": "actions.capability.AUDIO_OUTPUT"
     }, {
       "name": "actions.capability.WEB_BROWSER"
     }]
   },
   "requestType": "SIMULATOR",
   "inputs": [{
     "rawInputs": [{
       "inputType": "KEYBOARD"
     }],
     "arguments": [{
       "textValue": "true",
       "name": "PERMISSION",
       "boolValue": true
     }],
     "intent": "actions.intent.PERMISSION"
   }],
   "user": {
     "lastSeen": "2018-08-03T08:55:20Z",
     "permissions": ["NAME", "DEVICE_PRECISE_LOCATION"],
     "profile": {
       "displayName": ".... full name of the user ...",
       "givenName": "... name ...",
       "familyName": "... surname ..."
     },
     "locale": "it-IT",
     "userId": "xxxxxxxxxxxxxxxxxxxxx"
   },
   "device": {
     "location": {
       "coordinates": {
         "latitude": 45.xxxxxx,
         "longitude": 9.xxxxxx
       }
     }
   },
   "conversation": {
     "conversationId": "xxxxxxxxxxxxxxxxxxxxx",
     "type": "ACTIVE",
     "conversationToken": "[]"
   },
   "availableSurfaces": [{
     "capabilities": [{
       "name": "actions.capability.SCREEN_OUTPUT"
     }, {
       "name": "actions.capability.AUDIO_OUTPUT"
     }, {
       "name": "actions.capability.WEB_BROWSER"
     }]
   }]
     }
   },
   "session": "projects/xxxxxxxxxxxxxxxxxxxxx"
 }

包含姓名和纬度/经度。此信息可以保存在您的应用程序中,以便不再执行此步骤。

我希望这会有所帮助。

戴维德

关于actions-on-google - 谷歌操作/对话流 : how to ask for geolocation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51656954/

相关文章:

ios - Dialogflow 自定义身份验证

dialogflow-es - 如何导出代理 Dialogflow 的特定环境

ios - 即使我安装了 Cocoapods 并安装了 Dialogflow 的 pod 文件,Xcode 仍显示错误 'No such module'

actions-on-google - 如何在我的网站上部署 API.AI(对话流)机器人?

actions-on-google - Google Action中的未定义参数

automated-tests - DialogFlow 自动化测试

actions-on-google - 使用 Fulfillment 和 Dialogflow 时如何播放音频文件

firebase - Actions-on-Google 无法获取 Dialogflow SDK 上的 UPDATES_USER_ID

node.js - GoogleActions帐户尚未链接但出错

actions-on-google - DialogFlow V2 用户 ID?