更改Amazon Lex Chat bot时区

时间:2018-11-01 06:03:22

标签: timezone chatbot amazon-lex

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

example on codesandbox

this this my chat bot in amazon lex

this is my cloud formation

2 个答案:

答案 0 :(得分:1)

您正在使用的模板中可能有一个选项,但我找不到它,所以这是您在Lex中设置时区所需的知识。

首先,更改默认时区为东部时区的唯一方法是使用PostContent APIPostText API。他们应该在Lex Console中确实有一个时区设置,因此您至少可以设置默认时区,但是没有。


正确的方法:

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

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

解决方法:

如果您无法使用或无法访问对PostContent或PostText的使用,则需要使用已有的内容。现在,您似乎只是使用Lambda函数来实现,但实际上您也应该将其用于“初始化和验证”。

enter image description here

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

要了解请求的格式(有时称为“事件”)以及如何在该Lambda函数中设置响应的格式,您将需要read these docs

现在,Lex处理来自用户输入的日期和时间...(在您的示例中,用户说“ today”)...并且Lex将使用诸如(date){{ 1}}(时间)2018-11-02,适合东部标准时间(UTC -5)。但是新加坡是世界标准时间+8。因此,您需要在Lambda函数中转换该日期和时间,并将广告位改写为等效的新加坡时间,然后将这些广告位传回Lambda对Lex的回复中。

根据您的Lambda是使用Node.js还是Python以及多种时区转换的答案和指南,有多种转换方法。


示例:

  

用户输入:“我想今天从下午1点到下午2点预订会议室”

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

  

3个广告位:{date} {time_start} {time_end}
  目的话语:“我想在{date}从{time_start}到{time_end}预定一间会议室”

然后Lex将解析输入并填充插槽(使用时区默认值:美国东部)。然后,Lex将请求传递给您的“初始化和验证” Lambda函数。该请求(或“事件”)将包括:

13:00

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

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

现在输入转换逻辑:
由于新加坡比美国东部要早13个小时,因此只需花些时间再加上13个小时即可。如果这样做的时间是午夜,那么还可以将日期增加1天。

这将适用于“今天” “明天” “下周二” 甚至“ 25 2035年1月” ,因为Lex以相同的方式解析所有这些内容,并以默认的美国东部时间(日期)var date = event['currentIntent']['slots']['date']; var time_start = event['currentIntent']['slots']['time_start']; var time_end = event['currentIntent']['slots']['time_end']; 和(时间)yyyy-mm-dd的形式将它们简单地传递到Lambda。 / p>

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

答案 1 :(得分:0)

This is the solution image

最后,我找到了解决方案。如果有人想知道解决方案,请检查照片。我只是尝试从AWS github修复代码。谢谢。