Как разработать и передать информацию в нескольких цепочках Amazon.NextIntent для Alexa / Amazon Echo - PullRequest
0 голосов
/ 04 марта 2019

Привет, в настоящее время думаю о хорошем дизайне для управления несколькими цепочками вывода в навыке Alexa.Например, если я начну с одного намерения, названного «вчера», и другого, названного «сегодня».Я хочу передать эту информацию («вчера» я начал цепочку или «сегодня») в цепочку NextIntent.

Как лучше всего передавать информацию между намерениями?

Ответы [ 3 ]

0 голосов
/ 07 марта 2019

Хороший ответ Тоби.

Я использую 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 );
         }
...
}

Будет создана таблица динамодальной таблицы «alexaTable».в первый раз вызывается лямбда-функция, которая автоматически сохраняет и извлекает атрибуты.В приведенном выше примере «index» - это атрибут, перенесенный из предыдущего намерения.

Схема таблицы состоит из ключа и поля.

  1. Key: userId, alexa skill 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

0 голосов
/ 08 марта 2019

SessionAttributes - это способ сохранения состояния между намерениями, но есть новая функция jsut из духового шкафа, специально предназначенная для цепочки намерений и передачи значений слотов.

Это называется Intent Chaining, и вы можете увидеть больше здесь: https://developer.amazon.com/blogs/alexa/post/9ffdbddb-948a-4eff-8408-7e210282ed38/intent-chaining-for-alexa-skill

Intent Chaining позволяет вашему коду навыков начать управление диалогом с любого намерения, включая LaunchRequest.Вы можете объединиться в любое из ваших пользовательских намерений, если у вашей модели взаимодействия есть диалоговая модель.

Например, из YesterdayIntent в построителе ответов вы должны сделать:

handlerInput.responseBuilder.addDelegateDirective({
    name: 'TodayIntent',
    confirmationStatus: 'NONE',
    slots: {} // the slot values to pass go here
 })
0 голосов
/ 04 марта 2019

Только что узнал здесь 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);
        }
    },
};
...