Search code examples
dialogflow-esgoogle-home

Fulfillment response for Dialog flow


Just started with the DialogFlow building an app. I have hosted a service in Java on cloud (not using the firebase). Basically, I receive the data from the agent and send the response back as Json. For simple query its working as expected. Like if I say "My name is X", the service will respond as "Hello X" and it will be played on the Response. The JSON response is sent as

{speech: "Hello X", type:"0"}

Now, I want to fetch the user location, so I want to ask the user the permission to access the location. I have a separate intent that does not have any training_Phrases. It has an Event actions_intent_PERMISSION.

I am sending the following response

    {
  "conversationToken": "[\"_actions_on_google_\"]",
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "PLACEHOLDER_FOR_PERMISSION"
              }
            }
          ]
        }
      },
      "possibleIntents": [
        {
          "intent": "actions.intent.PERMISSION",
          "inputValueData": {
            "@type": "type.googleapis.com/google.actions.v2.PermissionValueSpec",
            "optContext": "To locate you",
            "permissions": [
              "NAME"
            ]
          }
        }
      ],
      "speechBiasingHints": [
        "$geo_city",
        "$event_category",
        "$event_date"
      ]
    }
  ],
  "responseMetadata": {
    "status": {},
    "queryMatchInfo": {
      "queryMatched": true,
      "intent": "1ec64dc5-a6f4-44f6-8483-633b8638c729"
    }
  }
}

But I am getting the response as 400 Bad request. Is there anything that I am doing wrong here or am I missing any thing?


Solution

  • There are three issues.

    The first is that the actions_intent_PERMISSION event is sent in response to a permission request. So this should not be the intent that triggers the request.

    Second, you're asking for the users name, but not their location. You want either the DEVICE_COARSE_LOCATION or DEVICE_PRECISE_LOCATION.

    The third, and much bigger, issue is that the JSON you're sending is the format used by the Action SDK. Since you're using Dialogflow, you'll be using a different response format which is the basic Dialogflow response, plus Actions on Google specific content in the data.google JSON property.

    Your response should look something more like this:

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

    Dialogflow also has some other examples of requests and replies that should help for the other parts of your conversation.