过去6-7天,我一直在探索Dialogflow,并创建了一个具有列表形式菜单的漫游器。
阅读了许多文章之后,我们知道我们需要使List中的事件之一actions_intent_OPTION
才能正常工作。还必须了解,最重要的是我们需要actions_intent_OPTION
的处理程序/意图。一旦用户点击“列表”选项之一,就会触发此意图。
现在,我正在努力为事件actions_intent_OPTION
定义处理程序。我已经用“ actions_intent_OPTION-handler”的名称定义了意图,但是我找不到我可以在Dialogflow的实现部分中进行编码的代码,该代码将标识用户选择的选项并调用与该选项相关的意图。
我不是来自编码背景的人,我尝试了一个代码(index.js),但是在部署时没有给出任何错误,但是在模拟器上执行时会引发错误“由于空,无法将Dialogflow响应解析为AppResponse语音回复。”
重申我的要求,我正在寻找一个示例代码,该代码可以捕获用户(从列表中)选择的选项并触发已经定义的意图。
有关机器人,列表和意图的详细信息随附于此。
注意-需要调用的意图是“ 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);
答案 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不会做您想要的。到那时,已经为时已晚,并且已经调用了处理程序。
在某些情况下,这是有道理的-但它们很少,相差甚远,而且是非常非常高级的概念。一般来说,将所有处理程序注册在我上面概述的中央位置。