Google助手-如果输入无效,如何重新提示?

时间:2018-07-26 12:23:13

标签: node.js actions-on-google

我正在将Google Assistant与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.
        }
});

我不想结束对话,而是想重新提示最后一个问题。

这是退房日期失败后的首次尝试。 enter image description here

这是第二次尝试:

enter image description here

enter image description here

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:1)

要在检查日期后添加重新提示,您需要通过启用“添加意图”底部的“ Enable webhook call for slot filling”来处理NodeJS代码中的参数/槽。

这样,对于每个所需的参数,都会调用webhook NodeJS代码,您可以检查参数的有效性。

重点是重新提示。要重新提示输入正确的参数时,需要以编程方式设置上下文。问题将是,在收集插槽时,Dialogflow为各个参数生成动态上下文。 您需要标识与日期参数关联的上下文,如果再次提示,请设置其寿命为2,以便再次收集该参数。

更好的方法是对要验证的所有参数有单独的意图。这样,您将不必标识动态上下文,并且可以在重新提示时使用自己的上下文。
更新-使用第二种方法

  • 确定需要验证的插槽。
  • 从当前意图中删除它们。
  • 为每个需要验证的插槽创建单独的意图。
  • 为这些意图启用webhook(不适用于插槽,因为您仅收集一个)。
  • 在webhook中,如果验证失败,则将输出上下文设置为与输入相同,以触发相同的意图。
  • 通过重新提示响应进行回复。

答案 1 :(得分:0)

您要使用conv.ask()而不是conv.close()。使用ask()将以相同的方式发送消息,但希望用户响应。顾名思义,close()确实关闭了麦克风并结束了对话。

答案 2 :(得分:0)

为简便起见,这里另外考虑使用contexts,因为它们可以实现状态的持久性。

在您的示例中,该操作可能会正确失败(应该如此),但还会保存签入日期,以便下次呼叫可以同时使用两个日期正确运行。 “ 2018年3月7日”请求也可以触发相同的操作,但读取已保存的入住日期并可以正常运行。