dsh-ctx-meter:零模型 token 的上下文占用读数与档位提醒

前言

在 DSH 里跑长会话时,上下文窗口会逐渐被 system、工具 schema 和消息堆满。界面右上角虽有占用计,但想在输入框里随手查一次「用了多少、还剩多少、构成如何」,若每次都靠模型侧工具,往往要在 system prompt 里常驻额外 schema,还会打断 prefix 缓存。下面介绍社区插件 dsh-ctx-meter:用 /ctx 斜杠命令按需打印占用,并在占用越过 25% / 50% / 75% 时各发一条可折叠的 host 通知;命令本身不消耗模型 token,插件无 client.js,不占 UI 槽位。

这是什么

dsh-ctx-meter 由维护者 ecbob 发布,分类为客户端插件(实际实现为 Host-only:仅宿主侧逻辑,无前端组件)。它读取 DSH 会话投影(与 @deepseek-ai/dsh-token-meter 及 Web UI 占用计同源),提供两种面向用户的表面:

表面 触发方式 模型 token 成本
/ctx 读数 在 composer 输入 /ctx 0 — 命令发现、执行与 UI 输出不会进入模型消息,也不向 system prompt 追加工具 schema
档位报告 占用越过 bands 中的百分比 约 35–45 tokens:一条 form: 'notice' 的 host aside(UI 折叠,模型可见以便决定是否 compact)

兼容 DSH >= 0.2.1-rc.2(README 注明在 0.2.1-rc.2 上测试)。当前包版本 0.1.1,许可证 MIT。仓库:https://github.com/ecbob/dsh-ctx-meter;社区目录页:https://www.skillhub.cn/plugins/ecbob/dsh-ctx-meter。

核心功能

/ctx 按需读数

输入 /ctx 后,输出与界面右上角占用计同源的数字,例如中文会话下可能类似:

/ctx
上下文占用 50.8% · 133,170 / 262,144 tokens · 剩余 128,974
档位:已越过 25% / 50% · 下一个 75%(还差 63,438 tokens)
构成(启发式):system 34,120 · tools 2,880 · messages 96,170
计费累计:输入(未缓存) 210,110 · 输出 8,120 · 缓存读 1,020,000 · 缓存写 40,000

README 说明:该命令不写入会话日志之外的内容,也不消耗模型 token。尚无 usage 样本时会降级为表面估算,读数与报告会标明「估算」。

档位 crossing 通知

默认在占用向上越过 25%、50%、75% 时各报告一次(每个档位仅一次;继续升高不会重复)。示例形态:

📊 上下文越过 50%:现在 50.0% · 131,197/262,144 tokens · 剩余 130,947 tokens

机制要点(均来自 README):

  1. 仅向上穿越时触发,每档一次。
  2. 2 个百分点滞回:占用需落到 band - 2% 以下才重新武装该档,compact 后可再走一轮 25 / 50 / 75。
  3. 一次跳跃跨多档时合并为一条报告。
  4. 挂载插件只建立基线,不会回放挂载前的历史。
  5. 档位状态在进程内 WeakMap 中按会话维护;重启后从新基线开始。

最高档报告可附带「需要时可在步骤安全点 compact_now」提示;配置 hint: false 可关闭。报告用 notice 而非 agent.followup(),目的是不主动唤醒 agent;在你保持沉默时,notice 的 token 成本为 0,直到下一步真正被接纳时才计费。

数字从哪来

数据来自 DSH 的 contextPressure / contextBreakdown / tokenUsage 等会话投影:分子基于最新 provider usage 样本并按 surface 的有符号变动调整(以反映 compact);分母为最新 request/context 的 contextWindow,不硬编码模型或窗口大小。订阅 ctx.sessionProjections.onChanged,经 stateOf() / snapshot() 读取,O(1) 查找、无轮询,且不调用 tokenMeter.measure()。

与 smart-compaction 的关系:后者提供模型侧 context_status、compact_now 及安全点自动 compact;本插件补充用户侧免费读数与跨档短提醒,二者读同一投影,数字一致。README 指出再增加一个工具会在 system prompt 中常驻约 150 tokens 并破坏 prefix 缓存,因此采用 /ctx 命令而非工具。

配置

包内默认 config: {}。在 profile 的 cordis.patch.yml 中用相同 id 覆盖(整段替换 config):

- id: ctx-meter
  name: 'dsh-ctx-meter'
  config:
    bands: [30, 60, 90]   # 报告档位,0 < b <= 100,去重排序
    notice: true          # false:不写会话日志,0 tokens,仅保留 /ctx
    hint: false           # 最高档省略 compact_now 提示

notice: false 时,v0.1 无 UI 组件,屏幕上不会常驻任何内容;若需要常驻 chip,README 建议 dsh-plugin-usage-meter 或内置占用计。

安装与启用

官方 README 的安装步骤如下(勿向 profile 随意增加新的 runtime 依赖;autoInstallPeers: false 时无法解析的依赖会导致 Cordis 无法启动):

  1. 打包:npm pack 得到 dsh-ctx-meter-0.1.1.tgz,放入 <DSH_HOME>\.plugin-sources\。
  2. 在 profile 中加入本地包:
   pnpm --dir <DSH_HOME>\profiles\<profile> add file:..\..\.plugin-sources\dsh-ctx-meter-0.1.1.tgz
  1. 在 profile 的 package.json 里把 "dsh-ctx-meter" 写入 dsh.profile.bundles(pnpm 会写 dependencies,bundles 需手工编辑,两者都要有)。
  2. 重启应用。斜杠命令随 bundle 激活注册;若 / 菜单里还没有 /ctx,刷新页面或再重启。

运行时仅依赖宿主提供的 @deepseek-ai/dsh-llm(用于 createUserMessage);peerDependencies 仅为声明。Node >= 22。

典型用法

  1. 长对话中在 composer 输入 /ctx,核对占用、剩余、构成与计费累计,无需发起模型轮次。
  2. 占用升高时留意折叠 notice,在合适时机配合 smart-compaction 或手动 compact;最高档可看 compact_now 提示(除非 hint: false)。
  3. 若只希望静默查数、不向日志写入 notice,设置 notice: false,仅使用 /ctx。

自测(在插件源码目录):

node scripts/selftest.mjs     # 或: npm test

末行应出现 ALL PASS(38 条断言)。

适用场景与注意

适合:需要在 DSH 会话里低成本查看上下文占用、并在 25/50/75(或可配置档位)收到提醒的开发者;与 smart-compaction 搭配时,用户侧读数与模型侧 compact 工具互补。

限制与注意(README):

  • 无 live agent 的会话无法读数,/ctx 会明确说明。
  • 报告写入会话日志(user/message + surfaceOp: append),每条约 35–45 tokens,本身也计入占用。
  • 插件在当前 DSH 进程权限下运行;安装前请自行审阅源码与 MIT 许可证,社区目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-ctx-meter 用 Host-only 的 /ctx 与可选档位 notice,在同源会话投影上提供零 token 的按需读数和跨档提醒,避免为查占用常驻模型工具。进一步了解可访问目录页 https://www.skillhub.cn/plugins/ecbob/dsh-ctx-meter 与 GitHub https://github.com/ecbob/dsh-ctx-meter。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