Alexa SDK V2 StateHandler - несколько намерений, использующих одно и то же значение слота - PullRequest
0 голосов
/ 06 декабря 2018

Я пишу навык Alexa, который фиксирует возраст с одного намерения и вес с другого намерения.и в основном эти два типа номера.

Когда я пытаюсь ввести число для веса, оно фиксируется в первом слоте Намерения.Вот моя схема намерений.

{
  "intents": [
    {
      "slots": [
        {
          "name": "AGE",
          "type": "AMAZON.NUMBER"
        }
      ],
      "intent": "AgeIntent"
    },
    {
      "slots": [
        {
          "name": "WEIGHT",
          "type": "AMAZON.NUMBER"
        }
      ],
      "intent": "WeightIntent"
    }
  ]
}

И мои примеры высказываний

AgeIntent

My age is {AGE}
{AGE}

WeightIntent

My weight is {WEIGHT}
{WEIGHT}

Разговор

User : open my test skill
Alexa: what is your age
User: 28
Alexa: what is your weight
User: 68

Здесь, когда пользователь вводит свой весовой ввод 68 вместо совпадения WeightIntent , он совпадает с AgeIntent .Я получаю AgeIntent в моем request.intent.name.

Я знаю, что он будет работать с , мой вес 68 ;А также я могу заставить его работать с функцией StateHandler в Alexa-SDK-V1, но я использую Alexa-SDK-V2

Так что проблема в следующем: Умение всегда отправляет intentName изпервое совпадающее намерение (т.е. AgeIntent) из модели взаимодействия, и я ожидаю получить второе совпадающее IntentName (то есть WeightIntent) для моего второго вопроса.

1 Ответ

0 голосов
/ 06 декабря 2018

Решение простое: либо вы делаете только 1 намерение и используете управление диалогами , чтобы получить все значения слотов, которые вам нужны ИЛИ Если вам нужно сделать их отдельными намерениями, используйте переменную состояния в сеансе навыкаи убедитесь, что вы устанавливаете и обновляете состояние в обоих случаях.Вы можете сделать это как:

const AgeIntentHandler = {
  canHandle(handlerInput) {
    let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
    
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'AgeIntent'
        && sessionAttributes.state !== 'WEIGHT';
  },
  handle(handlerInput) {
  
    let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
    sessionAttributes.state = 'WEIGHT';
    handlerInput.attributesManager.setSessionAttributes(sessionAttributes);
    
    const speechText = 'Age intent is called!';

    return handlerInput.responseBuilder
      .speak(speechText)
      .withSimpleCard('Hello World', speechText)
      .getResponse();
  },
};

const WeightIntentHandler = {
  canHandle(handlerInput) {
    let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
    
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'WeightIntent'
        && sessionAttributes.state === 'WEIGHT';
  },
  handle(handlerInput) {
  
    let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
    sessionAttributes.state = '';
    handlerInput.attributesManager.setSessionAttributes(sessionAttributes);
    
    const speechText = 'Weight intent is called!';

    return handlerInput.responseBuilder
      .speak(speechText)
      .withSimpleCard('Hello World', speechText)
      .getResponse();
  },
};

Хотя лучше использовать диалоги, чтобы не было путаницы в состояниях, и вы можете легко добавить больше слотов позже.

...