首页 > 解决方案 > 没有值传递给插槽,但原始值在机器人中传递

问题描述

我正在使用带有 AWS lambda 的 Amazon lex 作为验证 Codehook。当我尝试使用动态生成的响应卡传递值时,它在 AppointmentTime Slot 中显示空值,但原始值在 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 的请求,请参见 slot 对象中的 AppointmentTime,它显示为 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 插槽值的原因是,每当插槽中的值通过验证无效时,我会将其设置为 null 并通过 lambda 函数回调它,我将无法回调 slotDetails响应中的对象。谁能告诉我如何实现这一目标?

标签: node.jsaws-lambdaamazon-lex

解决方案


对于AMAZON.TIME内置插槽:

当用户输入不明确的时间时,Amazon Lex 使用 Lambda 事件的 slotDetails 属性将不明确时间的解决方案传递给您的 Lambda 函数。... 在这种情况下,slots 映射中的值为 null,并且 slotDetails 实体包含两种可能的时间分辨率。

您输入的“14:00:00”不被理解为明确的时间,Lex 试图将其解析为中午或午夜,这显然是错误的。这可能是因为 Lex 时隙只需要小时和分钟 (hh:mm) 而不是秒 (hh:mm:ss)。

因此,如果可能的话,一种解决方案是从您的时间值中删除秒数。例如:

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

但是,如果您必须在时间值中包含秒数,那么您可以简单地找到用户从 inputTranscript 值中选择的时间并从那里进行验证。

var userInput = event.inputTranscript;

编辑:

另一种选择是忽略 Lex 建议的解决方案并获取 slot-details original-value。像这样:

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

然后自己设置 AppointmentTime 槽。像这样:

event.currentIntent.slots.AppointmentTime = timeValue;

推荐阅读