想要保留持久值
Want to preserve persistent values
我们想要保留持久值。
我们用下面的简单代码尝试了一下,但是这个值没有被保留。
我们做错了什么?
index.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);
package.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 被调用。
读取 SecondIntent 中的持久值以创建响应。
显示"Value is undefined"。
我们找到了以下日志。
Billing account not configured.
External network is not accessible and quotas are severely limited.
Configure billing account to remove these restrictions
我们升级到flame,确认log没有显示,但是persistent值还没有保存。不收费能解决这个问题吗?
你的问题是对 conv.followup()
的调用否定了你在原始意图处理程序中所做的大部分事情,而不是将它们替换为你在后续意图中所做的事情。
user.storage
应保留由用户操作触发的 Intent 之间的值。
此行为(即设置为 user.storage
的值未通过 followup()
函数传递)是 actions-on-google-nodejs SDK 的规范。
其实这不仅仅是SDK的规范问题,也是user.storage
功能与followup()
功能使用的Dialogflow后续事件功能不兼容造成的。调用 followup()
函数时,"followupEventInput" 响应从实现 returned 到 Dialogflow。收到响应后,Dialogflow 决定一个可以处理指定事件的意图并直接触发该意图,而无需 return 对 Google 上的 Actions 进行任何响应。 user.storage
是 Google 上的 Actions 的一项功能,因此,Dialogflow 必须 return 将新值添加到 Google 上的 Actions 以更新 user.storage
值以便 Google 上的操作将新值发送到下一个请求。但是,在调用 followup()
时,Dialogflow 不会将控制权传递给 Google 上的操作。因此,即使将值设置为 user.storage
,不幸的是这些值也会被忽略。
相反,SDK 可以将新的 user.storage
值临时存储到 return 下一个 webhook 上 Google 上的操作的值。但是,后续事件触发的意图并不总是调用 webhook。因此,这个想法不能涵盖所有情况。经过讨论,目前的SDK不支持这种思路。
此规范在以下 API 参考资料中进行了描述。
此外,您可以阅读以下决定此规范的讨论:
https://github.com/actions-on-google/actions-on-google-nodejs/pull/211#issuecomment-412942410
我们想要保留持久值。 我们用下面的简单代码尝试了一下,但是这个值没有被保留。 我们做错了什么?
index.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);
package.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 被调用。 读取 SecondIntent 中的持久值以创建响应。 显示"Value is undefined"。
我们找到了以下日志。
Billing account not configured.
External network is not accessible and quotas are severely limited.
Configure billing account to remove these restrictions
我们升级到flame,确认log没有显示,但是persistent值还没有保存。不收费能解决这个问题吗?
你的问题是对 conv.followup()
的调用否定了你在原始意图处理程序中所做的大部分事情,而不是将它们替换为你在后续意图中所做的事情。
user.storage
应保留由用户操作触发的 Intent 之间的值。
此行为(即设置为 user.storage
的值未通过 followup()
函数传递)是 actions-on-google-nodejs SDK 的规范。
其实这不仅仅是SDK的规范问题,也是user.storage
功能与followup()
功能使用的Dialogflow后续事件功能不兼容造成的。调用 followup()
函数时,"followupEventInput" 响应从实现 returned 到 Dialogflow。收到响应后,Dialogflow 决定一个可以处理指定事件的意图并直接触发该意图,而无需 return 对 Google 上的 Actions 进行任何响应。 user.storage
是 Google 上的 Actions 的一项功能,因此,Dialogflow 必须 return 将新值添加到 Google 上的 Actions 以更新 user.storage
值以便 Google 上的操作将新值发送到下一个请求。但是,在调用 followup()
时,Dialogflow 不会将控制权传递给 Google 上的操作。因此,即使将值设置为 user.storage
,不幸的是这些值也会被忽略。
相反,SDK 可以将新的 user.storage
值临时存储到 return 下一个 webhook 上 Google 上的操作的值。但是,后续事件触发的意图并不总是调用 webhook。因此,这个想法不能涵盖所有情况。经过讨论,目前的SDK不支持这种思路。
此规范在以下 API 参考资料中进行了描述。
此外,您可以阅读以下决定此规范的讨论:
https://github.com/actions-on-google/actions-on-google-nodejs/pull/211#issuecomment-412942410