首页 > 解决方案 > conv.data 在 DialogFlow 的后续意图中丢失

问题描述


我在我的 Google Cloud 函数中使用 node.js 8 运行时,附加到我的 DialogFlow 应用程序(V2 API)。我可以使用 conv.data 在当前对话中存储临时数据。不幸的是,conv.data 在后续意图之后似乎没有保留数据。
例如,在我的意图中,以下代码:

conv.data.result = "Hello!";
console.log("[DEBUG] conv.data.result = "+conv.data.result);
conv.followup("customEvent1");

产生以下日志:

[DEBUG] conv.data.result = Hello!

这是我的后续意图:

app.intent('CUSTOM_EVENT_INTENT', (conv) => {
  console.log("[DEBUG] - CUSTOM_EVENT_INTENT");
  console.log("[DEBUG] - conv.data.result = "+conv.data.result);
  if(!conv.data.result) {
     console.log("[DEBUG] - I give up");
     conv.close("Nessuna risposta");
  }
  else conv.ask(conv.data.result);
});

这会产生以下日志:

[DEBUG] - conv.data.result = undefined
[DEBUG] - I give up

看起来我在后续意图中遗漏了一些非常重要的东西......
谢谢,
罗伯托

标签: node.jsgoogle-cloud-functionsdialogflow-esactions-on-googledialogflow-es-fulfillment

解决方案


我认为您在谈论后续事件而不是后续意图。后续 Intent 被设置为在用户执行某些操作后可能触发的 Intent - 这是通过设置上下文来完成的。后续事件在履行期间设置,旨在触发具有此事件集的 Intent。

在大多数情况下,您不需要使用后续事件。

相反 - 只需调用一个执行处理的函数并回复您希望它执行的方式。没有什么说你的 Handler 函数必须自己做所有事情 - 它可以像任何其他函数一样调用一个函数,并且可以使用参数调用它。

因此,拥有像这样的 Intent 处理程序是完全合理的

app.intent('intent.one', (conv) => {
  reply( conv, "Hello!" );
});

app.intent('intent.two', (conv) => {
  reply( conv, "How are you?" );
});

app.intent('intent.quit', (conv) => {
  reply( conv );
});

function reply( conv, msg ){
  if( !msg ){
    conv.close( "I give up!" );
  } else {
    cov.ask( msg );
  }
}

这仍然不能解释为什么它不起作用。

您使用后续事件的方式“缺少”的是,当它重定向到事件时,使用conv.followup()不会将您可能已发送回 Dialogflow 的任何内容发送回。正如文档所说:

通过从 webhook 发送后续事件来触发您选择的意图。[...] Dialogflow 不会将任何内容传回 Google Assistant,因此 Google Assistant 的特定信息,尤其是 conv.user.storage,将被忽略。

但是,您可以做的是将参数发送到从事件中检测到的新 Intent。像这样的东西可能会起作用:

const params = {
  result: "Hello!"
};
conv.followup("customEvent1", params);

然后在事件 Intent 的处理程序中:

app.intent('CUSTOM_EVENT_INTENT', (conv) => {
  console.log("[DEBUG] - CUSTOM_EVENT_INTENT");
  console.log("[DEBUG] - conv.parameters.result = "+conv.parameters.result);
  if(!conv.parameters.result) {
     console.log("[DEBUG] - I give up");
     conv.close("Nessuna risposta");
  }
  else conv.ask(conv.parameters.result);
});

推荐阅读