如何在多个Amazon.NextIntent链中为Alexa / Amazon Echo设计和传递信息

时间:2019-03-04 19:55:42

标签: node.js alexa alexa-skills-kit

您当前正在考虑采用Alexa技能管理多个输出链的良好设计。例如,如果我以一个名为“昨天”的意图开始,另一个以“今天”的意图开始。我想将此信息传递给NextIntent链(是从“昨天”开始的链,还是“今天”)。

在意图之间传递信息的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

只需在https://developer.amazon.com/de/blogs/alexa/post/f167aa0f-8abe-4602-b985-65118b3032ca/code-deep-dive-slots-and-session-attributes-in-the-ask-sdk-for-node-js处找到操作方法即可。

我正在搜索会话属性

这些可以这样使用

1)我调用的第一个意图是启动链:

    canHandle(handlerInput) {
      return handlerInput.requestEnvelope.request.type === 'IntentRequest'
          && handlerInput.requestEnvelope.request.intent.name === 'BesterAutorIntent';
    },
    handle(handlerInput) {
      try {
        const speechOutput = "Ich könnte dir sagen wer der beste Autor ist, aber ich muss erst HR fragen ob ich darf";

        const attributes = handlerInput.attributesManager.getSessionAttributes();
        attributes.kaesebrot = "kaesebrot"
        handlerInput.attributesManager.setSessionAttributes(attributes)

        return handlerInput.responseBuilder
          .speak(speechOutput)
          .reprompt()
          .withSimpleCard(defaulttext.SKILL_NAME, speechOutput)
          .getResponse();

      } catch (error) {
        console.error(error);
      }
    },
  };

您可以在其中将名为kaesebrot的属性设置为会话属性:

const attributes = handlerInput.attributesManager.getSessionAttributes();
attributes.kaesebrot = "kaesebrot"
handlerInput.attributesManager.setSessionAttributes(attributes)

稍后在另一个功能中,您可以像这样

let counter = 0;

const NextIntentHandler = {
    canHandle(handlerInput) {
      const request = handlerInput.requestEnvelope.request;
      return request.type === 'IntentRequest'
        && request.intent.name === 'AMAZON.NextIntent';
    },
    handle(handlerInput) {
        try {
            counter = counter + 1;

            const attributes = handlerInput.attributesManager.getSessionAttributes();
            speechOutput = counter + " TEST " + attributes.kaesebrot;

            return handlerInput.responseBuilder
                .speak(speechOutput)
                .reprompt()
                .withSimpleCard(defaulttext.SKILL_NAME, speechOutput)
                .getResponse();
        } catch (error) {
            console.error(error);
        }
    },
};

答案 1 :(得分:0)

Tobi的回答很好。

我正在使用sdk v1,并且在dynamoDB上保留属性的代码如下:

    exports.handler = function( event, context, callback ) {
        const alexa = Alexa.handler( event, context );
        alexa.dynamoDBTableName = "alexaTable";
        alexa.registerHandlers( handlers );
        alexa.execute();
    };
...
    const handlers = {
...
        "AMAZON.NextIntent": function () {
            console.log( "AMAZON.NextIntent: " + this.attributes.index );
         }
...
}

第一次调用lambda函数时,将创建一个dynamodb表“ alexaTable”,并将自动存储和检索属性。 在上面的示例中,“索引”是从先前的意图继承的属性。

表架构由一个键和一个字段组成。

  1. 键:userId,alexa技能用户ID
  2. 字段:mapAttr,JSON结构化属性 但是它是由alexa-sdk自行管理的。

这篇文章可以进一步帮助 https://developer.amazon.com/blogs/alexa/post/648c46a1-b491-49bc-902d-d05ecf5c65b4/tips-on-state-management-at-three-different-levels

答案 2 :(得分:0)

SessionAttributes是一种在意图之间保持状态的方法,但是烤箱中有一项新功能,可以专门链接意图并传递插槽值。

这称为“意图链接”,您可以在此处查看更多信息: https://developer.amazon.com/blogs/alexa/post/9ffdbddb-948a-4eff-8408-7e210282ed38/intent-chaining-for-alexa-skill

意图链允许您的技能代码从任何意图(包括LaunchRequest)开始对话框管理。只要交互模型具有对话模型,就可以链接到任何自定义意图。

例如,在YesterdayIntent中,您将在响应构建器中执行以下操作:

handlerInput.responseBuilder.addDelegateDirective({
    name: 'TodayIntent',
    confirmationStatus: 'NONE',
    slots: {} // the slot values to pass go here
 })