How do I set context in the response json payload? - dialogflow-es

I have setup a nodeJS server to return responses to a dialogflow webhook. I want to be able to send back a context in the JSON response so that dialogflow logic can move to the next desired Intent in the conversation flow.
In the response payload, I tried inserting "outputContexts" array in order to set the context. However this is not working in this form. The response Json is pasted below. The variable contextName holds the desired value of context to be sent back.
var simpleResponse = {
"payload": {
"google": {
"expectUserResponse": true,
"outputContexts": [
{
"name": "projects/my-agent-v2/agent/sessions/" + sessionId + "/contexts/" + contextName,
"lifespanCount": 1,
"parameters": {
"param": "param value"
}
}
],
"richResponse": {
"items": [
{
"simpleResponse": {
"textToSpeech": "Simple response",
"displayText": "Simple response"
}
}]}}}};
The control should move to intent = awaiting_more_details. The above returned context is the "input context" to this intent.
I hope this gives an understanding about what I want to achieve.

Your response has the wrong format, the outputContexts array must be in the top level object, next to payload. See Dialogflow's Discovery document for the authoritative specification: https://www.googleapis.com/discovery/v1/apis/dialogflow/v2beta1/rest

Related

How to retrieve the context from the agent in Dialogflow

I have managed to retrieve the context variables from the webhook using dialogflow-fulfillment agent.context.get() function however it does not provide the context variables that aren't set as input in that specific intent.
Intent A: "What city are you in?"
Through Dialogflow UI, the output context placeholder 'city' is set .
User answers => "Montréal"
Here I set the output context 'city' with the following code through the fulfiller:
agent.context.set('city', 100, {cityName: "Montréal"})
Intent B: "When will it freeze?"
Intentionally, no input/output context is set on Dialogflow. As I want the user to be able to ask this question without context.
When the intent is matched, Dialogflow sends the following request to my fullfiler.
{ "responseId": "496a4ed8-8421-4297-b464-adc54632cc93-32d6a6f2", "queryResult": { "queryText": "when will it freeze", "parameters": {}, "allRequiredParamsPresent": true, "fulfillmentText": "It will freeze next week", "fulfillmentMessages": [ { "text": { "text": [ "It will freeze next week" ] } } ], "intent": { "name": "projects/project-name/locations/global/agent/intents/7df0bb1d-f4ef-4e69-b9c4-4b6a2f91c95f", "displayName": "zone.freezing_dates via Fulfiller" }, "intentDetectionConfidence": 1, "diagnosticInfo": { "webhook_latency_ms": 59 }, "languageCode": "fr", "sentimentAnalysisResult": { "queryTextSentiment": { "score": 0.1, "magnitude": 0.1 } } }, "webhookStatus": { "message": "Webhook execution successful" }, "agentId": "5d8b71c7-cd3a-453a-b446-6d00334f1ae8" }
As you can see, the context parameters aren't present in the webhook request even though the city parameter has been set by intent A).
Therefore, how do we retrieve the context variables from the user's session (and not from the intent's webhook)?
I have a feeling it has to do with the agent session path as described here but in this sample, it's part of the intent (again) as I expect a way to retrieve the agent context outside of the intent's scope.
I will also add as a note, I know the city context var exists because I can see it through the Dialogflow UI when I add it to the response text.

Having trouble with Google Assistant repeating previous message in Dialogflow

