寻求Alexa Skill延迟响应的Python Lambda代码示例
解决Alexa Lambda函数超时的延迟响应实现
针对你的场景,在Alexa Python SDK中实现延迟响应(异步响应),核心是分两步处理:先返回临时响应告知用户正在处理,再通过后台异步任务完成API调用后发送最终结果。以下是具体代码示例和说明:
第一步:返回临时响应并触发异步任务
修改你的CustomIntentHandler,先返回让用户等待的即时响应,同时调用另一个Lambda执行耗时的API请求:
class CustomIntentHandler(AbstractRequestHandler): def can_handle(self, handler_input): return ask_utils.is_intent_name("CustomIntentHandler")(handler_input) def handle(self, handler_input): # 读取密钥(建议迁移到Lambda环境变量,更安全高效) import json with open('secrets.json') as f: secrets = json.load(f) # 触发异步处理Lambda import boto3 lambda_client = boto3.client('lambda') # 传递用户会话与设备信息,用于后续发送结果 user_id = handler_input.request_envelope.context.system.user.user_id device_id = handler_input.request_envelope.context.system.device.device_id lambda_client.invoke( FunctionName='你的异步处理Lambda名称', InvocationType='Event', # 异步调用,不等待返回 Payload=json.dumps({ "user_id": user_id, "device_id": device_id, "secrets": secrets }) ) # 返回临时响应 speak_output = "我正在查询你需要的信息,请稍等,结果出来后我会马上告诉你。" return ( handler_input.response_builder .speak(speak_output) .response )
第二步:异步处理Lambda实现
创建独立的Lambda函数,负责执行耗时的API调用,完成后通过Alexa主动事件API推送结果:
import json import boto3 def lambda_handler(event, context): # 获取传递的参数 user_id = event['user_id'] device_id = event['device_id'] secrets = event['secrets'] # 执行你的多API调用逻辑(替换为原代码中耗时的部分) api_results = [] # 示例:api_results.append(call_api_1(secrets)) # api_results.append(call_api_2(secrets)) # 构造最终语音内容 final_speak_output = f"查询完成啦,结果是:{', '.join(api_results)}" # 通过Proactive Events API发送主动通知 proactive_client = boto3.client('alexaforbusiness') # 需提前在Alexa开发者控制台配置Proactive Events权限与事件类型 proactive_client.send_announcement( RoomArn=f"arn:aws:alexaforbusiness:us-east-1:你的AWS账号ID:device/{device_id}", Content={ 'TextList': [ { 'Locale': 'zh-CN', 'Value': final_speak_output } ] }, TimeToLiveInSeconds=300 ) return { 'statusCode': 200, 'body': json.dumps('处理完成') }
关键注意事项
- 需在Alexa开发者控制台为技能启用Proactive Events权限,并配置对应事件类型
- 异步Lambda需配置调用Alexa主动事件API的IAM权限
- 建议将
secrets.json中的密钥迁移到Lambda环境变量,避免文件IO开销
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

