You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Lambda Python对接AWS Lex的正确输出格式咨询及报错排查求助

解决AWS Lambda与Lex对接的Invalid Response问题

看起来你遇到的核心问题可能有两个:API请求失败导致Lambda抛出未处理异常,以及Lex版本与响应格式不匹配。我们一步步来排查:

1. 先排查Lambda函数的运行错误(最可能的原因)

你看到的Invalid Lambda Response: Unhandled通常意味着Lambda函数在执行时抛出了异常,没有返回有效的JSON响应。你需要查看CloudWatch日志来确认具体错误:

  • 打开AWS控制台,进入Lambda服务,找到你的函数,切换到「监控」标签,点击「查看日志中的CloudWatch」。
  • 查看最近的执行日志,大概率会发现类似KeyError: 'main'的错误,这是因为你的OpenWeatherMap API请求有问题:
    你的API URL拼接错误,正确的格式应该包含&appid=前缀,比如:
    api = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid=YOUR_TOKEN"
    
    你当前的代码里直接把TOKEN拼在城市名后面,导致API返回的是错误信息(比如401未授权或者404城市不存在),而不是天气数据,所以json_data['main']就会抛出KeyError,让Lambda崩溃,无法返回预期的JSON给Lex。

另外,建议你给API请求加上异常处理,避免因为网络问题、城市名错误等导致函数崩溃:

try:
    json_data = requests.get(api).json()
    if 'main' not in json_data:
        # 处理API返回错误的情况,比如城市不存在
        answer = f"Sorry, I couldn't find weather data for {city}."
    else:
        temp = int(json_data['main']['temp'] - 273.15)
        answer = f"Weather in {city} is {temp}°C"
except Exception as e:
    # 捕获所有异常,返回友好提示
    answer = "Oops, something went wrong while fetching weather data. Please try again later."

2. 匹配Lex Bot的版本选择正确的响应格式

Lex有V1和V2两个版本,它们的响应格式完全不兼容,你需要确认你的Bot是哪个版本,然后使用对应的格式:

如果是Lex V1

响应需要以dialogAction为核心,正确的Close类型响应格式如下:

message = {
    "sessionAttributes": {},  # 可选,用于存储会话数据
    "dialogAction": {
        "type": "Close",
        "fulfillmentState": "Fulfilled",
        "message": {
            "contentType": "PlainText",
            "content": answer
        }
    }
}

注意:type设为Close表示结束会话,ConfirmIntent是用于确认用户意图的场景,不适合直接返回结果的情况。

如果是Lex V2

响应必须包含sessionState和messages字段,并且intent里需要包含name和slots(即使槽位已经填充),正确格式如下:

message = {
    "sessionState": {
        "dialogAction": {
            "type": "Close"
        },
        "intent": {
            "name": "FindingWeather",  # 必须和你的Lex意图名称完全一致
            "slots": {
                "City": city  # 把槽位值返回,可选但推荐
            },
            "state": "Fulfilled"
        }
    },
    "messages": [
        {
            "contentType": "PlainText",
            "content": answer
        }
    ]
}

你之前的Variant3缺少了slots字段,这可能导致Lex无法识别响应。

3. 额外检查项

  • 确认Lambda函数的执行角色有足够的权限:比如允许访问CloudWatch Logs(用于排查错误),以及允许出站请求到OpenWeatherMap的API(如果你的Lambda在VPC里,需要配置NAT网关)。
  • 测试Lambda函数:在Lambda控制台的「测试」标签里,模拟Lex发送的事件(可以从Lex的测试控制台复制请求格式),直接运行函数,查看返回的JSON是否符合预期,同时检查日志是否有异常。

按照以上步骤排查,应该能解决你的问题!

内容的提问来源于stack exchange,提问作者jarrett.rus26

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:32:29