基于Jovo框架的Alexa技能:如何通过Utterance获取IntentName并跳转意图?
解决Jovo框架下Alexa技能根据初始Utterance动态跳转意图的问题
看起来你之前的思路有点绕了——核心问题是你误解了Alexa的请求触发逻辑:当用户用带具体指令的Utterance(比如Alexa, ask <invocation_name> to get my latest campaign result)唤醒技能时,Alexa会直接发送对应的意图请求(CampaignIntent),而不是先触发LAUNCH意图。你之前把LAUNCH强制跳转到账号关联意图的逻辑,反而会干扰用户的初始请求。
下面是正确的实现方案,分步骤拆解:
1. 调整意图处理的核心逻辑
我们不需要在LAUNCH里统一处理账号关联,而是在每个需要账号权限的目标意图里先检查关联状态,如果未关联,就保存用户当前请求的意图,再引导账号关联;关联完成后自动跳回原意图。
第一步:修改目标意图的代码
在CampaignIntent和ActiveContactIntent里添加账号关联检查,并保存目标意图到会话数据:
async CampaignIntent() { // 检查用户是否已完成账号关联 if (!this.$user.isLinked()) { // 把当前意图保存到会话,方便关联后跳转 this.$session.data.targetIntent = 'CampaignIntent'; // 弹出账号关联卡片,引导用户完成关联 return this.$alexaSkill.showAccountLinkingCard( '请关联您的账号', '关联后才能查看您的活动结果' ); } // 账号已关联,执行你的业务逻辑 // 比如:获取并返回最新活动结果 const campaignResult = await this.getLatestCampaignResult(); return this.tell(`您的最新活动结果是:${campaignResult}`); } async ActiveContactIntent() { if (!this.$user.isLinked()) { this.$session.data.targetIntent = 'ActiveContactIntent'; return this.$alexaSkill.showAccountLinkingCard( '请关联您的账号', '关联后才能查看您的活跃联系人' ); } // 账号已关联,执行你的业务逻辑 const activeContact = await this.getMostActiveContact(); return this.tell(`您最活跃的联系人是:${activeContact}`); }
第二步:处理账号关联完成后的跳转
当用户完成账号关联后,Alexa会自动触发AccountLinkingIntent(如果你的技能配置的是LinkAccountIntent就用这个),此时我们从会话中取出之前保存的目标意图,直接跳转过去:
async AccountLinkingIntent() { // 从会话中读取用户最初请求的意图 const targetIntent = this.$session.data.targetIntent; if (targetIntent) { // 清除会话中的临时数据 delete this.$session.data.targetIntent; // 跳转到用户最初请求的意图 return this.toIntent(targetIntent); } // 如果没有保存的意图(比如用户直接从关联入口进来),默认引导到功能选择 return this.ask('账号关联完成!您可以查询最新活动结果,或者查看最活跃联系人,请问需要什么帮助?'); }
第三步:修正LAUNCH意图的逻辑
LAUNCH是用户无指令唤醒技能时的入口(比如只说Alexa, open <invocation_name>),应该给用户提供功能选择,而不是强制跳转:
LAUNCH() { return this.ask('欢迎使用XX技能!您可以查询最新活动结果,或者查看最活跃联系人。请问您需要什么帮助?'); }
2. 关键注意事项
- 确保交互模型配置正确:在Alexa开发者控制台的交互模型里,给
CampaignIntent和ActiveContactIntent添加对应的Utterances,比如:- CampaignIntent:
get my latest campaign result、give me my latest campaign results - ActiveContactIntent:
who is my most active contact、show me my most active contact
- CampaignIntent:
- 用Jovo内置方法判断关联状态:
this.$user.isLinked()是Jovo封装的便捷方法,比自己解析请求更可靠; - 测试时的正确姿势:直接用目标Utterance唤醒技能(比如
Alexa, ask <invocation_name> who is my most active contact),此时技能会先检查账号关联,未关联则引导用户完成,关联后自动返回活跃联系人信息。
这样整个流程就完全符合你的需求:用户的初始Utterance直接对应目标意图,账号关联完成后自动跳回该意图执行逻辑。
内容的提问来源于stack exchange,提问作者Subrata Sarkar
相关产品推荐
相关产品推荐

