我正在构建Alexa技能,并且不确定我是否正确使用sessionAtrributes
。我知道sessionAttributes
用于将会话数据转发到下一次调用。
所以我有这两个意图
1)ListToDoItem
sessionAttributes
。当被要求列出详细信息时
关于项目的信息,我将提取以前转发的
sessionAtrributes
并撰写详细的语音回复。将使用话语“是”,以便可以提取sessionAttributes
以创建详细的语音响应。
2)ListDoneItems
此意图将用于列出已完成的项目。它类似于之前的意图,唯一的区别是,此意图将列出已完成的项目。
对于这个意图将有2个样本话语
就像之前它有一个'是'来生成基于sessionAttributes的详细语音响应。
但我遇到的问题是,当我回复'{1}}意图'是'你要我列出已完成的项吗?'时,生成的下一个意图请求是ListDoneItems
类型而不是ListToDoItems
,即使我已在我的技能响应中将ListDoneItems
设置为shouldEndSession
。发生这种情况是因为我的意图之间的样本话语之间存在交叉。那么有不同意图的类似意图错了吗?如何设计交互模型以创建多转对话以便在false
中使用?
答案 0 :(得分:1)
我认为这对寻找答案的人有用。
基本上在样本话语中,您不应该包含重新提示的短语;即在我的情况下,我不应该添加'是'作为一种话语。相反,我应该使用Amazon.YesIntent
。
使用Amazon.YesIntent
时,应在SessionAttributes
中维护一个指向上次调用意图的状态机。例如,如果您的两个或多个意图具有用户响应可以调用YesIntent
的可能情况,则应将最后调用的意图名称和关联的会话数据存储在SessionAttributes
中。因此,在处理YesIntent
的函数中,您应该检查先前调用的状态,并委托控制到相应的intent处理程序。
在我的情况下,我将先前调用的意图名称作为关键字及其关联数据存储为session.attributes
中的值;
"session": {
"new":"false",
"sessionId": "sessionId",
"application": {
"applicationId": "applicationId"
},
"attributes": {
"PreviousIntent": {
"PreviousIntentData"
}
}
在处理YesIntent
的函数中,检查前一个状态(session.attributes.PreviousIntent
)并将控件委托给处理该意图的函数。