dsh-composer-tokens:DeepSeek Harness 输入框实时 Token 计数插件

前言

在 DeepSeek Harness (DSH) 的智能体开发场景中,输入 token 的估算直接关系到上下文窗口的使用情况和成本控制。官方 Web GUI 原生并未提供实时的、精确的输入 token 计数功能,特别是在涉及系统提示词、工具定义以及技能引用时,开发者难以直观判断上下文占用。

dsh-composer-tokens 是一个由 wbycloud 维护的纯客户端插件,它通过挂载到 Web GUI 的输入框组件,提供实时 token 计数与详细统计。该插件基于 @huggingface/tokenizers 实现,支持精确计数与离线估算两种模式。

功能说明

实时计数与展示

插件在 conversation.input.right 位置注入一个行内徽标,显示预计总 tokens(基线+草稿+帧)及上下文占用率。
- 显示格式:≈12,345 · 38%
- 防抖机制:输入时触发 250ms 防抖刷新草稿部分,避免频繁计算。
- 颜色分级:根据本次请求总 token 数着色:<100k 为绿色,100k-300k 为琥珀色,>300k 为红色。

详细信息 Tooltip

通过鼠标悬停或键盘焦点,展开 Tooltip 查看详细数据,包括:
- 基线:基于最近一次请求的真实锚点(projectedTokens)。
- 草稿增量:当前输入框内的变化量。
- Usage:会话累计真实 tokenUsage 四桶。
- 缓存命中率:仅在 provider usage 到达后显示。
- 引擎与模型:精确引擎(HF Tokenizers)或估算引擎(启发式),以及当前模型口径标记。

计算口径

  • 基线优先:优先使用 projectedTokens(已含系统提示词+工具定义)。
  • 草稿包含:技能文本、引用文本(@skill)按发送路径计入草稿。
  • 估算兜底:未知模型、离线无缓存或加载失败时,使用 ceil(len/4) 启发式估算(标 ~)。

安装与启用

前置要求

  • Node.js ≥ 22
  • pnpm
  • 构建产物:若修改了源码,需先运行 npm run bundle 生成 lib/client.js。

安装命令

推荐使用 npm 发布版本安装:

dsh plugin --profile web add dsh-composer-tokens

本地开发安装

若需开发调试,直接安装本地目录:

dsh plugin --profile web add D:\path\to\dsh-composer-tokens

老版本迁移

v0.1 版本起插件自带 dsh.bundle.patch,安装后无需手动在 cordis.patch.yml 中添加 loader 行。若之前手动添加过,请删除旧行,否则会冲突。

使用方法

基础查看

启动 Web GUI(dsh web)并刷新页面。在输入框右侧、发送按钮左侧会出现计数徽标。新会话首次请求前显示上次会话规模占位,发送后自动校准。

模型覆写配置

插件支持通过 localStorage 覆写模型对应的 tokenizer 家族或自定义 URL。

localStorage.setItem("dsh-composer-tokens.overrides", JSON.stringify({
  "qwen-72b": "deepseek",          // 指定内置家族
  "my-model": "https://…/tokenizer.json"  // 或自定义 tokenizer.json URL
}));

开发构建

插件源码包含 React 组件、Tokenizer 引擎及数据拉取逻辑。

npm run prepare-tokenizer   # 下载/校验 tokenizer 数据,生成 tokenizer-data.ts
npm run bundle              # 生成 lib/client.js
npm run watch               # 增量构建(配合 HMR)

注意事项

  1. 不含输出 tokens:由于输出不可预测,徽标仅显示输入侧的预计 tokens。
  2. 模型切换冷却:模型切换无 wire 事件,会话缓存 + 投影帧存在 3s 冷却重查机制。
  3. 超长草稿:草稿超过 10 万字符时,尾部将自动切换为估算模式。
  4. 行内显示限制:输入框空间有限,徽标可能被截断,完整数值在 Tooltip 中可见。
  5. Windows pnpm link:本地开发时,pnpm link 在跨盘符时可能生成文件符号链接导致 Node 无法解析,需手动重建为目录 junction。
  6. 老安装清理:v0.1 之前手动添加 loader 行的用户,卸载或更新时需手动清理 cordis.patch.yml 中的对应行。

参考链接

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

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

小夜