状态处理程序

状态处理程序(简称“处理程序”)用于通过为最终用户创建响应和/或转换当前页面来控制对话。对于每轮对话,系统都会评估处理程序,而处理程序可能会影响会话。处理程序包含三种常规类型的数据:

术语 定义
处理程序要求 必须满足这些要求,才能使处理程序对会话产生影响。如果处理程序满足其要求并以某种方式影响会话,才可以说“已调用”处理程序。
处理程序 fulfillment 如果调用处理程序,则使用可选的 fulfillment 为最终用户创建响应。这些响应可以在静态代理数据中定义,也可以从网络钩子服务中动态检索。
处理程序转换目标 如果调用了处理程序,则使用可选的转换目标来更改当前页面。下一页只能是流初始页面或当前活跃流中的页面。

状态处理程序的类型有以下两种,而且处理程序要求也不同:

术语 定义
路线 当最终用户输入匹配某个意图和/或会话状态的某个条件得以满足时,系统将调用路由。具有意图要求的路由也称为意图路由。 仅具有条件要求的路由也称为条件路由
事件处理程序 事件处理程序在调用事件时调用。在收到意外的最终用户输入或发生网络钩子错误时,系统会触发一些内置事件。您还可以定义在对话之外发生什么情况时调用的自定义事件

处理状态处理程序共需三个步骤:

术语 定义
1.范围 处理程序必须在范围内才能对会话产生影响。范围取决于处理程序是应用于流、页面还是表单参数,也取决于关联的流是否处于活跃状态、关联的页面是否处于活跃状态,或者代理当前是否正在尝试填充关联的表单参数。
2. 评估版 范围内的每个处理程序都会被按顺序评估。如果处理程序的要求得到满足,则其通过了评估。
3. 通话 如果处理程序在范围内,并且通过了评估,则系统将调用它。系统会调用所有关联的 fulfillment,并且任何关联的转换目标都将应用到会话。

范围

要评估处理程序,该处理程序必须在“范围”内。“处理程序范围”是帮助您控制对话的重要且强大的工具。通过控制处理程序的范围,您可以控制:

X 错误
何时可以匹配意图
何时应检查条件
何时处理特定事件
何时可以发生页面转换
何时提供静态 fulfillment 响应
何时为动态响应调用启用网络钩子的 fulfillment

范围取决于处理程序是应用于流、页面还是表单参数,也取决于关联的流是否处于活跃状态、关联的页面是否处于活跃状态,或者代理当前是否正在尝试填充关联的表单参数。

详细的范围规则如下:

  • 应用于活跃流的路由:
    • 如果当前页面是流初始页面,则转换路由在范围内。
    • 如果当前页面不是流初始页面,则转换路由仅在满足意图要求时才会在范围内。
  • 应用于当前页面的路由在范围内。
  • 应用活跃流的事件处理程序位于范围内。
  • 应用于当前网页的事件处理脚本在范围内。
  • 应用于代理当前尝试填充的表单参数的事件处理脚本在范围内。

路由

路由有两个要求,而且必须提供其中一个或两个都提供。如果同时提供这两个要求,则必须同时满足这两个要求才能调用路由:

术语 定义
意图要求 意图,必须与当前对话轮次的最终用户输入相匹配。 如果路由具有意图要求,则称为“意图路由”
条件要求 条件,必须得以满足。如果路由具有条件要求,则称为“条件路由”

您可以将路由应用于流(流级路由)和页面(页面级路由)。例如,您可能会在以下情况下使用路由:

X 错误
当最终用户输入匹配某个意图时,该匹配应触发静态 fulfillment 响应。
当最终用户输入匹配某个意图时,该匹配应针对动态响应触发启用网络钩子的 fulfillment
当最终用户输入提供了必需的最终表单参数时,条件检查会触发会话转换到其他页面。
当最终用户输入提供特定的表单参数时,条件检查会触发静态 fulfillment 响应。
设置为 true 并强制页面转换的条件检查。

意图传播

正常情况下,当路由由于有匹配的意图而被调用时,该意图将被“使用”。除非新的最终用户输入触发了新的意图匹配,否则无法再次匹配所使用的意图。但是,在以下场景中,可以将意图匹配从一个流传播到另一个流:

  • flow F1 中的路由将 intent I1 作为要求,而将 flow F2 作为转换目标。
  • Flow F2 的路由也将 intent I1 作为要求。

