Как завершить сеанс для пользовательского навыка Alexa?

Я создаю специальный навык для Alexa. Я хочу закрыть сеанс AMAZON.StopIntent. Как я могу добиться этого с помощью кода ниже?

const ExitHandler = {
  canHandle(handlerInput) {
    const request = handlerInput.requestEnvelope.request;
    return request.type === 'IntentRequest'
      && (request.intent.name === 'AMAZON.StopIntent');
  },
  handle(handlerInput) {
    return handlerInput.responseBuilder
      .speak('bye!')
      .reprompt('bye!')
      .getResponse();
  },
};

person Deepak Mankotia    schedule 04.07.2018    source источник


Ответы (2)


Alexa завершает сеанс, когда в ответе JSON для флага shouldEndSession установлено значение true.

... 
"shouldEndSession": true
...

В своем конструкторе ответов вы можете попробовать с помощью вспомогательной функции withShouldEndSession (true)

 return handlerInput.responseBuilder
      .speak('bye!')
      .withShouldEndSession(true)
      .getResponse();

Вспомогательные функции построителя ответов перечислены здесь

person johndoe    schedule 04.07.2018
comment
Вы не представляете, сколько мне пришлось погуглить, чтобы узнать .withShouldEndSession (true / false) существует. Спасибо - person Robert Christ; 19.10.2018

Во фрагменте кода вы завершите сеанс, просто удалив строку повторного запроса:

return handlerInput.responseBuilder
  .speak('bye!')
  .getResponse();

поэтому предлагаемое ниже решение работает, но оно избыточно:

return handlerInput.responseBuilder
      .speak('bye!')
      .withShouldEndSession(true)
      .getResponse();

Приведенный выше код часто используется в противоположном сценарии, когда вы хотите оставить сеанс открытым без повторного запроса:

return handlerInput.responseBuilder
      .speak('bye!')
      .withShouldEndSession(false)
      .getResponse();
person German    schedule 07.09.2018
comment
Как долго сохраняются атрибуты сеанса при использовании флага .withShouldEndSession (false)? - person thedreamsaver; 10.02.2019
comment
Пока не истечет время сеанса. В реальном устройстве несколько секунд, 8 секунд, если я правильно помню. В симуляторе (вкладка Test на developer.amazon.com/alexa) очень долгое время (в основном он не истекает, если вы не вышли со страницы) - person German; 14.02.2019
comment
Итак, в чем практическая польза от .withShouldEndSession (false) на реальном устройстве? - person thedreamsaver; 15.02.2019
comment
Это единственный способ сохранить сеанс открытым, позволяя устройству прослушивать новое высказывание без повторного запроса. В основном вы используете его, когда не хотите настаивать на получении ответа (через повторную подсказку), но позволяете пользователю что-то сказать один раз. - person German; 15.02.2019