DialogFlow 跟进触发空响应

DialogFlow follow up triggers empty response

我有一个 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 案例,所以如果有人说 yesmetro_timetable 不理解他们的原始请求并要求他们重复它,它就会捕获它。如果 incidents.data 实际上有信息可以正确共享对话触发器并且 I have incidents 被正确读给用户。

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

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

  1. incidents.data 将是未定义的
  2. 尝试计算 incidents.data.length 会导致错误
  3. 由于程序崩溃,您的 webhook 没有 return 结果。由于您可能没有在 UI 中设置结果,因此 returned.
  4. 为空结果

你或许可以通过做一个测试来解决这个问题,比如(例如)

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

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

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

metro_timetable 意图的实现中,如果您回应需要确认的内容(即 - 当 "yes" 将是用户所说的内容),您将设置 timetable 上下文类似

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

然后您可以创建一个 Intent,检查 timetable 作为传入上下文,并具有等同于 "yes" 的训练短语。在那个 Intent 中,你会做你需要做的并做出回应。