AnswerHandler 和 PlayerCountHandler 混淆了

AnswerHandler and PlayerCountHandler mixed up

我正在使用 this template from Amazon for a trivia game 构建 Alexa 按钮技能。在游戏中,Alexa 提出问题,用户根据插槽类型 "answers" 回答问题,该插槽类型具有以下模板值:

fox,
wolf,
cat,
etc.

我希望用户能够用数字而不是单词来回答琐事问题。

我复制了交互模型并将 Lambda 函数连接到我的 Alexa 技能(根据自述文件)。当我在不更改任何代码的情况下对其进行测试时,它工作正常。对话框是这样的:

设备日志中的调试信息显示 Alexa 认为用户正在响应 PlayerCount 意图,这是正确的:

"request": {
    "type": "IntentRequest",
    "intent": {
        "name": "PlayerCount",
        "confirmationStatus": "NONE",
        "slots": {
            "players": {
                "name": "players",
                "value": "2",
                "confirmationStatus": "NONE"
            }
        }
    }
}

当我将 AnswerQuestionIntent 和 AnswerOnlyIntent 的插槽类型更改为 "AMAZON.NUMBER"(而不是插槽类型 "answers")时,对话框如下所示:

(注意:如果用户响应任何其他内容,Alexa 将重新提示 "Welcome to Better with Buttons Trivia. This game supports up to 4 players. How many players are there?")

查看设备日志中的调试信息,我可以看到 Alexa 认为意图是 AnswerOnlyIntent,而不是 PlayerCount:

 "request": {
    "type": "IntentRequest",
    "intent": {
        "name": "AnswerOnlyIntent",
        "confirmationStatus": "NONE",
        "slots": {
            "answers": {
                "name": "answers",
                "value": "2",
                "confirmationStatus": "NONE"
            }
        }
    }
}

为什么 Alexa 认为用户需要 AnswerOnlyIntent?

根据 CloudWatch 日志,设置为重新提示用户的不是 AnswerHandler which is handling the response, but the Global DefaultHandler。 AnswerHandler 应该只在以下条件下 运行:

return requestEnvelope.request.type === 'IntentRequest' &&
        (requestEnvelope.request.intent.name === 'AnswerQuestionIntent' ||
          requestEnvelope.request.intent.name === 'AnswerOnlyIntent') &&
          validPlayerCount && 
          (sessionAttributes.STATE === settings.STATE.BUTTON_GAME_STATE ||
          sessionAttributes.STATE === settings.STATE.BUTTONLESS_GAME_STATE);

PlayerCountHandler returns 如果满足以下条件,则可以处理:

return requestEnvelope.request.type === 'IntentRequest' &&
        (requestEnvelope.request.intent.name === 'PlayerCount' ||
        requestEnvelope.request.intent.name === 'PlayerCountOnly') &&
        attributesManager.getSessionAttributes().STATE === settings.STATE.START_GAME_STATE;

发生这种情况是因为您的 AnswerOnlyIntentAnswerQuestionIntentPlayerCount 都有号码位。当用户说出一个数字时,它们就会被映射,这是预期的。一个好主意是 只有一个 意图,它从用户那里获取数字输入。例如:NumberInputIntent。每当用户说出数字时,Alexa 就会映射它。这样,当涉及到数字时,您总是可以期望映射此意图。

使用 sessionAttributes 跟踪用户喜欢的内容
STATE = "playerCount"STATE = "answer".

您可以对这些 canHandle() 条件使用两个不同的处理程序。

return requestEnvelope.request.type === 'IntentRequest' 
       && requestEnvelope.request.intent.name === 'NumberInputIntent' 
       && validPlayerCount 
       && sessionAttributes.STATE === 'answer' 
       && <add your extra conditions>

以及玩家数量

return requestEnvelope.request.type === 'IntentRequest' 
       && requestEnvelope.request.intent.name === 'NumberInputIntent' 
       && validPlayerCount 
       && sessionAttributes.STATE === 'playerCount' 
       && <add your extra conditions>

这个想法很简单,对特定类型的所有输入只使用一个意图。对于数字输入,只需使用一个映射数字的意图。