AWS Lex V2如何实现后端Lambda动态Fulfillment覆盖控制台静态配置
我正在使用AWS Lex V2搭建用户预约业务流程,期望能够返回后端生成的动态值给终端用户。
使用后端返回的动态值构造响应,示例:Your appointment has been confirmed. Please keep the following code: {{appointment_code}} when you show up to the interview.(您的预约已确认,请在到访面试时留存对应预约码:{{appointment_code}})
实际仅返回静态响应内容,示例:Your appointment has been confirmed.(您的预约已确认)。
在AWS Lex V2中配置Fulfillment输出时,当前仅可在控制台定义静态响应内容,或通过{slotName}语法引用槽位值拼接语句,无论后端响应中设置什么消息内容,最终返回给用户的始终是AWS Lex控制台预配置的响应,而非后端返回的动态内容。
相关Fulfillment配置截图:
收集完所有必要槽位、生成预约编码后,我使用如下代码构造Fulfillment关闭响应:
function close(sessionAttributes, message) { return { "sessionState":{ sessionAttributes, "dialogAction": { "type": 'Close', }, "intent": { "name": "PetitionsIntent", "state": "Fulfilled" }, "messages": [ { "contentType": "PlainText", "content": `cool, the apointment code is ${ap_code}`, } ], } }; }
上述代码可正常执行,对应意图可正常标记为Fulfilled状态,但始终返回控制台预定义响应而非后端构造的动态消息。请问是否有方式可以覆盖控制台预定义输出、直接使用Lambda返回的响应内容,当前我的配置遗漏了什么步骤?
问题出在两个核心位置,一个是控制台配置没开对应开关,一个是返回结构的字段位置写错:
- 控制台配置项漏开
进入对应意图的Fulfillment配置页,找到Lambda fulfillment的设置项,打开Return Lambda response directly to client开关。Lex V2默认这个开关是关闭的,关着的时候不管Lambda里返回什么消息内容,都会优先读取控制台预配置的静态响应,完全忽略Lambda返回的messages字段,开了开关之后才会优先使用Lambda返回的消息。小提示:开了这个开关之后,记得把Fulfillment步骤里之前配的所有静态响应规则全部删掉,不然偶尔会出现静态消息和Lambda返回消息混发的异常。
- 返回JSON结构错误
现在代码里把messages字段写在了sessionState对象内部,Lex V2识别不到这个位置的消息配置,必须把messages挪到和sessionState平级的根层级才会生效,修正后的代码参考:
function close(sessionAttributes, ap_code) { return { "sessionState":{ sessionAttributes, "dialogAction": { "type": 'Close', }, "intent": { "name": "PetitionsIntent", "state": "Fulfilled" } }, // messages必须放在根层级,不要嵌套在sessionState里 "messages": [ { "contentType": "PlainText", "content": `cool, the appointment code is ${ap_code}`, } ] }; }
- 备选方案:如果不想开直接返回Lambda响应的开关,也可以把生成的预约码放到返回的
sessionAttributes里,然后在控制台的静态响应配置里用((sessionAttributes.appointment_code))语法直接引用会话属性值,一样能实现动态内容拼接,不用调整返回结构。
内容的提问来源于stack exchange,提问作者Moriuks

