Действия Google Следите за несколькими действиями_intent_OPTION - PullRequest
0 голосов
/ 30 мая 2018

В последнее время я играю с Google Actions.Я хочу создать поток, где я делаю перевод.Он состоит из 3 шагов.

enter image description here

На первом шаге пользователь выбирает сумму, затем со счета и, наконец, до счета.

Первое намерение имеет выходной контекст transferMoney-followup.Второе намерение имеет transferMoney-followup в качестве входного контекста и transferMoneyFromAccount-followup в качестве выходного контекста.Третье намерение имеет transferMoneyFromAccount-followup в качестве входного контекста.

Когда я перехожу от первого намерения ко второму, и пользователь выбирает опцию, у меня есть доступ к первому и параметрам оттуда.

Когда я показываю теперь список снова на этот раз для 3-го намерения после выбора, он никогда не достигает там, и код никогда не выполняется, и 2-е намерение выполняется снова.Я предполагаю, что я делаю что-то не так с контекстами, но не могу понять, что.

const app = require('actions-on-google').dialogflow();
app.intent('transferMoney' , (conv, params) => {
    conv.ask("Sure, let's transfer " + params.amount +"...");
    let items = {
        title: 'Select an account to send money FROM',
        items: {}
    };
    for (let i = 0; i < conv.data.userInfo.banks[0].accountsInformation.accounts.length; i++) {
        let account = conv.data.userInfo.banks[0].accountsInformation.accounts[i];
        items.items[account.id] = {
            title: account.alias,
            description: account.balance + "$"
        }
    }
    conv.ask(new List(items));
});

//Create a Dialogflow intent with the `actions_intent_OPTION` event
app.intent('transferMoney.FromAccount', (conv, params, option) => {
    let amount = conv.contexts.get("transfermoney-followup").parameters.amount;
    let fromAccountId = option;
    conv.ask("Let's send that " + amount + " from " + fromAccountId);
    conv.ask("Where should we send them to ?");
    let items = {
        title: 'Select an account to send money TO',
        items: {}
    };
    for (let i = 0; i < conv.data.userInfo.banks[0].accountsInformation.accounts.length; i++) {
        let account = conv.data.userInfo.banks[0].accountsInformation.accounts[i];
        items.items[account.id] = {
            title: account.alias,
            description: account.balance + "$"
        }
    }
    conv.ask(new List(items));
});

//Create a Dialogflow intent with the `actions_intent_OPTION` event
app.intent('transferMoney.FromAccount.ToAccount', (conv, params, option) => {
    let amount = 0;
    let fromAccountId = 1;
    let toAccountId = 2;
    conv.ask("Let's send that " + amount + " from " + fromAccountId + " to " + toAccountId)
});

Дайте мне знать, если вам нужна дополнительная информация.

РЕДАКТИРОВАТЬ: 1-е намерение enter image description here 2-е намерение enter image description here 3-е намерение enter image description here

1 Ответ

0 голосов
/ 30 мая 2018

Проблема в том, что продолжительность жизни ваших двух контекстов равна 2. Это означает, что они будут существовать еще два ответа от пользователя.Таким образом, ваши контексты "TransferMoney-followup" и "TransferMoneyFromAccount-followup" действительны одновременно.Столкнувшись с этим, Dialogflow заканчивает тем, что выбирает первое, которое соответствует критериям, и заканчивает с намерением "TransferMoney.FromAccount".

У вас есть несколько решений.

Первоеэто самый простой способ - сократить срок службы до 1. Это, однако, имеет несколько побочных эффектов:

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

  • Параметры, которые были сохранены с первым контекстом, будут потеряны к тому времени, когда вы перейдете к третьему намерению.

Немного сложнее, но, вероятно, лучше обработать их в своем коде выполнения.Вам нужно сделать следующее в обработчике намерений для «TransferMoney.ForAccount»:

  • Скопируйте все необходимые значения в контекст transferMoneyFromAccount-followup (или любой другой контекст сдостаточно продолжительный срок службы) и убедитесь, что срок службы установлен на «достаточно долго».Вы даже можете сделать это довольно долго.

  • Установите срок жизни для transferMoney-followup равным 0. Это очистит его, поэтому его не поймают в следующий раз, когда пользователь скажет что-то.

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

...