n8n 多轮交互:输入输出约定

适用于需要用户补充信息、确认处理结果或提出新诉求的多轮交互。本文约定后端、n8n 主路由与业务 Workflow 之间传递的对话、话术和会话状态。

采用“每轮新执行 + 状态回传”:

公共字段与 state

请求字段

字段类型提供方式含义
session_idstring每轮传入同一会话保持一致,后端据此保存、取回状态和历史对话。
contentstring每轮传入本轮用户发言。
historystring每轮传入本轮之前的历史对话内容。
stateobject 或 null每次请求传入请求主路由时使用上轮保存的状态,无待续接业务时为 null;请求业务 Workflow 时使用本轮主路由返回的状态。
contextobject按需传入对话之外的业务背景,例如后端已查询到的服务资格、产品信息。

主路由返回后端

字段类型含义
target_workflowstring本轮需要调用的业务 Workflow 标识。需求不明确时为 other
stateobject 或 null继续当前业务或澄清时保留入参状态;明确切换业务时为 null。后端将此值传入本轮目标 Workflow。

首次没有业务状态时,主路由返回调用目标,并保留 state: null

{
  "target_workflow": "<业务workflow标识>",
  "state": null
}

后端按 target_workflow 选择调用地址,保留原请求中的 session_idcontenthistory 和按需提供的 context,将 state 设为主路由返回值,再请求业务 Workflow。

业务 Workflow 返回后端

字段类型含义
scriptstring本轮对外话术,由后端用于回复用户。
stateobject 或 null本轮业务处理后的续接状态;无待续接业务时为 null,否则包含完整的 routingworkflows

后端以业务 Workflow 返回的整份 state 作为本轮最终状态,下一轮与新的 content、更新后的 history 一起传入主路由。会话状态统一由后端保存。

state:业务归属、续接入口与变量

state: null 表示没有待续接业务。有待续接业务时,state 分为两层:routing 记录业务归属,workflows 保存处理进度与跨轮变量。下面是等待用户反馈时的状态结构,尖括号中的值由具体业务定义;两处 <业务workflow标识> 使用相同取值。

{
  "routing": {
    "active_workflow": "<业务workflow标识>"
  },
  "workflows": {
    "<业务workflow标识>": {
      "status": "waiting_input",
      "resume_from": "<续接入口>"
    }
  }
}
字段类型含义与更新方
routing.active_workflowstring当前待续接的业务 Workflow 标识,由业务根据处理结果设置。
workflowsobject以业务 Workflow 标识为键保存当前业务的一份续接记录,由业务 Workflow 更新。切换业务后,以新业务返回的状态替换原状态。
workflows.<业务workflow标识>.statusstring当前保留记录使用 waiting_input,表示等待用户反馈。
workflows.<业务workflow标识>.resume_fromstring下一轮进入的业务处理分支,由业务 Workflow 定义取值并更新。
workflows.<业务workflow标识>.variablesobject,可选业务需要跨轮保存的值,内部字段由业务按需定义和更新。

后端维护业务 Workflow 标识到调用地址的映射。resume_from 是业务内部约定的分支键,与入口 Switch 的分支配置对应。每次业务新执行从入口开始:没有本业务记录时进入首次处理;已有记录时按 resume_from 选择续接分支。

公共约定固定字段结构;各业务分别定义业务 Workflow 标识、可续接入口和需要保留的变量。

调用目标与业务状态

字段表达什么
target_workflow主路由选择的本轮调用目标。
state.routing.active_workflow已保存业务状态中的待续接归属,由业务 Workflow 返回。

主路由明确判定切换业务时,返回新调用目标和 state: null。后端携带空状态请求新业务,由新业务从首次处理开始,生成本轮话术与状态。

主路由负责决定旧续接状态是保留还是清空;业务 Workflow 负责生成和更新具体的业务状态。

需求不明确时,主路由返回 target_workflow: "other",同时保留原来的 state。本轮属于澄清,原业务仍待续接。other 结合本轮输入、历史对话和已有状态生成话术,返回原状态。

后端始终按 target_workflow 发起本轮业务请求。other 的本轮执行结束后,原业务仍可在后续路由判断中继续处理。

完成当前待续接业务时的返回

当前待续接的业务 Workflow 完成自身交互后,直接向后端返回话术和 state: null

{
  "script": "<本轮话术>",
  "state": null
}

首次没有业务状态、明确切换业务以及业务完成交互,均使用 state: null。本轮执行结束后仍需用户反馈时,继续返回状态对象。这里的完成指本项对话交互完成,外部业务事项按各自流程继续处理。