Skip to content

feat(chat): 上下文用量环与可靠手动压缩 - #426

Open
su-fen wants to merge 3 commits into
mainfrom
feat/context-usage-ring-reliable
Open

feat(chat): 上下文用量环与可靠手动压缩#426
su-fen wants to merge 3 commits into
mainfrom
feat/context-usage-ring-reliable

Conversation

@su-fen

@su-fen su-fen commented Aug 11, 2026

Copy link
Copy Markdown
Member

Linked issue

Closes #359

Summary

在最新 main 和当前共享 UI 架构上实现 GUI / WebUI 上下文用量环,并补齐手动压缩的完整可靠性闭环:

  • GUI 与 WebUI 共用用量阈值、颜色和 transcript 补算规则;占用达到 50% 后允许确认手动压缩;
  • 为 assistant 消息持久化 liveAgentContextUsage: { totalTokens, fixedTokens },动态校正 System Prompt、Skills、MCP 和 Tools 固定开销;
  • Provider 不返回 usage、旧历史缺少 fixed 锚点、压缩 checkpoint 和实时 trailing 消息均有保守且连续的读数;
  • render-only / Memory Extraction 轮次通过 contextRelevant: false 从上下文账本中整轮排除;
  • WebUI 可压缩任意目标会话,桌面端按 conversationId 水合独立 runtime,不再依赖桌面当前可见会话;
  • WebUI 使用 operationId 等待 manual_compaction_result 终态,并处理后台订阅、五分钟超时、迟到回包和跨会话错误隔离。

相关早期方案:#358。本 PR 不改写外部贡献者的 fork 分支,基于最新主线独立提交完整双宿主实现和 P1/P2 可靠性修复。

Change scope

  • Modules: agent-ui / agent-gui / agent-gateway/web
  • Key paths:
    • crates/agent-ui/src/lib/chat/contextUsage.ts
    • crates/agent-ui/src/components/chat/ContextUsageRing.tsx
    • crates/agent-gui/src/lib/chat/compaction/
    • crates/agent-gui/src/pages/chat/runtime/useManualCompaction.ts
    • crates/agent-gui/src/pages/chat/turns/
    • crates/agent-gateway/web/src/app/GatewayApp.tsx
    • crates/agent-gateway/web/src/lib/chat/transcript/

Screenshots / preview

Issue #359 中的目标交互预览;本 PR 保留用量环与确认压缩交互,并扩展到 GUI / WebUI 双端:

上下文用量环交互预览 手动压缩确认预览

Verification

  • pnpm --filter liveagent exec tsc --noEmit:通过
  • pnpm --filter @liveagent/gateway-webui exec tsc --noEmit:通过
  • P1/P2 定向 GUI 回归:155/155 通过
  • pnpm test:webui:546/546 通过
  • pnpm test:gui:1531/1532 通过;唯一失败为 test/settings/normalization.test.mjs:425 的 Gemini 档位目录断言,已在纯 origin/main@24e268f9 独立复现
  • pnpm build:gui:通过
  • pnpm build:webui:通过
  • pnpm lint:gui / pnpm lint:webui:通过
  • 本 PR 共享 UI 文件定向 Biome:通过;pnpm lint:ui 的 6 个既有 import 排序错误已在纯 origin/main@24e268f9 复现
  • pnpm check:ui-boundaries:通过
  • git diff --check:通过

Pre-submit checklist

  • A requirement issue is linked with Closes #359.
  • Synced with the latest target branch; no local merge conflicts.
  • The change is focused on context usage and manual compaction reliability.
  • No secrets, tokens, personal data, generated output, or local configuration included.
  • User-facing behavior, i18n, protocol types, persistence metadata, and regression tests are updated.

su-fen added 3 commits August 11, 2026 19:42
composer 发送按钮上方新增上下文用量环:<50% 绿 / 50-80% 黄 / >80% 红,
占用 ≥50%(变黄)起可点击,确认后手动压缩上下文。GUI 与 WebUI 完整对齐。

- 共享层 lib/chat/contextUsage.ts:阈值/读数单一真源。倒扫 transcript 取
  最近 assistant 轮次真实 usage;压缩后回退检查点摘要的 CJK 感知估算
  (自 tokenLedger 迁入共享层,re-export 保持旧调用方不动),环不归零。
- 共享层 ContextUsageRing:Base UI Meter 语义 + SVG 环 + 既有
  RuntimeControlTooltip 视觉 + ConfirmActionPopover 确认,两端同构。
- 桌面端执行:decideCompaction 增 bypassThresholdAndCooldown(手动仅跳过
  阈值/冷却,disabled 等硬守卫保留);controller.compactManually 空闲单飞、
  临时绑定复用 compactDuringRun 主流程;useManualCompaction 收纳 sinks/
  providerConfig/bridge 装配单点,检查点与压缩状态经既有 bridge 通道镜像。
- WebUI 手动压缩:chat_queue.compact_now 全透传中继(零 proto/Go/Rust
  改动),GUI 侧受理即回包后 fire-and-forget 调同一 handleManualCompact;
  进行中反馈复用 tool_status_is_compaction。
- i18n 两宿主 zh/en 补 manualCompact* 4 key;WebUI 镜像 confirm popover
  动画 CSS。
- 测试:contextUsage 阈值/读数/估算迁移 7 例;compactManually 空闲强制
  压缩/busy/硬守卫 3 例。
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.

[Feature] 会话支持显示上下文占比

1 participant