Skip to content

[Bug] 上下文压缩失败后切换模型无法恢复会话历史 / Model switch loses context after failed compaction #224

Description

@voidcraft-dev

问题描述

在 PI-Desktop v0.14.6(Windows)中,长会话发生自动上下文压缩失败后,切换模型或继续对话会导致新模型无法看到压缩点之前的历史内容。

这不是会话记录被删除:聊天记录仍然存在于本地 SQLite 和 session JSONL 中,但没有被恢复到后续模型的 context。新模型会说类似“之前的具体任务内容无法读取”。

已核实的证据

本机当前会话的持久化记录仍然存在,包含 500 多条消息。会话中有一条 compaction 记录:

{
  "failureCode": "CONTEXT_COMPACTION_FAILED",
  "fallback": "retained_tail",
  "retainedTail": [],
  "tokensBefore": 273641
}

该 checkpoint 的 summary 明确表示:

Older messages before this checkpoint are omitted from the next model request.
The complete transcript remains available to the user.

在此之前还发生过 provider 错误(上游返回 sensitive_words_detected)。随后切换到其他模型后,模型只能看到压缩点之后的短上下文,而完整 transcript 仍可在本地恢复。

为保护隐私,没有附加完整 session、数据库或 API 凭据。

复现步骤

  1. 创建一个较长的 Agent 会话,使上下文接近模型窗口上限。
  2. 让自动 compaction 运行;如果摘要请求因 provider 错误、超时或其他原因失败,观察 compaction fallback。
  3. 继续对话,或在同一会话中切换 provider/model,触发 runtime 重建。
  4. 询问新模型有关压缩点之前的具体任务或文件内容。
  5. 观察模型表示无法读取之前的历史;但本地 session transcript 仍包含这些消息。

实际结果

  • transcript/UI/本地存储中的历史仍然存在;
  • compaction 写入了 retainedTail: [] 的失败 checkpoint;
  • 后续模型请求不包含压缩点之前的历史,也没有可用摘要;
  • 模型继续回答时会失去任务连续性。

预期结果

  • 摘要失败时自动重试,或至少保留一个有界且非空的最近上下文;
  • 不要写入会使后续恢复得到空 context 的 checkpoint;
  • 模型切换和 runtime 重建应从 canonical transcript 或有效 summary 恢复;
  • 如果恢复失败,应明确提示用户并提供从完整 transcript 恢复/新建会话的路径,而不是静默继续。

影响

长时间编码任务在 provider 临时错误或 compaction 失败后无法可靠继续,可能导致模型重复工作、误解当前任务或重新处理已经完成的工作。

环境

  • PI-Desktop: v0.14.6
  • OS: Windows
  • 触发方式:长会话自动 compaction 失败后切换模型/继续会话

相关但不同的问题:#22、#203、#211、#39。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: agent-runtimeAgent execution, subagents, tools, and runtime behaviorbugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions