Google助手-输入无效如何重新提示?
Google Assistant - How to re-prompt if the input is invalid?
我正在使用 Google 助手和 Node.js,我向用户询问入住日期和退房日期。
如果退房日期晚于入住日期,那么我想添加一个重新提示,以便用户可以告知有效日期。有没有办法强制从代码中重新提示?
代码片段如下:
app.intent('myIntent', conv => {
// validation
const checkInDateString = conv.parameters[CHECK_IN_ARGUMENT];
const checkOutDateString = conv.parameters[CHECK_OUT_ARGUMENT];
var checkInDate = new Date(checkInDateString);
var checkOutDate = new Date(checkOutDateString);
console.log("Check-in date is: " + checkInDate.getTime());
console.log("Check-out date is: " + checkOutDate.getTime());
if (checkInDate.getTime() > checkOutDate.getTime())
{
conv.close('Pick a check-out date that is later than the check-in date!');
console.error('The check-in date must be before the check-out date!');
}
else
{
// save to db.
}
});
我不想结束对话,而是想重新提示最后一个问题。
这是退房日期失败后的第一次尝试。
这是第二次尝试:
您想使用 conv.ask()
而不是 conv.close()
。使用 ask()
将以相同的方式发送消息 但会期望用户响应 。顾名思义,close()
会关闭麦克风并结束对话。
要在检查日期后添加重新提示,您需要通过启用 "add intent" 底部的“Enable webhook call for slot filling
”来处理 NodeJS 代码中的 parameters/slots。
这样,对于每个需要的参数,webhook NodeJS 代码将被调用,您可以检查参数的有效性。
重要的一点是重新提示。当您想要重新提示输入正确的参数时,您需要以编程方式设置上下文。问题在于,在收集槽时,Dialogflow 会为各个参数生成动态上下文。
您需要确定与您的日期参数关联的上下文,如果重新提示,请将该上下文设置为 lifetime 2 以便再次收集参数。
更好的方法是为您要验证的所有参数设置单独的单独意图。这样您就不必识别动态上下文,并且可以在重新提示时使用自己的上下文。
更新 - 使用第二种方法
- 确定需要验证的广告位。
- 将它们从当前意图中删除。
- 为每个需要验证的插槽创建单独的意图。
- 为这些意图启用 webhook(不是为槽,因为您只收集一个)。
- 在webhook中,如果验证失败,将输出上下文设置为与输入相同,以触发相同的意图。
- 重新提示回复。
此外,为了简单起见,请考虑使用 contexts,因为它们可以实现某种状态持久化。
在您的示例中,该操作可能会正确失败(应该如此),但也会保存入住日期,以便下一次调用可以 运行 正确地使用这两个日期。 “2018 年 3 月 7 日”请求也可以触发相同的操作,但读取已保存的入住日期并正常运行。
我正在使用 Google 助手和 Node.js,我向用户询问入住日期和退房日期。 如果退房日期晚于入住日期,那么我想添加一个重新提示,以便用户可以告知有效日期。有没有办法强制从代码中重新提示?
代码片段如下:
app.intent('myIntent', conv => {
// validation
const checkInDateString = conv.parameters[CHECK_IN_ARGUMENT];
const checkOutDateString = conv.parameters[CHECK_OUT_ARGUMENT];
var checkInDate = new Date(checkInDateString);
var checkOutDate = new Date(checkOutDateString);
console.log("Check-in date is: " + checkInDate.getTime());
console.log("Check-out date is: " + checkOutDate.getTime());
if (checkInDate.getTime() > checkOutDate.getTime())
{
conv.close('Pick a check-out date that is later than the check-in date!');
console.error('The check-in date must be before the check-out date!');
}
else
{
// save to db.
}
});
我不想结束对话,而是想重新提示最后一个问题。
这是退房日期失败后的第一次尝试。
这是第二次尝试:
您想使用 conv.ask()
而不是 conv.close()
。使用 ask()
将以相同的方式发送消息 但会期望用户响应 。顾名思义,close()
会关闭麦克风并结束对话。
要在检查日期后添加重新提示,您需要通过启用 "add intent" 底部的“Enable webhook call for slot filling
”来处理 NodeJS 代码中的 parameters/slots。
这样,对于每个需要的参数,webhook NodeJS 代码将被调用,您可以检查参数的有效性。
重要的一点是重新提示。当您想要重新提示输入正确的参数时,您需要以编程方式设置上下文。问题在于,在收集槽时,Dialogflow 会为各个参数生成动态上下文。
您需要确定与您的日期参数关联的上下文,如果重新提示,请将该上下文设置为 lifetime 2 以便再次收集参数。
更好的方法是为您要验证的所有参数设置单独的单独意图。这样您就不必识别动态上下文,并且可以在重新提示时使用自己的上下文。
更新 - 使用第二种方法
- 确定需要验证的广告位。
- 将它们从当前意图中删除。
- 为每个需要验证的插槽创建单独的意图。
- 为这些意图启用 webhook(不是为槽,因为您只收集一个)。
- 在webhook中,如果验证失败,将输出上下文设置为与输入相同,以触发相同的意图。
- 重新提示回复。
此外,为了简单起见,请考虑使用 contexts,因为它们可以实现某种状态持久化。
在您的示例中,该操作可能会正确失败(应该如此),但也会保存入住日期,以便下一次调用可以 运行 正确地使用这两个日期。 “2018 年 3 月 7 日”请求也可以触发相同的操作,但读取已保存的入住日期并正常运行。