Skip to main content
S

dsh-plugin-rollout-scout

spookysandwich/dsh-plugin-rollout-scout

Detects which conversation model an account is being served: launches concurrent throwaway probe conversations, scores each streaming chain-of-thought by how its paragraphs open, and cancels probes that read as the older model within seconds. Includes an offline self-check that replays 13 hand-labelled chains-of-thought through the same classifier.

Install

dsh plugin --profile web add github:spookysandwich/dsh-plugin-rollout-scout

README

dsh-plugin-rollout-scout

English | 简体中文

npm license dsh stars

服务商有时会灰度发布新的对话模型,你分到哪一个全看运气。灰度侦察会用你自己的账号开启一批临时会话,在思维链流式输出的同时读取它,并按「推理是怎么写的」打分——读起来像你手上这个旧模型的立刻中止,不像的留下来。

它是基于措辞的启发式小工具,不是权威判据。它做的每件事你都可以手动完成:开一个新会话、扫一眼思维链、关掉。

侧边栏入口

判定方式

信号在于 每个段落是怎么开头的,而不是某个短语在全文出现了多少次。若按全文累计,「Let me」会单纯因为篇幅变长而越积越多,一段本来很好的长思维链最终也会被判为差。只看开头,度量才稳定。

每段只读前 48 个字符。而关键短语往往并不在第 0 个字符:

The directory is empty. Let me create a 3D cyberpunk scene. To avoid conflicts, I'll keep I18n.cs edits under one change.

有两个决定性信号,且刻意 不对称

信号效果
任意段落以 Let me 开头旧模型——立即中止该轮
整条思维链I'll 开头灰度模型——放行跑完并保留

I'll 只有出现在最开头才算证据:旧模型也会在 中间某段 写「I'll create a single HTML file…」,然后隔几段又说「Let me build…」。把每个 I'll 都当证据会造成误判。

两者都没触发时,其余开头进入评分:

加成   = (规整段落 ? 1 : 0) + (有停顿 ? 1 : 0)
置信度 = (正向开头数 + 加成 + 1) / (已分类开头数 + 加成 + 2)

加成把总结链的形态本身也算作证据,因此段落规整、又有停顿的思维链在还没有任何 开头被分类时就会高于 50%。它只影响这个数字:真正保留仍需要凑满「最少开头数」。

段落开头写满 48 个字符就会打分,即使模型从不换行。后出现的 Let me 会推翻 先前的保留。

灰度链路常常用一个 小模型总结思维链。总结模型经常以 We need to… 开头(所以段首 we 只记负分,不直接判死),写出 规整、一段一段的长段落,并且 输出一阵、卡住、再输出一阵。这三条都是新链路的正面证据。旧模型不规律——整段糊成一块,或夹着很短的 Let me 行。

正向开头是第一人称单数的计划语气——I'mI amI'veI haveI needI thinkI alsoI will,以及位于开头的 For。负向开头是 Let me / Let's,以及开头里出现的任何第一人称复数(wewe needwe willwe'll …)。灰度模型用 “I”,不用 “we”。加一的先验让证据稀少时分数停在 50% 附近,不会因为一个词就给出自信判断:

证据置信度判定
暂无50%继续观察
1 正 / 10 负15%丢弃
5 正 / 0 负86%保留

低于 低于此分即丢弃(0.35)丢弃,高于 高于此分即保留(0.7)保留,但都要先累计到 最少开头数(4)。若连续开了十段一个正向开头都没有,则放弃;思维链 以中文为主(字母中 80% 以上为汉字)则直接丢弃——英文推理里引用一句中文提示词不算。

针对灰度链路的速度与时延特征,还支持两项前置早停开关:

  • 生成速度 (TPS) 上限:灰度模型流式吐字速度常在 40~50 字/秒左右(旧模型通常显著更快)。开启后一旦流式 TPS 超过指定上限(默认 60 字/秒),立刻中止该轮,在开头几秒内挽救 Token。
  • 首字延迟 (TTFT) 下限:旧模型常在极短时间内(< 1~2 秒)开始输出。可设置首字延迟下限(默认 2 秒),低于此阈值立即在首个字符到达时判定为旧模型并丢弃。

分类器有基于人工标注样本的测试,此外还覆盖了接口防护、发起失败时的行为,以及删除会话的规则:

npm test

控制台

灰度侦察 位于侧边栏底部、「设置」旁边,点开就是下述整屏控制台。它注册在 sidebar.footer.action 座位上,因此与外壳自带的条目样式一致;侧边栏收起为窄栏时,它也会收成一个图标。

左栏 —— 探测提示词、模型(默认 V4-Pro / High)、并发数、存放目录,以及四项评分阈值。阈值下方是自检,再往下是各项开关:TPS 速度上限、首字延迟区间、命中强匹配时自动暂停、思维链以中文为主时丢弃、从磁盘删除旧模型会话。评分规则的长说明收在 评分是怎么算的 里,不再夹在控件中间。

操作按钮固定在左栏底部,设置滚动时不会跟着走,并按分量排列:开始 / 暂停 单独一行,强制停止清空已结束 并排,删除全部会话 则是一行纯文字——它不该长得像顺手就会点到的东西。

评分阈值下方有一条自检自检 13/13 · 已知灰度样本保留 5/5。它用当前表单里的设置,把十三条人工标注的思维链跑一遍——走的是真实探测同一套分类器,不消耗 Token、不发起探测。把「高于此分即保留」调到标注样本都够不着,它会变成橙色并列出被排除的样本。这是分辨「没找到」和「根本找不到」的办法,否则这两种情况在控制台里长得一模一样。

