Google cloud platform Dialogflow webhook设置参数值
如果用户查询中缺少参数,My intent将发送一个webhook作为插槽填充的一部分。然后,我的webhook使用逻辑来估计参数的值。如何将此参数作为WebhookResponse对象的一部分返回?我正在ASP.NET核心应用程序中使用C#客户端库 我的代码是:Google cloud platform Dialogflow webhook设置参数值,google-cloud-platform,webhooks,dialogflow-es,chatbot,Google Cloud Platform,Webhooks,Dialogflow Es,Chatbot,如果用户查询中缺少参数,My intent将发送一个webhook作为插槽填充的一部分。然后,我的webhook使用逻辑来估计参数的值。如何将此参数作为WebhookResponse对象的一部分返回?我正在ASP.NET核心应用程序中使用C#客户端库 我的代码是: string fulfillmentText; WebhookRequest request = null; using (var reader = new StreamReader(Request.Body)) { requ
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"
}
字符串实现文本;
WebhookRequest=null;
使用(var reader=newstreamreader(Request.Body))
{
request=jsonParser.Parse(reader);
}
//如果参数-1没有值
if(request.QueryResult.Fields[“参数-1].StringValue.Length==0)
{
fulfillmentText=“我猜到了参数-1的值”;
//我运用了一些对这个问题不重要的逻辑
//为了简单起见,假设我估计参数-1的值为“foobar”
//我希望能够给参数这样的值:
参数[“参数-1”]=“foobar”
}
更新
所以,我已经用Captier的方法完成了所有工作。我也会在某个时候重试sid8491。我的目的是尝试获取用户的地址。我需要自定义实体来检索街道号、街道名称、郊区和州
在自己不创建任何上下文的情况下,Dialogflow会自动生成以下上下文:projects/telebot-pianomoves-v1/agent/sessions/2b42cbc8-2418-4231-e4c0-bd3a175f2ea8/contexts/1320fe35-4329-4176-b136-9221dfadd4e\u id\u dialog\u context
。我在webhook中接收到该上下文,然后可以更改参数的值。让我们假设$郊区实体在webhook请求中并没有任何值,然后我的代码返回了上面的上下文,并为郊区实体
提供了一个新的值。我的代码成功地将郊区实体
从“
更改为aspendale
,正如webhook响应json所示:
现在奇怪的是,虽然我在webhook响应的outputContext
中将subparent\u实体
更改为实际值,但实际参数$subparent\u实体
仅在下一次检测意图请求时从outputContext更改为subparent\u实体
的新值在webhook响应的outputContext
中,我返回了新的Subparent\u实体,这是我得到的detect intent响应-注意$Subparent\u实体尚未更改:
在下一个检测意图请求中,webhook请求参数subparent_Entity
被设置为aspendale
,$subparent_Entity
也等于aspendale
。重要的是,$subparent_Entity
仅在下一个检测意图请求中更改为outputContext参数值,即ich会触发另一个webhook。$subparent\u Entity
在相同的检测意图请求期间没有改变,就像我修改outputContext
参数subparent\u Entity
时一样。这让我相信,$subparent\u Entity
会自动从这个基因继承参数值分级上下文。这里的问题是,当我的webhook使用outputContext
参数Subparent\u Entity
equalingaspendale
,在下一个请求之前,$Subparent\u Entity
不会更改为该值。这意味着如果所有其他参数都设置了值,但$Subparent\u Entity
为yet已更改值,然后allRequiredParamsSet==false
。如果我在outputContext
中返回Suburban\u实体
,我希望它立即更改$Suburban\u实体
的值,而不需要另一个检测意图请求,以便在这种情况下allRequiredParamsSet==true
。我尝试通过执行此操作设置默认值(无效):
当然,另一种方法是强制执行allRequiredParamsSet=true
。我将此参数值保存为上下文参数,而不是实际响应。因此,我不需要$subsection\u Entity
,我只希望它有一个值
干杯当您使用webhook进行“插槽填充”时,目的是返回您想要向用户请求的提示,并继续使用相同的目的来处理响应。您不需要自己创建值
如果您想“填写”Dialogflow Intent的静态“响应”部分中使用的一些答案,或者您只是想记录答案以便以后使用,您可以设置上下文的参数。在响应字符串中,您可以将此值称为#Context name.parameter name
更新
我不知道插槽填充的内部机制,但在下一轮处理意图之前,在内部上下文中为输入参数设置值不会“注册”,这并不奇怪
用于插槽填充的webhook并不是用来创建值的,而是用来处理值和创建提示以供用户响应。意图通常是关于处理用户输入,webhook是关于处理它们
我的解决方案建议,如果您希望将其用于输出,请使用上下文进行输出。完成此操作有多个步骤:
首先给出一个事件的意图
在webhook中检查您的状况
如果您的条件得到满足,则通过从webhook调用您在步骤1中定义的事件来调用意图
将paylaod(json格式)与事件调用一起传递,在有效负载中提供参数
在意图中,将参数的默认值设置为#eventName.parameterName
希望能有所帮助。请用意图截图和可能的更多webhook代码详细解释。我已经更新了问题,先生,这是