代码之家  ›  专栏  ›  技术社区  ›  Amit

从LaunchRequest中调用另一个Alexa intent

  •  3
  • Amit  · 技术社区  · 6 年前

    我正在研究Alexa技能,当用户通过LaunchRequest打开技能时,我想将用户重定向到一个意图。

    • 用户表示 Open xyz skill
    • LaunchRequest接收该请求并将请求转发给另一个intent。 this.emit('AnotherIntent')
    • AnotherIntent
    • 我已按要求设置插槽,并且 另一个内容 单独调用时,它的工作非常好。

    然而,当我启动技能并尝试呼叫时 另一个内容 如上文第2步所述,Alexa skill无法启动。

    还有一件事需要注意的是,当我在这个场景的skill builder中测试相同的Alexa技能时,输出json正确地显示了所引出的槽。当我试图从Echo设备运行它时,不确定发生了什么。

    我正在使用NodeJS和Lambda部署我的Alexa处理程序。

    任何帮助都将不胜感激。

    基于评论的进一步参考-

    处理程序-

    var handlers = {
    'LaunchRequest': function () {
        console.log("LaunchRequest::" + JSON.stringify(this.event.request));
        this.emit('fooIntent');
    },
    'SessionEndedRequest': function () {
        console.log('session ended!');
    },
    'fooIntent': function () {
        const intentObj = this.event.request.intent;
         if (!intentObj || (intentObj && !intentObj.slots.WHEN.value)) {
            console.log('fooIntent::UserId' + this.event.session.user.userId);
            const slotToElicit = 'WHEN';
            const speechOutput = 'Ask a question here ?';
            const repromptSpeech = speechOutput;
            console.log("emitting elict now");
            this.emit(':elicitSlot', slotToElicit, speechOutput, repromptSpeech);   
        } else {
            // SLOT is filled, let's query the database to get the value for the slot.
            console.log("fooIntent intent:something is requested for " + this.event.request.intent.slots.WHEN.value);
            // All the slots are filled (And confirmed if you choose to confirm slot/intent)
           fooIntentFunction(this,this.event.request.intent.slots.WHEN.value);
        }
     },
    'AMAZON.HelpIntent': function () {
        var speechOutput = "Need to come up with one.";
        var reprompt = "What can I help you with?";
        this.emit(':ask', speechOutput, reprompt);
    },
    'AMAZON.CancelIntent': function () {
        this.emit(':tell', 'Goodbye!');
    },
    'AMAZON.StopIntent': function () {
        this.emit(':tell', 'Goodbye!');
    }
    

    };

    LaunchRequest中捕获的JSON请求

    {
    "type": "LaunchRequest",
    "requestId": "amzn1.echo-api.request.972bb705-d181-495e-bf60-991f2bd8fbb1",
    "timestamp": "2017-12-30T21:35:21Z",
    "locale": "en-US"
    }
    

    从LaunchRequest调用时在Intent中捕获的JSON请求。这表明 intent 然后未设置。我相信这就是为什么当我尝试在fooIntent实现中发出elicit时它总是失败的原因,如上图所示。

    {
        "type": "LaunchRequest",
        "requestId": "amzn1.echo-api.request.972bb705-d181-495e-bf60-991f2bd8fbb1",
        "timestamp": "2017-12-30T21:35:21Z",
        "locale": "en-US"
    }
    
    • 阿米特
    3 回复  |  直到 6 年前
        1
  •  2
  •   Florian Hollandt    6 年前

    如中所述 Amazon's documentation ,对话框界面用于填充特定用途的所有必需插槽:

    这些问题和答案旨在收集和确认所有意图所需时间段的值。对话将继续,直到意向所需的所有时间段都已填满并得到确认。

    在您的情况下,用户的请求不是意图(即 IntentRequest 类型),但a LaunchRequest . 因此,它没有交互模型,也没有可引出的槽,即使它是由意图处理程序处理的。

    你应该通过深度调用让你的技能按预期工作,比如

    Alexa,告诉xyz skill给我做个三明治

    (如果三明治是故意的,或者在您的情况下 fooIntent ,具有 WHEN 插槽)。

    希望这有帮助!

        2
  •  0
  •   Suneet Patil    6 年前

    试试这个,

    this.emitWithState("IntentName");
    

    希望这有帮助。祝你一切顺利:)

        3
  •  0
  •   Shivanshu Garg    5 年前

    使用以下代码段可以简单地从另一个意图调用意图-\ 这发射(“意图名称”)

    在对你的第一个意图的回应中,给出你想要调用的意图的名称。