Skip to content

[Bug]: 流式调用失败后分支不可用或继续生成时消息消失 #85

Description

@chenyme

Affected area

Conversations / streaming

Version or commit

v0.1.2

Environment

OS: 任意
Browser: Web 端
Deployment: local / Docker / separated frontend-backend 均可能
Model provider: 任意支持流式、工具调用或可能中途失败的模型提供方
Scenario: 流式回复、工具调用、上游报错、网络中断、继续生成、重试

Reproduction steps

  1. 打开一个已有会话,发送一条会触发较长流式输出或工具调用的消息。
  2. 让模型调用在中途失败,例如上游返回错误、工具调用失败、网络中断,或生成过程中主动/被动中断。
  3. 观察当前 assistant 消息是否保留已输出内容和工具轨迹。
  4. 点击继续生成或重试。
  5. 观察分支切换器、当前消息链路和后续消息是否稳定展示。

Expected behavior

调用失败或中断后,如果本轮已经产生可见内容、思考过程或工具调用轨迹,应该保留到当前 assistant 消息中,并将消息标记为 interrupted / failed,而不是让消息从当前分支中消失。

继续生成时,应基于这条已保留的 interrupted assistant 消息继续追加新的上下文,不应出现分支不可用、消息链断开、临时消息消失、或继续后看不到上一段输出的问题。

如果失败发生在没有任何可保留内容之前,也应该给出清晰错误状态,并确保分支选择回退到最近一个可用的服务端消息节点。

Actual behavior

在调用报错或调用失败后,有时会出现以下现象:

  • 当前分支变成不可用,分支切换器无法正常定位。
  • 已经流式输出过的内容在刷新或继续生成后消失。
  • 继续生成后,前一次失败消息没有稳定保留在当前消息链路中。
  • 本地临时消息和服务端真实消息之间切换时,可能导致当前可见分支跳变。

初步排查定位:

  • 后端已有 persistInterruptedMessageGeneration 逻辑,只会在已有 assistant 文本或工具轨迹时保留 interrupted 消息。
  • 如果失败发生在该逻辑成功落库之前,或没有满足保留条件,user/assistant 消息可能最终被标记为 error,默认上下文不会继续使用该失败分支。
  • 前端 pendingExchange 会先插入临时 user/assistant 消息,并设置临时分支选择;失败后依赖 reload() 拉取服务端消息并 reconcile 分支。
  • 如果服务端只落库了部分状态、reload 失败、或临时 ID 与真实 ID 切换窗口处理不稳定,就可能出现消息消失或分支不可用。
  • 继续生成目前要求 assistant 消息状态为 interrupted;如果失败消息被标记为 error 或没有保留内容,继续入口会不可用。

Logs, screenshots, or request samples

Configuration and deployment context

No response

Pre-submit checklist

  • I searched existing issues and pull requests.
  • I removed secrets, tokens, credentials, and personal data from this report.
  • This is not a security vulnerability report.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions