[错误]: 上下文溢出恢复锁定整个会话 – 每次后续回合都会在本地被拒绝, 采取"none"操作, tokensBefore 等于 tokensAfter, 导致目标继续失败

作者: orientpine创建于 2026年9月17日更新于 2026年9月17日

问题描述:一旦会话遇到上下文溢出,单个紧缩并重试尝试无法解决,会话将进入一个永久终止状态。之后的每个回合 - 包括每个目标继续唤醒和每个后台任务交付 - 都会被本地拒绝,在尝试进行紧缩之前,以及在再次联系提供者之前。门槛在 packages/coding-agent/src/core/agent-session.ts 中的 _overflowRecoveryAttempted(~L6626):

if (this._overflowRecoveryAttempted) {
    const errorMessage =
        "Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.";
    this._emit({ type: "compaction_end", reason: "overflow", result: undefined, aborted: false, willRetry: false, errorMessage });
    if (inlineReason === "pre_prompt") { throw new Error(errorMessage); }
    return false;
}

该标志在文件中的其他位置也被重置(L2439,L2513,L6802,L6810,L7017,L7073,L7107),但所有这些都位于使进程取得进展的回合之后。卡滞会话永远不会完成一个回合,因此预算永远不会补充。结果不是“每次溢出一次重试” - 而是“每次会话一次重试”,并且会话无法自我修复,因为不允许运行紧缩操作。我的日志显示此问题不是暂时的。连续四个 compaction_decision 记录, 跨越 13 小时和多次会话唤醒,字节相同:

action: "none"   disposition: "skipped"   tokensBefore: 486755 == tokensAfter: 486755

action: "none"表示没有运行紧缩操作;因此 tokensBefore 永远不会移动;因此下一个回合采取相同的分支。这是一个闭环。也 没有 provider_error 在第一次之后 - 会话再也不会与提供者联系,因此“尝试减少上下文或切换到更大上下文模型”的建议从会话内部无法到达:切换模型不会清除闩锁。用户可见的症状(实际上结束了我的会话):

警告:目标继续被阻止:上下文溢出结束了回合(紧缩操作没有恢复)。发送任何消息以恢复。
上下文溢出恢复失败后,经过一次紧缩并重试尝试。尝试减少上下文或切换到更大上下文模型。
运行时错误(send_message):上下文溢出恢复失败后,经过一次紧缩并重试尝试。 ...

“发送任何消息以恢复”是误导性的 - 发送消息重新进入相同的闩锁分支并以相同方式失败。

内容来源: code-yeongyu/oh-my-openagent