dsh-speed-anchor
把 DSH 输入框下方那颗“N 轮 N 步 · 223 tok/s”的统计胶囊,换成一条实时速度折线。
折叠时是一条 44×13 的折线加上当前 tok/s,右侧小圆点表示此刻正在数(只有思考和正文输出会让它亮)。点开是原来的会话统计面板,多出峰值和两项采样参数。
安装
在 DSH 的插件管理里选“从 URL 安装”,粘贴对应版本的 release 链接:
https://github.com/puny-code/dsh-speed-anchor/releases/download/v0.6.0/dsh-speed-anchor-0.6.0.tgz
装完刷新窗口。卸载走插件管理的停用/移除,它会从 profile 的 bundle 列表里消失,官方那颗胶囊自动回来。
只有一个链接要粘,别用 dsh plugin add <url> 代替:那条命令只是把包加进 profile 的依赖,不会把它登记进 bundle 列表,插件不会启用(还得回插件管理里手动打开)。要装就用插件管理这个入口。
折线上的数字是怎么来的
DSH 只有在一步结束时才给出该步的输出 token 数,流式过程中没有现成的 token 计数。所以这里的做法是:
- 每 200 ms 取一次当前正在流式输出的字符数(只算正文和思考,不算工具调用块);
- 每个点算“最近 300 ms 内字符数的增长 ÷ 这段时长 ÷ 每 token 字符数”;
- 每 token 字符数不是常数,先按 4 起步,等某一步结算后用它的实际输出 token 数和观察到的字符数校准一次(指数平滑,钳在 0.3–20 之间)。纯中文大致一字符一 token,靠这一步学准。
所以这是估算值,不是服务商计费口径的 TPS。优点是 200 ms 的粒度、能看清输出节奏的变化;代价是绝对数值会有一两个百分点的偏差。
工具调用阶段完全不采样:那段时间的 partial 是空的或者冻住的,写进曲线只会留下成串的 0 碎点。工具跑着时读数冻在开始前的最后一个值,绿点熄灭,新的正文一出来窗口就清空重起,工具耗时不会稀释下一点。
设置
设置 → TPS折线:
| 项 | 默认 | 范围 | 作用 |
|---|---|---|---|
| 采样粒度 | 200 ms | 50–5000 | 多久记一个点 |
| 平均窗口 | 300 ms | 50–5000 | 每个点回看多远求平均 |
| 丢弃尾部点数 | 1 | 0–10 | 输出结束时丢掉最后几个点,免得起草停顿把读数冻在一个极小值上 |
| 取值范围点数 | 30 | 3–60 | 纵轴高度只按最近这么多点里的最高值算 |
关于取值范围点数
一开始纵轴上界是整场会话的最高值,只增不减。结果是一次 1000 tok/s 的偶发尖峰,会把后面所有 50 tok/s 的点压到离底边 1 px 的地方,整条曲线看起来又平又压抑。现在上界只取最近 30 个点(200 ms 粒度下约 6 秒)里的最高值:尖峰随时间退出窗口,曲线自己重新舒展。
这个范围本身不画出来。超出上界的点会钳在顶边,看起来是一段平顶——说明“当时比现在快”,而不是画到框外面。面板里的“峰值”仍然报整条曲线的真实最高点,不是用来缩放的那个值。
其他
- 曲线按会话缓存(localStorage,最多 20 个会话),切走再切回来还在;会话结束后读数停在流尾的最后一个有效点,而不是
—。 - 四项设置都存在 localStorage 里。动态插件拿不到 Host 的设置服务,这是唯一可行的持久化路径。
- 只注册一个新格子(
speed-anchor),不抢官方activity的位置——抢同一个 id 会让本包的启动错误变成整个聊天的启动错误。官方那颗由 CSS 隐藏。
许可
MIT
No comments yet. Be the first to write one.