Помощник Google Actions SDK не получает пользовательский ввод во время встроенного диалога?

У меня возникли проблемы с получением метода 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);
    }

person Wayne Hansen    schedule 06.03.2017    source источник


Ответы (1)


Вы не указали, используете ли вы API.AI или API действий напрямую, но похоже, что вы используете API действий. Также похоже, что вы пишете функцию линейно — как будто вы ожидаете, что assistant.ask() остановит программу и дождется ответа от пользователя. Это не то, как работают assistant.ask() или действия в целом.

Думайте о Google Home как о веб-браузере, и ваше действие будет выполняться где-то на веб-сервере. assistant.ask() эквивалентно отправке сообщения обратно в браузер и закрытию соединения (но не закрытию микрофона). Дополнительная обработка невозможна, поэтому операторы после ask() не имеют смысла.

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

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

person Prisoner    schedule 06.03.2017