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

开发调用REST API的Alexa技能遇问题:Lambda依赖与代码报错排查

Alexa技能问题排查与解答

一、AWS账户相关疑问

  • 是的,你需要AWS账户来配置Lambda函数。Alexa开发者控制台本身不内置Lambda服务,Lambda是AWS的无服务器计算服务,必须通过AWS控制台创建并关联到你的Alexa技能。你可以通过Alexa开发者控制台的「Endpoint」页面跳转到AWS Lambda控制台创建对应函数。

二、代码错误排查

你的代码存在多处问题,这是导致Alexa返回技能响应错误的核心原因:

1. 缺失关键类导入

类GetElectricityConsumptionIntentHandler继承自AbstractRequestHandler,但代码未导入该类,需添加:

from ask_sdk_core.dispatch_components import AbstractRequestHandler

2. 未初始化SkillBuilder实例

代码末尾引用了sb但未创建实例,需添加:

from ask_sdk_core.skill_builder import SkillBuilder

sb = SkillBuilder()

3. 未注册Intent处理类

创建完意图处理类后,必须将其注册到SkillBuilder,否则技能无法识别该意图:

sb.add_request_handler(GetElectricityConsumptionIntentHandler())

4. lambda_handler定义不完整

最后一行lambda_handler = sb.la是无效代码,正确写法为:

lambda_handler = sb.lambda_handler()

5. 无异常处理逻辑

当前代码中API请求失败会直接抛出异常,导致Lambda返回错误。需添加异常捕获,返回友好提示:

def handle(self, handler_input):
    try:
        # 原有核心逻辑代码
        ...
    except Exception as e:
        speak_output = "抱歉,暂时无法获取能耗数据,请稍后再试。"
        return (
            handler_input.response_builder
                .speak(speak_output)
                .response
        )

6. 冗余依赖导入

代码导入了json和dateutil.parser但未使用,可移除以减小部署包体积。

修复后的完整代码

import logging
import ask_sdk_core.utils as ask_utils
import requests
import pandas as pd
from datetime import datetime, timedelta
from ask_sdk_core.dispatch_components import AbstractRequestHandler
from ask_sdk_core.skill_builder import SkillBuilder

API_KEY = "BLABLABLABLA"
BASE_URL = f'https://api.octopus.energy/v1/electricity-meter-points/09090909/meters/2139898/consumption/'


class GetElectricityConsumptionIntentHandler(AbstractRequestHandler):
    def can_handle(self, handler_input):
        return ask_utils.is_intent_name("GetElectricityConsumptionIntent")(handler_input)

    def handle(self, handler_input):
        try:
            page_number = 1
            page_size = 15000
            more_data = True
            total_data = pd.DataFrame()

            end_date = datetime.utcnow()
            start_date = end_date - timedelta(days=7)

            end_date_str = end_date.strftime('%Y-%m-%dT%H:%M:%SZ')
            start_date_str = start_date.strftime('%Y-%m-%dT%H:%M:%SZ')

            while more_data:
                url = f"{BASE_URL}?page={page_number}&page_size={page_size}&period_from={start_date_str}&period_to={end_date_str}&order_by=period"
                
                response = requests.get(url, auth=(API_KEY, ''))
                
                if response.status_code != 200:
                    raise Exception("Failed to fetch data from the API")
                
                re = response.json()
                results = re['results']
                
                if not results:
                    more_data = False
                    break
                
                data = pd.DataFrame(results)
                data['date'] = pd.to_datetime(data['interval_start'])
                total_data = pd.concat([total_data, data])
                
                page_number += 1
            
            total_data['date'] = total_data['date'].dt.date
            daily_data = total_data.groupby('date')['consumption'].sum().reset_index()
            
            highest_daily_consumption = daily_data['consumption'].max()
            highest_daily_date = daily_data.loc[daily_data['consumption'].idxmax(), 'date']

            speak_output = f"过去7天里,单日最高用电量是{highest_daily_consumption}千瓦时,日期是{highest_daily_date}。"
            return (
                handler_input.response_builder
                    .speak(speak_output)
                    .response
            )
        except Exception as e:
            speak_output = "抱歉,暂时无法获取能耗数据,请稍后再试。"
            return (
                handler_input.response_builder
                    .speak(speak_output)
                    .response
            )

sb = SkillBuilder()
sb.add_request_handler(GetElectricityConsumptionIntentHandler())
lambda_handler = sb.lambda_handler()

三、额外建议

  • 部署Lambda时,需确保包含所有依赖包(如pandas、requests),可通过创建部署包或Lambda层管理依赖。
  • 在Alexa开发者控制台的「Test」页面查看详细错误日志,辅助定位问题。

内容的提问来源于stack exchange,提问作者Wasabi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:57:02