I am using GUI tools provided by API AI to create Actions. Is it possible to fetch device location? I have heard that this is possible by requesting permissions. Is this documented anywhere? An example/code snippet will be very useful.
相关问题
- gactions CLI crashes on Windows when uploading goo
- How can I delete project in actions on google cons
- askWithList on Actions on Google
- Storing data “across conversations” in Google Acti
- app.setContext() in dialogflow v2 api?
相关文章
- Dialogflow, Google Account Linking and ASP.NET Cor
- How to get Session Entities to work as part of Dia
- How to access Dialogflow V2 API from a webpage?
- Google Assistant flow with multiple actions_intent
- “The agent returned an empty TTS” when action is n
- Requesting User Location from Google Actions with
- Linking Google Assistant with Firebase Auth
- Implementing Account Linking - queries
As you can see here Api.Ai doc in the response there is a
data
field. You need to create a json response exactly Google expects the webhook response (see Google docs) but if you are using Api.Ai you need to nest the Google json element in under the data field.Yes, it's possible to fetch device location and some other bits of info (name) after the user gives permission.
It's already documented well by google, so I don't think it's necessary for me to repeat it here.
If the question is whether it's possible to get the location information without a custom webhook implementation that's called through API.AI's fulfillment, then the answer is no: API.AI itself does not natively provide this capability, you need to use API.AI's extension mechanism, that is, a webhook.
The documentation is a bit unclear. I hope this can help someone.
All you have to do is create a child fallback intent for the intent you are requesting permissions from.
Screen shot for how to create a child fallback intent
Screen shot for how to configure the child fallback intent
That's it. Now once the permission is requested, the user response will be post back to you with the action which is configured in your child fallback intent.
See below for the webhook sample code.
There are three parts to this:
Asking for permission
A lot of people aren't mentioning the JSON body that needs to be made to request permissions in the first place. This is (poorly) documented at actions > assistant > helpers > User information since it doesn't really cover what needs to be sent if you're using API.AI.
In short, your JSON needs to look something like this:
Telling API.AI to handle the response
API.AI needs to know which Intent handles permission information. You do this by setting the Event to
actions_intent_PERMISSION
.This will look something like this:
You can set the Action to whatever makes sense for your webhook, and be sure to enable webhook fulfillment for the Intent as well.
If you need to keep track of where the permission request was initiated from, and handle it through a different Action, you can set a Context and have different handling Intents based on different Context settings.
The Fallback Intent method works because there is no better match at that point since you hadn't specified a regular Intent with
actions_intent_PERMISSION
. It isn't the best choice, however, since it could match other situations from your user.Get the info in your webhook
Your webhook will get a JSON object in the body.
The user's name and related information will be at the object path
originalRequest.data.user.profile
.Their location is provided at
originalRequest.data.device.location
.See Overview > Actions on Google lets you extend the functionality for references.
I was struggling with this for so long. I found this forum and something clicked. Turns out it's really not that hard.
In your php webhook, your original intent should return this as json -- or
json_encode
this array:then create another intent with the event:
actions_intent_PERMISSION
In your php webhook for the newly created intent, you will now have the location returned. It is in the response:
["originalRequest"]['data']['device']['location']['coordinates']
Easy Peasy...