dsh-cache-probe:在 DSH 里直接测渠道的提示词缓存命中率与响应速度

前言

做 DSH 渠道接入或模型推理调优时,经常要回答几个问题:这个渠道的提示词缓存到底命中了多少?TTFT 和输出速度是多少?模型能否按要求输出一段可用的 SVG?过去要拆开单独搭测试脚本,或者借助外部工具,结果和渠道的真实运行态对不上。

下面介绍的 xymy666/dsh-cache-probe 是一个 DSH 插件,它在 DSH Web GUI 里开一个独立的「渠道测试」页面,直接对已配置的渠道跑缓存命中率、响应速度和鹈鹕 SVG 三项测试。页面走插件自己的 Host HTTP 接口,不注册 slash 命令,不往对话写命令卡片,也不会产生模型可见的消息。

这是什么

由 xymy666 维护的 DSH 插件,分类为模型推理。它的定位是「一个页面测渠道」,解决的是渠道接入阶段缺少可视化、可复现的缓存与速度验证手段的问题。README 里列出的两个入口都打开同一个页面:输入框下方统计徽标行末尾的「渠道测试」按钮,以及侧边栏的「渠道测试」页面图标。页面替换中栏会话,点「返回会话」回到原会话;切换页面再回来,最近一次结果仍在。

核心功能

页面提供三个测试,各自独立参数。

1、测缓存:一次预热 + N 次复测,载荷为固定模板加随机 nonce 的长前缀(默认 12,000 字符),每轮内容完全相同,读取真实 usage 计算命中率。
2、测速:N 轮短提示词,每轮带唯一 nonce 避免命中提示词缓存把 TTFT 测低,测 TTFT、输出 tok/s、总耗时。
3、鹈鹕测试:一轮请求让模型画「骑自行车的鹈鹕」SVG,页面提取并渲染预览,同时记录 TTFT、tok/s、总耗时、推理/正文 token 和 SVG 字符数。
4、全部运行:缓存 → 测速 → 鹈鹕,逐项更新卡片,一项失败不会跳过另一项。

三项测试的思考等级各自独立,选项来自当前模型声明的 reasoning.efforts,包含 无思考(off) 与 低 / 高 / 最高 等模型实际支持的档位,默认都是 low。选 off 时请求带 reasoning_effort: "none";选 low/high/max 时思考过程不进入正文、不展示、不保存,只从 usage 的 reasoningTokens 读数量。

缓存命中率的口径与 DSH 内置统计一致:

cacheReadTokens ÷ (未缓存输入 + cacheReadTokens + cacheWriteTokens)

缓存表和测速表最后一行是平均:token/耗时取算术平均;缓存命中率按「总缓存读 ÷ 总 prompt」加权,且只统计复测轮、不含预热。失败轮不参与平均。多轮测速给出中位数与范围,只有 1 轮时不写「中位」。

测试过程中结果区显示全宽进度面板:当前阶段、已用时间、预热/复测步骤条、等待倒计时、逐轮实时指标,以及「停止测试」按钮。正常完成后进度面板收起;取消后保留已完成轮次的进度面板,标记「测试已停止」,不生成不完整的结果卡。

安装与启用

需要带 Web GUI 的 DSH profile(web 或 desktop);CLI/headless profile 不显示页面。

从 npm 安装(推荐),npm 包是预构建版本,安装时不需要 allowBuilds 授权:

dsh plugin --profile web add dsh-cache-probe

desktop profile 把 web 换成 desktop。

npm 不可用时可以从 GitHub 安装:

dsh plugin --profile web add https://github.com/xymy666/dsh-cache-probe

本地开发时用 link: 指向 checkout:

dsh plugin --profile web add "link:/absolute/path/to/dsh-cache-probe"

安装后重启 DSH 一次,让 Host 路由加载,之后刷新页面。

启用后确认三点:输入框下方只有一个「渠道测试」按钮;侧边栏出现「渠道测试」图标;点击任一入口打开页面,供应商下拉能列出已启用渠道,模型下拉只显示所选供应商的模型。

典型用法

打开页面后,先选供应商再选该供应商的模型,每个供应商会记住上次选的模型,切回来时自动恢复。没有可用模型的供应商仍会显示,标注「无可用模型」,选中后模型下拉为空、运行按钮禁用。

点「测缓存」先跑一次预热,等待 10 秒后复测 2 轮,结果卡显示命中率、逐轮表格、结论和可复制的文本报告,缓存卡还会显示来源会话的真实流量对照(只汇总打开页面时所在会话已结算的 assistant/message,按 provider 分组,不包含本次测试)。

点「测速」跑 3 轮短提示词,每轮 prompt 约 30 token。输出列下方显示 思考 N 字 / 正文 M 字,由插件统计流里的 reasoning-delta 与 text-delta,不用 token 拆分。

