Как предотвратить дублирование действий в Bixby? - PullRequest
1 голос
/ 20 мая 2019

Я хочу реализовать капсулу, которая выполняет вычисления, если пользователь предоставляет полный ввод, необходимый для расчета, или запрашивает у пользователя необходимые данные, если пользователь не предоставляет полный ввод с самого первого запроса.Все работает, если пользователь предоставляет полный запрос.Если пользователь не предоставляет полный запрос, но Биксби требуется больше информации, я сталкиваюсь с каким-то странным поведением, когда Расчет вызывается более одного раза, а Биксби берет необходимую информацию для вычисления из результата другого вычисления, похоже,на графике отладки.

Чтобы упростить демонстрацию моей проблемы, я расширил капсулу с образцом кости капсула-образец-кости и добавил numSides и numDice к RollResultConcept,так что я могу получить доступ к количеству кубиков и сторон в результате.RollResult.model.bxb теперь выглядит следующим образом:

structure (RollResultConcept) {
  description (The result object produced by the RollDice action.)
  property (sum) {
    type (SumConcept)
    min (Required)
    max (One)
  }
  property (roll) {
    description (The list of results for each dice roll.)
    type (RollConcept)
    min (Required)
    max (Many)
  }
  // The two properties below have been added
  property (numSides) {
    description (The number of sides that the dice of this roll have.)
    type (NumSidesConcept)
    min (Required)
    max (One)
  }
  property (numDice) {
    description (The number of dice in this roll.)
    type (NumDiceConcept)
    min (Required)
    max (One)
  }
}

Я также добавил single-line s в RollResult.view.bxb, так что количество сторон и кубиков показывается пользователю после броска.RollResult.view.bxb:

 result-view {
   match {
     RollResultConcept (rollResult)
   }

   render {
     layout {
       section {
         content {
           single-line {
             text {
               style (Detail_M)
               value ("Sum: #{value(rollResult.sum)}")
             }
           }
           single-line {
             text {
               style (Detail_M)
               value ("Rolls: #{value(rollResult.roll)}")
             }
           }
           // The two single-line below have been added
           single-line {
             text {
               style (Detail_M)
               value ("Dice: #{value(rollResult.numDice)}")
             }
           }
           single-line {
             text {
               style (Detail_M)
               value ("Sides: #{value(rollResult.numSides)}")
             }
           }
         }
       }
     }
   }
 }

Редактировать: я забыл добавить код, который я изменил в RollDice.js, см. Ниже: RollDice.js

// RollDice
// Rolls a dice given a number of sides and a number of dice

// Main entry point
module.exports.function = function rollDice(numDice, numSides) {

  var sum = 0;
  var result = [];

  for (var i = 0; i < numDice; i++) {
    var roll = Math.ceil(Math.random() * numSides);
    result.push(roll);
    sum += roll;
  }

  // RollResult
  return {
    sum: sum,           // required Sum
    roll: result,       // required list Roll
    numSides: numSides, // required for numSides
    numDice: numDice    // required for numDice
  }
}

КонецEdit


В симуляторе я теперь запускаю следующий запрос

intent {
  goal: RollDice
  value: NumDiceConcept(2)
}

, в котором отсутствует требуемый NumSidesConcept.

В режиме отладки показан следующий график:с NumSidesConcept отсутствует (как и ожидалось).Debug Graph 1

Теперь я запускаю следующий запрос в симуляторе

intent {
  goal: RollDice
  value: NumDiceConcept(2)
  value: NumSidesConcept(6)
}

, что приводит к следующему графику в представлении отладки:

Debug Graph 2

и мне кажется, что расчет делается дважды, чтобы добраться до результата.Я уже пытался дать feature { transient } моделям, но это ничего не изменило.Кто-нибудь может сказать мне, что здесь происходит?Разрешено ли мне использовать одни и те же примитивные модели в выходных данных, потому что они будут использоваться Биксби при попытке выполнить действие?

1 Ответ

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

Я попытался изменить код, как вы, но не смог выполнить намерение (успешно).

enter image description here

НАЧАТЬ РЕДАКТИРОВАТЬ

Я добавил дополнительные строки в RollDice.js и смог увидеть план, который вы видите.

Причиной двойного исполнения является то, что вы выполняли намерения последовательно, и Биксби вывел значение NumSidesConcept, которое вы НЕ указали в первом намерении, из второго намерения, и выполнил первое намерение.

Вы можете проверить вышеупомянутое, предоставляя разные наборы значений для NumSidesConcept и NumDiceConcept в каждом из намерений.

Если бы вы дали достаточно времени между этими двумя намерениями, тогда результат был бы другим. В вашем сценарии первое намерение ожидало, что NumSidesConcept станет доступным, и как только Планировщик обнаружил его (из результата второго намерения), выполнение прошло.

Как вы можете избежать этого? Убедитесь, что у вас есть представление ввода для каждого из входов, чтобы Bixby мог запрашивать у пользователя любые значения, которые не прошли через NL (или Aligned NL).

END EDIT

Вот еще один подход, который НЕ требует изменения RollResultConcept И будет работать в соответствии с вашими ожиданиями (доступа к количеству кубиков и сторон в result-view)

 result-view {
  match: RollResultConcept (rollResult) {
    from-output: RollDice(action)
  }


   render {
     layout {
       section {
         content {
           single-line {
             text {
               style (Detail_M)
               value ("Sum: #{value(rollResult.sum)}")
             }
           }
           single-line {
             text {
               style (Detail_M)
               value ("Rolls: #{value(rollResult.roll)}")
             }
           }
           // The two single-line below have been added
           single-line {
             text {
               style (Detail_M)
               value ("Dice: #{value(action.numDice)}")
             }
           }
           single-line {
             text {
               style (Detail_M)
               value ("Sides: #{value(action.numSides)}")
             }
           }
         }
       }
     }
   }
 }

Дайте ему шанс и дайте нам знать, если это работает!

...