Skip to content

feat(context): add local truncation fallback for overflowed conversations - #3484

Open
uiharuayako wants to merge 3 commits into
GCWing:mainfrom
uiharuayako:codex/compact-force-overflow-recovery
Open

uiharuayako wants to merge 3 commits into
GCWing:mainfrom
uiharuayako:codex/compact-force-overflow-recovery

Conversation

@uiharuayako

@uiharuayako uiharuayako commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Summary

为已经触发上下文超限的会话增加本地截断恢复路径,让用户有机会继续当前对话。

当模型 API 因上下文过长拒绝请求时,普通 /compact 的摘要请求也可能被同样拒绝。此时继续依赖模型生成摘要可能无法恢复会话。本 PR 增加 /compact force,无需调用摘要模型或解析模型凭据即可截断较早的工作上下文;同时提供全局策略,让用户选择在模型明确报告上下文超限后自动使用这条保底路径。

Type and Areas

  • Type: Feature / recovery fallback.
  • Areas: Rust Agent Runtime、Desktop / CLI、Web UI 设置、Shared Runtime IPC、App Server、Peer Device、Detached Dispatch、文档与多语言。

Motivation / Impact

核心意义是为“已经超限,连压缩请求都可能发不出去”的情况提供恢复手段,减少用户被迫新建会话、重新交代任务背景的情况。

设置 → 模型 → 使用本地截断 是执行主机的全局配置,对所有模型生效:

选项 行为
必须显式调用(默认) 保留原有模型摘要逻辑;通过 /compact force 显式使用本地截断。
模型超限时 普通模型请求或摘要请求被明确分类为上下文超限后,使用本地截断;成功请求及其他错误仍沿用原逻辑。
始终使用本地截断 手动、自动压缩均跳过模型摘要和预摘要。
  • /compact force 始终执行本地截断;CLI 的 /summarize force 别名保持相同语义。
  • 保留首个、最新用户请求及预算内的近期消息,工具调用和结果成组保留或移除;聊天卡片明确显示“本地截断上下文”。
  • 已保存的会话历史继续保留。本地截断会丢弃部分后续推理可见的上下文,不生成语义摘要;如果必须保留的请求和固定开销仍无法容纳,会明确报错并保留原上下文。

Verification

本轮再次合并上游 724bf2f39:仅两个生成能力表发生冲突,已从合并后的源注册表重新生成;核心截断、三态设置及可恢复 Error 准入逻辑未改动,PR 仍保持80个文件的原有功能范围。新增验证:远程能力契约20项、前端6个文件158项及 pnpm run check:web 全部通过;对象大小与差异检查通过。上一轮 b87b81808 的 CI 已全部通过,包含三平台 CLI / Rust 和前端构建;本次合并由新一轮 CI 验证。

上一轮合并上游 616c3f262 时,已验证:

  • cargo test --locked -p openbitfun-core --no-default-features --features agent-runtime,git --lib -- compression compaction local_truncation user_dialog_retry_is_allowed_from_error:79 项通过。包含真正的“先因上下文超限失败,再从可恢复 Error 状态执行强制截断”的完整入口回归,同时验证不可恢复错误仍被拒绝、原始历史保留、无需可用模型。
  • 配置契约定向回归:1 项通过,覆盖旧配置默认、三态保存及往返兼容。
  • 前端定向回归:设置 / 命令 / 卡片等 6 个文件、90 项;Peer / 派发 84 项;Agent API / LocalSessionDriver 35 项通过。
  • pnpm run check:web、pnpm run i18n:audit(零警告)、pnpm run check:core-boundaries 通过;能力表重新生成,PR 范围内42个 Rust 文件定向格式检查、差异检查及 Git 对象大小检查通过。
  • Runtime ports2项、Shared IPC3项、App Server旧协议1项通过;App Server client 离线编译通过。
  • 本机 CLI 定向测试在编译上游新增的 openbitfun-computer-use 时被缺失的系统依赖 gstreamer-1.0.pc 阻塞,测试尚未执行。补充 App Server 集成测试因本机剩余磁盘空间不足而停止,未取得新的测试结果。没有修改依赖、绕过编译检查或删除用户文件,后续以 CI 结果为准。
  • 未进行桌面 GUI、Windows 或真实 SSH / Peer / 派发联调。
  • AI-assisted: 本 PR 由 Codex 辅助实现和复查。Testing level: 定向单元与协议集成测试已完成,GUI / 真实远程端到端验收尚未完成。

