Наблюдение за DialogFlow вызывает пустой ответ - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть намерение в DialogFlow, с которым мне тяжело.Это единственное продолжение моего основного намерения, и проблема, с которой я столкнулся, заключается в том, что когда массив incidents.data пуст, он не вызывает оператор conv.ask в другом случае и заставляет DialogFlow выдавать пустой речевой ответ.ошибка.Код выглядит примерно так:

app.intent('metro_timetable - yes', async (conv: any) => {
  const incidents = await serviceIncidents.getIncidents();
  if (incidents.data.length > 0) {
    conv.ask('I have incidents')
  } else {
    conv.ask(
      `I wasn't able to understand your request, could you please say that again?`
    );
  }
});

incidents.data сохраняется в глобальной области видимости и устанавливается глубоко в намерении metro_timetable.Он хранит инцидент для последующего наблюдения.Поскольку все ответы yes инициируют последующее наблюдение, я настраиваю еще один случай, поэтому он ловит его, если кто-то говорит yes, когда metro_timetable не понимает их первоначальный запрос и просит их повторить его.Если incidents.data на самом деле имеет информацию для правильного обмена триггерами диалога и I have incidents правильно читается пользователю.

В DialogFlow это выглядит примерно так.Где я тут ошибаюсь?

enter image description here

enter image description here

enter image description here

1 Ответ

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

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

  1. incidents.data будет неопределенным
  2. Попытка оценки incidents.data.length приведет к ошибке
  3. , так каксбой программы, ваш webhook не возвращает результат.Поскольку вы, вероятно, не устанавливали результат в пользовательском интерфейсе для намерения, был возвращен пустой результат.

Вы, вероятно, можете решить эту проблему, выполнив такой тест, как (например)

incidents && incidents.data && incidents.data.length > 0

Другая ваша проблема, однако, заключается в том, что у вас есть заданное значение для сценария, в котором вы на самом деле не хотите, чтобы это было продолжением.Это одна из причин, по которой вам, вероятно, не следует использовать Followup Intents, а вместо этого только устанавливать контекст, когда вы отправляете ответ, где этот контекст имеет смысл, и ищите ответ «Да» в определенном вами контексте.Затем, когда metro_timetable не понимает запрос, вы не устанавливаете контекст и выдает ошибку.

Для этого вы удалили бы автоматически сгенерированный контекст metro_timetable-followup из двух Intents,Вы создадите свой собственный контекст, который я назову timetable для целей этого примера.

В выполнении для metro_timetable Намерения, если вы ответите чем-то, что требует подтверждения (то есть - когда«да» будет что-то, что пользователь скажет), вы бы задали контекст timetable с чем-то вроде

conv.contexts.set('timetable',2);
conv.ask('Are you sure?');

. Затем вы можете создать Intent, который проверяет timetable как входящий контекст и проводит обучениефразы, которые эквивалентны «да».В этом намерении вы будете делать то, что вам нужно, и отвечать.

...