Параметр списка в диалоговом потоке для помощника Google не дает правильных результатов

Я изучаю Dialogflow последние 6-7 дней и создал бота, у которого есть меню в виде списка.

После прочтения множества статей мы узнали, что нам нужно иметь событие actions_intent_OPTION в одном из намерений, чтобы List работал правильно. Также стало известно, что помимо этого нам нужен обработчик / намерение для actions_intent_OPTION. Это намерение сработает, когда пользователь выберет одну из опций списка.

Теперь я изо всех сил пытаюсь определить обработчик для события actions_intent_OPTION. Я определил намерение с именем «actions_intent_OPTION-handler», но я не могу найти код, который я могу ввести для раздела выполнения Dialogflow, который будет идентифицировать параметр, выбранный пользователем, и вызывать намерение, связанное с этим параметром.

Я не являюсь специалистом по программированию, и я пробовал один код (index.js), но при развертывании не выдает никаких ошибок, однако при выполнении на симуляторе выдает ошибку «Не удалось проанализировать ответ Dialogflow в AppResponse из-за пустого речевого ответа. "

Повторяя свое требование, я ищу образец кода, который может фиксировать параметр, выбранный пользователем (из списка), и запускать уже определенное намерение.

Подробная информация о боте, списке и намерениях прилагается.

Это список, определенный мной, и в настоящее время я пытаюсь создать код, чтобы зафиксировать параметр даты платежа (который в списке указан текст «Срок платежа за электричество»

Код в разделе выполнения

Определены намерения

Примечание. Намерение, которое необходимо вызвать: «1.1 - ElectricityDetails - DueDate».

Вот код -> Пожалуйста, не спрашивайте меня, почему я использовал определенный фрагмент кода, как новичок :).

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

person gagandeep singh    schedule 17.01.2019    source источник
comment
Пожалуйста, не размещайте свой код как изображение. Это делает его очень трудным для чтения и помогает вам отлаживать. Обновите свой вопрос, разместив код в самом вопросе.   -  person Prisoner    schedule 18.01.2019
comment
@Prisoner, когда я копирую код, он приходит в нечитаемом формате без пробелов между ними. Можете ли вы посоветовать мне, как скопировать код и заставить каждую строку работать правильно?   -  person gagandeep singh    schedule 18.01.2019
comment
Самый простой способ - вставить код, выделить его, а затем нажать кнопку {}, чтобы отформатировать его как код. Вы также можете увидеть справку для редактора по адресу stackoverflow.com/editing-help   -  person Prisoner    schedule 18.01.2019
comment
Я включил код, пожалуйста, предложите. Заранее спасибо.   -  person gagandeep singh    schedule 18.01.2019
comment
@Prisoner - Я просмотрел много таких статей, но не могу решить свою проблему. Пожалуйста помоги.   -  person gagandeep singh    schedule 21.01.2019


Ответы (1)


У вас есть несколько проблем, поэтому трудно сказать, какая именно проблема настоящая, но все они сводятся к следующему утверждению в вашем вопросе:

Пожалуйста, не спрашивайте меня, почему я использовал определенный фрагмент кода

Мы понимаем, что вы новичок - мы все были там! Но копирование кода без понимания того, что он должен делать, - рискованный путь.

Тем не менее, есть несколько вещей в вашем дизайне и коде, которые бросаются мне в глаза как проблемы:

Смешивание библиотек

Кажется, вы загружаете как библиотеку действий в Google, так и библиотеку выполнения диалога. Хотя большая часть того, что вы делаете, выполняется с помощью библиотеки actions-on-google, intentMap - это то, что используется библиотекой d-f.

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

Зарегистрируйте обработчики с помощью actions-on-google

Если вы используете библиотеку a-o-g, вы обычно создаете объект app с чем-то вроде

const app = dialogflow();

а затем зарегистрируйте каждый обработчик с помощью чего-то вроде

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

Вы зарегистрируете приложение для обработки запроса и ответа примерно так:

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

Зарегистрируйте обработчик с исполнением диалогового потока

Подход с выполнением диалогового потока аналогичен, но он предлагает создать Map, который отображает имя намерения на функцию-обработчик. Что-то вроде этого:

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

Где handlerFunction - это также имя функции, которую вы хотите использовать в качестве обработчика. Это может выглядеть примерно так

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

Затем вы можете создать агента, установить объекты запроса и ответа, которые он должен использовать, и указать ему использовать карту, чтобы выяснить, какой обработчик намерений вызывать с помощью чего-то вроде

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

Намерения представляют то, что делает пользователь, а не то, что вы с ним делаете

Помните, что намерения представляют собой действие пользователя.

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

Вы не делаете этого, пытаясь вызвать это намерение.

Что вы делаете, так это то, что оба обработчика вызывают функцию, которая делает то, что вы хотите. В этом нет ничего необычного - оба вызывают одну и ту же функцию, как и многие другие коды, которые могут вызывать общие функции.

Не пытайтесь динамически регистрировать обработчики

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

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

person Prisoner    schedule 22.01.2019