Google操作跟进多个actions_intent_OPTION

时间:2018-05-30 14:53:34

标签: node.js actions-on-google dialogflow

我最近一直在玩Google Actions。我想创建一个流程,我进行转移。它包括3个步骤。

enter image description here

在第一步中,用户选择金额,然后是“来自”帐户,最后是“帐户”。

第一个意图具有transferMoney-followup输出上下文。 第二个intent将transferMoney-followup作为输入上下文,transferMoneyFromAccount-followup作为输出上下文。 第三个意图将transferMoneyFromAccount-followup作为输入上下文。

当我从第一个意图到第二个意图并且用户选择一个选项时,我可以访问第一个意图和那里的参数。

当我现在再次显示列表时,第三个意图在选择之后它永远不会到达那里并且代码永远不会被执行并且第二个意图再次被执行。我的猜测是我在上下文中做错了但却无法弄清楚是什么。

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)
});

如果您需要更多信息,请与我们联系。

编辑: 第一意图 enter image description here 第二意图 enter image description here 第三意图 enter image description here

1 个答案:

答案 0 :(得分:1)

问题是两个上下文的生命周期是2.这意味着它们将存在两个来自用户的回复。所以你的&#34; transferMoney-followup&#34;和&#34; transferMoneyFromAccount-followup&#34;上下文同时有效。面对这种情况时,Dialogflow最终会选择符合条件的第一个,并最终使用&#34; transferMoney.FromAccount&#34;意图。

你有几个解决方案。

第一个是最简单的 - 将寿命缩短为1.然而,这会产生一些副作用:

  • 如果用户说出使用后备意图处理的内容或者不匹配的内容,则上下文将用完。

  • 第一个上下文存储的参数在到达第三个Intent时会丢失。

稍微困难一些,但可能更好的是在您的履行代码中处理这些问题。您需要在&#34; transferMoney.ForAccount&#34;的意图处理程序中执行以下操作:

  • 将您需要的所有值复制到transferMoneyFromAccount-followup上下文(或具有足够长使用寿命的任何其他上下文)中,并确保生命周期设置为足够长&#34;。你甚至可以把它做得相当长。

  • transferMoney-followup的生命周期设置为0.这样可以清除它,以便下次用户说出来时不会被捕获。

根据您的需要,为您的其他意图处理程序执行相同类型的操作可能也是明智之举。