Google Actions SDK assistant не получает ввод пользователя во время встроенного диалога?
У меня возникают проблемы при получении метода getRawInput() для захвата ввода пользователя после его первоначального вызова. Я хотел бы, чтобы пользователь выбрал и действие, а затем помощник, чтобы ответить на вопрос, на который пользователь должен ответить, чтобы двигаться вперед. Например, пользователь хотел бы перевести деньги с текущего счета на сберегательный счет и сказал бы: "Я хотел бы сделать перевод". Помощник спросит: "С какого аккаунта вы хотели бы перейти". Пользователь ответит учетной записью, с которой он хочет перейти. Кажется, проблема в том, что помощник не принимает второй ввод, и я получаю сообщение об ошибке: "Действие: {имя моего действия} не отвечает прямо сейчас. Попробуйте еще раз в ближайшее время". Пожалуйста, дайте мне знать, если есть лучший способ или более подходящий метод для вызова встроенных диалогов.
Вот код, который я пытаюсь выполнить:
else if (assistant.getRawInput() === 'I want to make a transfer') {
let inputPrompt = assistant.buildInputPrompt(true, 'Sure, which account would you like to transfer from? You can say checking or savings.');
assistant.ask(inputPrompt);
if(assistant.getRawInput() === 'checking') {
let transFrom = 'checking';
let transTo = 'savings';
let inputPrompt = assistant.buildInputPrompt(true, 'You are going to make a transfer from your ' + transFrom + ' account to your ' + transTo + ' account. What is the amount you would like to transfer?');
assistant.ask(inputPrompt);
let amtInput = assistant.getRawInput();
let amt = parseInt(amtInput);
transferMoney(transFrom, transTo, amt);
inputPrompt = assistant.buildInputPrompt(true, 'Cool, you have transfered ' + amt + ' dollars from your ' + transFrom + ' account to your ' + transTo + ' account. Your new balance is ' + customer1.chkBal + ' dollars in your ' + transFrom + ' account and ' + customer1.savBal + ' in your ' + transTo + ' account.');
assistant.ask(inputPrompt);
} else if (assistant.getRawInput() === 'savings') {
let transFrom = 'savings';
let transTo = 'checking';
let inputPrompt = assistant.buildInputPrompt(true, 'You are going to make a transfer from your ' + transFrom + ' account to your ' + transTo + ' account. What is the amount you would like to transfer?');
assistant.ask(inputPrompt);
let amtInput = assistant.getRawInput();
let amt = parseInt(amtInput);
transferMoney(transFrom, transTo, amt);
inputPrompt = assistant.buildInputPrompt(true, 'Cool, you have transfered ' + amt + ' dollars from your ' + transFrom + ' account to your ' + transTo + ' account. Your new balance is ' + customer1.chkBal + ' dollars in your ' + transFrom +' account and ' + customer1.savBal + ' in your ' + transTo + ' account.');
assistant.ask(inputPrompt);
}
1 ответ
Вы не указали, используете ли вы API.AI или API действий напрямую, но похоже, что вы используете API действий. Кроме того, похоже, что вы пишете функцию линейно - как будто вы ожидаете assistant.ask()
остановить программу и дождаться ответа от пользователя. Это не как assistant.ask()
или действия в общем-то работают.
Думайте о Google Home как о веб-браузере, и ваше действие будет выполняться где-то на веб-сервере. assistant.ask()
эквивалентно отправке сообщения обратно в браузер и закрытию соединения (но не закрытию микрофона). Там нет никакой дополнительной обработки, которая может быть выполнена, поэтому наличие операторов после ask()
не имеет смысла.
Если вы используете API-интерфейс действий напрямую, вам необходимо отслеживать, в каком месте разговора вы находитесь (состояние - или какие вопросы уже заданы и какие ответы вы получили) и соответствующим образом выполнять различные пути кода.,
Возможно, вас больше заинтересует API.AI, который позволит вам строить диалоги более интерактивно и указывать только те команды, которые понадобятся вам для отправки информации. Используя API.AI, вашей логике программирования не нужно отслеживать, где вы находитесь в диалоге - вы строите конечный автомат и путь диалога через API.AI.