Skip to content

[fix]: 修复会话与失败请求恢复,完善 Provider 错误分类和展示 - #1

Merged
Daniel-ChenJH merged 9 commits into
mainfrom
fix/session-compaction-recovery
Sep 7, 2026
Merged

[fix]: 修复会话与失败请求恢复,完善 Provider 错误分类和展示#1
Daniel-ChenJH merged 9 commits into
mainfrom
fix/session-compaction-recovery

Conversation

@wentaopoly

@wentaopoly wentaopoly commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator

概要

修复会话恢复、失败请求压缩和 Provider 确定性拒绝恢复,并完善上游错误展示。

会话恢复与压缩

  • Resume 按真实时间恢复最近 10 个 turn,保留失败、取消或中断的 journal 内容;结合顺序与时间对齐 canonical 与 journal,避免重复文本导致错误去重。
  • 手动 /compact 同时考虑 canonical 历史、turn journal 与失败 Provider WAL,使用与 turn 内压缩一致的 planner;连续失败保留恢复基线,压缩后的后续 turn 可继续压缩。

Provider 拒绝恢复

  • 三种 adapter 区分上下文超限、请求过大、媒体拒绝与普通确定性请求拒绝,按已接受响应边界恢复;保留已接受进度和已清理的媒体前缀。
  • sidecar 保护崩溃恢复窗口;turn 终态后清理残留记录,避免重放旧回滚。上下文拒绝仍可进入压缩恢复;发送结果不明确时保留必要的安全边界。
  • 媒体拒绝仅接受结构化 invalid_imageinvalid_image_urlimage_too_largeunsupported_imageunsupported_media_type 及仅正文提到图片的普通错误不会触发附件剥离。
  • HTTP 413 与既有 WS 大消息识别保持原语义;附件剥离后重试,并在 resume 后保持清理结果。

错误展示与维护性

  • 优先显示上游结构化 message;缺少非空消息时显示正文,按 UTF-8 边界截断至 1000 字节并附省略号。结构化消息不受该兜底长度限制。
  • 展示与恢复分类分离,回显文字不扩大附件剥离、重试或压缩的分类范围。
  • 不主动附加请求正文、鉴权头或损坏响应帧。上游消息可能包含输入片段、URL 等信息,并沿用现有错误日志和 session 事件链路落盘;这是已确认的展示边界。
  • 统一错误码白名单与公共分类函数,保留各协议既有差异。
  • 删除 TUI 兜底分支的 Edit the prompt, retry, or /exit to finalize,保留 Attention 标题、虚线框和启动失败提示。
  • 同步相关 PRD,移除已解决的待拍板项。

验证

  • 格式、Clippy、类型检查及完整 Rust 测试已通过;最近一次完整验证包括 2822 项 library 测试。
  • 独立代码审查及修复后复审完成,无待修复的非过度防御 P0/P1 问题。
  • 本次手工复验:真实 deepseek-v4-flash、关闭 WS、reasoning max,覆盖工具调用、退出、resume 与后续对话。
  • 实际生成非空摘要并落盘;补充降低原文保留预算的实验,压缩边界从 11 推进至 34,压缩后正确回答此前验收标记。
  • 本地错误服务器 + 真实 TUI 分别验证 Content-Type 415、正文含媒体字样的普通 400、明确媒体拒绝、HTTP 413;前两种不剥离,后两种 warning 后剥离并重试;四种场景 resume 后均可继续对话,成功运行的 TUI stderr 为空。
  • 本次另行重跑 5 项定向测试:错误展示、三种 adapter 分类隔离、TUI 失败兜底。
  • 本次提交内容开源检查:未发现真实密钥、内部域名、个人路径或测试运行产物。
  • 合入后按需触发 release workflow,确认三平台测试与构建。

验收说明:working_note 当前只保存在进程内存,跨进程 resume 后列表为空;未把此列表的持久化作为本 PR 实现内容。历史信息在压缩后可继续用于对话,已单独验证。

后续范围

  • sidecar 与 journal 的记录整合属于非阻塞长期整理,当前继续保留崩溃恢复快照。
  • 删除失败 turn / 丢弃 WAL 的新命令暂缓,不在本 PR 范围内。
  • fix/provider-history-recovery 的修复已整合到本 PR,无需再次单独合并。

lu-xury and others added 9 commits September 3, 2026 19:57
- 复用当前 turn 的已压缩状态,继续压缩既有摘要与新增工具结果
- 保留 turn、canonical 边界及上下文续写尾部保护
- 补充连续自动压缩和上下文满后强制压缩的完整工具循环回归测试
- 接入确定性拒绝的 WAL 回滚与 journal 恢复,接受内部响应后清除发送歧义
- 统一利用错误 code/type 分类,只有明确媒体错误才触发媒体清理重试
- 二次拒绝丢弃失败 turn,保留历史媒体清理边界及跨 identity 重建语义
- 修复 continuation 原始/发送窗口差异,以及连续 context 拒绝后的再次压缩
- 补充恢复与协议回归测试,保持连续压缩修复并同步核心行为文档
- 手动压缩前收束残留拒绝恢复,避免下次输入覆盖新摘要
- 三类 adapter 在续写前保存独立响应快照与恢复游标
- 非流式 fallback 正文写入 journal,续写失败仍保留已接受内容
- 增加跨 adapter、WAL 重建和 journal checkpoint 回归测试
- 保留工具参数恢复、Finalizing resume 与拒绝恢复两侧逻辑
- 解决协议与测试冲突,补齐 Chat 拒绝字段测试初始化
- 合并结果通过 2878 项 Rust 测试、静态检查及终端回归
- 上下文窗口拒绝只取决于请求内容,不再被更早的发送歧义降级为 TerminalFailure,仍进入压缩重试
- 拒绝恢复 sidecar 在对应 turn 写下终态后只删除记录,不再重放回滚覆盖之后的 compaction 写入
- 删除 provider_compaction_before_turn 的死兜底分支
- 补齐 Provider 确定性拒绝恢复 PRD 与核心行为文档,新增两条回归测试
- 仅依据明确的结构化图片错误码触发附件剥离,移除错误正文推断逻辑
- 将 unsupported_media_type 保留为普通请求拒绝,避免误删历史附件
- 补齐 HTTP、SSE 和 WebSocket 分类回归,保持 413 与 WS 1009 恢复行为
- 使用状态等待和就绪信号稳定 Maintainer、MCP 与后台进程测试
- 同步 PRD;通过全量测试、九组 TUI 及 resume 验收和 P0/P1 复审
- 展示上游错误原因,限制无消息时的正文兜底长度,保持恢复分类边界不变
- 集中维护错误码白名单,保留各协议既有的重试与拒绝识别范围
- 移除 TUI 失败兜底中的通用编辑提示,同步 PRD 已完成事项与日志边界
- 补充分类和展示回归测试,验证真实模型压缩及错误场景恢复
@Daniel-ChenJH Daniel-ChenJH changed the title [fix]: 修复会话恢复、失败 turn 压缩与 Provider 确定性拒绝恢复 [fix]: 修复会话与失败请求恢复,完善 Provider 错误分类和展示 Sep 7, 2026
@Daniel-ChenJH
Daniel-ChenJH merged commit 2b01363 into main Sep 7, 2026
2 checks passed
@Daniel-ChenJH
Daniel-ChenJH deleted the fix/session-compaction-recovery branch September 7, 2026 08:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants