基于持续时间的对话流

时间:2018-10-03 19:43:37

标签: javascript dialogflow

这可能不是最好的问题,但是我想知道是否有人可以基于@ sys.duration帮助新人完成工作。例如,如果某人对5年或10个月的提示做出响应,他们将根据这些值得到不同的答复。

我知道,如果有人回答“ 5年”而不是回答“ 3个月...”,这可能会很棘手

我一直在使用内联编辑器,并根据一些演示使用了以下内容,并且在网上找到了这样的内容:

const functions = require('firebase-functions');
const {dialogflow} = require('actions-on-google');

const TIME_INTENT = "Time";
const LENGTH_OF_TIME_ENTITY = "LengthOfTime";

const app = dialogflow();

app.intent(TIME_INTENT, (conv) => {
    const length_of_service = conv.parameters[LENGTH_OF_TIME_ENTITY].toLowerCase();
    if (length_of_time > 5) {
        conv.ask("Response 1");
    } else {
        conv.ask("Response 2");
    }
});

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

1 个答案:

答案 0 :(得分:3)

看起来您在正确的轨道上。我有几个建议:

  • 我将LENGTH_OF_TIME_ENTITY的名称更改为LENGTH_OF_TIME_PARAMETER。实体有点像用户输入所属的类别,在您的情况下为@ sys.duration。参数是实际输入。
  • 根据他们的文档,您将从Dialogflow获得的@ sys.duration参数的参数作为一个看起来像{"amount":10,"unit":"min"}的对象进入,因此您需要确保您正在处理以这种形式的对象。在使用系统实体时,Dialogflow docs是很好的参考。
  • 您似乎正在尝试进行某种持续时间比较。 Moment.js是一个经常使用的库,可以提供帮助。如果您不想依赖库,则需要使用自己的解决方案将从Dialogflow获得的各种可能的输入转换为相同的单位,以便将其与您确定的响应时间进行比较使用。

将它们放在一起,您将执行以下操作:

const functions = require('firebase-functions');
const {dialogflow} = require('actions-on-google');
const moment = require('moment');

const TIME_INTENT = "Time";
const LENGTH_OF_TIME_ENTITY = "LengthOfTime";

const CUTOFF = moment.duration(5, "month");

const app = dialogflow();

app.intent(TIME_INTENT, (conv) => {
    const input = conv.parameters[LENGTH_OF_TIME_ENTITY];
    const length_of_service = moment.duration(input.amount, input.unit);

    if (length_of_service.asSeconds() > CUTOFF.asSeconds()) {
        conv.ask("Response 1");
    } else {
        conv.ask("Response 2");
    }
});

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

您可能需要进行一些转换,以将Dialogflow使用的单位字符串转换为Moment.js期望的形式,但这应该非常简单。我没有彻底检查任何一个的单位值,但遵循以下原则:

const toMomentUnit = (unit) => {
    switch(unit) {
        case "min":
            return "minutes";
        case "day":
            return "days";
        case "mo":
            return "months";
        case "year":
            return "years";
        default:
            throw new Error("Unrecognized unit");
    }
};