В слоты не передается значение, но в боте передается исходное значение - PullRequest
0 голосов
/ 27 мая 2018

Я использую Amazon lex с AWS lambda в качестве проверочного кодека.Когда я пытался передать значение динамически сгенерированной карточкой ответа, оно показывает нулевое значение в слоте AppointmentTime, но исходное значение показывает значение в slotDetails.Вот запрос, отправленный через lex:

{
"messageVersion": "1.0",
"invocationSource": "DialogCodeHook",
"userId": "prwna44b91sbr4w7d2pwwva59anaqzqx",
"sessionAttributes": {
    "store_id": "26",
    "address": "Quark Atrium, A‐45, Phase VIII Extension,Industrial Focal Point,Sahibzada Ajit Singh Nagar, Punjab 160071,India",
    "closingTime": "19:00:00",
    "city": "Mohali",
    "phone": "9718409751",
    "bookingDateTime": "2018-05-27T21:25:46+05:30",
    "openingTime": "10:00:00",
    "state": "PB",
    "email": "bhuvnesh.kumar@sourcefuse.com",
    "zip_code": "44545"
},
"requestAttributes": null,
"bot": {
    "name": "ScheduleRide",
    "alias": "$LATEST",
    "version": "$LATEST"
},
"outputDialogMode": "Text",
"currentIntent": {
    "name": "BookAppointment",
    "slots": {
        "CustomerAgreement": null,
        "DropLocationPrompt": "yes",
        "PickupAddress": "Unnamed Road, Industrial Area, Sector 74, Sahibzada Ajit Singh Nagar, Punjab 140308, India",
        "RequiredService": null,
        "AppointmentTime": null,
        "DropAddress": null,
        "PhoneNumber": null,
        "AppointmentDate": "2018-05-28"
    },
    "slotDetails": {
        "CustomerAgreement": {
            "resolutions": [],
            "originalValue": null
        },
        "DropLocationPrompt": {
            "resolutions": [
                {
                    "value": "yes"
                }
            ],
            "originalValue": "yes"
        },
        "PickupAddress": {
            "resolutions": [],
            "originalValue": "Unnamed Road, Industrial Area, Sector 74, Sahibzada Ajit Singh Nagar, Punjab 140308, India"
        },
        "RequiredService": {
            "resolutions": [],
            "originalValue": null
        },
        "AppointmentTime": {
            "resolutions": [
                {
                    "value": "00:00"
                },
                {
                    "value": "12:00"
                }
            ],
            "originalValue": "14:00:00"
        },
        "DropAddress": {
            "resolutions": [],
            "originalValue": null
        },
        "PhoneNumber": {
            "resolutions": [],
            "originalValue": null
        },
        "AppointmentDate": {
            "resolutions": [],
            "originalValue": "28 may"
        }
    },
    "confirmationStatus": "None"
},
"inputTranscript": "14:00:00"

} Вот запрос, переданный в lex, смотрите AppointmentTime в объекте slots, он показывает значение null, а в объекте slotDetails он показывает значение.Вот массив кнопок, которые я передаю от объекта карты ответа:

 [ { text: '1:00 PM', value: '13:00:00' },
   { text: '1:30 PM', value: '13:30:00' },
   { text: '2:00 PM', value: '14:00:00' },
   { text: '2:30 PM', value: '14:30:00' },
   { text: '3:00 PM', value: '15:00:00' },
   { text: '3:30 PM', value: '15:30:00' },
   { text: '4:00 PM', value: '16:00:00' },
   { text: '4:30 PM', value: '16:30:00' },
   { text: '5:00 PM', value: '17:00:00' },
   { text: '5:30 PM', value: '17:30:00' },
   { text: '6:00 PM', value: '18:00:00' },
   { text: '6:30 PM', value: '18:30:00' } ]

Вот функция buildResponseCard:

  function buildResponseCard(title, subTitle, options){
let buttons = null;
console.log(options);
let genericAttachments = [];
if (options != null){
    buttons = [];
    for(let i = 0; i < (options.length); i++){
        buttons.push(options[i]);
        if(i%3 === 2){
            genericAttachments.push({
             title,
             subTitle,
             buttons
            });
            buttons = [];
        }
    }
}
return {
    version: 1,
    contentType: "application/vnd.amazonaws.card.generic",
    genericAttachments
};
}

Причина, по которой я хочу значение слота AppointmentTime для объекта слотабудет показано, что всякий раз, когда значение в слоте недопустимо из-за проверки, я устанавливаю его равным нулю и вызываю его с помощью лямбда-функции, и я не смогу отозвать объект slotDetails в ответе.Может кто-нибудь сказать мне, как я могу добиться этого?

1 Ответ

0 голосов
/ 30 мая 2018

Для встроенного слота AMAZON.TIME :

Когда пользователь вводит неоднозначное время, Amazon Lex использует атрибут slotDetails события Lambda для передачи разрешений длянеоднозначные времена для вашей лямбда-функции.... В этом случае значение на карте слотов равно нулю, а сущность slotDetails содержит два возможных разрешения времени.

Ваш ввод "14:00:00" не являетсяпонимается как однозначное время, и Лекс пытается разрешить его до полудня или полуночи, что явно неправильно.Вероятно, это связано с тем, что слот Lex Time ожидает только часы и минуты (чч: мм), но не секунды (чч: мм: сс).

Так что, если это возможно для вас, одним из решений является удалениесекунды цифры от ваших значений времени.Например:

[ { text: '1:00 PM', value: '13:00' }, ... ]

Однако, если у вас должны быть секунды в значении времени, вы можете просто найти время, выбранное пользователем из значения inputTranscript, и выполнить его проверку оттуда.

var userInput = event.inputTranscript;

РЕДАКТИРОВАТЬ:

Другой вариант - игнорировать предложенные разрешения Лекса и получить исходное значение для слота.Вот так:

var timeValue = event.currentIntent.slotDetails.AppointmentTime.originalValue;

А затем установите слот AppointmentTime самостоятельно.Как это:

event.currentIntent.slots.AppointmentTime = timeValue;
...