在对话中保存数据 (Dialogflow)

在 Dialogflow 中探索

点击继续,将我们的“保存数据”示例导入 Dialogflow 中。然后,按照 部署和测试示例的步骤如下:

  1. 输入代理名称并为示例创建新的 Dialogflow 代理。
  2. 代理导入完成后,点击转到代理 (Go to agent)。
  3. 在主导航菜单中,前往 Fulfillment
  4. 启用内嵌编辑器,然后点击部署。编辑器包含示例 代码。
  5. 在主导航菜单中,前往 Integrations(集成),然后点击 Google Google 助理
  6. 在显示的模态窗口中,启用 Auto-preview changes(自动预览更改),然后点击 Test(测试) 打开 Actions 模拟器。
  7. 在模拟器中,输入 Talk to my test app 以测试该示例!
<ph type="x-smartling-placeholder"></ph> 继续

提供出色用户体验的一部分往往是能够节省流量 。 如果您要在单个对话中提供有用的提示, 保存不同会话中的游戏得分,或者记住少量信息 。

根据是否需要在单个文件夹内保存数据,相关要求会略有不同 或跨会话进行共享如要在对话中保存数据,您可以执行以下操作: 使用 AppResponse 对象的 conversationToken 字段。

如要保存不同对话的数据,请改为按以下步骤操作:

  1. 确定用户是经过验证的用户还是访客。
  2. 使用 userStorage 字段存储或访问用户数据 您的 AppResponse 对象。

在各轮对话之间保存数据

conversationToken 字段是一个字符串,其中包含一个不透明令牌, 会在每轮对话中重新循环到相应 Action。例如,如果您将 第 1 轮中,您在AppResponse中将值设为 "count=1" 对话,即你的 Action 在第二轮收到的AppRequestconversationToken 中包含 "count=1"

令牌始终在 对话。如果您使用 Actions on Google Node.js 客户端库, 使用 conv.data 将对话令牌作为 JSON 对象进行接口处理,其中 conv 是您的 Conversation 实例。

以下示例展示了如何在 conversationToken 中保存计数器 AppResponse 字段中:

Node.js

conv.data.firstNum = firstNum;
conv.ask(`Got it, the first number is ${firstNum}.`);
conv.ask(`What's the second number?`);

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.getConversationData().put("firstNum", firstNum);
responseBuilder.add("Got it, the first number is " + firstNum + ".");
responseBuilder.add("What's the second number?");
return responseBuilder.build();

JSON

请注意,下面的 JSON 描述的是 webhook 响应,该响应使用 outputContexts,而非 conversationToken

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Got it, the first number is 23."
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "What's the second number?"
            }
          }
        ]
      }
    }
  },
  "outputContexts": [
    {
      "name": "projects/save-data-df-js/agent/sessions/ABwppHGfFkWJdHKPpBEYiGkhdoakWmYj_2sZa4o8pbGG9nj4q5_GfDTtNEXOY34mLX8G4o_d7oZdUW9bnBZC/contexts/_actions_on_google",
      "lifespanCount": 99,
      "parameters": {
        "data": "{\"firstNum\":23}"
      }
    }
  ]
}

JSON

请注意,下面的 JSON 描述的是 webhook 响应。

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Got it, the first number is 23."
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": "What's the second number?"
              }
            }
          ]
        }
      }
    }
  ],
  "conversationToken": "{\"data\":{\"firstNum\":23}}"
}

请参阅我们的提供有用的重新提示,并优雅地表示未通过 获取实际使用示例的最佳实践指南。

跨对话保存数据

AppResponse 对象的 userStorage 字段是一个字符串, 包含由 Action 提供的不透明令牌, 特定用户的会话。例如,游戏可以 userStorage 中用户的评分,并在欢迎消息中使用其值 当用户发起新对话时触发。

确定和处理用户验证状态

用户的验证状态可能为 GUESTVERIFIED。在 开始,Actions on Google 会将用户的验证 根据各种指示显示对话状态。合并为一个 例如,某位用户在移动设备上登录 Google 助理后, VERIFIED 的验证状态。

导致用户处于验证状态的原因可能有以下几种 GUEST:

  • 用户关闭了个人信息相关结果功能。
  • 用户停用了自己的网页和应用活动。请注意,有些用户 您可能在网域级别停用了此设置。
  • 如果设备启用了 Voice Match,但匹配失败或用户调用 直接使用 Google 助理,例如长按 Google 助理 首页)。
  • 用户未登录。

使用 userStorage,或者启动账号关联流程以阻止访客用户 与某项功能交互将会失败。

如果您使用的是适用于 Node.js 的 Actions On Google 客户端库, 您可以使用 conv.user.storage,其中 conv 是您的 Conversation 实例。通过 以下示例展示了如何在userStorage AppResponse:

Node.js

app.intent('Save Sum', (conv) => {
  if (conv.user.verification === 'VERIFIED') {
    conv.user.storage.sum = conv.data.sum;
    conv.close(`Alright, I'll store that for next time. See you then.`);
  } else {
    conv.close(`I can't save that right now, but we can add ` +
      `new numbers next time!`);
  }
});

Java

@ForIntent("Save Sum")
public ActionResponse saveSum(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  Integer sum = ((Double) request.getConversationData().get("sum")).intValue();
  String verificationStatus = request.getUser().getUserVerificationStatus();
  if (verificationStatus.equals("VERIFIED")) {
    responseBuilder.getUserStorage().put("sum", sum);
    responseBuilder.add("Alright, I'll store that for next time. See you then.");
  } else {
    responseBuilder.add("I can't save that right now, but we can add new numbers next time!");
  }
  responseBuilder.endConversation();
  return responseBuilder.build();
}

