前言¶
用 DSH 接中转或官方模型,常会碰到一个问题:同样一句请求,有的接口首字节很快、但吐字慢,有的相反。光看对话响应体感觉不出来,手工拿脚本去点赞也麻烦。dsh-speed-monitor 这个插件把这件事放进了 DSH 自己的界面里:侧栏点开,右侧面板就按固定间隔对模型发流式请求,把首字节、总耗时、吞吐画成曲线。
它由 doraasn 维护,分类是「工作流」,思路是「测速不离开 DSH」:模型清单直接读 DSH 设置,请求打到供应商配置的 baseURL,密钥走 DSH 自己的凭据文件。下面介绍它的功能、安装和用法。
定位与维护¶
插件名是 dsh-speed-monitor,当前版本 0.9.8,MIT 许可,package.json 里声明对 dsh 引擎的要求是 >=0.2.1-rc.2。仓库在 https://github.com/doraasn/dsh-speed-monitor,社区目录页在 https://www.skillhub.cn/plugins/doraasn/dsh-speed-monitor。目录页是独立站点,与 DeepSeek / 幻方没有官方从属关系。
核心功能¶
模型清单来自 DSH。 Client 读 /api/settings/describe 的 llm-* 命名空间,合并 llm-pi-ai.providers 与 llm-deepseek.models,插件里不硬编码模型。离开面板后新加的供应商,重启后会出现在下拉里。模型显示名也和 DSH 一致,用供应商 displayName + 模型 name 组合,例如 DeepSeek · DeepSeek-V4.1-Flash。
多模型并列。 每个模型一行,可以增删,每行的模型和思考挡位各自独立保存。默认目标写的是 astra-hub / deepseek-v4.1-flash,异常时回落到清单里第一个模型。
采样间隔。 默认每分钟一轮,可选 1 / 5 / 15 / 30 / 60 分钟。每轮每个模型先预热一次再采样 3 次,取中位数入库。
单指标曲线。 顶部切换首字节 / 总耗时 / 吞吐,每个模型一条线,图例点击可隐藏。悬浮显示该次采样的三项数值。时延单位是毫秒(越高越慢),吞吐单位是 tok/s(越高越快)。
断档不连线。 相邻采样点间隔超过 3 倍中位间隔或 2 分钟时,曲线会断开。这是刻意设计,不是数据丢失。
采样方法¶
数值不是点一次得来的,方法参考 term-llm benchmark 和 llm-speed-test:
| 步骤 | 做法 | 原因 |
|---|---|---|
| 预热 | 每个模型每轮第一次请求丢弃 | 排除 DNS、TCP 建连、前缀缓存冷启动 |
| 采样 | 默认 3 次,可调 1~5 次 | 单次抖动大,取中位数更稳 |
| 聚合 | 取中位数入库,同时记录 min / max | 中位数抗离群点,min/max 看波动 |
| 串行 | 多模型之间间隔 300ms 串行执行 | 并发会抢带宽,把数值拉高 |
| 失败 | 记录 ok/runs 与错误信息 |
区分「慢」和「挂了」 |
面板概览卡显示的就是中位数:首字节带 ±(max-min)/2 波动,总耗时带区间;每条曲线上的一个点 = 一轮采样(3 个样本的中位数)。
安装与启用¶
README 给的安装方式是界面操作,没有命令行命令:
- 侧栏 → 插件 → 添加插件,粘贴仓库地址、
.tgz或本地目录 - 启用后重启 DSH,Host 侧改动不热加载
- 侧栏出现「速度监控」入口,点开即见面板
这里不要凭插件名去拼安装命令,README 里没有 dsh plugin add ... 这类写法。也不需要手动 git clone。
指标口径¶
读曲线之前先确认每个字段的含义:
| 字段 | 含义 |
|---|---|
ttfb_ms |
请求发出 → 收到响应头 |
decode_ms |
首个内容事件 → 最后一个内容事件 |
total_ms |
请求发出 → 流结束 |
tokens |
completion_tokens |
tps_decode |
解码吞吐 = tokens ÷ decode |
tps_e2e |
端到端吞吐 = tokens ÷ total |
首字节偏低、但 total 和 tps_decode 都差,是排队或生成慢;首字节高而 decode 正常,通常是建连或前缀缓存问题。
数据来源与接口¶
插件不新建配置体系,复用了 DSH 的设置和存储:
| 项 | 说明 |
|---|---|
| 模型清单 | DSH 设置(llm-pi-ai / llm-deepseek 等命名空间) |
| 请求 | POST {baseURL}/chat/completions,stream: true、stream_options.include_usage: true |
| 存储 | ~/.dsh/storages/speed-monitor.json(配置)、speed-monitor.jsonl(采样)、speed-monitor.providers.json(模型清单缓存) |
| 密钥 | 供应商配置里的 apiKeyEnv,指向 ~/.dsh/.credentials.yaml 的字段 |
密钥不出主机:按 apiKeyEnv 从 ~/.dsh/.credentials.yaml 读取,Client 拿不到。
面板前端调的是这几个 HTTP 接口:
| 方法 | 路径 | 说明 |
|---|---|---|
GET |
/dsh-speed/api/state |
{ config, providers, items, error } |
POST |
/dsh-speed/api/providers |
写入模型清单 { providers } |
POST |
/dsh-speed/api/config |
保存 { intervalMinutes, runs, targets } |
POST |
/dsh-speed/api/sample |
立即采样,可带 { id } 只采一个目标 |
典型用法¶
装好重启后:
- 在 DSH 设置里配好至少一个
llm-*供应商,apiKeyEnv指向~/.dsh/.credentials.yaml里有值的字段,baseURL填完整 - 侧栏点「速度监控」,面板会从清单里带上已有模型
- 先点 立即采样 跑一轮,确认行内有数值而不是
-- - 确认无误后把采样间隔调回默认的 1 分钟,让它长期记录
- 前几条曲线只作为早期参考,中位数要等每轮采样攒够才有意义
常见问题¶
| 现象 | 处理 |
|---|---|
| 面板提示「还没有可用的模型清单」 | DSH 设置里没有配置任何 llm-* 供应商 |
某行一直 -- |
该供应商 apiKeyEnv 在 ~/.dsh/.credentials.yaml 里没有值,或 baseURL 为空 |
| 曲线不动 | 采样间隔被调大;或全部请求失败(行内会显示红色错误) |
| 想清零 | 删除 ~/.dsh/storages/speed-monitor.jsonl |
适用场景与注意¶
适合已经在 DSH 里接了多个供应商、想留下一条长期的延迟/吞吐记录的人,也适合在切换中转地址前后自己对比一次。它测的是网络到供应商这一段的流式表现,不含模型实际生成的推理质量。
需要注意几点:插件以当前 DSH 进程权限运行,会在该进程的工作目录下读取和写入 ~/.dsh/storages/ 下的配置文件。安装前先打开仓库核对源码与 MIT 许可证,确认其中的接口路径和存储路径符合预期,再决定是否启用。另外测速请求会真实消耗供应商额度,跑之前确认账户余额。
结尾¶
dsh-speed-monitor 的价值在于把测速变成 DSH 界面里的常驻功能,配置复用 DSH 的模型清单和凭据,不需要另起脚本。目录页是 https://www.skillhub.cn/plugins/doraasn/dsh-speed-monitor,源码在 https://github.com/doraasn/dsh-speed-monitor。