Google助手对话框流中的列表选项未给出正确的结果

时间:2019-01-17 17:47:46

标签: dialogflow actions-on-google googlebot

过去6-7天,我一直在探索Dialogflow,并创建了一个具有列表形式菜单的漫游器。

阅读了许多文章之后,我们知道我们需要使List中的事件之一actions_intent_OPTION才能正常工作。还必须了解,最重要的是我们需要actions_intent_OPTION的处理程序/意图。一旦用户点击“列表”选项之一,就会触发此意图。

现在,我正在努力为事件actions_intent_OPTION定义处理程序。我已经用“ actions_intent_OPTION-handler”的名称定义了意图,但是我找不到我可以在Dialogflow的实现部分中进行编码的代码,该代码将标识用户选择的选项并调用与该选项相关的意图。

我不是来自编码背景的人,我尝试了一个代码(index.js),但是在部署时没有给出任何错误,但是在模拟器上执行时会引发错误“由于空,无法将Dialogflow响应解析为AppResponse语音回复。”

重申我的要求,我正在寻找一个示例代码,该代码可以捕获用户(从列表中)选择的选项并触发已经定义的意图。

有关机器人,列表和意图的详细信息随附于此。

This is the list defined by me and currently iam trying to code to capture the Payment Due Date option (which has text Payment Due Date Electricity defined in list

Code in fulfillment section

Intents defined

注意-需要调用的意图是“ 1.1-ElectricityDetails-DueDate”

这里是代码->请不要问我,为什么我会使用某些代码,例如iam newbie :)。

'use strict';
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {dialogflow} = require('actions-on-google');
const app = dialogflow({debug: true});
//const agent = new WebhookClient({ request, response });
let intentMap = new Map();
app.intent('actions_intent_OPTION-handler', (conv, params, option) => {
  if (!option) {
    conv.ask('You did not select any item from the list or carousel');
  } else if (option === 'Payment Due Date Electricity') {
    //conv.ask('You are great');
    //intentMap.set('Default Welcome Intent', welcome);
    intentMap.set('1.1 - ElectricityDetails - DueDate',option);
  } else {
    conv.ask('You selected ' + option);
  }
});
//agent.handleRequest(intentMap);
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

1 个答案:

答案 0 :(得分:1)

您在这里有几个问题,因此很难准确地确定哪个是 real 问题,但是这些问题都归结为您的问题中的这一陈述:

  

请不要问我为什么我使用了一定的代码

我们知道您是新来的-我们都去过那里!但是在不了解代码应该做什么的情况下复制代码是一条冒险的道路。

这就是说,关于您的设计和代码的一些问题引起了我的注意:

混合库

您似乎正在加载Google Actions-on-Google库和dialogflow-fulfillment库。尽管您所做的大部分工作都是通过Google动作库进行的,但intentMap是d-f库所使用的。

您不能将两者混在一起。选择一个并了解如何注册处理程序以及如何选择这些处理程序。

使用Google动作注册处理程序

如果您使用的是a-o-g库,通常会使用类似

的方法创建app对象
const app = dialogflow();

然后向每个处理程序注册类似

app.intent( 'intent name', conv => {
  // handler code here
});

您将注册该应用程序以处理诸如

之类的请求和响应
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

具有对话流实现功能的注册处理程序

对话流实现方法类似,但建议创建一个Map,以从Intent Name映射到处理函数。像这样:

let intentMap = new Map();
intentMap.set( 'intent name', handlerFunction );

handlerFunction也是要用作处理程序的函数的名称。可能看起来像

function handlerFunction( agent ){
  // Handler stuff here
}

然后您可以创建一个代理,设置它应该使用的请求和响应对象,并告诉它使用该映射来找出要调用哪个Intent Handler的方法,例如

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

意图表示用户的行为,而不是您的用途

请记住,意图表示用户的操作。

您基于该操作执行的操作取决于很多事情。对于您的情况,一旦他们选择了一个选项,您就希望以与他们使用特定Intent触发它相同的方式进行答复。对吧?

您不会通过尝试触发该Intent来做到这一点。

您要做的是让两个处理程序都调用一个执行所需功能的函数。对此没有什么幻想-两者都只是在调用相同的函数,就像许多其他可以调用通用函数的代码一样。

不要尝试动态注册处理程序

与上一个问题有关,尝试在现有Handler内注册新的Handler不会做您想要的。到那时,已经为时已晚,并且已经调用了处理程序。

在某些情况下,这是有道理的-但它们很少,相差甚远,而且是非常非常高级的概念。一般来说,将所有处理程序注册在我上面概述的中央位置。