Могу ли я создать последующие действия в Actions on Google?

Я знаю, что могу добавить ссылку на свое приложение Google Home, добавив в свой файл actions.json.

Я также знаю, что могу анализировать необработанные строковые значения из намерения app.StandardIntents.TEXT, предоставленного по умолчанию, что я сейчас делаю так:

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

Но обеспечивает ли Actions on Google прямую поддержку для создания последующих намерений, возможно, после определенного голосового ввода пользователя?

Пример потока разговора:

Окей, Google, поговори с моим приложением.

Добро пожаловать в мое приложение, я могу заказать вашу последнюю покупку или сохраненную вами любимую. Что бы вы предпочли?

Недавняя покупка.

Следует ли мне использовать ваш предпочтительный адрес и способ оплаты?

Да

Хорошо, я разместил ваш заказ.


person Alan Wang    schedule 18.07.2017    source источник


Ответы (3)


Мой предыдущий ответ не сработает после тестирования. Вот проверенная версия.

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

Предыдущее решение не будет работать, потому что приложение создается каждый раз при вызове функции действия. Я попытался сохранить функцию обратного вызова в app.data, но при следующем намерении ее не будет. Так что я изменился по-другому. Зарегистрируйте функцию обратного вызова в app.callbackMap внутри функции. так что он все равно будет там.

Чтобы это работало, важно, чтобы у Api.Ai был контекст, определенный в намерении. См. намерение Api.Ai здесь.

Убедитесь, что у вас есть событие, контекст и действие. в противном случае это намерение не сработает.

Пожалуйста, дайте мне знать, сможете ли вы использовать это решение. извините за мое предыдущее неправильное решение.

Благодарность

person user3423762    schedule 21.07.2017

Можете ли вы привести пример потока разговора, в котором есть то, что вы пытаетесь сделать?

Если вы можете использовать API.AI, у них есть намерения в документации.

person Shuyang Chen    schedule 19.07.2017

Я не думаю, что твой код

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

хорошая идея. Я бы посоветовал вам иметь два разных намерения для обработки «Платежной информации» и «Выйти».

person user3423762    schedule 21.07.2017
comment
Я согласен с вами, но есть ли способ сделать последующие намерения (т. Е. Связанные намерения)? Пока я знаю только, как создавать отдельные намерения, которые все являются точками входа в приложение. - person Alan Wang; 21.07.2017