Dialogflow es Google上的操作-处理dialogflow中的旋转木马响应

Dialogflow es Google上的操作-处理dialogflow中的旋转木马响应,dialogflow-es,actions-on-google,google-assistant-sdk,Dialogflow Es,Actions On Google,Google Assistant Sdk,我使用DialogFlow创建了一个简单的GoogleAssistant界面,其中有几个旋转木马,我希望能够链接在一起。但是,每当我触摸旋转木马选项时,它总是转到指定了actions\u Intent\u option事件的第一个意图。我可以使用语音命令访问我的所有屏幕,但我不知道如何处理触摸命令以发送给用户正确的意图 webhook中的当前代码: const party = 'party'; const cocktail = 'cocktail'; const SELECTED_ITEM_RE

我使用DialogFlow创建了一个简单的GoogleAssistant界面,其中有几个旋转木马,我希望能够链接在一起。但是,每当我触摸旋转木马选项时,它总是转到指定了actions\u Intent\u option事件的第一个意图。我可以使用语音命令访问我的所有屏幕,但我不知道如何处理触摸命令以发送给用户正确的意图

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()行,那么我会得到“Item selected”。。。但是如果我尝试使用app.intent代码,它会说我只是得到一个空的语音响应

我试图创建一个名为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);

这里有几个关于使用选项的问题。让我们把一些事情弄清楚

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

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

正如您所注意到的,您需要使用事件
actions\u Intent\u选项创建意图

处理此问题的代码可能如下所示,尽管还有其他处理方法:

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');
  }
});
我可以为每个旋转木马触发不同的意图吗?

对。为此,在发送转盘时,您将设置OutgoingContext并删除为转盘创建的任何其他OutgoingContext(将其寿命设置为0)。然后,您将创建一个将此上下文作为IncomingContext的意图

如果您使用的是google library上的操作,那么发送旋转木马的代码可能与此类似

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实现库,则可能与之类似,尽管存在一些差异:

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});
如果使用,响应配置可能如下所示:

{
  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
    }
  ]
}
捕获此选项建议的意图可能如下所示:

{
  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
    }
  ]
}

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

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

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

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

为什么代码不起作用?

线路

app.intent('actions.intent.OPTION', (conv, params, option) => {
可能不会像你想的那样。除非这是Dialogflow中意图的名称,否则处理程序中将看不到字符串
actions.Intent.OPTION
。这也是您如何在google library上的操作中注册意图处理程序


看起来您还将dialogflow fulfillment library注册意向处理程序的方式与google library上的操作混合在一起,后者通过
carousel()
函数注册意向处理程序。不要这样做。(这也可能是回复不正确的部分原因。)

为了进一步澄清,我希望从dialogflow carousel中获取“项目选项键”文本,并使用相同的名称调用DF intent。感谢@CAPRINT的回复。我会更新这篇文章,告诉你为什么我在里面放了carousel()。在你发布的代码中,你会在确认列表中询问DF中意图的名称吗?哇,是的。从其他地方复制了它,并打算将其更改为与我显示的意图相同的内容。编辑。我还澄清了各种库的代码。