在这种情况下,调用 flow F1 中的路由时,系统会针对单个最终用户输入将 intent I1 匹配两次,并同时调用这两个路由。

传播意图有助于:

X 资源项
将当前页面更改为其他流中的特定页面(转换目标流的路由具有特定的转换目标页面)。
为流的初始页创建一个条目消息(转换目标流的路由具有 fulfillment)。

路由组

构建代理时,您可能会发现许多页面都有一组通用的路由。要使路由可重复使用,您可以定义“路由组”。您可以创建这些可在流或整个代理中重复使用的群组资源。

例如,您可能想要让您的流来处理最终用户输入,如“I want to add a topping to my pizza”和“I want to change my drup size”。当流的多个页面中的任何一个页面处于活跃状态时,系统应处理这些输入。您可以定义两个具有意图的路由,以便为所有相关页面处理这些输入,但这将是大量重复的工作。您可以改为定义一次路由组,并在所有相关页面上添加对该组的引用。

流级别的路由组

流级路由组是以流作为父级创建的路由组资源。它们可在流内重复使用。

代理级路由组

代理级路由组是以代理作为父级创建的路由组资源。这些路由可在整个代理中重复使用,但不允许将路由转换为非符号化页面作为目标。

流级路由

流级路由是通过将流添加到流初始页来应用于流的路由。 这些类型的处理程序具有以下用例:

X 资源项
意图或条件要求在流初始页面范围内的处理程序。
意图要求在流中所有页面范围内的处理程序。

如需从控制台创建流级路由,请执行以下操作:

  1. 打开流初始页。
  2. 点击路线标题中的添加 按钮。
  3. 系统随即会打开路线修改面板。
  4. 提供路线字段。
  5. 点击保存

如需从控制台对流级路由重新排序,请执行以下操作:

  1. 打开流初始页。
  2. 点击路线标题。
  3. 系统会打开路线列表面板。
  4. 按所需顺序拖动路线。 或者,点击选项 菜单,然后选择 Move To

如需从控制台中删除流级路由,请执行以下操作:

  1. 打开流初始页。
  2. 点击路线标题。
  3. 系统会打开路线列表面板。
  4. 点击选项 菜单。
  5. 选择删除

页面级路由

网页级路由是应用于页面的路由。 这些类型的处理程序具有以下用例:

X 资源项
当特定页面处于活跃状态时,意图或条件要求在范围内的处理程序。

如需通过控制台创建页面级路由,请执行以下操作:

  1. 打开相应页面(不是流初始页)。
  2. 点击路线标题中的添加 按钮。
  3. 系统随即会打开路线修改面板。
  4. 提供路线字段。
  5. 点击保存

如需从控制台对页面级路由重新排序,请执行以下操作:

  1. 打开相应页面(不是流初始页)。
  2. 点击路线标题。
  3. 系统会打开路线列表面板。
  4. 按所需顺序拖动路线。 或者,点击选项 菜单,然后选择 Move To

如需从控制台中删除页面级路由,请执行以下操作:

  1. 打开相应页面(不是流初始页)。
  2. 点击路线标题。
  3. 系统会打开路线列表面板。
  4. 点击选项 菜单。
  5. 选择删除

事件处理程序

事件处理程序必须调用一个要求:

术语 定义
事件要求 必须调用的事件。事件通过其名称标识。在收到意外的最终用户输入或发生网络钩子错误时,系统会调用一些内置事件。您还可以定义在对话之外发生事情事情时调用的自定义事件。

您可以将事件处理脚本应用于流(流级事件处理脚本)、页面(页面级事件处理脚本)和参数(参数级事件处理脚本)。例如,您可能会在以下情况下使用事件处理程序:

X 资源项
当最终用户输入不匹配任何意图时,“无匹配”事件处理程序会提供特定的静态 fulfillment 响应。
计时器在您的系统中过期,您希望向最终用户提供具有特定静态 fulfillment 响应的提醒信息。

流级事件处理程序

流级事件处理程序是应用于流的事件处理程序。这些类型的处理程序具有以下用例:

X 错误
事件要求在流初始页面范围内的处理程序。
事件要求在流中所有页面范围内的处理程序。
处理由流中的所有页面共享的意外最终用户输入。
处理网络钩子错误(由流中的所有页面共享)。
处理系统调用的、由流中所有页面共享的自定义事件。

