首页 > 解决方案 > 基于持续时间的对话流

问题描述

这可能不是最好的提问地点,但我想知道是否有人可以根据@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);

标签: javascriptdialogflow-es

解决方案


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

  • 我会将名称更改为LENGTH_OF_TIME_ENTITYto LENGTH_OF_TIME_PARAMETER。实体有点像用户输入所属的类别,在您的情况下是@sys.duration。参数是实际输入。
  • 根据他们的文档,您从 Dialogflow 获得的 @sys.duration 参数的参数将作为一个看起来像 的对象出现{"amount":10,"unit":"min"},因此您需要确保以该形式处理一个对象。使用系统实体时,Dialogflow 文档是一个很好的参考
  • 看起来您正在尝试进行某种持续时间比较。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");
    }
};

推荐阅读