Reputation: 1945
My intent sends a webhook as part of slot filling if a parameter is missing from the user query. My webhook then uses logic to estimate the value of the parameter. How can I return this parameter as part of the WebhookResponse object? I am using the C# client library in an ASP.NET Core app.
My code is:
string fulfillmentText;
WebhookRequest request = null;
using (var reader = new StreamReader(Request.Body))
{
request = jsonParser.Parse<WebhookRequest>(reader);
}
//If Parameter-1 has no value
if (request.QueryResult.Fields["Parameter-1].StringValue.Length == 0)
{
fulfillmentText = "I have guessed the value of Parameter-1";
//I apply some logic that is unimportant to this question
//For the sake of simplicity, say I estimate the value of Parameter-1 to be "foobar"
//I want to be able to give the parameter this value like this:
parameter["Parameter-1"] = "foobar"
}
UPDATE
So, I have pretty much got it all working using Prisoner's method. I will retry sid8491's at some point too. My intent is trying to obtain a user's address. I have required custom entities to retrieve the street number, street name, suburb and state.
Without creating any contexts myself, the following context is automatically generated by Dialogflow: projects/telebot-pianomoves-v1/agent/sessions/2b42cbc8-2418-4231-e4c0-bd3a175f2ea8/contexts/1320fe35-4329-4176-b136-9221dfaddd4e_id_dialog_context
. I receive this context in my webhook, and can then CHANGE the value of a parameter. Let's assume $Suburb_Entity had no value in the webhook request and my code then returned the above context with the a new value for Suburb_Entity
. My code successfully changes the Suburb_Entity
from ""
to aspendale
as can be seen by the webhook response json:
Now the odd thing is, although I changed the Suburb_Entity
to an actual value in the outputContext
of my webhook response, the actual parameter $Suburb_Entity
only changes to the new value of Suburb_Entity
from the outputContext on the NEXT detect intent request. So, keeping in mind the fact that I returned the new Suburb_Entity
in the outputContext
of the webhook response, this is the detect intent response I get - noting that $Suburb_Entity is yet to be changed:
On the next detect intent request, the webhook request parameter Suburb_Entity
is set to aspendale
and $Suburb_Entity
also equals aspendale
. The important thing about this, is $Suburb_Entity
only changed to the outputContext parameter value on the NEXT detect intent request, of which would have triggered another webhook. $Suburb_Entity
did not change during the same detect intent request as when I modified the outputContext
parameter Suburb_Entity
, but in the next. This leads me to believe that somehow, $Suburb_Entity
inherits parameter values from this automatically generated context. The issue here, is that when my webhook responds with the outputContext
paramter Suburb_Entity
equalling aspendale
, $Suburb_Entity
does not change to this value until the next request. This means that if all the other parameters have values set, but $Suburb_Entity
is yet to have changed value, then allRequiredParamsSet == false
. If I return the Suburb_Entity
in the outputContext
, I want it to immediately change the value of $Suburb_Entity
without requiring another detect intent request so that allRequiredParamsSet == true
in such a circumstance. I tried setting the default value by doing this (it didn't work):
An alternative of course would be a way for me to force allRequiredParamsSet = true
. I save the parameter values from this the context parameter, not the actual response. So I don't need $Suburb_Entity
, I just want the intent to think that it has a value.
Cheers
Upvotes: 3
Views: 7818
Reputation: 50731
When you use a webhook for "slot filling", the intention is that you return the prompts you want to ask the user for and continue to use the same Intent to handle the responses. You're not expected to create values yourself.
If you want to "fill in" some answers that are used in the static "response" section of the Dialogflow Intent, or if you just want to record the answers so you can use them later, you can set the parameters of a Context. In the response string, you can refer to this value as #context-name.parameter-name
.
Update
I don't know the internal mechanics of slot filling, but it doesn't surprise me that setting a value in the internal context for the input parameters doesn't "register" until the next round of handling the Intent.
The webhook for slot filling isn't intended to create values - it is intended to handle values and create prompts for the user to respond to. Intents are generally about processing user inputs and webhooks about handling them.
My workaround suggested that if you want this for output, you use the context for output.
Upvotes: 3
Reputation: 6800
There are multiple steps for get it done:
#eventName.parameterName
Hope it helps.
Upvotes: 3