我可以针对Google上的操作制作后续操作吗?

时间:2017-07-18 20:47:56

标签: actions-on-google

我知道我可以通过添加到我的actions.json深入链接到我的Google Home应用程序。

我也知道我可以从默认提供的app.StandardIntents.TEXT意图中解析原始字符串值,我目前正在这样做:

if(app.getRawInput() === 'make payment') {
    app.ask('Enter payment information: ');
}
else if(app.getRawInput() === 'quit') {
    app.tell('Goodbye!');
}

但Google上的动作是否会在创建后续意图时提供直接支持,可能是在某些用户语音输入之后?

会话流程的一个示例是:

确定Google,与我的应用对话。

欢迎使用我的应用,我可以订购您最近的购买或您保存的收藏。您更喜欢哪种?

最近购买。

我应该使用您的首选地址和付款方式吗?

好的,我已经下了订单。

3 个答案:

答案 0 :(得分:1)

我以前的答案在测试后无法正常工作。 这是经过测试的版本。



exports.conversationComponent = functions.https.onRequest((req, res) => {
  const app = new ApiAiApp({request: req, response: res});
  console.log('Request headers: ' + JSON.stringify(req.headers));
  console.log('Request body: ' + JSON.stringify(req.body));
  
  const registerCallback = (app, funcName)=>{
    if (!app.callbackMap.get(funcName)){
      console.error(`Function ${funcName} required to be in app.callbackMap before calling registerCallback`);
      return;
    }
    app.setContext("callback_followup", 1, {funcName});
  }

  const deRegisterCallback = (app)=>{
    const context = app.getContext("callback_followup");
    const funcName = app.getContextArgument("callback_followup", "funcName").value;
    const func = app.callbackMap.get(funcName);
    app.setContext("callback_followup", 0);
    return func;
  }

  app.callbackMap = new Map();
  app.callbackMap.set('endSurvey', (app)=>{
    if (app.getUserConfirmation()) {
      app.tell('Stopped, bye!');
    }
    else {
      app.tell('Lets continue.');
    }
  });

  app.callbackMap.set('confirmationStartSurvey', (app)=>{
    const context = app.getContext("callback_follwup");
    if (app.getUserConfirmation()) {
      registerCallback(app, 'endSurvey');
      app.askForConfirmation('Great! I\'m glad you want to do it!, do you want to stop?');
    } else {
      app.tell('That\'s okay. Let\'s not do it now.');
    }
  });

    



  // Welcome
  function welcome (app) {
    registerCallback(app, 'confirmationStartSurvey');
    const prompt = "You have one survey in your task list, do you want to proceed now?";
    app.askForConfirmation(prompt);
    
  }
 
  function confirmationCalbackFollowup (app) {
    const context = app.getContext("callback_followup");
    if (! context){
      console.error("ERROR: confirmationCallbackFollowup should always has context named callback_followup. ");
      return;
    }
    const callback = deRegisterCallback(app);
    return callback(app);
  }
  
  const actionMap = new Map();
  actionMap.set(WELCOME, welcome);
  actionMap.set('confirmation.callback.followup', confirmationCalbackFollowup );  
  app.handleRequest(actionMap);
});




之前的解决方案无法运行,因为每次调用action函数时都会生成app。我试图将回调函数保存到app.data中,但它不会存在下一个意图。所以我改变了另一种方式。将回调函数注册到函数内的app.callbackMap。无论如何它会在那里。

为了使它工作,一个重要的事情是Api.Ai需要在意图中定义上下文。 See the Api.Ai Intent here.

确保您拥有事件,背景和行动。否则,这个意图不会被触发。

如果您可以使用此解决方案,请与我们联系。抱歉我之前的错误解决方案。

感谢

答案 1 :(得分:0)

您能举例说明您正在尝试做的对话流程吗?

如果您可以使用API​​.AI,则会有Follow Up intents in the docs

答案 2 :(得分:0)

我不认为你的代码

<field name="one2many_field" context="{'default_field_name' : parent.last_added_value}">
    <tree string="Title" editable="bottom">
        <field name="field_name"/>
    </tree>
</field>

是个好主意。我建议您有两种不同的意图处理“付款信息”和“退出”。