如何在 Dialogflow 实现中获取当前意图的名称?
How to get current intent's name in Dialogflow fulfillment?
我想在实现中获取当前意图的名称,这样我就可以根据我所处的不同意图处理不同的响应。但是我找不到它的功能。
function getDateAndTime(agent) {
date = agent.parameters.date;
time = agent.parameters.time;
// Is there any function like this to help me get current intent's name?
const intent = agent.getIntent();
}
// I have two intents are calling the same function getDateAndTime()
intentMap.set('Start Booking - get date and time', getDateAndTime);
intentMap.set('Start Cancelling - get date and time', getDateAndTime);
您可以尝试使用 "agent.intent",但为两个不同的意图使用相同的函数没有意义。
request.body.queryResult.intent.displayName
将给出意图名称。
'use strict';
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
const agent = new WebhookClient({ request, response });
function getDateAndTime(agent) {
// here you will get intent name
const intent = request.body.queryResult.intent.displayName;
if (intent == 'Start Booking - get date and time') {
agent.add('booking intent');
} else if (intent == 'Start Cancelling - get date and time'){
agent.add('cancelling intent');
}
}
let intentMap = new Map();
intentMap.set('Start Booking - get date and time', getDateAndTime);
intentMap.set('Start Cancelling - get date and time', getDateAndTime);
agent.handleRequest(intentMap);
});
但是如果你在 intentMap.set
中使用两个不同的函数会更有意义
使用 intentMap
或为每个 Intent 创建一个 Intent Handler 并没有什么神奇或特别之处。 handleRequest()
函数所做的就是查看 action.intent
以获取 Intent 名称,从映射中获取具有该名称的处理程序,调用它,并可能处理它 returns 的 Promise。
但是如果你要违反公约,你应该有一个很好的理由这样做。每个 Intent 有一个 Intent Handler 可以非常清楚每个匹配的 Intent 正在执行什么代码,这使您的代码更易于维护。
看起来您想要这样做的原因是因为两个处理程序之间存在大量重复代码。在您的示例中,这是获取 date
和 time
参数,但也可能有更多参数。
如果这是真的,那就做程序员几十年来一直在做的事情:将这些任务推送到一个可以从每个处理程序调用的函数。所以你的例子可能看起来像这样:
function getParameters( agent ){
return {
date: agent.parameters.date,
time: agent.parameters.time
}
}
function bookingHandler( agent ){
const {date, time} = getParameters( agent );
// Then do the stuff that uses the date and time to book the appointment
// and send an appropriate reply
}
function cancelHandler( agent ){
const {date, time} = getParameters( agent );
// Similarly, cancel things and reply as appropriate
}
intentMap.set( 'Start Booking', bookingHandler );
intentMap.set( 'Cancel Booking', cancelHandler );
我想在实现中获取当前意图的名称,这样我就可以根据我所处的不同意图处理不同的响应。但是我找不到它的功能。
function getDateAndTime(agent) {
date = agent.parameters.date;
time = agent.parameters.time;
// Is there any function like this to help me get current intent's name?
const intent = agent.getIntent();
}
// I have two intents are calling the same function getDateAndTime()
intentMap.set('Start Booking - get date and time', getDateAndTime);
intentMap.set('Start Cancelling - get date and time', getDateAndTime);
您可以尝试使用 "agent.intent",但为两个不同的意图使用相同的函数没有意义。
request.body.queryResult.intent.displayName
将给出意图名称。
'use strict';
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
const agent = new WebhookClient({ request, response });
function getDateAndTime(agent) {
// here you will get intent name
const intent = request.body.queryResult.intent.displayName;
if (intent == 'Start Booking - get date and time') {
agent.add('booking intent');
} else if (intent == 'Start Cancelling - get date and time'){
agent.add('cancelling intent');
}
}
let intentMap = new Map();
intentMap.set('Start Booking - get date and time', getDateAndTime);
intentMap.set('Start Cancelling - get date and time', getDateAndTime);
agent.handleRequest(intentMap);
});
但是如果你在 intentMap.set
使用 intentMap
或为每个 Intent 创建一个 Intent Handler 并没有什么神奇或特别之处。 handleRequest()
函数所做的就是查看 action.intent
以获取 Intent 名称,从映射中获取具有该名称的处理程序,调用它,并可能处理它 returns 的 Promise。
但是如果你要违反公约,你应该有一个很好的理由这样做。每个 Intent 有一个 Intent Handler 可以非常清楚每个匹配的 Intent 正在执行什么代码,这使您的代码更易于维护。
看起来您想要这样做的原因是因为两个处理程序之间存在大量重复代码。在您的示例中,这是获取 date
和 time
参数,但也可能有更多参数。
如果这是真的,那就做程序员几十年来一直在做的事情:将这些任务推送到一个可以从每个处理程序调用的函数。所以你的例子可能看起来像这样:
function getParameters( agent ){
return {
date: agent.parameters.date,
time: agent.parameters.time
}
}
function bookingHandler( agent ){
const {date, time} = getParameters( agent );
// Then do the stuff that uses the date and time to book the appointment
// and send an appropriate reply
}
function cancelHandler( agent ){
const {date, time} = getParameters( agent );
// Similarly, cancel things and reply as appropriate
}
intentMap.set( 'Start Booking', bookingHandler );
intentMap.set( 'Cancel Booking', cancelHandler );