如何使用 Google Home (DialogFlow) 在 NodeJS 中设置会话变量

How to set session variables in NodeJS with Google Home (DialogFlow)

我正在为 Google Home 编写我的第一个 NodeJS 应用程序(使用 DialogFlow - 以前的 API.ai)。

我正在查看此页面上的文档:https://developers.google.com/actions/reference/v1/dialogflow-webhook

但我看不到任何设置会话变量的方法。

我目前的测试程序设置语音是这样的:

 speechText = "I'm not sure that character exists!";
 callback(null, {"speech": speechText});

在 DialogFlow 中,我在 运行 之后的 JSON 看起来像这样,看起来 "contexts" 可能是会话状态的去向?

{
    "id": "3a66f4d1-830e-48fb-b72d-12711ecb1937",
    "timestamp": "2017-11-24T23:03:20.513Z",
    "lang": "en",
    "result": {
        "source": "agent",
        "resolvedQuery": "test word",
        "action": "MyAction",
        "actionIncomplete": false,
        "parameters": {
            "WordNumber": "400"
        },
        "contexts": [],
        "metadata": {
            "intentId": "a306b829-7c7a-46fb-ae1d-2feb1c309124",
            "webhookUsed": "true",
            "webhookForSlotFillingUsed": "false",
            "webhookResponseTime": 752,
            "intentName": "MyIntentName"
        },
        "fulfillment": {
            "messages": [{
                "type": 0,
                "speech": ""
            }]
        },
        "score": 1
    },
    "status": {
        "code": 200,
        "errorType": "success",
        "webhookTimedOut": false
    },
    "sessionId": "fe0b7d9d-7a55-45db-9be9-75149ff084fe"
}

我刚刚从我购买的一个聊天机器人课程中注意到,您可以像这样设置上下文,但仍然不确定上下文是如何设置的,以及如何在我的程序的一次调用响应之间来回传递下次调用我的程序时的请求(通过 "webhook" 定义)。 当我添加上面的上下文时,DialogFlow 将不再识别我的话语并给我 DefaultFallback 响应。当我删除它们时,我的 AWS Lambda 会被调用。

首先,您正在查看的文档页面指的是 API 的已弃用版本。讨论 api (v2) 当前版本的页面是 https://developers.google.com/actions/dialogflow/webhook。已弃用的版本将仅支持 6 个月左右。

您使用 Contexts 的方法是正确的!如果您使用 Google 的 actions-on-google node.js 库,会有一些额外的选项——但它们都在幕后使用上下文。 (并且由于他们确实在场景下使用上下文 - 你应该确保你选择的上下文名称与他们的名称不同。)你还可以使用 sessionId 并跟踪本地数据存储中的内容(例如 DynamoDB ) 针对该 SessionID 编制索引。但是关于其他选项已经足够了...

一个上下文由三个元素组成:

  1. 一个名字。
  2. 一生 - 此上下文将向您发送回多少条来自用户的消息。 (但请参阅下面有关重新发送上下文的信息。)
  3. 键值字符串对象。

您将在 JSON 中将您 return 中的任何上下文设置为名为 contextOut 的附加参数。这将是一系列上下文。所以你的回复可能是这样的:

var speechText = "I'm not sure that character exists!";
var sessionContext = {
  name: "session_variables",
  lifespan: 5,
  parameters: {
    "remember": "one",
    "something": "two"
  }
};
var contextOut = [sessionContext];
var response = {
  speech: speechText,
  contextOut: context
};
callback(null, response);

这将包括一个名为 "session_variables" 的上下文,它存储两个这样的变量。它将 returned 用于发送到您的 webhook 的下 5 条消息。但是,您可以将此添加到您发送的每条消息中,并且最新的生命周期和参数将是下一次发送回来的。

您将在 result.contexts 数组中发送给您的 JSON 中获得这些上下文。

Intent 屏幕上的 "Context" 字段在 Dialogflow 中用于除了仅保留会话信息之外的其他目的。这表明当短语试图与其匹配时(或处理回退意图时),如果指定的上下文存在(生命周期 > 0),则 Intent 被触发。如果您使用的是 webhook,如果您自己发回上下文,"Context Out" 字段将被忽略。

这让你可以做一些事情,比如问一个特定的问题并设置一个上下文(可能带有参数)来指示一些答案应该被理解为对你刚刚提出的问题的答复。