我正在尝试为 Google Assistant 实现一个简单的应用。 一切正常,但现在我遇到了“权限”助手的问题: https://developers.google.com/actions/assistant/helpers#helper_intents
我有一个通过 webhook 连接到我的 java 应用程序的意图。当用户输入类似于“靠近我”的句子时,我想询问他的位置,然后使用lat/lon
进行搜索。
es:我附近的巴西餐厅
我的意图“searchRestaurant”被触发
我收到 webhook 请求并解析它
如果我发现一个参数连接到“靠近我”之类的句子,那么我会返回一个代表帮助器请求的 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 响应示例,似乎它应该与我正在使用的上面的不同:
{
"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”事件:
- 没有训练短语
- 无操作和参数
- 没有回应
但在履行事件处于事件状态时:
5) 当您的回复到达 Google Assistant 后,将显示以下消息:
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/