DialogFlow跟进触发空响应

时间:2018-12-27 14:52:37

标签: dialogflow actions-on-google

我在遇到DialogFlow意图方面遇到了麻烦。这是我主要意图的唯一跟进工作,而我遇到的问题是  incidents.data数组为空,在else情况下不会触发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响应都会触发跟进,所以我设置了else案例,以便当yes不理解他们的原始请求并要求他们重复该请求时,如果有人说metro_timetable,它将捕获该案例。如果incidents.data实际上有信息可以正确共享对话框触发器,并且I have incidents被正确读取给用户。

在DialogFlow中,它看起来像这样。我在哪里错了?

enter image description here

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

您的描述有些复杂,实际上incidents.data是如何设置的,但是听起来有可能不是将其设置为空数组,而是根本没有设置它。在这种情况下,我怀疑发生了以下情况:

  1. incidents.data将不确定
  2. 尝试评估incidents.data.length会导致错误
  3. 由于程序崩溃,您的Webhook不会返回结果。由于您可能未在意图的UI中设置结果,因此返回了空结果。

您可能可以通过进行测试(例如)来解决此问题

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

但是,您的另一个问题似乎是您为实际上不希望将其作为后续情况的场景设置了“跟踪意图”。这是您可能不应该使用后续意图的原因之一,而是仅在发送响应时设置一个上下文,该上下文有意义,然后在您定义的上下文中查找“是”响应。然后,当metro_timetable无法理解请求时,您无需设置上下文并给出错误。

为此,您将从两个Intent中删除自动生成的metro_timetable-followup上下文。您将创建自己的上下文,在本示例中,我将其命名为timetable

在实现metro_timetable意图的过程中,如果您回答需要确认的内容(即,当用户说“是”时),则可以使用一些内容来设置timetable上下文喜欢

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

然后,您可以创建一个Intent,用于检查timetable作为传入上下文,并具有与“ yes”等效的训练短语。在这种意图下,您将做您需要做的事情并做出回应。