Richard Kennard
Richard Kennard

Reputation: 1325

DialogFlow: why does this Webhook Response fail with 'empty speech response'

Why does this specific webhook response (passed by DialogFlow back to Google Assistant)

    {
      "fulfillmentMessages" : [ {
        "payload" : {
          "google" : {
        "richResponse" : {
          "items" : [ {
            "simpleResponse" : {
              "textToSpeech" : "And are you male or female?"
            }
          } ]
        },
        "expectUserResponse" : true
          }
        },
        "text" : {
          "text" : [ "And are you male or female?" ]
        }
      }, {
        "quickReplies" : {
          "quickReplies" : [ "Male", "Female" ]
        }
      } ],
      "fulfillmentText" : "And are you male or female?",
      "outputContexts" : [ ... ]
    }

Error as:

"MalformedResponse: Failed to parse Dialogflow response into AppResponse because of empty speech response" 

Upvotes: 0

Views: 379

Answers (1)

Thomas Lombart
Thomas Lombart

Reputation: 433

In the case of Google Assistant, the responses are not part of fulfillmentMessages but are in a payload object which should be located at the top level of your response.

Note that quickReplies and text are valid for Dialogflow fulfillment messages but not for Google Assistant too. Instead, you should use simpleResponse and suggestions fields and put them in the response.

So, for example here is a response for Google Assistant which is made of suggestion chips and a simple response:

{
  payload: {
    google: {
      richResponse: {
        items: [{
          simpleResponse: {
            textToSpeech: "Are you male or female"
          }
        }],
        suggestions: [
          { title: 'Male' },
          { title: 'Female' }
        ]
      }
    }
  },
  outputContexts: [...]
}

For Dialogflow fulfillment messages (in the Dialogflow console for example), it would have been something like that:

{
  fulfillmentMessages: [
    { text: { text: ['Are you male or female'] } },
    { quickReplies: { quickReplies: ['Male', 'Female'] } } 
  ],
  outputContexts: [...]
}

Hope that helps.

Upvotes: 1

Related Questions