issue: context usage gauge ignores the model’s own compaction threshold

该问题出现在 Open WebUI 开启上下文压缩、且为某个模型单独设置了更低的 compact_token_threshold 时: / 弹出层里的上下文占用百分比仍按全局阈值计算,而实际自动压缩按模型阈值触发,因此显示值与实际行为不一致。优先排查模型级阈值是否未传到前端、以及服务端计算上下文占用

快速结论:该问题出现在 Open WebUI 开启上下文压缩、且为某个模型单独设置了更低的 compact_token_threshold 时:/ 弹出层里的上下文占用百分比仍按全局阈值计算,而实际自动压缩按模型阈值触发,因此显示值与实际行为不一致。优先排查模型级阈值是否未传到前端、以及服务端计算上下文占用的接口是否只用了会话参数。

适用环境:Docker 部署的 Open WebUI v0.12.3(ghcr.io/open-webui/open-webui:v0.12.3),SQLite 数据库,已启用 context compaction。Issue 中未提供操作系统、Python、CUDA、显卡等环境信息,无法据此判断。

最快修复方案:暂无确认的一步修复方案。Issue 中给出的修复方向是让 public_model_params() 透传 compact_token_threshold,或在 get_chat_context_usage() 中先解析模型 info.params 再调用 _resolve_token_threshold();这两项未经用户侧验证,升级或应用对应修复后需自行确认。同期 PR #32825 声称修复该问题,但 Issue 评论链未给出验证结论。

注意事项:该问题只影响上下文占用指示器的显示,自动压缩本身按模型阈值正常触发。Issue 中给出的临时规避方式是:把全局阈值设为默认模型的值;上下文更小的模型仍会正确压缩,只是指示器百分比不准确。在未确认修复前,不要仅凭 / 弹出层的百分比判断剩余空间。

问题场景

在 Open WebUI 中启用上下文压缩后,管理员在 Workspace → Models 的某个模型高级参数里把 compact_token_threshold 设置成比全局阈值更低的值(例如全局 200,000、模型 8,000)。与该模型对话,token 接近模型阈值时打开 / 弹出层,看到的 “Compact x % full” 百分比仍按全局阈值计算,显示只有几个百分点;继续对话一到两轮,聊天却被实际压缩。自动压缩行为正确,问题出在占用指示器。

报错原文

issue: context usage gauge ignores the model's own compaction threshold

该 Issue 没有传统堆栈报错,核心表现为显示阈值与实际压缩阈值不一致。按源码定位,关键链路是:前端 getContextThreshold() 读取 model?.info?.params?.compact_token_threshold 得到 undefined,回退到 serverContextUsage?.threshold;服务端 get_chat_context_usage() 返回的是全局阈值。

原因分析

根据 Issue 作者对 v0.12.3 源码的分析,可能原因集中在两处:

  • 后端 backend/open_webui/utils/models.py 的 public_model_params() 在输出 /api/models 时把 info.params 收敛为 model_controls,compact_token_threshold 被剔除,导致前端读不到模型级阈值。
  • 服务端 utils/context_compaction.py 的 get_chat_context_usage() 调用 _resolve_token_threshold(..., {'params': params}) 时只带会话参数(以及 model),没有合并模型的 info.params,因此返回全局阈值(并受全局上限约束)。
  • 请求过程中的自动压缩(main.py)会合并 model_info_params,所以实际压缩用的是正确值,这就造成了指示器与压缩行为不一致。

以上为 Issue 作者基于源码的推断,Issue 讨论链中未提供维护者的逐条确认;实际修复范围以对应 PR 为准。

环境排查

  • 确认 Open WebUI 镜像版本是否为 ghcr.io/open-webui/open-webui:v0.12.3,或存在相同 public_model_params() / get_chat_context_usage() 实现的版本。
  • 确认 Admin → Settings 中 context compaction 已启用,并记录全局阈值。
  • 确认目标模型的高级参数中设置了 compact_token_threshold,且该值明显小于全局阈值,便于观察差异。
  • 通过浏览器开发者工具查看 /api/models 返回的模型 info.params 中是否包含 compact_token_threshold。
  • 通过 /api/ 相关响应中的 serverContextUsage.threshold 确认服务端返回的是全局阈值还是模型阈值。

解决步骤

  1. 先按 Issue 中的复现步骤确认差异:全局阈值设为较大值(如 200,000),模型级 compact_token_threshold 设为较小值(如 8,000),与模型对话到约 7,000 token 时打开 / 弹出层。若百分比按全局阈值计算,即命中该问题。
  2. 在浏览器网络面板检查 /api/models 响应,确认模型 info.params 是否缺少 compact_token_threshold。若缺失,说明属于 public_model_params() 过滤导致的字段丢失。
  3. 检查服务端 serverContextUsage.threshold 的值是否等于全局阈值而非模型阈值。若是,说明 get_chat_context_usage() 未合并模型 info.params。
  4. 可优先尝试升级到包含 PR #32825 的版本,或应用等价修复:让 public_model_params() 透传 compact_token_threshold(该字段不敏感),或在 get_chat_context_usage() 中先解析模型 info.params 再调用 _resolve_token_threshold(),与 main.py 的处理保持一致。
  5. 若暂时无法升级或修改源码,按 Issue 中的临时规避方式,把全局阈值设为默认模型的值,并改用实际压缩触发点判断剩余空间,不依赖 / 弹出层百分比。

验证方法

在同一模型、同一会话下,当 token 用量接近模型级 compact_token_threshold 时打开 / 弹出层:百分比应以模型阈值作为分母,接近 100% 时与实际压缩触发时间点一致,不再出现“显示约 12%、下一轮即被压缩”的偏差。同时确认 /api/models 的模型 info.params 中可见 compact_token_threshold,或 serverContextUsage.threshold 等于模型阈值。

参考来源

open-webui/open-webui #32821

open-webui/open-webui PR #32825(Issue 评论中给出的修复 PR,未在评论链中给出验证结论)

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29664

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注