Lambda调用ElicitSlot向Lex返回无效槽名[slotId]错误求助
解决Lex Lambda使用ElicitSlot时的"invalid slot names"错误
嘿,我帮你分析下这个报错的原因,以及怎么修复它。这个Invalid Lambda Response: Lambda response provided invalid slot names [slotId]错误,基本跑不出下面这几个情况:
1. 槽位名称不匹配(最常见)
Lex的槽位名称是严格区分大小写的,而且拼写必须完全一致。比如你在Lex控制台里定义的槽位叫SlotID,但Lambda里写的是slotId,就会直接报错。
- 赶紧打开Lex控制台,找到你的目标意图,检查有没有一个叫
slotId的槽位,确保名称的大小写、拼写和Lambda里用的完全一样。 - 如果Lex里根本没创建这个槽位,先补上它,再继续调试。
2. Lambda返回的响应格式不符合要求
Lex对DialogCodeHook返回的响应结构有严格要求,尤其是ElicitSlot类型的响应,少了必要字段或者结构错了也会触发错误。你要确保返回的内容是下面这个标准格式:
callback(null, { sessionAttributes: intentRequest.sessionAttributes || {}, dialogAction: { type: 'ElicitSlot', intentName: intentRequest.currentIntent.name, slots: intentRequest.currentIntent.slots, slotToElicit: 'slotId', // 这里必须和Lex槽位名称完全一致 message: { contentType: 'PlainText', content: '请提供你的slotId值' } } });
3. 代码中对槽位的引用有误
从你给出的代码片段来看,你直接获取了intentRequest.currentIntent.slots.slotId,如果这个槽位在Lex里不存在,或者拼写错了,也会间接导致ElicitSlot的响应出错。建议先对槽位做个有效性检查,再返回ElicitSlot响应。
给你修改后的代码示例
结合你的代码片段,调整成符合要求的版本:
const handleOrder = async (intentRequest, callback) => { const source = intentRequest.invocationSource; const currentSlots = intentRequest.currentIntent.slots; if (source === 'DialogCodeHook') { // 检查slotId是否为空或未定义 if (!currentSlots.slotId) { // 返回正确格式的ElicitSlot响应 return callback(null, { sessionAttributes: intentRequest.sessionAttributes || {}, dialogAction: { type: 'ElicitSlot', intentName: intentRequest.currentIntent.name, slots: currentSlots, slotToElicit: 'slotId', // 确保和Lex槽位名称完全匹配 message: { contentType: 'PlainText', content: '麻烦提供一下你的slotId哦?' } } }); } // 如果槽位都没问题,就交给Lex继续处理(Delegate) return callback(null, { sessionAttributes: intentRequest.sessionAttributes || {}, dialogAction: { type: 'Delegate', slots: currentSlots } }); } // 这里处理FulfillmentCodeHook的逻辑(比如完成订单) // ... };
最后再核对一遍:先确认Lex里的槽位名称,再检查Lambda响应的结构和slotToElicit的拼写,基本就能解决这个问题了。
内容的提问来源于stack exchange,提问作者Shanika Ediriweera
相关产品推荐
相关产品推荐

