AnswerHandler и PlayerCountHandler перепутали - PullRequest
0 голосов
/ 01 сентября 2018

Я создаю навык кнопки Alexa, используя этот шаблон от Amazon для викторины . В игре Алекса задает вопросы, а пользователи отвечают с ответом из слота типа «ответы», который имеет следующие значения из шаблона:

fox,
wolf,
cat,
etc.

Я хочу, чтобы пользователи могли отвечать на вопросы по пустякам числом, а не словом.

Я скопировал модель взаимодействия и соединил лямбда-функцию с моим навыком Alexa (согласно readme). Когда я тестирую его без изменения какого-либо кода, он работает нормально. Диалог выглядит так:

  • Алекса: Добро пожаловать в начало добавления. Эта игра поддерживает до 4 игроков. Сколько там игроков?
  • Пользователь: два
  • Алекса: Хорошо. Игроки, нажмите ваши кнопки сейчас, чтобы я знал, какие кнопки вы будете использовать.

Отладочная информация из журнала устройства показывает, что Alexa считает, что пользователь отвечает намерением PlayerCount, что правильно:

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

Когда я меняю тип слота AnswerQuestionIntent и AnswerOnlyIntent на «AMAZON.NUMBER» (вместо типа слота «answers»), диалог выглядит так:

  • Alexa: Добро пожаловать в начало добавления. Эта игра поддерживает до 4 игроков. Сколько там игроков?
  • Пользователь: два
  • Алекса: Извините, я этого не понял. Пожалуйста, скажи еще раз!

(примечание: если пользователь ответит чем-то еще, Alexa ответит на вопрос «Добро пожаловать лучше с кнопками викторины. Эта игра поддерживает до 4 игроков. Сколько игроков?»)

Глядя на информацию об отладке из журнала устройств, я вижу, что Алекса считает, что целью является AnswerOnlyIntent, а не PlayerCount:

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

Почему Alexa считает, что пользователь хочет AnswerOnlyIntent?

Согласно журналам CloudWatch, это не AnswerHandler , который обрабатывает ответ, а 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 возвращает canHandle, если верно следующее:

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

1 Ответ

0 голосов
/ 01 сентября 2018

Это происходит потому, что оба ваших AnswerOnlyIntent, AnswerQuestionIntent и PlayerCount все имеют числовые слоты. Они отображаются, когда пользователи говорят число, как и ожидалось. Хорошая идея - иметь только одно намерение, которое принимает ввод числа от пользователя. Пример: 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>

Идея проста: использовать только одно намерение для всех входов этого конкретного вида . Для ввода чисел просто используйте одно намерение, которое отображает число.

...