如何在对话框流程中触发其他意图响应的意图

时间:2020-06-08 04:30:50

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

app.intent('Delivery', conv => {
  conv.ask("What a great day for Delivery!  We can provide more information on any of the categories shown below.");
  return axios.get(url).then((success) => {
    let items = {};
    for (let i of success.data.data) {
      let item = {};
      item.synonyms = [i.name];
      item.title = `${i.name}`;
      item.image = new Image({
        url: `${i.image}`,
        alt: 'Image alternate text',
      });
      item.description = `${i.description}`;
      items[i.id] = item;
    }
    conv.ask(new List({ title: 'Food Categories', items }));

  }).catch((error) => {
    conv.ask("Error in category");
  });
});

我在Dialogflow中有两个意图:

  1. 送货
  2. 产品

在交付意图中,动态存在来自API的类别。

在选择类别时,我只是想触发产品意图,以便用户可以从那里选择产品。

我如何触发选择类别的产品意图。

1 个答案:

答案 0 :(得分:0)

您最好的选择是将产品意图逻辑移至其自己的类或函数。这样,您就可以将代码用于其他用途,而不必复制和粘贴任何代码。因此,它使您的代码更灵活,更易于阅读。

是否选择函数或类取决于您自己。如果仅创建简单的响应,一个函数就足够了,但是如果发现自己一次又一次地导入/请求相同的类,那么一个类可能会更好。

这是NodeJS中带有Typescript的Welcome Intent类的示例:

/**
 * Welcome intent class
 */
export default class WelcomeIntent {
  invoke(conv: DialogflowConversation): DialogflowConversation {

    const greeting = this.getTimeOfDayGreeting();
    const response = "Welcome to my test app. How can I help?"

    const hasScreen = this.contextService.getContext(conv, "actions_capability_screen_output");

    if (hasScreen) {
      conv.ask(new Suggestions("What can I do?"));
    }

    conv.ask(greeting);
    return conv.ask(response);
  }

  private getTimeOfDayGreeting(): string {
    const currentHour = new Date().getHours();

    if (currentHour >= 6 && currentHour < 12) {
      return "Good morning.";
    } else if (currentHour >= 12 && currentHour < 18) {
      return "Good afternoon.";
    } else if (currentHour >= 18 && currentHour <= 23) {
      return "Good evening.";
    } else {
      return "Hello.";
    }
  }
}

每次我想欢迎用户时,我只返回welcomeIntent.invoke(),它就会欢迎用户。