首页 文章

Dialogflow webhook设置参数值

提问于
浏览
1

如果用户查询中缺少参数,我的意图会发送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 . 我的意图是试图获取用户的地址 . 我需要自定义实体来检索街道号码,街道名称,郊区和州 .

enter image description here

在不创建任何上下文的情况下,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所示:

enter image description here

现在奇怪的是,虽然我将 Suburb_Entity 更改为我的webhook响应的 outputContext 中的实际值,但实际参数 $Suburb_Entity 仅从NEXT检测意图请求的outputContext更改为 Suburb_Entity 的新值 . 所以,请记住,我在webhook响应的 outputContext 中返回了新的 Suburb_Entity ,这是我得到的检测意图响应 - 注意$ Suburb_Entity尚未更改:

enter image description here

在下一个检测意图请求中,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 在这种情况下 . 我尝试通过这样做设置默认值(它不起作用):

enter image description here

当然,另一种方法是强迫我使用 allRequiredParamsSet = true . 我从上下文参数中保存参数值,而不是实际响应 . 所以我不需要 $Suburb_Entity ,我只是想让它认为它有 Value .

干杯

2 回答

  • 1

    完成它有多个步骤:

    • 首先提出意图事件

    • 在webhook中检查您的状况

    • 如果您的条件满足,则通过调用您在步骤1中定义的webhook中的事件来调用intent

    • 传递paylaod(以json格式)以及事件调用,在有效负载中提供参数

    • 在intent中,将参数的默认值设为 #eventName.parameterName

    希望能帮助到你 .

  • 0

    当您使用webhook进行“插槽填充”时,目的是返回要求用户提示的提示,并继续使用相同的Intent来处理响应 . 你不应该自己创造 Value .

    如果您想要在Dialogflow Intent的静态"response"部分中使用某些答案,或者您只想记录答案以便以后使用它们,则可以设置上下文的参数 . 在响应字符串中,您可以将此值称为 #context-name.parameter-name .

    Update

    我不知道插槽填充的内部机制,但我并不感到惊讶的是,在输入参数的内部上下文中设置值不会“注册”直到下一轮处理Intent .

    用于插槽填充的webhook不用于创建值 - 它旨在处理值并创建供用户响应的提示 . 意图通常是关于处理用户输入和关于处理它们的webhook .

    我的解决方法建议如果你想要输出,你可以使用输出的上下文 .

相关问题