Skip to content

Reduce context token usage#28

Merged
RachelForster merged 4 commits into
RachelForster:mainfrom
NeoLi00:token-reduction-issue-25
May 24, 2026
Merged

Reduce context token usage#28
RachelForster merged 4 commits into
RachelForster:mainfrom
NeoLi00:token-reduction-issue-25

Conversation

@NeoLi00
Copy link
Copy Markdown
Contributor

@NeoLi00 NeoLi00 commented May 22, 2026

Summary

  • 增加上下文预算配置:压缩触发阈值、压缩目标比例、保留最近历史条数、工具结果最大保存长度、活跃工具组上限。
  • 桌面设置页和 WebUI 高级 API 区都可以配置这些参数,并补了中英日文案。
  • auto compact 默认在上下文约 40% 时触发,目标压到约 30%;同时在 schema、保存配置和 CompactManager 初始化阶段限制 compact_target_ratio <= compact_threshold - 0.05,避免压缩后马上再次触发。
  • token 估算改为统计完整 message payload,包括 tool_callstool_call_idname 等;每轮调用前记录 system/history/tools/total,并在桌面聊天窗口用不显眼的小状态文本展示。
  • token 状态文本已移动到对话框上方、reroll 按钮左侧,避免被输入框区域截断。
  • 历史加载时不调用 LLM;历史过大时按预算裁剪,预算 cap 从 30k 调整为 50k。有效的历史 tool_calls/tool results 会保留,只清理损坏的 orphan tool 链。
  • 新工具结果写入历史前会截断,截断结构保留 original_charsomitted_charsheadtail,避免只剩开头 preview 丢掉尾部错误或结论。
  • 活跃工具组默认上限从 5 降到 3,顶层对话结束后回落到 default,需要时仍可临时启用其他工具组。
  • 修复两个压缩相关问题:压缩结果没有稳定写回、短历史但超预算时可能跳过压缩。
  • 修复 UI e2e:--run-ui 下先 window.show() / qtbot.waitExposed(window),再断言 token 标签状态和文本。

Tests

  • .\.venv\Scripts\python.exe -m pytest -q,结果 445 passed, 5 skipped, 1 warning
  • .\.venv\Scripts\python.exe -m pytest test/e2e/test_chat_flow.py::TestUISignalFlow::test_ui_update_manager_signals_to_window --run-ui -q,结果 1 passed, 1 warning
  • git diff --check,只有 Windows 换行提示,没有 whitespace error

Addresses #25.

@RachelForster
Copy link
Copy Markdown
Owner

我在本地测试了下,效果非常好,可以清晰观测到token消耗,设置token压缩比例,感谢贡献,有点小建议,

  • 能不能把token消耗面板放在对话框上面,重roll按钮的左边,可能会比较好些?或者在toolbar的下方?虽然现在这样倒是也可以,但是感觉被对话框截断了。
  • 请保证 compact_target_ratio < compact_threshold,否则压缩后可能仍接近/超过触发线,导致频繁重复压缩。
    可以在 schema/config save 阶段 clamp 或 validate,例如 target 至少比 threshold 小 0.05。
  • 工具结果截断需要保留可追溯信息,当前只保存 preview。建议截断结构里加 omitted_chars,并尽量保留开头和结尾,或者允许关键工具标记“不可截断”。这样后续追问时不会完全丢掉长结果的尾部结论或文件末尾错误信息。在加载历史记录时会去除所有的tool calls会不会造成缓存大量失效?
  • 修复 UI e2e,新增测试在 --run-ui 下失败,因为没有 window.show() 却断言 isVisible()。建议在测试里 window.show() 后 qtbot.waitExposed(window),或者改成断言 not window.context_token_label.isHidden() 和文本内容。

@NeoLi00
Copy link
Copy Markdown
Contributor Author

NeoLi00 commented May 23, 2026

好的,已提交改动

@RachelForster RachelForster merged commit a835e32 into RachelForster:main May 24, 2026
1 check passed
@RachelForster
Copy link
Copy Markdown
Owner

感谢贡献,已merge

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.

2 participants