Alexa SDK Redirect для установки атрибутов сеанса - PullRequest
1 голос
/ 02 мая 2019

Есть ли способ временно перенаправить из одного намерения в другое, чтобы заполнить слоты или атрибуты сеанса, а затем вернуться к первоначальному намерению, на которое нужно ответить или выполнить?

Мой пример использования - запрос PIN-кода учетной записи в качестве дополнительной аутентификации после привязки учетной записи. Например, если кто-то спросит «Каковы данные моей учетной записи?», Я хочу, чтобы это намерение изменилось в атрибутах сеанса, если оно существует, а если нет, временно перенаправить на намерение, которое будет запрашивать у них ПИН-код и устанавливать его ... затем вернитесь и ответьте на запрос данных своего аккаунта. Аналогичен примеру ниже:

const IntentHandler = {
  canHandle(input) {
    return (
      input.requestEnvelope.request.type === 'IntentRequest' &&
      input.requestEnvelope.request.intent.name === 'MyIntent'
  },
  handle(input) {
    const { accessToken } = input.requestEnvelope.context.System.user
    // ... do stuff with accessToken

    if (!input.attributesManager.getSessionAttributes().pin) {
      // redirect to other intent to set the pin session attribute
    }

    // ...response to intent request
  }
}

Я могу заставить это работать с одним намерением, используя подсказки заполнения слотов, но это общая задача для нескольких намерений, и я хотел бы отделить ее, чтобы ее не нужно было настраивать в консоли для всех, кто этого требует.

К вашему сведению: использование ask-sdk для Node.js

Возможно ли это с текущей версией ask-sdk?

1 Ответ

1 голос
/ 03 мая 2019

Да, Alexa теперь позволяет легко переключаться между намерениями и переходить прямо к извлечению определенного слота для нового намерения.

Я бы использовал Диалоговая директива ElicitSlot и включите объект updatedIntent для нового намерения.

updatedIntent

Используйте это для изменения намерений во время диалога или установки значений слотов и подтверждениястатус.См. Изменение намерения или обновление значений слотов во время диалога.Если вам не нужно менять намерение, значения слотов или статусы подтверждения, вы можете оставить это свойство вне своего ответа.

Когда вы переключаете намерения с помощью этого параметра, Alexa пытается извлечь указанное значение слотапо новому намерению.Следующим IntentRequest для вашего навыка будет новое намерение, а не оригинал.

Пример:

  1. Intent A отсутствует токен доступа.
  2. IntentA направляет Alexa на elicitSlot "pin" из Intent B. (включает информацию в sessionAttributes, такую ​​как "previousIntent" или "nextIntent", чтобы использовать в качестве направления для Intent B)
  3. Alexa отвечает пользователю с помощью elicit Intent Bприглашение для слота "pin".
  4. Пользователь предоставляет пин-код.
  5. Alexa предоставляет пользовательский ввод для Intent B (не A) с заполненным слотом "pin", а Intent B устанавливает токен доступа в sessionAttribtues.
  6. Затем Intent B проверяет sessionAttribtues направление, в которое намеревается вернуться, и в какой слот извлечь из этого намерения.Таким образом, вы можете либо confirmIntent, либо elicitSlot для Intent A.
  7. Intent A получит следующий пользовательский ввод и теперь обнаружит токен доступа.

Обратите внимание, что вам придетсяобратиться к пользователю с чем-то между намерениями переключения.Если вы используете confirmIntent, то это может быть простой вопрос подтверждения «Да / Нет», например: «Спасибо за ваш пин-код, хотите, чтобы я получил данные вашей учетной записи сейчас?» .Пользователь говорит «Да», и он отправляется обратно в Намерение А, чтобы завершить начатое.

Если вы не хотите, чтобы этот дополнительный взад и вперед с пользователем, то, насколько я знаю, выВам придется встроить слот pin в каждое намерение, которое вам может понадобиться для его извлечения.Таким образом, вы просто остаетесь в Intent A. Менее эффективный код, но более эффективный разговор, так что это немного компромисс.

...