Reviewer Notes

本轮最小化审查保留跨版本安全边界,移除可证实的重复实现:

  • 自动压缩的本地 / 模型路径共用历史引用创建;删除仅供测试使用的私有包装方法,并在入口固定有效策略,避免继续传递重复的 force / policy 状态。

  • 派发记录仅用 kind=localTruncation 持久化强制语义,不再重复保存 force 布尔值;仍能读取上一版 PR 的有效记录。

  • App Server 单个能力布尔值使用 AtomicBool,移除不必要的互斥锁和锁中毒处理;设置 UI 由可信配置状态推导加载状态。

  • 将摘要超限 / 摘要成功 / 非超限错误改为表驱动测试;合并重复的历史引用用例,并用完整失败后恢复入口取代只覆盖底层强制成功的用例。保留旧请求、预取追加消息、取消、工具调用配对、旧摘要不可改写和旧 worker 拒绝等不同风险的回归。

  • 仅本地截断允许从可恢复 Error 状态启动;普通维护操作仍保持 idle-only,运行中及不可恢复错误不会被绕过。该增量是保障“已经超限后还能恢复”所必需的。

  • 已检查最新 main 及相关开放 PR feat(context): compression config surface, structured handoff prompt, and summary-request elision #3532 / fix(web-ui): keep an admitted /compact out of the composer #3588;它们分别处理摘要请求裁剪 / 设置和命令残留,均未替代本 PR 的强制恢复路径。没有纳入这些 PR 的独立功能。

  • 最终范围仅包含功能、必要兼容适配、测试、多语言、文档及生成契约;没有 Cargo / pnpm 依赖改动、构建产物、治理基线放宽或第三方代码格式化改动。

  • 旧配置和普通压缩请求继续兼容;默认行为保持原有模型摘要路径。网络、鉴权等非上下文超限错误不会触发本地截断。

  • 本地截断保留现有取消、提交锁及持久化流程;历史引用写入新标记,保留的旧消息及旧摘要不被改写。

  • Peer、派发、App Server 均先检查本地截断能力,旧目标明确返回不支持。Shared Runtime 私有 IPC 升至 v20,使用版本隔离的发现目录;升级后需重启客户端及 Runtime 主机。

  • 派发强制截断不依赖模型就绪状态,并以独立的 localTruncation 类型持久保存,防止降级后的旧 worker 忽略 force、误调用模型;旧 worker 解析失败会保留记录。

  • 手机 / IM 的聊天文本 /compact、/compact force 命令仍明确回复不支持,保留待处理的权限 / 问答状态。上游新增的 HarmonyOS 命令面板普通压缩通过既有 HostInvoke compact_session 执行,遵循目标主机策略;本 PR 未新增手机强制截断按钮。

Checklist

  • This PR is focused and does not include secrets, temporary prompts, generated scratch files, or unrelated artifacts.
  • Relevant verification is recorded above, or skipped checks are explained.
  • User-facing strings, docs, and locales are updated where applicable.

@uiharuayako

Copy link
Copy Markdown
Contributor Author

@wgqqqqq 我希望能关注一下这个pr,因为token数难以在本地精确计算,上下文压缩机制有时会误判,如果token超限了,这种情况下对话就彻底“没救了“,除非用户手动去分叉。加这个不依赖大模型的上下文压缩可以提供一种兜底的可能。现在官方的端点1M上下文确实很难超,但是本地部署模型,开256k甚至128k的场景,这个问题感觉还是有点严重的

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.

1 participant