Как получить пользовательские значения слотов намерений с помощью handlerInput в ASK-SDK v2

Я создаю базовый навык калькулятора с помощью ASK-SDK v2. Я не уверен, как получить значения слотов, предоставленные пользователем, в код Lambda с новой версией. Мне удалось заставить его работать со старой версией.

Пользователь разговора: открыть вычислить Alexa: вы можете попросить меня сложить, вычесть, умножить и разделить Пользователь: сложить два и три Alexa: сумма 2 и 3 равна 5

Ниже моя IntentSchema

{
    "interactionModel": {
        "languageModel": {
            "invocationName": "calculate",
            "intents": [
                {
                    "name": "AMAZON.CancelIntent",
                    "samples": []
                },
                {
                    "name": "AMAZON.HelpIntent",
                    "samples": []
                },
                {
                    "name": "AMAZON.StopIntent",
                    "samples": []
                },
                {
                    "name": "AddIntent",
                    "slots": [
                        {
                            "name": "numA",
                            "type": "AMAZON.NUMBER"
                        },
                        {
                            "name": "numB",
                            "type": "AMAZON.NUMBER"
                        }
                    ],
                    "samples": [
                        "Sum of {numA} and {numB}",
                        "add {numA} and {numB}"
                    ]
                },
                {
                    "name": "SubIntent",
                    "slots": [
                        {
                            "name": "numA",
                            "type": "AMAZON.NUMBER"
                        },
                        {
                            "name": "numB",
                            "type": "AMAZON.NUMBER"
                        }
                    ],
                    "samples": [
                        "difference between {numA} and {numB}",
                        "subtract {numA} from {numB}"
                    ]
                },
                {
                    "name": "ProductIntent",
                    "slots": [
                        {
                            "name": "numA",
                            "type": "AMAZON.NUMBER"
                        },
                        {
                            "name": "numB",
                            "type": "AMAZON.NUMBER"
                        }
                    ],
                    "samples": [
                        "multiply {numA} and {numB}",
                        "product of {numA} and {numB}"
                    ]
                },
                {
                    "name": "DivideIntent",
                    "slots": [
                        {
                            "name": "numA",
                            "type": "AMAZON.NUMBER"
                        },
                        {
                            "name": "numB",
                            "type": "AMAZON.NUMBER"
                        }
                    ],
                    "samples": [
                        "divide {numB} by {numA}",
                        "divide {numA} by {numB}"
                    ]
                },
                {
                    "name": "ExponentialIntent",
                    "slots": [
                        {
                            "name": "numA",
                            "type": "AMAZON.NUMBER"
                        },
                        {
                            "name": "numB",
                            "type": "AMAZON.NUMBER"
                        },
                        {
                            "name": "numC",
                            "type": "AMAZON.NUMBER"
                        }
                    ],
                    "samples": [
                        "{numA} raised to the power of {numB} by {numC}",
                        "{numA} raised to the power {numB}"
                    ]
                },
                {
                    "name": "AMAZON.NavigateHomeIntent",
                    "samples": []
                }
            ],
            "types": []
        }
    }
}

Я добавляю сюда addintenthandler. Скажите, пожалуйста, правильный ли подход, который я использую для получения значений слотов из намерения, или мне следует использовать атрибуты сеанса

const AddIntentHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest'
            && handlerInput.requestEnvelope.request.intent.name === 'AddIntent';
    },
    handle(handlerInput) {
        var output1 = "";
        var num1 = handlerInput.resuestEnvelope.request.intent.slots.numA.value;
        var num2 = handlerInput.resuestEnvelope.request.intent.slots.numB.value;
        if((num1)&&(num2)){
            output1 = 'The sum of ' +num1+ ' and ' +num2+ ' is ' + (num1+num2);
        }
        else {
            output1 = 'Enter valid number';
        }
        const speechText = output1;
        return handlerInput.responseBuilder
            .speak(speechText)
            .reprompt(speechText)
            .getResponse();
    }
};

Alexa отвечает «Невозможно обработать запрошенный ответ о навыках». Любая помощь приветствуется.


person Krithika Sureshkumar    schedule 18.02.2019    source источник


Ответы (1)


Обновление: теперь в SDK есть встроенные функции для этого: Alexa.getSlotValue () (возвращает строковое значение) и getSlot () (возвращает объект Slot) Alexa.getSlotValue (handlerInput.requestEnvelope, someSlotName)

Старый ответ: у вас опечатка, resuestEnvelope должно быть requestEnvelope. В любом случае я создал точно такой же навык, калькулятор (на испанском языке, но это в основном то же самое), и я использую вспомогательную функцию под названием getSlotValues(), которую я рекомендую вам использовать повторно. Он также будет отлично работать, когда вам нужно захватывать настраиваемые слоты (которые обрабатываются по-разному, потому что структура разрешения сущностей отличается):

https://github.com/germanviscuso/skill-sample-nodejs-mycalculator

person German    schedule 19.02.2019
comment
Большое вам спасибо за вашу помощь. Это была ошибка по неосторожности. Я обязательно попробую метод getSlotValues ​​(). Однако я все еще получаю сообщение об ошибке, только с намерением добавить. Когда я прошу Алексу добавить два и три. Она отвечает, что сумма 2 и 3 равна 23. Остальные намерения работают нормально. Я не могу понять, почему логика неверна только для сложения. - person Krithika Sureshkumar; 20.02.2019
comment
Вы добавляете строки! Если вы сделаете: 2 + 3, это равно 23 (это приведет к объединению). Вам необходимо преобразовать значения в числа перед их добавлением. - person German; 04.03.2019
comment
В настоящее время я нашел их только в документации: Alexa.getSlotValue() (возвращает строковое значение) и getSlot() (возвращает объект Slot). Обычное использование Alexa.getSlotValue(handlerInput.requestEnvelope, "someSlotName") - person jave.web; 10.12.2020