我们希望保留持久值。 我们使用以下简单代码进行了尝试,但未保留该值。 我们犯了什么错误?
索引.js
'use strict';
const functions = require('firebase-functions');
const { dialogflow } = require('actions-on-google');
const app = dialogflow();
app.intent('FirstIntent', conv => {
conv.user.storage.value = 'A';
conv.followup('SecondEvent');
});
app.intent('SecondIntent', conv => {
conv.close('value is ' + conv.user.storage.value);
});
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
包.json
{
"name": "dialogflowFirebaseFulfillment",
"description": "This is the default fulfillment for a Dialogflow agents using Cloud Functions for Firebase",
"version": "0.0.1",
"private": true,
"license": "Apache Version 2.0",
"author": "Google Inc.",
"engines": {
"node": "8"
},
"scripts": {
"start": "firebase serve --only functions:dialogflowFirebaseFulfillment",
"deploy": "firebase deploy --only functions:dialogflowFirebaseFulfillment"
},
"dependencies": {
"actions-on-google": "^2.2.0",
"firebase-admin": "^5.13.1",
"firebase-functions": "^2.0.2",
"dialogflow": "^0.6.0",
"dialogflow-fulfillment": "^0.6.1"
}
}
FirstIntent 在启动时调用。 将持久值保存在 FirstIntent 中并引发 SecondEvent。 第二意图被调用。 读取 SecondIntent 中的持久值以创建响应。 显示"值未定义"。
我们找到了以下日志。
Billing account not configured.
External network is not accessible and quotas are severely limited.
Configure billing account to remove these restrictions
我们升级到 flame 并确认日志未显示,但持久值尚未保存。我们可以在不充电的情况下解决这个问题吗?
此行为(即,设置为user.storage
的值不会通过followup()
函数传递(是 google-nodejs SDK 上的操作规范。
实际上,这不仅是SDK的规范,而且这也是由于user.storage
功能与followup()
函数使用的Dialogflow后续事件功能不兼容造成的。调用followup()
函数时,"followupEventInput"响应从履行返回到Dialogflow。收到响应后,Dialogflow 会确定可以处理指定事件的意图,并直接触发该意向,而不会向 Google 上的操作返回任何响应。user.storage
是 Google 上的操作的一项功能,因此,对话流必须将新值返回到 Google 上的操作以更新user.storage
值,以便 Google 上的操作将新值发送到下一个请求。但是,在调用followup()
时,对话流不会将控件传递给 Google 上的操作。结果,即使将值设置为user.storage
,不幸的是,这些值被忽略了。
相反,SDK 可以临时存储新的user.storage
值,以便在下一次网络钩子时将这些值返回到 Google 上的操作。但是,后续事件触发的意图并不总是调用 Webhook。因此,这个想法不能涵盖所有情况。作为讨论的结果,当前的SDK不支持这个想法。
以下 API 参考中介绍了此规范。
https://actions-on-google.github.io/actions-on-google-nodejs/classes/dialogflow.dialogflowconversation.html#followup
此外,您还可以在以下位置阅读决定此规范的讨论:
https://github.com/actions-on-google/actions-on-google-nodejs/pull/211#issuecomment-412942410
在你的例子中,问题在于对conv.followup()
的调用否定了你在原始意图处理程序中所做的大多数事情,而是用你在后续意图中所做的替换它们。
user.storage
应保留由用户操作触发的意向之间的值。