Алекс умение поддерживать порядок слотов и добавить проверки - PullRequest
0 голосов
/ 15 октября 2018

Я работаю над простым умением получить код ifsc для банка из названия банка и филиала.Я реализовал многооборотные диалоги, что означает, что разговор идет до того, как слоты заполняются.У меня есть два слота в модели взаимодействия.Это БАНК и ФИЛИАЛ.Оба слота обязательны.Я предоставил 200 высказываний для слота BANK.

Навык сначала запрашивает у пользователя имя банка.Если пользователь указывает неверное имя банка, скажем, например, «Я не знаю».Он определяет, что это недействительное имя банка, и снова запрашивает у пользователя имя банка.Но в этом процессе он заполняет слот BRANCH словами «я не знаю».Я хочу поддерживать порядок заполнения слотов.Слот BRANCH не должен заполняться до тех пор, пока не будет заполнен слот BANK.Я хочу убедиться, что BRANCH является действительным адресом улицы (это slotType для BRANCH).Как применить порядок заполнения значений в слоте?Пожалуйста, найдите лямбда-код ниже:

const InProgressIfscCodeIntentHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest' &&
            handlerInput.requestEnvelope.request.intent.name === 'ifscCode' &&
            handlerInput.requestEnvelope.request.dialogState !== 'COMPLETED'
    },
    handle(handlerInput) {
        const currentIntent = handlerInput.requestEnvelope.request.intent;
        return handlerInput.responseBuilder
            .addDelegateDirective(currentIntent)
            .getResponse();
    }
};

const CompletedIfscCodeIntentHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest' &&
            handlerInput.requestEnvelope.request.intent.name === 'ifscCode'
    },
    async handle(handlerInput) {

        if (!handlerInput.requestEnvelope.request.intent.slots.BANK.value) {
            return handlerInput.responseBuilder
                .speak("Let me know which IFSC code for which bank are you looking for ?")
                .reprompt("Let me know which IFSC code for which bank are you looking for ?")
                .addElicitSlotDirective('BANK')
                .getResponse();
        } else {

            const bankName = handlerInput.requestEnvelope.request.intent.slots.BANK.value;
            const branch = handlerInput.requestEnvelope.request.intent.slots.BRANCH.value;

            // retrieve the bank details by calling the API
            const bankDetails = await getBankDetails(bankName, branch);

            console.log('--- length of the bank ---', bankDetails.banks.length);
            if (bankDetails.banks.length > 0) {
                console.log('-- bank details --', bankDetails);
                const speechText = `IFSC code of the ${bankName}, ${branch} is
                <break time="2s"/>
                <emphasis level="strong"><say-as interpret-as='spell-out'>${bankDetails.banks[0].IFSC}</say-as></emphasis>.
                <break time="2s"/>Try again for different bank by invoking open ifsc code finder.`;

                return handlerInput.responseBuilder
                    .speak(speechText)
                    .reprompt(speechText)
                    .withShouldEndSession(true)
                    .getResponse();
            } else {
                const speechText = "We were not able to get the bank details. Please try again by invoking open ifsc code finder.";
                return handlerInput.responseBuilder
                    .speak(speechText)
                    .reprompt(speechText)
                    .withShouldEndSession(true)
                    .getResponse();
            }

        }
    }
};

Кроме того, строка «Я не знаю» не является допустимым адресом улицы.Обучение модели для 1 миллиона адресов на данный момент не представляется возможным.Моя проблема заключается в том, что недопустимое значение для слота BANK не должно использоваться в качестве ветви.Я хочу добавить подтверждение здесь.Пожалуйста, помогите мне понять вещи здесь.

Спасибо

1 Ответ

0 голосов
/ 15 октября 2018

С директивой Dialog.Delegate вы передаете управление Alexa, и у вас нет никакого контроля над тем, какой слот будет запрашивать Alexa.Также вы не можете отправить outputSpeech или reprompt из вашего кода в качестве ответа.Вместо этого будут использоваться те, которые определены в модели взаимодействия.

Таким образом, в вашем InProgressIfscCodeIntentHandler вместо делегирования элемента управления Alexa вы можете фактически получить желаемый слот.Если вы хотите, чтобы слот BANK был заполнен первым, то сначала вызовите слот BANK и подтвердите его.И если это правильное название банка, попросите BRANCH и затем подтвердите его.

Если какая-либо проверка не удалась, например, если пользователь говорит «Я не знаю» ,Затем снова вызовите этот конкретный слот с правильным сообщением об ошибке.

const InProgressIfscCodeIntentHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest' &&
            handlerInput.requestEnvelope.request.intent.name === 'ifscCode' &&
            handlerInput.requestEnvelope.request.dialogState !== 'COMPLETED'
    },
    handle(handlerInput) {
        const currentIntent = handlerInput.requestEnvelope.request.intent;

        // write a function to validate BANK name
        if (isBankNameValid(handlerInput)) {
            return handlerInput.responseBuilder
                .speak("Let me know which IFSC code for which bank are you looking for ?")
                .reprompt("Let me know which IFSC code for which bank are you looking for ?")
                .addElicitSlotDirective('BANK')
                .getResponse();
        }
        // write a function to validate BRANCH name
        if (isBranchNameValid(handlerInput)) {
            return handlerInput.responseBuilder
                .speak("Let me know the branch ?")
                .reprompt("Let me know the branch ?")
                .addElicitSlotDirective('BRANCH')
                .getResponse();

        }

        //Do your stuff

        return handlerInput.responseBuilder
            .speak("Your speech here")
            .reprompt("Your reprompt here")
            .getResponse();
    }

};
...