ChatV2 / Interrupt / Resume

智能体确认与表单接口调用流程图

描述从创建 Session、初始化聊天、提交 Pre-dispatch 确认、填写表单,到使用 Action 消息更新卡片状态的完整调用顺序、参数继承关系和关键返回值。

接口:/chat/create → /chatv2 响应:interrupt / action 关键机制:resume 恢复中断

核心规则

初始化时 question 必须为空

调用初始化事件时传 "question": """event_type": "init"

stage / agent_type 不应写死

正式调用时根据用户所选智能体确定;仅允许调试阶段临时写死。

Resume 标识必须原样继承

session_id、路由参数及 resume 内相关标识必须与上一条 interrupt 返回保持一致。

Action 用于更新历史卡片

使用 action_id 查找此前 interrupt_idaction_id 相同的消息并切换状态。

总流程图

蓝色表示前端请求,紫色表示需要用户处理的 interrupt,绿色表示更新已有卡片状态的 action。

1

创建 Session

POST /chat/create

请求:title

保存返回的 session_id

2

初始化聊天

POST /chatv2

question = ""

event_type = init

I

确认 Interrupt

question_type = confirm

渲染确认 / 取消按钮

缓存完整 interrupt 标识

3

提交确认 Resume

POST /chatv2

action = confirm

confirmed = true

I

表单 Interrupt

card_type = form_card

渲染 form_definition

保存 submit_params

表单 Interrupt4. 提交表单 ResumeAction:更新卡片状态有后续表单?是:返回下一条 Interrupt / 否:流程结束
前端请求 Interrupt:创建待处理卡片 Action:更新已有卡片

逐步调用说明

1

POST/chat/create

创建一个新聊天 Session,后续所有请求均复用返回的 Session ID。

请求 Body
{
  "title": "c2"
}
关键返回值

保存新建会话的 ID,并作为后续请求的 session_id。示例流程中使用 "510"

2

POST/chatv2 · 初始化聊天

以 init 事件启动所选智能体。正常进入 Pre-dispatch 确认时,返回 event=interrupt

请求 Body
{
  "session_id": "510",
  "stage": "enrollment",
  "agent_type": "patient_common",
  "question": "",
  "event_type": "init",
  "event_payload": {
    "projectId": "35",
    "patientId": "73"
  }
}
调用注意

question 为空;stageagent_type 根据所选智能体动态传入。

返回字段前端用途
interrupt_id 等标识完整缓存,供第 3 步 resume 原样提交。
question_type=confirm使用确认框展示。
title / message确认框标题与正文。
confirm_text / cancel_text确认与取消按钮文案。
emit_operation_message=true提交时,前端先显示对应的用户操作消息。
confirm_operation_message用户确认时显示的用户消息。
cancel_operation_message用户取消时显示的用户消息。
查看完整 Confirm Interrupt 示例
event: interrupt
{
  "event": "interrupt",
  "interrupt_id": "c91812370b62437ab76d75a5efa651ba:init_crf_01_form_confirm",
  "thread_id": "510",
  "request_id": "c91812370b62437ab76d75a5efa651ba",
  "action_code": "init_crf_01_form_confirm",
  "action_type": "message_ask",
  "origin_type": "llm_node",
  "origin_node_code": "pre_dispatch_confirmation",
  "origin_tool_name": "pre_dispatch_confirmation",
  "required": true,
  "action_params": {
    "question_type": "confirm",
    "title": "您是否现在要做入组评估",
    "question": "张瑞玥 嘱托 [小每] 一定要在健康管理服务前,评估您的当前的个人状态,以便为您提供更契合您自身情况的服务,请“立即评估”吧~",
    "message": "张瑞玥 嘱托 [小每] 一定要在健康管理服务前,评估您的当前的个人状态,以便为您提供更契合您自身情况的服务,请“立即评估”吧~",
    "confirm_text": "立即评估",
    "cancel_text": "暂不评估",
    "status": "pending",
    "emit_operation_message": true,
    "confirm_operation_message": "我要立即评估",
    "cancel_operation_message": "暂不评估,以后再说"
  },
  "requestId": "c91812370b62437ab76d75a5efa651ba",
  "seq": 4
}
3

POST/chatv2 · Pre-dispatch 确认提交

用户点击确认后,用上一条 Confirm Interrupt 的标识恢复流程;随后通常返回表单 Interrupt。

一致性约束

session_idstageagent_type 及 resume 内的 interrupt_idrequest_idaction_codeaction_typeorigin_node_codeorigin_tool_name 必须与第 2 步返回一致。

确认请求 Body
{
  "session_id": "510",
  "stage": "enrollment",
  "request_id": "c91812370b62437ab76d75a5efa651ba",
  "agent_type": "patient_common",
  "resume": {
    "interrupt_id": "c91812370b62437ab76d75a5efa651ba:init_crf_01_form_confirm",
    "request_id": "c91812370b62437ab76d75a5efa651ba",
    "action_code": "init_crf_01_form_confirm",
    "action_type": "message_ask",
    "origin_node_code": "pre_dispatch_confirmation",
    "origin_tool_name": "pre_dispatch_confirmation",
    "response": {
      "question_type": "confirm",
      "action": "confirm",
      "confirmed": true
    }
  }
}
表单 Interrupt 字段前端用途
card_type=form_card渲染表单卡片。
form_definition表单定义,用于生成字段与控件。
title / message卡片标题与说明文字。
allow_skip_form为 false 时不显示取消/跳过按钮。
skip_form_text跳过填写按钮文案。
submit_form_text提交按钮文案。
submit_params提交表单时必须附带的业务参数。
4

POST/chatv2 · 表单提交

将表单值与 submit_params 组装到 resume.response.form_data 中。

一致性约束

session_id、路由参数、interrupt_idrequest_idaction_code 必须与第 3 步返回的表单 Interrupt 一致;question_typeaction 使用固定值。

表单提交请求 Body
{
  "session_id": "510",
  "agent_type": "patient_common",
  "stage": "enrollment",
  "resume": {
    "interrupt_id": "c91812370b62437ab76d75a5efa651ba:init_crf_01_form",
    "request_id": "c91812370b62437ab76d75a5efa651ba",
    "action_code": "init_crf_01_form",
    "response": {
      "question_type": "form",
      "action": "submit_form",
      "form_data": {
        "recordId": 504,
        "formData": {
          "fasting_glucose": 100,
          "sample_type": "VENOUS_BLOOD",
          "test_method": "GLUCOMETER",
          "hba1c": "4.7%",
          "ga": "1%"
        }
      }
    }
  }
}
固定字段

response.question_type = "form"
response.action = "submit_form"

有后续表单

除 Action 状态消息外,还会继续返回下一条 event=interrupt,前端渲染下一张表单卡片。

无后续表单

仅返回 event=action,用于标记当前表单卡片的最终状态。

5

处理 Action 消息 · 更新确认/表单卡片状态

Confirm 提交和表单提交的结果均通过 event=action 更新已有消息,不创建新的待处理卡片。

Interrupt 卡片

interrupt_id = X
action_params.status = pending

Action 更新同一卡片

action_id = X
status = finished
submit_status = success

前端匹配规则

收到 Action 后,用 action_id 查找此前 interrupt_idaction_id 相同的消息,然后更新其状态与结果文案。

Action 完整示例
{
  "event": "action",
  "request_id": "c91812370b62437ab76d75a5efa651ba",
  "session_id": "510",
  "action_id": "c91812370b62437ab76d75a5efa651ba:init_crf_01_form",
  "action_code": "init_crf_01_form",
  "action_type": "message_ask",
  "origin_type": "llm_node",
  "origin_node_code": "interaction_policy",
  "origin_tool_name": "interaction_policy",
  "action_result_message": "表单提交成功",
  "action_params": {
    "status": "finished",
    "submit_status": "success",
    "title": "init_crf_01_form"
  }
}

字段继承矩阵

建议前端将每条 Interrupt 的原始标识与 action_params 一起保存,构造 Resume 时直接读取,避免手工拼接错误。

字段初始化请求确认 Resume表单 Resume规则
session_id来自创建 Session原样沿用原样沿用整个调用链保持一致。
stage按所选智能体确定原样沿用原样沿用不要在正式代码中写死。
agent_type按所选智能体确定原样沿用原样沿用不要在正式代码中写死。
interrupt_id来自确认 Interrupt来自表单 Interrupt每次使用最近待处理 Interrupt 的值
request_id来自确认 Interrupt来自表单 Interrupt与对应 Interrupt 一致
action_code来自确认 Interrupt来自表单 Interrupt与对应 Interrupt 一致
origin_node_code / origin_tool_name来自确认 Interrupt按返回契约携带需要时原样透传
response.question_type固定 confirm固定 form由当前卡片类型决定。
response.action固定 confirm固定 submit_form取消/跳过场景使用对应动作值。
action_id用于前端状态更新匹配历史消息的 interrupt_id 或 action_id。