Алекса пропустить слот или установить его программно? - PullRequest
0 голосов
/ 06 декабря 2018

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

if(!answers.NewWordSpanishAnswer) {
  const newWordIntroAudio = sound('intro');
  const promptAudio = sound(`new-word-${word}-spanish-intro`);
  return handlerInput.responseBuilder
    .speak(newWordIntroAudio + promptAudio)
    .reprompt(promptAudio)
    .addElicitSlotDirective('NewWordSpanishAnswer')
    .getResponse();
}

if(!answers.NewWordEnglishAnswer) {
  const responseAudio = sound(`new-word-${word}-spanish-correct`);
  const promptAudio = sound(`new-word-${word}-english-intro`);
  return handlerInput.responseBuilder
    .speak(responseAudio + promptAudio)
    .reprompt(promptAudio)
    .addElicitSlotDirective('NewWordEnglishAnswer')
    .getResponse();
}

// etc. repeat for each question

Проблема в том, что мне нужно создать тест, который требует переменного числа вопросов, но слоты определены в модели, поэтому я не могу изменитьколичество ответов, необходимых для завершения намерения.Я думаю, что способ сделать это состоит в том, чтобы предоставить произвольное количество answer слотов и назначить значения по умолчанию тем, которые мне не нужны (поэтому, если в тесте есть 3 вопроса, но есть 5 слотов, последние 2 слота будутприсваивать значения местозаполнителя).

Как это сделать?Есть ли способ установить значения слотов программно?

Этот пост блога Alexa , кажется, описывает то, что мне нужно, но, к сожалению, он написан с использованием ASK SDK v1, поэтому я не уверен, какчтобы сделать это, используя v2.

1 Ответ

0 голосов
/ 06 декабря 2018

Да, можно пропустить 1 или более значений слотов.

Я могу придумать два решения вашей проблемы.

1) Использовать addDelegateDirective вместо addElicitSlotDirective , чтобы собрать значения слотов и заполнить ненужные слоты произвольным значением, когда dialogState равно ' STARTED ' Как и в следующем фрагменте.

const { request } = handlerInput.requestEnvelope;
const { intent } = request;
if (request.dialogState === 'STARTED') {
  
  intent.slots.slotToSkip.value = 'skipped'
  
  return handlerInput.responseBuilder
      .addDelegateDirective(intent)
      .withShouldEndSession(false)
      .getResponse()
}

2) Во втором решении вы можете использовать переменные сеанса, чтобы отслеживать, сколько слотов нужно извлечь.Нравится

let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
sessionAttributes.count = 3 //Suppose you want to elicit 3 slots;
handlerInput.attributesManager.setSessionAttributes(sessionAttributes);

if (sessionAttributes.count >= 0)
{
  //addElecitSlotDirective
  sessionAttributes.count = sessionAttributes.count--;
  handlerInput.attributesManager.setSessionAttributes(sessionAttributes);
}
else{
  //here you will get the required number of slots
}
...