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 日”请求也可以触发相同的操作,但读取已保存的入住日期并正常运行。