每个流都有针对 no-matchno-input 内置事件的事件处理脚本。这些事件处理脚本会在您创建流时自动创建,并且不能删除。

如需通过控制台创建流级事件处理脚本,请执行以下操作:

  1. 打开流初始页。
  2. 点击事件处理脚本标题中的添加 按钮。
  3. 系统会打开事件处理脚本面板。
  4. 提供事件处理脚本字段。
  5. 点击保存

如需从控制台删除流级事件处理脚本,请执行以下操作:

  1. 打开流初始页。
  2. 点击事件处理脚本标题。
  3. 系统随即会打开事件处理脚本列表面板。
  4. 将鼠标悬停在事件处理脚本上,然后点击删除 按钮。

页面级事件处理程序

页面级事件处理脚本是指适用于一个页面的事件处理脚本。这些类型的处理程序具有以下用例:

X 资源项
特定页面处于活跃状态时,在范围内有事件要求的处理程序。
处理特定于页面的意外最终用户输入。
处理特定于页面的网络钩子错误。
处理系统调用的特定于页面的自定义事件。

如需通过控制台创建网页级事件处理脚本,请执行以下操作:

  1. 打开一个页面(不是流初始页)。
  2. 如果没有事件处理程序标题,请点击添加状态处理程序,选择事件处理程序,然后点击应用
  3. 点击事件处理脚本标题中的添加 按钮。
  4. 系统会打开事件处理脚本面板。
  5. 提供事件处理脚本字段。
  6. 点击保存

如需从控制台删除页面级事件处理脚本,请执行以下操作:

  1. 打开一个页面(不是流初始页)。
  2. 点击事件处理脚本标题。
  3. 系统随即会打开事件处理脚本列表面板。
  4. 将鼠标悬停在事件处理脚本上,然后点击删除 按钮。

参数级事件处理程序

参数级事件处理程序是应用于表单参数的事件处理程序。它们也称为重新提示处理程序。这些事件处理程序不允许有自定义事件,因为它们专门用于在表单填充过程中处理无效的最终用户输入。

这些类型的处理程序具有以下用例:

X 资源项
当系统要求填入表单参数时,最终用户没有提供有效的输入。

如需通过控制台创建参数级事件处理脚本,请执行以下操作:

  1. 打开包含表单参数的页面。
  2. 点击相应参数。
  3. 系统会打开参数面板。
  4. 向下滚动到重新提示事件处理脚本部分,然后点击添加事件处理脚本
  5. 系统会打开事件处理脚本面板。
  6. 提供事件处理脚本字段。
  7. 点击保存

如需从控制台中删除参数级事件处理脚本,请执行以下操作:

  1. 打开包含表单参数的页面。
  2. 点击相应参数。
  3. 系统会打开参数面板。
  4. 向下滚动到重新提示事件处理脚本部分。
  5. 将鼠标悬停在事件处理脚本上,然后点击删除 按钮。

内置事件

以下事件是 Dialogflow 内置的并调用的。 有些事件受限于某些级层。

事件名称
流级 页面级 参数级 调用发生条件
sys.no-match-default
  • 对于页面级别:最终用户输入与范围内的处理程序的任何 intent 都不匹配。
  • 对于参数级别:最终用户输入不满足表单参数要求。
sys.no-match-[1-6] 如果您为这些数字排序的事件提供了处理程序,则系统会调用它们(而不是 sys.no-match-default),并且顺序为:sys.no-match-1sys.no-match-2、...
sys.no-input-default 未收到最终用户输入。可在以下情况下调用此项:
  • Dialogflow 接收空的最终用户文本输入。
  • Dialogflow 接收空白的最终用户音频输入,或者输入不包含任何可识别的语音。
  • 在最终用户的音频输入包含任何可识别的语音之前,会发生无语音超时