Node.js

if (conv.user.verification === 'VERIFIED') {
  conv.user.storage.sum = conv.data.sum;
  conv.close(`Alright, I'll store that for next time. See you then.`);
} else {
  conv.close(`I can't save that right now, but we can add ` +
    `new numbers next time!`);
}

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);
Integer sum = ((Double) request.getConversationData().get("sum")).intValue();
String verificationStatus = request.getUser().getUserVerificationStatus();
if (verificationStatus.equals("VERIFIED")) {
  responseBuilder.getUserStorage().put("sum", sum);
  responseBuilder.add("Alright, I'll store that for next time. See you then.");
} else {
  responseBuilder.add("I can't save that right now, but we can add new numbers next time!");
}
responseBuilder.endConversation();
return responseBuilder.build();

JSON

请注意,下面的 JSON 描述的是 webhook 响应。

{
  "payload": {
    "google": {
      "expectUserResponse": false,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Alright, I'll store that for next time. See you then."
            }
          }
        ]
      },
      "userStorage": "{\"data\":{\"sum\":68}}"
    }
  }
}

JSON

请注意,下面的 JSON 描述的是 webhook 响应。

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "simpleResponse": {
            "textToSpeech": "Alright, I'll store that for next time. See you then."
          }
        }
      ]
    }
  },
  "conversationToken": "{\"data\":{\"firstNum\":23,\"sum\":68}}",
  "userStorage": "{\"data\":{\"sum\":68}}"
}

请参阅我们的根据用户偏好打造个性化对话 获取实际使用示例的最佳实践指南。

法律声明:在访问 userStorage 之前先征得用户同意。 部分国家/地区的法规要求开发者必须征得 或者保存某些信息(如 userStorage中的文档。如果您在这些国家/地区开展业务 或将此类信息保存在 userStorage,则必须使用 要询问的确认帮助程序 并征得用户同意后,才能开始存储 userStorage 中的信息。

用户存储空间过期

当 Google 助理可以将某个身份与用户匹配时, userStorage 永不过期,只有用户或 Action 本身可以清除它。

当 Google 助理无法将某个身份与用户匹配时, 对话结束后userStorage将清除。以下是一些示例 在 Google 助理无法将某个身份与用户匹配的情况下:

  • Voice Match 已设置,没有匹配项。
  • 用户已停用个人数据。

清除 userStorage 字段的内容

您可以通过以下方式清除 Action 的 userStorage 字段内容: 将 AppResponseresetUserStorage 字段设为 true。如果 您需要将 userStorage 的值设置为空字符串,即 userStorage在下个对话中保持不变。这样,您就可以 避免在内容不该出现的情况下依次发回整个 userStorage 更改。

如果您使用的是适用于 Node.js 的 Actions On Google 客户端库, 只需将 conv.user.storage 的值设置为 {}(空对象)即可。

Node.js

app.intent('Forget Number', (conv) => {
  conv.user.storage = {};
  conv.ask(`Alright, I forgot your last result.`);
  conv.ask(`Let's add two new numbers. What is the first number?`);
});

Java

@ForIntent("Forget Number")
public ActionResponse forgetNumber(ActionRequest request) {
  ResponseBuilder responseBuilder = getResponseBuilder(request);
  responseBuilder.getUserStorage().clear();
  responseBuilder.add("Alright, I forgot your last result.");
  responseBuilder.add("Let's add two new numbers. What is the first number?");
  return responseBuilder.build();
}

Node.js

conv.user.storage = {};
conv.ask(`Alright, I forgot your last result.`);
conv.ask(`Let's add two new numbers. What is the first number?`);

Java

ResponseBuilder responseBuilder = getResponseBuilder(request);
responseBuilder.getUserStorage().clear();
responseBuilder.add("Alright, I forgot your last result.");
responseBuilder.add("Let's add two new numbers. What is the first number?");
return responseBuilder.build();

JSON

请注意,下面的 JSON 描述的是 webhook 响应。

{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "Alright, I forgot your last result."
            }
          },
          {
            "simpleResponse": {
              "textToSpeech": "Let's add two new numbers. What is the first number?"
            }
          }
        ]
      },
      "userStorage": "{\"data\":{}}"
    }
  }
}

JSON

请注意,下面的 JSON 描述的是 webhook 响应。

{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "possibleIntents": [
        {
          "intent": "actions.intent.TEXT"
        }
      ],
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "Alright, I forgot your last result."
              }
            },
            {
              "simpleResponse": {
                "textToSpeech": "Let's add two new numbers. What is the first number?"
              }
            }
          ]
        }
      }
    }
  ],
  "userStorage": "{\"data\":{}}"
}

作为用户,你可以在自己创建的 Action 中查看 userStorage 字段的内容, 调用。您还可以从该特定 Action 中移除您存储的用户数据 来阻止该服务记住你

  1. 打开手机上的 Google 助理应用。
  2. 点按抽屉式导航栏图标。

  3. Explore 标签页中,找到您要查看的 Action 或清除用户的 Action 轻击存储空间,打开详细信息页。
  4. 滚动到页面底部。
    • 如需查看 userStorage 字段的内容,请点按 [查看存储的数据]
    • 如要移除存储的用户数据,请点按不再允许 $action 记住我