如何在Dialogflow中跨代理的调用保存和检索信息?

时间:2017-11-28 16:06:38

标签: dialogflow actions-on-google

我希望Google代理上的操作能够跨调用存储和检索某些信息 - 比如cookie。我该怎么做?

5 个答案:

答案 0 :(得分:17)

您可以根据自己的具体操作选择很多选项。虽然有相似之处,但它并不像网络cookie那样。

如果您想要一个会话cookie的等价物,单次对话期间保留的信息,那么您的选项是

  • 使用会话ID作为每次调用时发送给您的信息的一部分,并在您的履行中跟踪此信息。
  • 使用Dialogflow上下文存储您想要保留的信息
  • 如果您使用的是动作谷歌JavaScript库,请将其存储在为您创建的app.data对象中。

如果您希望等效的持久cookie可以在会话之间保留信息,那么您的选项就是

  • 使用匿名用户ID作为每次调用时发送给您的信息的一部分,并在您的履行中跟踪此信息。
  • 如果您使用的是google动作javascript库,请将其存储在为您创建的app.userStorage对象中。
  • 将其存储为data.google.userStorage下的JSON响应中字符串的一部分。

有关这些

的更多信息

会话ID

为您拥有的每个会话创建不同的会话ID。您可以通过检查sessionId参数中发送到您的webhook的JSON来获取此会话ID。

然后,您可以在您管理的某种数据存储中查找它。

对话框流程

上下文是Dialogflow提供的强大工具。您将上下文作为履行webhook的一部分返回,并指明上下文的名称,其生命周期(将多少轮对话传递回您的webhook),以及与上下文关联的任何参数(字符串键/值)对)。

上下文对于帮助确定可能调用的意图特别有用。您可以指示哪些上下文必须处于活动状态才能被Dialogflow识别。

如果您正在使用actions-on-google node.js库,则可以使用以下内容设置上下文:

var contextParameters = {
  foo: "Something foothy",
  bar: "Your local bar."
};
app.setContext( "remember_this", 5, contextParameters );

您需要在致电app.ask()app.tell()之前执行此操作。

或者您可以将JSON中的等效内容作为响应的contextOut块的一部分

"contextOut": [
  {
    "name": "remember_this",
    "lifespan": 5,
    "parameters": {
      "foo": "Something foothy",
      "bar": "Your local bar."
    }
  }
]

下次调用webhook时,您可以通过查看result.contexts数组或使用库中的app.getContext()app.getContextArgument()方法来获取此上下文。

使用app.data

如果您正在使用该库,Google已经为您完成了一些工作。为您创建app.data对象。您在对象中设置的任何值都可用于会话的生命周期 - 您只需在以后调用webhook时阅读它们。

(在幕后,谷歌使用了一个上下文,所以没有魔法。两者一起工作,你可以自由地做两件事。)

匿名用户ID

当用户首次使用您的操作时,会生成用户ID。此ID不允许您访问有关它们的任何特定信息,并且不会用于任何其他操作,但每次您看到它时,您都可以放心,它与使用它的用户相同前一次发生。然而,就像cookie一样,用户可以重置它,并为他们的动作生成一个新的ID。

您可以在originalRequest.user.userId或使用app.getUser().userId的JSON中获取此信息。获得后,您可以使用某种数据存储来存储和检索有关此用户的信息。

使用app.userStorage

app.data类似,还为每个用户创建了一个app.userStorage对象。您对此对象所做的任何更改都会保存在您与此用户的对话之间。

app.data不同,它并不存储在上下文中。它有自己的存储方法。这导致......

以JSON格式存储

如果您未使用Google Play操作,则仍可通过响应访问userStorage并直接请求JSON。您需要将其存储为字符串,但如果您需要存储更复杂的对象,则常见的方法是将其字符串化为JSON。

您可以在回复中将此值存储在data.google.userStorage下,并可以在您的webhook收到的请求中的originalRequest.data.user.userStorage下检索该值。

答案 1 :(得分:0)

您还可以使用Google {(3}}或BigQuery

等Google云数据库

答案 2 :(得分:0)

听起来您可能想要结帐帐户关联:https://developers.google.com/actions/identity/account-linking。通过帐户关联,您可以通过提供唯一密钥来收集您与Google交换的最终用户信息。此唯一密钥成为您从Google收到的每个请求的一部分,因此当您获得该唯一密钥时,您将查找从最终用户收集的信息。在您的情况下,您将存储凭据或访问最终用户信息所需的任何密钥。在初始链接之后,您获得的任何新数据都可以与收集的原始信息一起存储,具体取决于在帐户链接期间获得的唯一密钥。

答案 3 :(得分:0)

您可以使用键值参数将信息保存在上下文中。

在上下文中保存值:

agent.set.Context({
  name:'context-name',
  lifespan: 5,
  parameters:{
    'parameter-name':'parameter-value'
    }
});

从上下文中获取值

 agent.getContext('context-name');

有关更多详细信息:https://dialogflow.com/docs/contexts/contexts-fulfillment

答案 4 :(得分:0)

为此,我只是为此做了一个节点模块,在api调用的外部json文件中,我需要存储并添加其他信息以供以后检索。我想您可以使用此模块做很多事情,存储对象,数组,json,值,导航历史记录?,返回上一页。 它的工作方式类似于localStorage或Cookies。 没有限制,您可以通过名称(键)一个值创建多个存储。它是新的,我现在正在我自己的项目中测试它的错误。

Test on Runkit

On npm

vStorage = require('virtual-storage');
vStorage.set('name', '{title:'Title 1', description:'Descriptions 1'}')
let getStorage_name = vStorage.get('name');
console.log(getStorage_name.title);
vStorage.get('name')