Actions on Google - 处理来自对话流的轮播响应

2024-05-02

我使用 DialogFlow 创建了一个简单的 Google Assistant 界面,并希望能够将多个轮播链接在一起。每当我触摸轮播选项时,它总是转到指定了 actions_intent_OPTION 事件的第一个 Intent。我可以使用语音命令访问所有屏幕,但我不确定如何处理触摸命令以将用户发送到正确的意图。

webhook 中的当前代码:

const party = 'party';
const cocktail = 'cocktail';
const SELECTED_ITEM_RESPONSES = {
  [party]: 'You selected party',
  [cocktail]: 'You selected cocktail',
};

function carousel(agent) {
    //agent.add(`Item selected`);
    app.intent('actions.intent.OPTION', (conv, params, option) => {
      let response = 'You did not select any item from the list or carousel';
      if (option && SELECTED_ITEM_RESPONSES.hasOwnProperty(option)) {
        response = SELECTED_ITEM_RESPONSES[option];
      } else {
        response = 'You selected an unknown item from the list or carousel';
      }
      conv.ask(response);
    });
}

如果我保留agent.add()行,那么我会得到“项目已选择”...但如果我尝试使用app.intent代码,它会说我只是得到一个空的语音响应。

我试图创建 1 个名为 CarouselHandler 的意图来处理所有菜单选择。当该意图被事件击中时,我使用示例代码调用 carousel() 函数。

  let intentMap = new Map();
  intentMap.set('Default Welcome Intent', welcome);
  intentMap.set('Default Fallback Intent', fallback);
  intentMap.set('CarouselHandler', carousel);
  agent.handleRequest(intentMap);

您在这里有几个关于使用选项的问题。让我们尝试澄清一些事情。

我可以为每个选项触发不同的 Intent 吗?

不会。向 Dialogflow 报告选项的方式是所有选项都会触发相同的 Intent。您负责查看发送的选项字符串并根据需要调用另一个函数。

正如您所指出的,您需要使用事件创建一个意图actions_intent_OPTION.

尽管还有其他方法可以处理它,但处理此问题的代码可能看起来像这样:

app.intent('list.reply.click', (conv, params, option) => {
  // Get the user's selection
  // Compare the user's selections to each of the item's keys
  if (!option) {
    conv.ask('You did not select any item from the list or carousel');
  } else if (option === 'OPTION_1') {
    handleOption1( conv );
  } else if (option === 'OPTION_2') {
    handleOption2Or3( conv );
  } else if (option === 'OPTION_3') {
    handleOption2Or3( conv );
  } else {
    conv.ask('You selected an unknown item from the list, or carousel');
  }
});

我可以为每个轮播触发不同的 Intent 吗?

是的。为此,当您发送轮播时,您将设置一个 OutgoingContext 并删除为轮播创建的任何其他 OutgoingContext(将其生命周期设置为 0)。然后,您将创建一个将此 Context 作为 IncomingContext 的 Intent。

如果您使用 actions-on-google 库,发送轮播的代码可能如下所示

conv.ask("Here is menu 2");
conv.ask(new List({
  title: "Menu 2",
  items: {
    "OPTION_1": {
      title: "Option 1",
      description: "Description 1"
    },
    "OPTION_2": {
      title: "Option 2",
      description: "Description 2"
    },
    "OPTION_3": {
      title: "Option 3",
      description: "Description 3"
    },
  }
});
conv.contexts.set("menu_2",99);
conv.contexts.delete("menu_1");
conv.contexts.delete("menu_3");
// Don't forget to add suggestions, too

如果您使用dialogflow-fulfillment库,它会类似,但有一些差异:

let conv = agent.conv();
conv.ask("Here is menu 2");
conv.ask(new List({
  title: "Menu 2",
  items: {
    "OPTION_1": {
      title: "Option 1",
      description: "Description 1"
    },
    "OPTION_2": {
      title: "Option 2",
      description: "Description 2"
    },
    "OPTION_3": {
      title: "Option 3",
      description: "Description 3"
    },
  }
});

agent.add(conv);
agent.setContext({name:"menu_1", lifespan:0});
agent.setContext({name:"menu_2", lifespan:99});
agent.setContext({name:"menu_3", lifespan:0});

如果您正在使用多声部 https://multivocal.info/,响应配置可能如下所示:

{
  Template: {
    Text: "Here is menu 2",
    Option: {
      Type: "carousel",
      Title: "Menu 2",
      Items: [
        {
          Title: "Option 1",
          Body: "Description 1"
        },
        {
          Title: "Option 2",
          Body: "Description 2"
        },
        {
          Title: "Option 3",
          Body: "Description 3"
        }
      ]
    }
  },
  Context: [
    {
      name: "menu_1",
      lifetime: 0
    },
    {
      name: "menu_2",
      lifetime: 99
    },
    {
      name: "menu_3",
      lifetime: 0
    }
  ]
}

捕获此选项建议的意图可能如下所示:

处理此问题的代码与上面类似,只是使用不同的 Intent 名称。

如果处理程序之间存在重叠选项,它们可以调用实际执行工作的相同函数(同样,如上所示)。

如何以相同的方式处理语音和选项响应?

在某些情况下,AoG 将使用语音响应来触发该选项。这就是别名的用途。但即使除此之外,如果您有捕获用户短语的 Intent 和与选项一起使用的 Intent,您所需要做的就是让实现代码调用相同的函数。

为什么代码不起作用?

线路

app.intent('actions.intent.OPTION', (conv, params, option) => {

可能不会做你认为的那样。除非这是意图的名称在 Dialogflow 中, 字符串actions.intent.OPTION不会在您的处理程序中看到。这也是您向 actions-on-google 库注册 Intent 处理程序的方式。

看起来您也将注册 Intent 处理程序的对话流实现库方式与通过您的注册 Intent 处理程序的 actions-on-google 库方式混合在一起。carousel()功能。不要这样做。 (这也可能是无法正确返回回复的部分原因。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Actions on Google - 处理来自对话流的轮播响应 的相关文章

随机推荐