【问题标题】:How can I make Dialogflow agent greet user if they have used the action before?如果他们以前使用过该操作,我如何让 Dialogflow 代理迎接用户?
【发布时间】:2019-04-26 07:17:39
【问题描述】:

我正在使用 Google / Dialogflow 上的操作,并且我正在尝试创建一个功能,如果他们以前使用过该操作,它将以用户的名字打招呼,如果没有,将询问他们的名字。我试图通过履行将其映射到“欢迎意图”,但每当我尝试在模拟器上运行该操作时,我都会收到此错误:

Error 206: Webhook Error

如果这被映射到另一个意图,这最初是有意义的,但我想知道我是否收到此错误,因为您无法满足欢迎意图?

这是我在内联编辑器中使用的代码,这可能是问题所在:

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request,response) => {
  const agent = new WebhookClient({ request, response });


  function welcome(conv) {
      if (conv.user.last.seen) {
          conv.ask(`Welcome back ${name}!`);
    } else {
          conv.ask('Welcome to The app! My name is Atlas, could I get your name?');
   }}

  let intentMap = new Map();
  intentMap.set('Welcome Intent', welcome);
  agent.handleRequest(intentMap);

这怎么行不通?我需要实现用户登录吗?我是否需要使用可以写入 Firestore 数据库的函数?

感谢您的帮助或建议!

【问题讨论】:

  • 您的代码运行正常吗?也许 conv.user.last.seen 并不总是设置?在这种情况下,脚本会抛出类似cannot get seen of undefined
  • 看起来 OP 使用的是 Actions on Google 库语法,但使用的是 dialogflow 实现库。我会改用 AoG 做所有事情。

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


【解决方案1】:

让我们先弄清楚一些事情:

  • 可以满足您的欢迎意图。
  • 您确实不需要需要用户登录。虽然当然可以使用 Google Sign In for Assistant,但这并不能从根本上改变您的问题。
  • 您确实不需要需要使用写入 Firestore 数据库的函数。同样,您可以使用它,但这不会改变您的问题。

这不起作用的具体原因是因为在这种情况下,conv 参数包含 Dialogflow WebhookClient 而不是 actions-on-google Conversation 对象。

要获取带有参数的对话对象,可以调用conv.getConv(),它会给你一个带有user 参数的对象。所以这可能看起来像

function welcome(conv) {
  let aog = conv.getConv();
  if (aog.user.last.seen) {
      conv.ask(`Welcome back ${name}!`);
  } else {
      conv.ask('Welcome to The app! My name is Atlas, could I get your name?');
}}

但是,这仍然存在一些问题。最值得注意的是,尚不清楚name 的来源。我假设您将从用户存储对象中获取它,但您似乎没有这样做。

【讨论】:

    【解决方案2】:

    对于将来遇到此问题并且只想要一个直接的答案而无需搜索模棱两可的答案/文档的任何人,以下是逐步执行的操作:

    注意:我最终使用了 Google 登录方法,但即使这不是您的目标,我也会发布替代方法的链接。

    1) 导入谷歌模块上的动作。人们/教程没有显示的是您必须像这样导入库(用于用户登录):

    const {
       dialogflow,
       Permission,
       SignIn
    } = require('actions-on-google')
    

    而不是

    const dialogflow = require('actions-on-google')
    

    2) 使用此代码:

    const app = dialogflow({
          clientId: '<YOUR CLIENT ID from Actions on Google>',
     });
    
     app.intent('Start Signin', conv => {
          conv.ask(new SignIn('To get your account details'));
     });
    
    
      app.intent('Get Signin', (conv, params, signin) => {
            if (signin.status === 'OK') {
                   const payload = conv.user.profile.payload;
                   conv.ask(`Welcome back ${payload.name}. What do you want to do next?`);
           } else {
               conv.ask(`I won't be able to save your data, but what do you want to do next?`);
       }
            });
    

    这个函数会要求用户登录,下次你调用intent时,它会说“Welcome back name”,因为谷歌会自动保存它。

    这是替代method的链接:

    【讨论】:

      猜你喜欢
      • 2019-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 2020-05-12
      相关资源
      最近更新 更多