右栏 —— 已发起 / 进行中 / 已保留 / 已丢弃 / 最高分,下方队列按发起顺序排列、不随分数跳动。每行带分数条、命中短语与思维链预览。点击整张卡片打开会话。淡出过程中把鼠标移上去会救回来;从悬停直接点进会话时,这次救援会带进会话界面,直到鼠标再次移动。要真正留住一个探测,请点 保留

开始 前会先提醒你确认通知设置——一次运行会开启大量会话,而 DSH Desktop 可能逐个弹通知。探测提示词以插件消息发送,本身不会触发通知;弹窗会显示桌面通知当前是否开启,并可一键关闭。勾选 不再提示 即可跳过。

开始 会变为 暂停:停止发起新探测,中止已判定为旧模型的探测,尚未判定的各自跑完。再变为 继续强制停止 会中止所有进行中的会话。

判旧的探测先淡出约 3 秒(卡片底边一条细线收掉),期间会话还在跑;淡完才取消。悬停会暂停淡出,移开后继续——只有 保留 才会真正留下。

卡片上的 保留 是对会话文件的承诺:不淡出、不清理、不删除,且该标记在插件重载后依然有效。它不会让正在消耗 Token 的回合变成不可停止——强制停止 仍会结束该回合,但会话和保留标记都留下。判定为灰度并跑完的探测会自动保留。再次点击 已保留 可交回常规清理规则。

探测会话在侧边栏里会自动命名:运行时叫 灰度探测 12,命中后改为 ★ 灰度命中 12 · 87%,在一堆探测里一眼就能认出。已保留的卡片上有 重命名,可以自己起名字;起了名字就等于保留。

清空已结束 会从列表移除已完成的探测,并删除这些会话文件。删除全部会话 会清空该目录下所有探测(包括已经从列表清掉的),并把编号从 1 重新计。

如果目录下出现了本控制台并未跟踪的探测会话——插件重载、升级或应用重启都会留下这类残留——顶部会出现提示条,可一键 清理。这些正是平时在侧边栏里删不掉的会话:外壳自带的菜单只有归档,没有删除。

两者都不会动仍在流式输出或正在释放资源的探测,已保留的也不例外。暂停只是停止发起,进行中的探测仍在跑,所以此时 删除全部会话 会要求你先 强制停止,并等宿主完成释放后才允许删除,以免删掉仍在写入的会话文件。存放目录不能是主目录、磁盘根目录,也不能位于 ~/.dsh 之内——删除以该目录为范围,这些位置会把无关会话卷进去。

若连续三个探测连启动都失败(服务不可达、目录不可写等),运行会自行停止并报出错误,而不是一直重复同一个失败。点 继续 可以重试。

运行状态在宿主端,因此关掉控制台后仍会继续——侧边栏那一行的图标上带一个状态小点(侦察中呼吸闪烁、暂停为灰、命中转绿),宽栏里还会显示进行中的数量、命中后带绿色角标,悬停可看已试数量与目前最高置信度。收成窄栏后只剩这个小点可看,所以它长在图标上而不是文字里。

安装

dsh plugin --profile web add dsh-plugin-rollout-scout

安装后请重启 DSH:宿主端随服务器加载。界面跟随 DSH 显示语言(中文 / English)。

也可以直接从仓库安装,跟的是 master 而不是最近一次发布:

dsh plugin --profile web add github:SpookySandwich/dsh-plugin-rollout-scout

web 是 profile 名称,请换成你实际使用的那个。独立版启动的是 web,DSH Desktop 用的是 desktop~/.dsh/profiles/ 下就是你现有的 profile,安装结果落在对应 profile 的 package.json 里。

lib/client.js 是构建产物,但已提交进仓库,所以从仓库安装时也无需任何构建步骤。若你修改了 plugin.client.js,请运行 npm run build 重新生成(npm test 也会顺带生成),并把结果一并提交。

工作原理

  • 宿主端提供 /rollout-scout 接口,用 ctx.agents.create(不带 seed)把每个探测创建为全新会话,并通过 installModelSelection 设置模型与思考强度。
  • 探测提示词以插件消息发送,这样一次运行才不会逐个探测地弹出系统通知。
  • 订阅该 agent 作用域内的 session/event,从 assistant/chunk 读取 reasoning-delta(流式思维链),每收到一块就重新分类。
  • 判为旧模型时调用 agent.cancel 中止该轮;判为灰度则放行至 turn/end。流式过程中最后一段会被暂时忽略(开头可能只写了一半),turn 结束后再用完整文本重新分类。
  • 探测会话创建在你指定的目录下(作为一个工作区),判为旧模型的会话可选择从磁盘删除。
  • /rollout-scout 监听在本地端口上,因此按本地接口的方式做了防护:写操作必须带 application/json 内容类型(这会强制浏览器发起 CORS 预检,而预检永远不会被放行),跨源的 Origin 一律拒绝。你恰好打开的某个网页无法借此发起探测或删除数据。

实现细节见 docs/架构说明,以及所依赖的宿主行为

兼容性

入口占用 sidebar.footer.action 座位(list 类型,会与其它底部操作并排,而不是把谁挤掉),控制台本体渲染在全局 shell.overlay 层。两者都不属于会话作用域,因此不与任何会话内插件冲突。需要侧边栏声明了该座位的 DSH 版本;否则控制台将没有入口。与 dsh-plugin-smooth-streamdsh-plugin-no-workspacedsh-plugin-message-edit 同族。

关于额度

每个探测都是一次真实的对话轮次,消耗你自己的额度。被丢弃的通常一两秒内就中止,但只要不停止,运行中的任务会一直发起新探测。并发数与各项阈值都可自行调整。

许可

MIT © SpookySandwich

Related plugins