sys.no-input-[1-6] 如果您为这些数字排序的事件提供了处理程序,则系统会调用它们(而不是 sys.no-input-default),并且顺序为:sys.no-input-1sys.no-input-2、...
sys.invalid-parameter 网络钩子响应通过将 WebhookResponse.pageInfo.formInfo.parameterInfo.state 设置为 INVALID 使参数失效时调用。
sys.long-utterance 最终用户输入超出非生成式意图参数所匹配的长度上限(256 个字符)。如果未提供,Dialogflow 会将较长的用户话语视为 no-match。对于流式音频输入,此事件仅在客户端关闭音频流后触发。
webhook.error webhook 调用返回错误。仅在以下情况下才会调用此事件:1) 没有与 webhook 错误代码匹配的精细 webhook 事件处理脚本(例如 webhook.error.timeout);2) 如果原始路由中未设置转换目标,并且使用失败的 webhook 调用 fulfillment。如需了解详情,请参阅评估顺序部分。
webhook.error.timeout webhook 调用超时。只有当原始路由中没有设置使用失败的 webhook 调用 fulfillment 的原始路由时,系统才会调用 webhook 事件。如需了解详情,请参阅评估顺序部分。
webhook.error.bad-request webhook 返回了 400 Bad Request。只有当原始路由中没有设置使用失败的 webhook 调用 fulfillment 的原始路由时,系统才会调用 webhook 事件。如需了解详情,请参阅评估顺序部分。
webhook.error.rejected webhook 返回了 401 Unauthorized403 Forbidden。只有当原始路由中没有设置使用失败的 webhook 调用 fulfillment 的原始路由时,系统才会调用 webhook 事件。如需了解详情,请参阅评估顺序部分。
webhook.error.unavailable webhook 返回 503 Service AVAILABLE。只有当原始路由中没有设置使用失败的 webhook 调用 fulfillment 的原始路由时,系统才会调用 webhook 事件。如需了解详情,请参阅评估顺序部分。
webhook.error.not-found webhook 调用失败,因为网络钩子网址无法访问。只有当原始路由中没有设置使用失败的 webhook 调用 fulfillment 的原始路由时,系统才会调用 webhook 事件。如需了解详情,请参阅评估顺序部分。
flow-cancelled 最终用户请求取消流程。此事件由“包含取消的结束流程”页面触发,具体请参阅 END_FLOW_WITH_CANCELLATION 符号过渡目标
flow-failed 此流程无法完成给定任务。此事件由“包含失败的结束流程”页面触发,具体请参阅 END_FLOW_WITH_FAILURE 符号转换目标
flow-failed-human-escalation 最终用户请求与人工客服人员交谈。此事件由“包含人工提升的结束流程”页面触发,具体请参阅 END_FLOW_WITH_HUMAN_ESCALATION 符号过渡目标

自定义事件

您可以创建自定义事件和事件处理脚本。自定义事件用于处理与最终用户的对话之外发生的事件。例如,最终用户点击了一个按钮,经过一段时间后,可用库存在对话期间发生了变化,等等。

事件仅按名称标识。您应该避免使用以 sys.webhook. 开头的事件名称,以避免与内置事件冲突。

如需使用 API 调用事件,请参阅 Session 类型的 detectIntent 方法的 queryInput.event 字段。

选择会话引用的协议和版本

协议 V3 V3beta1
REST 会话资源 会话资源
RPC 会话接口 会话接口
C++ SessionsClient 不可用
C# SessionsClient 不可用
Go SessionsClient 不可用
Java SessionsClient SessionsClient
Node.js SessionsClient SessionsClient
PHP 不可用 不可用
Python SessionsClient SessionsClient
Ruby 不可用 不可用

评估顺序

系统会按特定顺序评估处理程序。以下通用规则适用:

  1. 仅评估范围内的处理程序。
  2. 只能调用满足要求的处理程序。
  3. 如果调用了没有转换目标的处理程序,则系统会继续评估处理程序列表。由于存在此规则,多个 fulfillment 可以向响应队列添加多个消息。
  4. 如果调用了具有转换目标的处理程序,则对处理程序列表的评估即会结束。
  5. 如果调用了具有 fulfillment 的处理程序,且 fulfillment 导致网络钩子错误:
    • 如果处理程序定义了转换目标,则网络钩子将静默失败。
    • 如果事件处理程序在事件范围内,则处理程序将处理事件,而处理程序列表评估将结束。
    • 如果事件范围内没有事件处理程序,则网络钩子将会失败且无任何提示。
  6. 当满足意图要求时,将使用该意图,因此只能调用为意图找到的第一个路由处理程序(如需了解异常详情,请参阅意图传播)。
  7. 当满足条件要求时,系统不会消耗条件,因此能够调用多个带有条件的路由。
  8. 当满足事件要求后,系统将使用事件,以便调用为事件找到的第一个事件处理程序。
  9. 处理程序调用堆栈可能会影响评估顺序。

