更改 Amazon Lex 聊天机器人时区

Change Amazon Lex Chat bot Time zone

现在,我正在将我的亚马逊 Lex 聊天机器人集成到我的网站上。我遇到了时区问题。时区在美国东部(弗吉尼亚北部)。所以如果我说今天,那是基于弗吉尼亚时间。所以我找到了如何更改时区,建议是将 x-amz-lex:time-zone 请求属性设置为我的区域。但我不知道该怎么做,该在哪里做。请帮助我!!谢谢。 我使用了简单的模板 "https://s3.amazonaws.com/aws-bigdata-blog/artifacts/aws-lex-web-ui/artifacts/templates/master.yaml"。 我从 SnippetUrl 复制代码并粘贴到我的网页。聊天机器人出现。那么我应该如何传递这些请求属性。

this this my chat bot in amazon lex

this is my cloud formation

These codes are from SnippetUrl in CodeBuildDeploy

您正在使用的模板中可能有一个选项,但我找不到它,所以这里是您需要了解的有关在 Lex 中设置时区的信息。

首先,更改默认美国东部时区的唯一方法是使用 PostContent API or PostText API。他们确实应该在 Lex 控制台中设置时区,这样您至少可以设置默认时区,但他们没有。


正确的做法:

需要 AWS SDK 才能使用 PostContent API or PostText API 将用户的输入传递给您的 Lex 聊天机器人。当以这种方式将数据传递给 Lex 时,您可以在用户输入、唯一 ID 和会话属性(可选)中包含 requestAttributes。以下是如何将 requestAttributes 中的 timezone 设置为新加坡时间的示例:

{
   "inputText": "What the user said.",
   "requestAttributes": { 
      "x-amz-lex:time-zone" : "Singapore" 
   },
   "sessionAttributes": null
}

解决方法:

如果您无法使用或无法使用 PostContent 或 PostText,那么您需要使用现有的资源。现在,您似乎只使用 Lambda 函数来实现,但您实际上也应该将它用于 "initialization and validation"。

每次 Lex 处理输入时,这将向您的 Lambda 函数传递一个请求,您可以指导 Lex 确切地如何回复。这使您可以更好地控制聊天机器人。

要了解请求的格式(有时称为 "Event")以及如何在 Lambda 函数中格式化响应,您需要 read these docs.

现在,Lex 处理用户输入的日期和时间...(在您的示例中,用户说 "today")...Lex 将用类似 ( date) 2018-11-02 (time) 13:00 适用于东部标准时间 (UTC -5)。但是新加坡是UTC +8。因此,您将需要在 Lambda 函数中转换该日期和时间,并将时隙覆盖为等效的新加坡时间,然后将这些时隙传递回 Lambda 对 Lex 的响应。

根据您的 Lambda 是 Node.js 还是 Python 以及大量关于时区转换的答案和指南,有多种方法可以进行这种转换。


示例:

User Input: "I want to book a meeting room from 1pm to 2pm for today"

要捕获此输入的值,您的 Intent 应该设置为:

3 slots: {date} {time_start} {time_end}
Intent Utterance: "I want to book a meeting room from {time_start} to {time_end} for {date}"

Lex 然后将解析输入并填充槽(使用时区默认值:美国东部)。然后 Lex 会将请求传递给您的 "initialization and validation" Lambda 函数。请求(或 "event")将包括:

{
  "currentIntent": {
    "name": "BookRoom",
    "slots": {
      "date": "2018-11-05",
      "time_start": "13:00",
      "time_end": "14:00",
    },
  },
  ...
}

然后在 Lambda 函数中,您可以获取这些值 (Node.js):

var date = event['currentIntent']['slots']['date'];
var time_start = event['currentIntent']['slots']['time_start'];
var time_end = event['currentIntent']['slots']['time_end'];

现在是您的转换逻辑:
由于新加坡比美国东部早 13 小时,因此只需将这些时间加上 13 小时即可。如果执行此操作时已过了午夜,则也将日期增加 1 天。

这将适用于 "today""tomorrow"[= 的输入89=],甚至 "2035 年 1 月 25 日",因为 Lex 以相同的方式解析所有这些,并简单地将它们以默认的美国东部时间格式传递给您的 Lambda (日期) yyyy-mm-dd 和 (时间) hh:mm.

转换后,只需将这些槽位设置为新的日期和时间,然后在您的响应中将槽位传回给 Lex。然后,Lex 将保留新加坡时间的槽值。

This is the solution image

终于找到解决办法了。如果有人想知道解决方案,请查看照片。我只是尝试修复 aws github 中的代码。谢谢