想要保留持久值

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://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