评估包括三个阶段:

  1. 具有意图要求的路由按以下顺序进行评估:
    1. 页面级:按照提供的顺序应用到当前页面的各个路由。
    2. 页面级组:按照提供的顺序应用到当前页面的路由组
    3. 流级:按照提供的顺序应用到活跃流的路由。
    4. 流级组:按活跃的顺序应用活跃流的路由组
  2. 仅具有条件要求的路由会按以下顺序进行评估:
    1. 页面级:按照提供的顺序应用到当前页面的各个路由。
    2. 页面级组:按照提供的顺序应用到当前页面的路由组
    3. 流级(仅当当前页面为流起始页面时):路由按提供的顺序应用于活跃流的路由。
    4. 流级组(仅当当前页面为流起始页面时):应用于活跃页面的路由组流程。
  3. 事件处理程序按以下顺序进行评估:
    1. 参数级:应用于当前页面的表单参数的事件处理程序,代理会尝试按提供的顺序填充这些表单参数(重新提示处理程序)。
    2. 页面级:按提供的顺序应用于当前页面的事件处理程序。
    3. 流级:按提供的顺序应用于活跃流的事件处理程序。

符号转换目标

在为处理程序输入目标时,您可以输入特定流或页面,也可以输入符号转换目标:

符号转换目标
说明
START_PAGE 目标为同名活跃流的初始页面的转换。
END_FLOW 结束当前活跃的流并转换回到导致当前流的转换的页面。 另请参阅处理程序调用堆栈和流堆栈限制
END_FLOW_WITH_CANCELLATION 结束当前活跃的流并转换回到导致当前流的转换的页面。 调用页面可以使用 flow-cancelled 内置事件处理此转换。另请参阅处理程序调用堆栈和流堆栈限制
END_FLOW_WITH_FAILURE 结束当前活跃的流并转换回到导致当前流的转换的页面。 调用页面可以使用 flow-failed 内置事件处理此转换。另请参阅处理程序调用堆栈和流堆栈限制
END_FLOW_WITH_HUMAN_ESCALATION 结束当前活跃的流并转换回到导致当前流的转换的页面。 调用页面可以使用 flow-failed-human-escalation 内置事件处理此转换。另请参阅处理程序调用堆栈和流堆栈限制
END_SESSION 清除当前会话并转换到名为 END_SESSION 的特殊页面。下一个用户输入将在默认初始流初始页面上重启会话。
PREVIOUS_PAGE 转换到上一页,这导致转到当前页面。转换后,上一页中的页面状态将恢复。
CURRENT_PAGE 重新转换到当前页面。如果您希望代理重复执行某些操作,这将非常有用。

处理程序调用堆栈和流堆栈限制

当会话通过特定转换目标从流转换为流时,每个流都会推送到流堆栈

处理程序调用堆栈

当会话转换为 END_FLOW 时,它会返回到导致转换为已完成流的调用页面。在这种情况下,系统会保留处理程序调用堆栈。系统将跳过从调用页面中评估的所有处理程序,并将按顺序评估剩余处理程序。

例如:

  1. 页面 P 按以下顺序显示三个处理程序:H1H2H3
  2. 系统会评估 H1,但不会导致转换。
  3. 系统会评估 H2,它会导致转换流程 F
  4. F 中的页面转换为 END_FLOW
  5. 会话将返回到页面 P,页面的状态再次变为活动状态,并保留状态。
  6. 页面 P 中的处理程序评估会从保留的状态继续操作,因此 H3 会予以评估。

流堆栈限制

流堆栈的最大限制为 25。超出堆栈上限可能会导致从堆栈中弹出流,从而导致使用 END_FLOW 转换时出现意外行为。为避免这些潜在问题,请尽量减少 END_FLOW 转换之前的流向流转换次数。

如果流堆栈为空,END_FLOW 转换会结束会话。

设置条件

如需使用控制台设置conditions,您需提供以下三个逻辑选项之一:

  • 至少符合一个规则(或)
  • 符合每个规则 (AND)
  • 自定义表达式

为方便起见,您可以使用 AND/OR 选项为参数值创建简单或复合条件。

您可以对所有类型的条件(包括系统函数boolean constants)使用自由格式的自定义表达式选项。

例如,如需设置条件为通过测试的概率 10%,请选择自定义表达式选项,然后输入$sys.func.rand() < 0.1包含于状况字段:

设置自定义条件的屏幕截图