Как получить имя текущего намерения при выполнении Dialogflow? - PullRequest
0 голосов
/ 06 декабря 2018

Я хочу получить имя текущего намерения в выполнении, чтобы я мог иметь дело с различным ответом в зависимости от другого намерения, в котором я нахожусь.Но я не могу найти для него функцию.

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);

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

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

0 голосов
/ 07 декабря 2018

Нет ничего волшебного или особенного в использовании intentMap или создании одного обработчика намерений для каждого намерения.Все, что делает функция handleRequest(), это смотрит на action.intent, чтобы получить имя Intent, получить обработчик с этим именем из карты, вызвать его и, возможно, иметь дело с Promise, которое он возвращает.

Но еслиВы собираетесь нарушить соглашение, у вас должна быть очень веская причина для этого.Наличие одного обработчика намерений на каждое намерение позволяет очень четко определить, какой код выполняется для каждого соответствующего намерения, и это облегчает поддержку вашего кода.

Похоже, что причина, по которой вы хотите это сделать, заключается в том, чтозначительный дублирующий код между двумя обработчиками.В вашем примере это получает параметры 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 );
0 голосов
/ 06 декабря 2018

вы можете попробовать использовать "agent.intent", но нет смысла использовать одну и ту же функцию для двух разных целей.

...