如何在Node.js的Lambda中从一个Lex Intent调用另一个带响应卡的Intent?
解决方案
问题根源在于你返回了Close类型的对话动作,该动作会直接终止当前会话,导致后续无法触发任何Intent。要在同一个Lambda中触发带Yes/No响应卡的新Intent,需修改返回的对话动作类型,指定目标Intent并构造响应卡内容。
核心修改要点
- 摒弃
Close类型的dialogAction,改用ElicitIntent触发指定的新Intent - 在返回的messages中添加包含Yes/No选项的响应卡
- 正确配置sessionState中的intent信息,指向目标Intent
修改后的代码示例
假设你要触发的新Intent名为ConfirmRetryIntent,以下是替换原closeresponse的函数:
function triggerIntentWithYesNoCard(intent_request, session_attributes, target_intent, card_info) { return { "sessionState": { "sessionAttributes": session_attributes, "dialogAction": { "type": "ElicitIntent" }, "intent": { 'name': target_intent, 'state': "ReadyForFulfillment" } }, "messages": [ { "contentType": "ImageResponseCard", "content": { "title": card_info.title, "subTitle": card_info.subTitle, "buttons": [ { "text": "Yes", "value": "Yes" }, { "text": "No", "value": "No" } ] } } ], "sessionId": intent_request["sessionId"], "requestAttributes": intent_request[ENTITY.requestAttributes] ? intent_request[ENTITY.requestAttributes] : {} }; }
实际调用示例
当槽位校验不通过(比如手机号长度不符)时,调用该函数替代原closeresponse:
// 手机号格式校验逻辑 if (userPhone.length !== 10) { return triggerIntentWithYesNoCard( intent_request, session_attributes, "ConfirmRetryIntent", { title: "手机号格式错误", subTitle: "是否重新输入手机号?" } ); }
注意事项
- 确保目标Intent(如
ConfirmRetryIntent)已在Lex Bot中创建,且配置了对应的识别逻辑 - 响应卡按钮的文本和值需与目标Intent的触发短语或槽位值匹配,保证Lex能正确识别用户选择
内容的提问来源于stack exchange,提问作者aws demo
相关产品推荐
相关产品推荐

