javascript - 基于持续时间的对话流
问题描述
这可能不是最好的提问地点,但我想知道是否有人可以根据@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);
解决方案
看起来你在正确的轨道上。我有几个建议:
- 我会将名称更改为
LENGTH_OF_TIME_ENTITY
toLENGTH_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");
}
};
推荐阅读
- jquery - Amazon S3 文件上传:抛出 403
- azure - 如何将密钥保管库的访问权限授予用户分配的身份?
- android - 使用 SnapHelper 选择项目时在 Viewholder 中调用函数
- mongodb - Mongo聚合,分组,最大值并取整行具有最大值
- android - java.lang.ClassNotFoundException:在路径上找不到类“com.google.firebase.provider.FirebaseInitProvider”:DexPathList
- database - 将具有单个数据库的 laravel 项目迁移到多个库
- python - Python 尝试通过 Hotmail 发送电子邮件时出错。暂停
- oracle - 无法从 SQL Developer 检索乌尔都语/阿拉伯语数据
- django - 在 Django/Postgres 中存储挂钟日期时间
- git - Git:将多个提交组合成一个提交