Google cloud platform Dialogflow webhook设置参数值

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

如果用户查询中缺少参数,My intent将发送一个webhook作为插槽填充的一部分。然后,我的webhook使用逻辑来估计参数的值。如何将此参数作为WebhookResponse对象的一部分返回?我正在ASP.NET核心应用程序中使用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"

}
字符串实现文本;
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
equaling
aspendale
,在下一个请求之前,
$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代码详细解释。我已经更新了问题,先生,这是