amazon-web-services - 发生错误:服务器在处理 Lambda 响应时遇到错误
问题描述
我正在使用 AWS Lex 和 AWS Lambda 创建聊天机器人。请求和响应格式如下 事件被传递给 AWS Lambda
{
"alternativeIntents": [
{
"intentName": "AMAZON.FallbackIntent",
"nluIntentConfidence": null,
"slots": {}
}
],
"botVersion": "$LATEST",
"dialogState": "ConfirmIntent",
"intentName": "OrderBeverage",
"message": "you want to order 2 pints of beer",
"messageFormat": "PlainText",
"nluIntentConfidence": {
"score": 0.92
},
"responseCard": null,
"sentimentResponse": null,
"sessionAttributes": {},
"sessionId": "2021-05-10T09:13:06.841Z-bSWmdHVL",
"slotToElicit": null,
"slots": {
"Drink": "beer",
"Quantity": "2",
"Unit": "pints"
}
}
响应格式-
{
"statusCode": 200,
"dialogAction": {
"type": "Close",
"fulfillmentState": "Fulfilled",
"message": {
"contentType": "PlainText",
"content": "Message to convey to the user. For example, Thanks, your pizza has been ordered."
}
}
}
AWS LAMBDA Python 实现-
import json
def lambda_handler(event, context):
# TODO implement
slots= event["slots"];
drink,qty,unit= slots["Drink"], slots["Quantity"], slots["Unit"]
retStr= "your order of "+qty+" "+unit+ " of "+drink+ " is coming right up!";
return {"dialogAction": {
"type": "Close",
"fulfillmentState": "Fulfilled",
"message": {
"contentType": "PlainText",
"content": retStr
},
}
}
格式与文档一致,但在处理 lambda 响应时仍然出错。问题是什么?
解决方案
当 Lambda 函数执行失败并向 Amazon Lex 抛出错误时,会发生此错误。
我尝试使用共享的 python 代码和测试输入事件重新创建您的环境。
您在原始帖子中指定的输出格式是正确的。您的问题似乎在于输入测试事件。您使用的输入消息与 Lex 实际发送到您的 Lambda 函数的消息不同。
尝试向您的 Lambda 函数添加一些额外的调试以记录 Lex 传递给它的事件,然后将记录的事件用作新的测试事件。
确保您为 Lambda 函数启用了 CloudWatch 日志记录,以便您可以查看日志中的输入消息。
这是我的 Lambda 函数的外观:
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
def dispatch(event):
# TODO implement
slots= event["slots"];
drink,qty,unit= slots["Drink"], slots["Quantity"], slots["Unit"]
retStr= "your order of "+qty+" "+unit+ " of "+drink+ " is coming right up!";
return {"dialogAction": {
"type": "Close",
"fulfillmentState": "Fulfilled",
"message": {
"contentType": "PlainText",
"content": retStr
},
}}
def lambda_handler(event, context):
logger.debug('event={}'.format(event))
response = dispatch(event)
logger.debug(response)
return response
现在,如果您通过 Lex 控制台进行测试,您将在 CloudWatch 日志中发现您的错误。:
[错误] KeyError:'slots' Traceback(最近一次调用最后):文件“/var/task/lambda_function.py”,第 33 行,在 lambda_handler 响应 = dispatch(event) 文件“/var/task/lambda_function.py” ,第 19 行,在 dispatch slots= event["slots"];
使用此错误跟踪和记录的事件,您应该看到它slots
嵌套在currentIntent
.
您将需要更新代码以从正确的位置提取插槽值。
相信这可以帮助你。