在 Alexa 技能中使用 sessionAttributes

Using sessionAttributes in Alexa Skill

我正在构建 Alexa 技能,但不太确定我是否正确使用 sessionAtrributes。我知道 sessionAttributes 用于 carry-forward 一个 session 的数据到下一次调用。 所以我有这两个意图

1) ListToDoItem

将使用话语 'yes',以便提取 sessionAttributes 以创建详细的语音响应。

2) ListDoneItems

此意图将用于列出已完成的项目。与之前的intent类似,唯一不同的是,这个intent会列出已完成的项目。

为此意图将有 2 个示例话语

就像之前一样,它有一个 'yes' 来根据 session 属性生成详细的语音响应。

但我遇到的问题是,当我回复 'yes' 到 ListDoneItems 意图的 'Do you want me to list the completed items'? 时,生成的下一个意图请求是类型 ListToDoItems 而不是ListDoneItems,虽然我在技能回复里设置了shouldEndSessionfalse。发生这种情况是因为我的意图之间的样本话语之间存在交叉。那么在不同的意图中有相似的意图是错误的吗?如何设计交互模型以创建 multi-turn 对话框以便在 sessionAttributes?

中使用

我认为这对寻找答案的人有用。

基本上,在示例话语中,您不应包含用于重新提示的短语;也就是说,在我的例子中,我不应该添加 'yes' 作为话语。相反,我应该使用 Amazon.YesIntent

使用 Amazon.YesIntent 时,您应该在 SessionAttributes 中维护一个状态机,指向最后调用的意图。例如,如果您的两个或多个意图有可能出现用户响应调用 YesIntent 的情况,您应该将最后调用的意图名称和关联的会话数据存储在 SessionAttributes 中。因此,在处理 YesIntent 的函数中,您应该检查之前调用的状态并将控制委托给相应的意图处理程序。

在我的例子中,我会将之前调用的意图名称存储为键,并将其关联数据存储为 session.attributes;

中的值
   "session": {
        "new":"false",
        "sessionId": "sessionId",
        "application": {
          "applicationId": "applicationId"
        },
        "attributes": {
          "PreviousIntent": {
             "PreviousIntentData"
        }
    }

在处理 YesIntent 的函数中,检查之前的状态 (session.attributes.PreviousIntent) 并将控制委托给处理该意图的函数。