如果用户查询中缺少参数,我的意图会发送webhook作为插槽填充的一部分 . 然后我的webhook使用逻辑来估计参数的值 . 如何将此参数作为WebhookResponse对象的一部分返回?我在ASP.NET Core应用程序中使用C#客户端库 .
我的代码是:
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
所以,我几乎都使用了囚犯的方法 . 我也会在某个时候重试sid8491 . 我的意图是试图获取用户的地址 . 我需要自定义实体来检索街道号码,街道名称,郊区和州 .
在不创建任何上下文的情况下,Dialogflow会自动生成以下上下文: projects/telebot-pianomoves-v1/agent/sessions/2b42cbc8-2418-4231-e4c0-bd3a175f2ea8/contexts/1320fe35-4329-4176-b136-9221dfaddd4e_id_dialog_context
. 我在webhook中收到此上下文,然后可以更改参数的值 . 假设$ Suburb_Entity在webhook请求中没有值,然后我的代码返回上面的上下文,其中包含 Suburb_Entity
的新值 . 我的代码成功地将 Suburb_Entity
从 ""
更改为 aspendale
,如webhook响应json所示:
现在奇怪的是,虽然我将 Suburb_Entity
更改为我的webhook响应的 outputContext
中的实际值,但实际参数 $Suburb_Entity
仅从NEXT检测意图请求的outputContext更改为 Suburb_Entity
的新值 . 所以,请记住,我在webhook响应的 outputContext
中返回了新的 Suburb_Entity
,这是我得到的检测意图响应 - 注意$ Suburb_Entity尚未更改:
在下一个检测意图请求中,webhook请求参数 Suburb_Entity
设置为 aspendale
, $Suburb_Entity
也等于 aspendale
. 关于这一点的重要一点是, $Suburb_Entity
仅更改为NEXT检测意图请求中的outputContext参数值,该请求将触发另一个webhook . $Suburb_Entity
在与我修改 outputContext
参数 Suburb_Entity
相同的检测意图请求期间没有改变,但是在下一个 . 这让我相信,不知何故, $Suburb_Entity
从这个自动生成的上下文中继承了参数值 . 这里的问题是,当我的webhook响应 outputContext
参数 Suburb_Entity
等于 aspendale
时, $Suburb_Entity
在下一个请求之前不会更改为此值 . 这意味着如果所有其他参数都设置了值,但 $Suburb_Entity
尚未更改值,则 allRequiredParamsSet == false
. 如果我在 outputContext
中返回 Suburb_Entity
,我希望它立即更改 $Suburb_Entity
的值,而不需要另一个检测意图请求,以便 allRequiredParamsSet == true
在这种情况下 . 我尝试通过这样做设置默认值(它不起作用):
当然,另一种方法是强迫我使用 allRequiredParamsSet = true
. 我从上下文参数中保存参数值,而不是实际响应 . 所以我不需要 $Suburb_Entity
,我只是想让它认为它有 Value .
干杯
2 回答
完成它有多个步骤:
首先提出意图事件
在webhook中检查您的状况
如果您的条件满足,则通过调用您在步骤1中定义的webhook中的事件来调用intent
传递paylaod(以json格式)以及事件调用,在有效负载中提供参数
在intent中,将参数的默认值设为
#eventName.parameterName
希望能帮助到你 .
当您使用webhook进行“插槽填充”时,目的是返回要求用户提示的提示,并继续使用相同的Intent来处理响应 . 你不应该自己创造 Value .
如果您想要在Dialogflow Intent的静态"response"部分中使用某些答案,或者您只想记录答案以便以后使用它们,则可以设置上下文的参数 . 在响应字符串中,您可以将此值称为
#context-name.parameter-name
.Update
我不知道插槽填充的内部机制,但我并不感到惊讶的是,在输入参数的内部上下文中设置值不会“注册”直到下一轮处理Intent .
用于插槽填充的webhook不用于创建值 - 它旨在处理值并创建供用户响应的提示 . 意图通常是关于处理用户输入和关于处理它们的webhook .
我的解决方法建议如果你想要输出,你可以使用输出的上下文 .