打开「高级设置」为缓存、测速、鹈鹕分别调整参数,参数写入 localStorage,下次打开继续使用:

项目 参数 默认 范围
缓存测试 载荷字符数 12,000 2,000–200,000
缓存测试 复测次数 2 ≥1(无上限)
缓存测试 等待秒数 10 0–120
缓存测试 单次超时 120s 10–300
测速 目标输出 tokens 256(思考关闭时即上限;开启时自动 +4,096) 32–2,048
测速 轮数 3 ≥1(无上限)
测速 轮间隔 1s 0–30
测速 单次超时 120s 10–300
鹈鹕测试 单次超时 120s 10–300

思考等级不是 off 时,实际发送的上限是 目标 + 4,096,高级设置里会显示本轮实际生效的上限。原因是 DSH 的 outputTokens 已包含思考部分,若「目标输出 tokens」只按正文估算,思考会吃光预算、正文为 0 字。

页面内的供应商/模型选择只影响本页测试,不会切换当前会话的聊天模型。

Host 接口

页面使用两条同源 HTTP 路由,不经过命令系统:

GET  api/dsh-cache-probe/models?sessionId=...
POST api/dsh-cache-probe/run

models 返回 active providers、各自模型、模型的 reasoning.efforts 和默认路由。run 接收 JSON 请求体,kind 支持 cache、speed、pelican,鹈鹕返回 pelican.attempt、text、svg、svgSource、svgLength、report、summary。单次只接受一项,「全部运行」由页面顺序发三次请求。请求头带 x-dsh-cache-probe-stream: 1 时,run 改为返回 application/x-ndjson 流,逐行推送 start → attempt-start → attempt → wait → wait-done → done,页面据此实时填表。

安全围栏:只允许 loopback socket + loopback Host;拒绝 cf-connecting-ip / x-forwarded-for 代理跳;拒绝 sec-fetch-site: cross-site,Origin 必须与 Host 同源;有 remoteWebUiPairing 时已配对设备 cookie 作为第二条放行路径;POST 额外要求 x-dsh-cache-probe: 1 请求头;请求体上限 64 KiB。

适用场景与注意

适合刚接入新渠道、需要确认缓存是否生效、或做模型推理速度回归的 DSH 开发者。三个测试都会发送真实计费请求,README 给出的默认成本参考:默认缓存 3 次请求(预热 + 2 次复测),每次约 3,000 prompt token + 32 output token;默认测速 3 轮 × 256 output token;默认鹈鹕 1 轮不设输出上限(落到模型配置上限,README 在 a6 上实测约 1.2 万 output token)。复测次数和测速轮数都不设上限,轮次越多耗时和费用越高,每轮都是真实请求。

插件以当前 DSH 进程权限运行,页面不会读取或打印 API Key,凭据由 DSH 的 provider 配置提供。同一时间只允许一个测试,第二个请求返回 409「已有渠道测试正在进行」。安装前建议检查源码与许可证(MIT,版本 0.5.7)。

已知限制:页面只在带 webServer 与 Web GUI 的 profile 加载;实时逐轮进度与「停止测试」需要新版 Host,旧 Host 会自动回退到一次性 JSON 结果,升级后必须重启 DSH 才能启用流式进度;结果保存在 localStorage,只保留全局最近一次缓存、测速和鹈鹕结果;鹈鹕 SVG 只做提取和基础清理(去脚本、事件属性、外链、foreignObject),清理后仍不安全的 SVG 不渲染,只显示原始文本,鹈鹕测试不判断画得像不像。

开发

本地开发的命令:

git clone https://github.com/xymy666/dsh-cache-probe.git
cd dsh-cache-probe
node scripts/build.mjs     # 生成 lib/client.js(内联 options/stats/client)
node --test                # 98 个单测
node scripts/verify.mjs    # 包结构 + bundle + profile 安装状态

主要目录:lib/index.js 是 Host 路由入口,src/http.mjs 实现 loopback/配对围栏与 JSON body 处理,src/routes.mjs 是 models / run 两条 Host 路由,src/probe.mjs、src/speed.mjs、src/pelican.mjs 分别负责三项测试的执行、摘要与报告,src/client.mjs 提供 controller、页面、侧边栏图标与输入框按钮。

结尾

dsh-cache-probe 的价值在于把渠道接入阶段最常问的几个问题(缓存命中、响应速度、SVG 输出)收进一个 DSH Web GUI 页面,参数可调、结果可复现,且不干扰当前会话。插件目录页在 https://www.skillhub.cn/plugins/xymy666/dsh-cache-probe,源码在 https://github.com/xymy666/dsh-cache-probe。

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

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

小夜