1. 调用流程与职责
每轮用户消息对应两次独立请求:后端先请求主路由,再请求选中的业务 Workflow。两类 Workflow 各自通过 Webhook 接收请求并返回响应。
- 后端 → 主路由
session_id · content · history · statecontext(可选);state = 上轮保存值 - 主路由 → 后端
target_workflow · state本轮调用目标与交接状态 - 后端 → 业务 Workflow
session_id · content · history · statecontext(可选);state = 主路由返回值 - 业务 Workflow → 后端
code · script · state后端按 code 查库展示,保存 state
| 参与方 | 职责 |
|---|---|
| 后端 | 提供对话和已保存的状态;按 target_workflow 请求业务;按 code 从话术库选择并展示话术,保存完整 state。 |
| 主路由 | 结合本轮输入、历史对话和已有状态,选择本轮目标;决定原状态保留或清空。 |
| 业务 Workflow | 处理本轮输入,返回话术编码 code、联调参考 script 和完整 state,结束本轮执行。 |
other Workflow | 处理需求不明确等情况,返回澄清或兜底话术的编码与联调参考,保留已有业务状态。 |
同一会话只保留一个待续接业务。下一轮由后端携带新的对话与最新状态,再次请求主路由。
2. 请求与返回
2.1 公共请求
后端请求主路由和业务 Workflow 时,使用同一套字段。以下为尚无续接状态时的请求结构:
{
"session_id": "<会话标识>",
"content": "<本轮用户发言>",
"history": "<历史对话>",
"state": null
}
| 字段 | 类型 | 提供方式 | 含义 |
|---|---|---|---|
session_id | string | 每轮传入 | 会话标识。后端据此保存、取回状态与历史对话。 |
content | string | 每轮传入 | 本轮用户发言。 |
history | string | 每轮传入 | 本轮之前的历史对话内容。 |
state | object 或 null | 每次请求传入 | 请求主路由时使用上轮保存的状态;请求业务 Workflow 时使用本轮主路由返回的状态。 |
context | object | 按需传入 | 对话之外的业务背景,例如后端已查询到的服务资格、产品信息。 |
2.2 主路由返回
以上述空状态请求为例:
{
"target_workflow": "<业务workflow标识>",
"state": null
}
| 字段 | 类型 | 含义 |
|---|---|---|
target_workflow | string | 本轮需要调用的业务 Workflow 标识。需求不明确时选择 other。 |
state | object 或 null | 交给本轮业务的状态;保留或清空规则见第 3 节。 |
后端按 target_workflow 选择业务调用地址,沿用原请求的 session_id、content、history 和可选 context,将 state 设为主路由返回值,再请求目标业务。
2.3 业务 Workflow 返回
所有业务 Workflow(包括 other)统一返回 code、script 和 state。
交互完成时的返回:
{
"code": "<话术编码>",
"script": "<参考话术>",
"state": null
}
| 字段 | 类型 | 含义 |
|---|---|---|
code | string | 话术编码,后端据此从话术库选择实际展示的话术。 |
script | string | 参考话术,用于开发联调和调用测试时核对本轮处理结果。 |
state | object 或 null | 本轮处理后的完整续接状态。仍需用户反馈时返回状态对象;无待续接业务时返回 null。 |
后端根据 code 查询并展示话术,用业务返回的整份 state 替换本轮保存的状态,下一轮随请求传入主路由。
同一业务可以根据不同处理结果返回不同 code。编码对应的话术含义与 state 的后续处理保持一致,例如等待用户确认时,对应话术应询问是否认可。
3. state 结构与流转
3.1 状态结构
state: null 表示没有待续接业务。有待续接业务时使用以下结构,两处 <业务workflow标识> 保持一致:
{
"routing": {
"active_workflow": "<业务workflow标识>"
},
"workflows": {
"<业务workflow标识>": {
"status": "waiting_input",
"resume_from": "<续接入口>"
}
}
}
| 字段 | 类型 | 含义与更新方 |
|---|---|---|
routing.active_workflow | string | 当前待续接的业务 Workflow 标识,由业务根据处理结果设置。 |
workflows | object | 以业务 Workflow 标识为键,保存当前业务的一份续接记录,由业务 Workflow 更新。 |
workflows.<业务workflow标识>.status | string | 当前记录使用 waiting_input,表示等待用户反馈。 |
workflows.<业务workflow标识>.resume_from | string | 下一轮进入的业务处理分支,由该业务定义取值并更新。 |
workflows.<业务workflow标识>.variables | object,可选 | 该业务需要跨轮保留的值,内部字段由业务按需定义和更新。 |
每次业务新执行从入口开始:没有本业务记录时进入首次处理;已有记录时,通过入口 Switch 按 resume_from 进入相应分支。
3.2 本轮目标与待续接业务
| 字段 | 表达什么 |
|---|---|
target_workflow | 本轮调用哪个业务,由主路由返回。 |
state.routing.active_workflow | 当前保存了哪个业务的续接状态,由业务 Workflow 返回。 |
需求不明确时,本轮目标可以是 other,已有状态仍指向原业务。other 返回澄清话术编码及联调参考,保留原状态,下一轮再由主路由判断归属。
3.3 状态流转
| 本轮情况 | 主路由返回 | 业务 Workflow 返回的 state |
|---|---|---|
| 首次进入 | 目标业务标识 + state: null。 | 需要反馈时生成状态;交互完成时为 null。 |
| 继续当前业务 | 当前业务标识 + 原状态。 | 按本轮结果更新状态;交互完成时为 null。 |
| 明确切换业务 | 新业务标识 + state: null。 | 新业务从首次处理开始,返回自身状态,或完成后返回 null。 |
| 需求不明确 | target_workflow: "other" + 原状态。 | 保留原状态。 |
主路由决定旧续接状态的保留或清空;业务 Workflow 生成和更新具体业务状态。这里的“完成”指本项对话交互完成,外部业务事项按各自流程继续处理。
4. 业务扩展项
| 扩展项 | 定义与使用 |
|---|---|
| 业务 Workflow 标识 | 各业务定义标识;主路由据此选择,后端维护标识到调用地址的映射。 |
code 取值 | 按业务处理结果约定话术编码,与后端话术库对应。 |
resume_from 取值 | 各业务定义可续接入口,并配置对应的入口 Switch 分支。 |
variables 内部字段 | 业务定义需跨轮保留的值,随 state 返回并由后端保存。 |
context 内部字段 | 后端按需提供业务背景;同一轮的两次请求均携带该背景。 |
context 提供本轮处理所需的额外资料;variables 保留上轮业务处理形成的值。二者按具体业务需要使用。
调用示例
以下以扣费投诉的服务安排确认为例:后端按业务返回的编码展示核查安排并询问是否认可,用户可能认可、改问发票,或纠正当前理解。业务标识、话术编码、续接入口、对话排版和话术均为示例设定。
首次进入展示第一轮;其余三个场景分别从第一轮返回的投诉状态继续。
前置状态
本轮用户
本轮保存
下一轮
补充示例
业务标识与续接入口
| 示例业务 Workflow 标识 | 示例 resume_from | 处理分支 |
|---|---|---|
complaint(投诉) | handle_feedback | 处理对安排的认可、追问或异议。 |
complaint(投诉) | handle_adjustment | 已询问调整诉求,处理用户的具体要求。 |
invoice(发票) | collect_invoice_title | 处理用户提供的发票抬头。 |
verification(验证码) | verify_code | 处理本轮验证码或相关问题。 |
other(澄清 / 兜底) | — | 结合对话与已有状态返回澄清话术编码及联调参考,保留原业务记录。 |
用户只回答“不认可”时,示例投诉业务返回询问具体要求的话术编码,并保存 handle_adjustment;收到要求并给出新安排后,保存 handle_feedback,等待用户确认。
context:额外业务背景
后端已查询到服务资格和产品信息,通过 context 提供。后端请求主路由与业务 Workflow 时,均携带该背景。service_eligibility、product_name 是此示例自定义的字段。
{
"session_id": "S001",
"content": "这次扣费不对,我要投诉。",
"history": "",
"state": null,
"context": {
"service_eligibility": "eligible",
"product_name": "基础服务"
}
}
variables:验证码尝试次数
示例验证码业务通过 variables.attempts_used 保留已尝试次数。主路由已返回 target_workflow: "verification" 并保留原状态,后端请求验证码 Workflow:
{
"session_id": "S002",
"content": "222222",
"history": "[客服] 请输入 6 位验证码。\n[用户] 111111\n[客服] 验证码不正确,还可以尝试两次。",
"state": {
"routing": {
"active_workflow": "verification"
},
"workflows": {
"verification": {
"status": "waiting_input",
"resume_from": "verify_code",
"variables": {
"attempts_used": 1
}
}
}
}
}
验证服务确认本次为第二次失败,业务 Workflow 返回:
{
"code": "A_VERIFICATION_02",
"script": "验证码不正确,还可以尝试一次。",
"state": {
"routing": {
"active_workflow": "verification"
},
"workflows": {
"verification": {
"status": "waiting_input",
"resume_from": "verify_code",
"variables": {
"attempts_used": 2
}
}
}
}
}
attempts_used 使用验证服务返回的次数;用户追问“没收到验证码”等未进行有效校验的情况,次数保持。