Appearance
删除消息节点
删除消息节点用于让一条已有消息退出当前会话的有效历史。节点先在当前会话项目和当前用户作用域内定位会话,再按消息 ID 删除该会话中的有效消息;删除成功后,普通的消息列表、会话历史和后续模型上下文不再包含该消息。

适用场景
- 移除测试会话中写错、重复或不应继续参与上下文的消息。
- 删除不再适用的用户输入或助手回答。
- 在符合业务审计和数据留存规则的前提下,清理会话中的指定消息。
- 删除带工具调用过程的助手回答及其关联中间消息。
节点每次接收一个目标消息 ID。它不会删除整个会话,也不会自动删除目标消息之前或之后的普通问答消息。
使用前提与作用域
- 目标会话必须存在,并属于当前会话项目和当前用户。
- 目标消息必须属于该会话,且当前仍是有效、未删除状态。
conversationName可以填写会话名称;当前执行器也会优先把该值尝试作为会话 ID 查找。- 使用名称查找时不区分大小写;如果存在同名会话,选择最近更新的一条。
messageId应来自“创建消息”或“查询消息列表”的实际输出,不要手工猜测。- 资源库工作流试运行应关联目标应用,使运行上下文提供会话项目;缺少会话项目时返回
isSuccess=false。 - 有明确会话项目时,会按当前用户的项目访问权限执行。
推荐把唯一的 conversationId 传给 conversationName,并使用同一会话查询得到的 messageId。这样可以避免同名会话或跨会话消息 ID 导致未命中。
添加与配置节点
- 在工作流画布中单击“添加节点”。
- 选择“消息节点”中的“删除消息”。
- 配置目标会话和目标消息 ID。
- 将
isSuccess接入条件分支。 - 成功后重新查询消息列表或会话历史,确认目标消息及可能的关联消息已经退出有效历史。
- 试运行时使用专门创建的测试会话,不要直接删除生产会话中的消息。
输入参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
conversationName | String | 是 | 消息所属会话名称;当前执行器也支持传入会话 ID。节点定义不预置非空默认值,截图中的 Default 只是示例配置 |
messageId | String | 是 | 要删除的消息 ID,必须属于解析出的目标会话 |
两个参数均可填写固定值或引用上游变量。参数在去除首尾空白后不能是空字符串;缺失或空白会触发必填参数错误,而不是返回成功。
会话和消息定位
节点按以下范围定位目标:
- 使用当前运行上下文中的会话项目和当前用户限定可访问数据。
- 先把
conversationName当作会话 ID 查找。 - 未命中时,再把它当作会话名称进行不区分大小写的查找。
- 在解析出的会话中按
messageId查找尚未删除的消息。
即使消息 ID 在其他会话中真实存在,只要它不属于本次解析出的会话,节点仍会返回 isSuccess=false。其他用户的消息、已删除的消息和已经随清空历史失效的消息同样不能再次删除。
删除范围
普通消息
删除普通用户消息、普通助手消息或其他单独消息时,只删除指定 ID 对应的消息:
- 会话本身继续存在。
- 其他普通消息不会因为时间相邻而自动删除。
- 删除一条用户消息不会自动删除后续助手回答。
- 删除一条普通助手回答不会自动删除前面的用户消息。
因此,单独删除问答链中的某条消息可能使剩余历史语义不连贯。需要移除完整一轮问答时,应先查询并确认相关消息,再按业务规则逐条处理。
带工具过程的助手回答
当前存储实现对 answer 类型的目标消息有额外处理:如果该回答带有 chat_id,删除回答时会同时删除同一 chat_id 下的以下中间消息:
function_calltool_responsetool_outputfollow_upverbose
这样可以避免最终回答被删除后,工具调用和过程消息仍孤立地留在有效历史中。节点输出不会告诉下游级联删除了多少条消息;验收时应重新查询完整消息列表。
直接删除某一条中间消息时,不会反向自动删除对应的最终回答。
输出参数
| 参数 | 类型 | 说明 |
|---|---|---|
isSuccess | Boolean | 是否成功找到并删除目标消息 |
节点只输出布尔值,不返回被删除消息、删除数量或关联消息列表。下游应当显式判断:
true:目标消息已从有效历史中删除。false:常见原因是缺少会话项目、会话不存在、消息不存在、消息不属于该会话,或消息已经被删除。- 参数缺失、空白、权限校验失败或存储服务异常可能使节点直接执行失败,而不是统一返回
false。
首次成功删除后,使用相同参数再次执行会返回 false,因为目标消息已经不再是有效消息。不要把第二次的 false 误判为第一次删除没有生效。
当前版本的执行逻辑
节点执行时按以下顺序处理:
- 解析运行上下文中的会话项目和当前用户。
- 校验
conversationName和messageId均为非空值。 - 资源库运行上下文没有会话项目时,直接返回
isSuccess=false。 - 按“会话 ID 优先、名称兜底”的方式定位当前用户的有效会话。
- 在该会话中查找相同
messageId且未删除的目标消息。 - 删除目标消息;如果目标是带
chat_id的answer,同时删除关联的工具和过程消息。 - 把底层结果中的
isSuccess或deleted标准化为节点唯一输出。
逻辑删除与可见性
当前持久化存储实现通过写入删除时间进行逻辑删除,普通读取只查询尚未删除的记录。因此:
- 查询消息列表、查询会话历史和后续上下文组装不再返回目标消息。
- 修改消息节点也不能再命中已经删除的消息。
- 删除节点没有恢复或撤销入口,也不返回原消息内容。
- 逻辑删除不等于数据立即从底层介质物理擦除;审计、备份和数据保留仍取决于部署策略。
内存测试后端会直接从内存集合移除消息,但对工作流可见结果相同:后续普通读取不再看到它。
对模型上下文的影响
删除成功后,后续基于该会话重新组装上下文的模型调用不再使用目标消息。但需要注意:
- 已经生成并保存的助手回答不会因为上游消息被删除而自动重新生成。
- 删除用户消息不会自动删除后续回答,可能留下无法解释的孤立回答。
- 删除助手回答也不会自动重新调用模型生成替代回答。
- 删除带工具过程的
answer会同步移除同一调用链的中间消息,但不会删除对应的用户问题。
如果需要重建一轮对话,应明确决定保留哪些消息、删除哪些消息,并在删除完成后重新调用模型和写入回答。
推荐编排
删除已知消息
取得 conversationId → 查询消息列表 → 人工或规则确认 messageId → 归档必要内容 → 删除消息 → 判断 isSuccess → 再次查询确认
不要把查询其他会话得到的消息 ID 与当前会话混用。
删除带工具过程的回答
查询消息列表 → 确认目标为 answer 及其 chat_id 调用链 → 删除 answer → 判断成功 → 重新查询确认回答和中间消息均消失
节点不会输出级联删除清单,所以重新查询是必要的验收步骤。
移除完整问答
查询并确认用户消息和回答消息 → 按留存规则归档 → 删除回答 → 删除用户消息 → 分别判断结果 → 重新查询
删除回答时可能同时清理工具过程,但用户消息仍需单独删除。
试运行与验收
建议使用专门的测试会话:
- 创建测试会话,并保存其
conversationId。 - 创建一条带唯一测试文本的消息,并保存
messageId。 - 使用该会话 ID 和消息 ID 执行删除节点。
- 确认首次执行
isSuccess=true。 - 查询消息列表,确认目标消息已经不存在,而会话和其他消息仍然存在。
- 使用相同参数再次执行,确认返回
isSuccess=false。 - 使用其他会话和同一消息 ID 执行,确认返回
false且不会影响原会话。 - 使用空白消息 ID 执行,确认节点明确报必填参数错误。
- 如果测试回答包含工具过程,删除该回答后确认同一
chat_id的中间消息一并消失,用户问题仍保留。
常见问题与处理
| 现象 | 原因 | 处理 |
|---|---|---|
isSuccess=false | 会话或消息未命中、作用域不匹配、消息已删除,或资源库没有会话项目 | 核对应用关联、当前用户、会话 ID 和消息 ID;重新查询消息列表 |
| 提示参数必填 | 会话或消息 ID 为空,或引用的上游变量没有值 | 在上游增加非空校验,并检查变量路径 |
消息确实存在但仍返回 false | 传入了错误会话,或消息属于其他用户、项目或已清空的历史 | 使用同一会话的查询结果重新取得 ID |
第一次成功,第二次变成 false | 第一次已经删除,第二次无法再次命中有效消息 | 以首次结果和重新查询为准,不要盲目重试 |
| 删除用户消息后助手回答仍存在 | 普通消息不按问答轮次级联删除 | 按业务规则确认并单独删除受影响回答 |
| 删除回答后工具过程也消失 | answer 与同一 chat_id 的中间消息会一起删除 | 这是当前一致性处理;删除前先确认调用链范围 |
| 想恢复消息但没有入口 | 节点不提供撤销或恢复能力 | 删除前归档必要内容;误删时按业务恢复流程重新写入 |
| 删除后模型没有重新回答 | 节点只删除历史,不调用模型 | 在成功分支重新调用模型并按需创建回答消息 |
| 需要证明底层已经物理擦除 | 当前持久化实现是逻辑删除 | 按数据治理流程处理保留期、备份和物理清理 |
与旧文档的核对结论
| 旧文档内容 | 当前处理 |
|---|---|
| 每次只能指定一个消息 ID | 保留,与当前节点定义一致 |
| 需要会话名称和消息 ID | 保留;补充 conversationName 也支持会话 ID,且两个值均不能为空 |
| 消息 ID 来自查询消息列表 | 保留;补充也可使用创建消息的输出,并且 ID 必须属于本次目标会话 |
| 删除后模型可见历史同步移除该消息 | 保留并细化;后续普通读取不再返回,但已有模型回答不会自动重算 |
输出只有 isSuccess | 保留;补充首次删除与重复删除的结果差异,以及节点不返回删除数量或原消息 |
| 每次只删除一条消息 | 调整说明;输入目标只有一条,但删除带 chat_id 的 answer 时会级联删除关联工具和过程消息 |
| 可以删除静态会话或动态会话中的消息 | 不作为当前契约沿用;当前实现按项目、用户和会话 ID/名称作用域定位,没有该分类参数 |
| 资源库试运行需要关联智能体或应用 | 调整;当前节点需要会话项目,通常由关联应用提供;缺失时返回 false |
| 旧页面操作截图 | 不沿用;以当前系统的节点面板和字段截图为准 |
发布前检查
- 已优先使用唯一
conversationId,没有依赖可能重复的会话名称。 messageId来自同一会话的创建或查询结果。- 已确认业务允许删除这条消息,并满足审计和数据留存要求。
- 需要恢复或审计时,已在删除前归档原消息和必要关联信息。
- 已评估删除目标后剩余问答历史是否仍然语义完整。
- 删除
answer前已确认同一chat_id下工具和过程消息的级联范围。 - 下游先判断
isSuccess,成功后重新查询确认实际可见结果。 - 已避免把重复删除返回的
false误判为首次删除失败。