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

Dialogflow es 如何在Dialogflow中跨代理调用保存和检索信息?,dialogflow-es,actions-on-google,Dialogflow Es,Actions On Google,我希望我在Google agent上的操作能够跨调用存储和检索某些信息,比如cookie。我该怎么做?你有很多选择,具体取决于你想做什么。虽然有相似之处,但它并不完全像网络cookie 如果您想要会话cookie的等价物,即在单个会话中保留的信息,那么您的选项是 使用作为每次调用时发送给您的信息的一部分提供的会话ID,并在实现过程中对此进行跟踪 使用Dialogflow上下文存储要保留的信息 如果您正在使用google JavaScript库上的操作,请将其存储在为您创建的app.data对象

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

你有很多选择,具体取决于你想做什么。虽然有相似之处,但它并不完全像网络cookie

如果您想要会话cookie的等价物,即在单个会话中保留的信息,那么您的选项是

  • 使用作为每次调用时发送给您的信息的一部分提供的会话ID,并在实现过程中对此进行跟踪
  • 使用Dialogflow上下文存储要保留的信息
  • 如果您正在使用google JavaScript库上的操作,请将其存储在为您创建的
    app.data
    对象中
如果您希望在对话之间使用相当于持久cookie的方法来保留信息,那么您的选择是

  • 使用作为每次调用时发送给您的信息的一部分提供的匿名用户ID,并在履行过程中跟踪此信息
  • 如果您正在使用google javascript库上的操作,请将其存储在为您创建的
    app.userStorage
    对象中
  • 将其存储为JSON响应中
    data.google.userStorage
    下字符串的一部分
关于每一项的更多信息

会话ID

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

然后,您可以在您管理的某种数据存储中查找此信息

对话流上下文

上下文是Dialogflow提供的强大工具。作为实现webhook的一部分返回一个上下文,并指示上下文的名称、其生存期(它将被传递回webhook的会话的多轮数)以及与上下文相关的任何参数(字符串键/值对)

上下文尤其有助于确定可以称为什么意图。您可以指示哪些上下文必须处于活动状态才能被Dialogflow识别

如果您正在使用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时,您可以通过查看
结果.contexts
数组或使用库中的
app.getContext()
app.getContextArgument()
方法获取此上下文

使用
app.data

如果你正在使用图书馆,谷歌已经为你做了一些工作。
app.data
对象是为您创建的。您在对象中设置的任何值在会话的生存期内都是可用的-您只需在稍后对webhook的调用中读取它们

(在封面下,谷歌使用了一个上下文,因此没有魔力。两者一起工作,你可以自由地同时做这两件事。)

匿名用户ID

当用户首次使用您的操作时,将生成一个用户ID。此ID不允许您访问有关它们的任何特定信息,也不用于任何其他操作,但每次看到它时,您都可以确信它是上次事件中使用它的同一用户。但是,就像cookie一样,用户可以重置它,并为它们生成一个新的ID以供您操作

您可以从JSON的
originalRequest.user.userId
或使用
app.getUser().userId
获取此信息。一旦有了它,您将使用某种类型的数据存储来存储和检索有关该用户的信息

使用
app.userStorage

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

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

将其存储在JSON中

如果您没有使用google library上的操作,您仍然可以通过响应和直接请求JSON访问
userStorage
。您需要将其存储为字符串,但如果您需要存储更复杂的对象,一种常见的方法是将其字符串化为JSON


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

您还可以使用谷歌云数据库,例如或听起来您可能想签出帐户链接:。通过帐户链接,您可以收集最终用户信息,并通过提供唯一密钥与谷歌交换这些信息。此唯一密钥成为您从Google收到的每个请求的一部分,因此当您获得该唯一密钥时,您将查找从最终用户收集的信息。在您的情况下,您将存储凭据或访问最终用户信息所需的任何密钥。初始链接后,您获得的任何新数据都可以根据在帐户链接期间获得的唯一密钥与收集的原始信息一起存储。

您可以使用key-value参数将信息保存在上下文中

在上下文中保存值:

agent.set.Context({
  name:'context-name',
  lifespan: 5,
  parameters:{
    'parameter-name':'parameter-value'
    }
});
从上下文中获取值

 agent.getContext('context-name');

有关更多详细信息:

为此,我只做了一个节点模块,在api调用的外部json文件中,我需要存储并添加额外的信息来检索
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')