I'm working on a very simple Dialogflow with about 15-20 intents. All of these intents use a text response except one. The only intent that does not use a text response is called 'repeat'. The intent (repeat) should be able to repeat whatever was previously said by Google Assistant.
I've tried to set this up using Multivocal but have not been successful. When I type a command into the test simulator I'll get the initial response, but when I follow up with 'repeat' the default response of 'Not available' is returned. The webhook times out when I look at the Diagnostic Info. My sense is that I've configured something wrong because I've read these answers and not been able to solve my problem:
How to repeat last response of bot in dialogflow
Dialogflow - Repeat last sentence (voice) for Social Robot Elderly
Use multivocal libary to configure repeat intent in Dialogflow for VUI
I'm using the inline editor within Dialogflow my index.js looks like:
const Multivocal = require('multivocal');
const conf = {
Local: {
en: {
Response: {
"Action.multivocal.repeat": "Let me try again",
}
}
}
};
new Multivocal.Config.Simple( conf );
exports.webhook = Multivocal.processFirebaseWebhook;
exports.dialogflowFirebaseFulfillment = Multivocal.processFirebaseWebhook;
And my package.json includes the Multivocal dependency:
"multivocal": "^0.15.0"
My understanding based on the above SO questions is that these config values would be enough and I don't need to do any coding, but I'm clearly screwing something (many things?) up. How can I get the prior response in Google Assistant to repeat when a user says 'repeat' or something similar? Multivocal seems like a simple solution, if I can do it that way.
Additional logs:
Fulfillment request (removed project id information):
{
"responseId": "--",
"queryResult": {
"queryText": "repeat",
"action": "multivocal.repeat",
"parameters": {},
"allRequiredParamsPresent": true,
"fulfillmentMessages": [
{
"text": {
"text": [
""
]
}
}
],
"outputContexts": [
{
"name": "project info",
"parameters": {
"no-input": 0,
"no-match": 0
}
}
],
"intent": {
"name": "project info",
"displayName": "repeat"
},
"intentDetectionConfidence": 1,
"languageCode": "en"
},
"originalDetectIntentRequest": {
"payload": {}
},
"session": "project info"
}
Raw API response (removed project and response id)
{
"responseId": "",
"queryResult": {
"queryText": "repeat",
"action": "multivocal.repeat",
"parameters": {},
"allRequiredParamsPresent": true,
"fulfillmentMessages": [
{
"text": {
"text": [
""
]
}
}
],
"intent": {
"name": "projects info",
"displayName": "repeat"
},
"intentDetectionConfidence": 1,
"diagnosticInfo": {
"webhook_latency_ms": 4992
},
"languageCode": "en"
},
"webhookStatus": {
"code": 4,
"message": "Webhook call failed. Error: DEADLINE_EXCEEDED."
}
}
My simple intent that I've added based on the recommendation that for repeat to work on an intent it must use fulfillment and not based text response in Dialogflow
Here is my index.js file using the inline editor with suggestion to add text response in the config:
const conf = {
Local: {
en: {
Response: {
"Intent.help": [
"I'm sorry, I'm not able to help you.",
"You, John, Paul, George, and Ringo ey?"
],
"Action.multivocal.repeat": "Let me try again"
}
}
}
};
This line at the end of my index.js seems odd to me, but may be unrelated:
exports.webhook = Multivocal.processFirebaseWebhook;
exports.dialogflowFirebaseFulfillment = Multivocal.processFirebaseWebhook;
It sounds like you're triggering the Fallback Intent. You also need an Intent defined in Dialogflow that has an Action set to "multivocal.repeat". That might look something like this:
In the dialogflow directory of the npm package (or on github) you'll find a zip file with this and several other "standard" Intents that you can use with mulivocal.
Additionally, all the other Intents that you want to be repeated must use fulfillment to send the response (the library doesn't know what might be sent unless it can send it itself). The simplest way to do this is to enable fulfillment on each, and move the text responses from their Dialogflow screens into the configuration under an entry such as "Intent.name" (replacing "name" with the name of the Intent) or "Action.name" if you set an action name for them.
So your configuration might be something like
const conf = {
Local: {
en: {
Response: {
"Intent.welcome": [
"Hello there!",
"Welcome to my Action!"
],
"Action.multivocal.repeat": [
"Let me try again"
]
}
}
}
};

How to get Dialogflow to say my response from cloud run webhook?

I have created a simple intent in DialogFlow where the user asks 'how old someone is' (ex. "How old is David Beckham?").
This is then sent to a cloud run web hook that returns a response: "How am I meant to know?".
When i test this in the DialogFlow console it works fine and the JSON response is returned from Cloud Run to Dialogflow:
FULFILLMENT RESPONSE
{
"payload": {
"google": {
"expectUserResponse": true,
"richResponse": {
"items": [
{
"simpleResponse": {
"textToSpeech": "How am I meant to know?!"
}
}
]
}
}
}
The problem is that DialogFlow is not responding with "How am I meant to know?" in the console. its not responding with anything.
Is there something else i need to do for this to happen? I assumed this would happen automatically.
That response is only for Google Assistant, you need to add a "default" response in this format:
{
"fulfillmentMessages": [
{
"text": {
"text": [
"Text response from webhook"
]
}
}
]
}
Every integration has a different format response but they could be used together
Check the docs:
https://cloud.google.com/dialogflow/docs/fulfillment-webhook

Custom Payload with dialogflow on google plateform

I am trying to sent custom payload in an dialogflot intent. When i am selecting the custom payload option available under google assistant it gives the following predefined json format : -
{
"google": {
}
}
now i am not aware about what i need to put in there in order to get a response from here. Any guide will be helpful
There are some compulsory Keys to be added in Rich Response JSON.
You must have Suggestion Chips and a Simple Response to maintain the follow-up of your Action. AoG rejects any action with missing Suggestion Chips or Follow-Up Response.
Refer to this JSON for Basic Card Response:
{
"payload": {
"google": {
"expectUserResponse": true,
"richResponse": {
"items": [
{
"simpleResponse": {
"textToSpeech": "Here's an example of a basic card."
}
},
{
"basicCard": {
"title": "Title: this is a title",
"subtitle": "This is a subtitle",
"formattedText": "This is a basic card. Text in a basic card can include \"quotes\" and\n most other unicode characters including emojis. Basic cards also support\n some markdown formatting like *emphasis* or _italics_, **strong** or\n __bold__, and ***bold itallic*** or ___strong emphasis___ as well as other\n things like line \nbreaks",
"image": {
"url": "https://storage.googleapis.com/actionsresources/logo_assistant_2x_64dp.png",
"accessibilityText": "Image alternate text"
},
"buttons": [
{
"title": "This is a button",
"openUrlAction": {
"url": "https://assistant.google.com/"
}
}
],
"imageDisplayOptions": "CROPPED"
}
},
{
"simpleResponse": {
"textToSpeech": "Which response would you like to see next?"
}
}
]
}
}
}
}
You can refer to the specific Rich Response JSON for your Action in the following Documentation:
https://developers.google.com/assistant/conversational/rich-responses#df-json-basic-card

Dialogflow Fulfillment URLnot sending any data

I am building a bot for google assistant. I have enabled fulfillment section for some intents. Dialog flow sends the request to the fulfillment url. The url is executed and a hard coded response is returned. I can see the response in the assistant simulator. Everything works fine except one thing. The request is empty.I can't access fields that are supposed to be present in the request.
I have accessed the same url using post request from a python code and it displays the parameters. So, there are no issues in the code. I think I am missing some configuration option.
I was expecting the post body in the following format:
POST body:
{
"responseId": "ea3d77e8-ae27-41a4-9e1d-174bd461b68c",
"session": "projects/your-agents-project-id/agent/sessions/88d13aa8-2999-4f71-b233-39cbf3a824a0",
"queryResult": {
"queryText": "user's original query to your agent",
"parameters": {
"param": "param value"
},
"allRequiredParamsPresent": true,
"fulfillmentText": "Text defined in Dialogflow's console for the intent that was matched",
"fulfillmentMessages": [
{
"text": {
"text": [
"Text defined in Dialogflow's console for the intent that was matched"
]
}
}
],
"outputContexts": [
{
"name": "projects/your-agents-project-id/agent/sessions/88d13aa8-2999-4f71-b233-39cbf3a824a0/contexts/generic",
"lifespanCount": 5,
"parameters": {
"param": "param value"
}
}
],
"intent": {
"name": "projects/your-agents-project-id/agent/intents/29bcd7f8-f717-4261-a8fd-2d3e451b8af8",
"displayName": "Matched Intent Name"
},
"intentDetectionConfidence": 1,
"diagnosticInfo": {},
"languageCode": "en"
},
"originalDetectIntentRequest": {}
}
But when I print the post data using print(request.POST), the actual post request shown is
One more thing: Does dialog flow append the action at the end of the fulfillment url? If so, I will have to handle the logic separately. I have done it without considering the action name. But a lot of my stuff is hacked, so I just want to be sure.
On another note, is dialogflow good enough? It has worked fine on a few examples similar to what it was trained on. How many training samples does it need to work properly? What is the underlying algorithm used in dialogflow? Or should I use the fulfillment url and handle everything on my own? I am inclined towards the later. I do not have too much faith in the existing chatbots.
Any help is appreciated.
If the Fallback Intent is the one being triggered, then you wouldn't get any parameters since this means that nothing else matched.
Got it. Used request.body. This solves the problem. Then parsed it using json.loads and accessed the parameters.

Resources