ARTICLE · 1298556
AI给 DSH 插件体检做了条快路径:缓存、瘦身、离线 CLI
写过本地插件的人都遇到过这个场景:
DSH 升级了。你不知道手上这堆插件还对不对得上,于是让模型跑一遍兼容性体检。结果它查完宿主版本、再查插件声明、再逐个对账,来回四五轮,每轮上下文几十 K;等结论出来,你其实只想看一句话——「有没有坏的?」
体检这件事本身,被做成了比插件还贵的东西。
我写了个小插件 dsh-compat-optimize,它不重写体检逻辑,只做一件事:给体检修一条快路径。四个动作:砍工具定义、一次调用说清、结果落盘复用、把体检搬出会话。
一、先看清钱花在哪
把一次体检拆开,成本在四个地方:
1)工具定义每轮都在发。只要工具挂在会话里,它的 schema 就随每次请求的 tools[] 重发。原体检工具的定义是 1198 字符,按字符折算约 774–950 token——你不调用它,也在付这份钱。
2)调用链太长。一次体检 4–8 轮往返,每轮 input 40–100K token。模型拿到的是一堆中间结论,还得自己再问一轮才敢下判断。
3)算力花在重复解析上。本地计算 283–552 ms,其中 69% 是反复解析 app.asar 那 4.76 MB 的头部——每次体检解析四次,每次从零开始。
4)离线场景根本用不了。想放进 CI、想挂定时任务,可体检只有「模型触发」一个入口。
二、四个减法
① 把工具定义压短,而不是「延迟加载」
工具的说明文字从 433 字符压到 104 字符,参数描述一起瘦身,整体 942 字符(约 236 token)。这里有个必须说清的误会:很多人以为 deferLoading 能省 token——不能。宿主照样会把工具定义投影进每轮请求,它延迟的只是「模型现在能不能直接调」。真正省常驻 token 的,只有把描述写短。
② 一次调用,返回结论 + 报告 + 报告正文
action=run 一次返回紧凑摘要、报告落盘路径,以及截断约 40 行的报告正文。模型拿到就够下结论,不用再追问。这是省 token 最狠的一刀:轮次从 4–8 降到 1。
③ 缓存不该按 size + mtime 判活
这条是踩出来的。第一版缓存按文件大小和修改时间判断有效性,结果生产环境里每次都被判成失效,优化等于白做。
原因很微妙:DSH 桌面端跑在 Electron 里,Electron 把 .asar 当虚拟目录接管,进程内 fs.statSync('app.asar') 返回的是合成 stat——size=0、mtimeMs 等于进程启动时刻。拿它判活,永远对不上。
改成内容指纹判活:取文件头 64 KB 的 sha1。指纹不依赖 stat,宿主内外一致;DSH 一升级换了归档,指纹必变,缓存自动作废,不会读到旧版本。
④ 把体检搬出会话:0 token 的离线 CLI
node bin/compat-check-cli.mjs check # 人话输出 + 报告落盘 + 耗时 node bin/compat-check-cli.mjs check --json # 机器可读,进 CI node bin/compat-check-cli.mjs warm && ... check # 最快路径 node bin/compat-check-cli.mjs bench --bench 10 # 量化优化效果 node bin/compat-check-cli.mjs status # 只看缓存,纯离线它不经过模型,所以 0 token;默认全程离线,只有显式 --notes / --refresh / --network 才联网。退出码也做了约定:0 无 broken 插件、1 有 broken 插件(宿主闸门不过,DSH 会跳过)、2 运行错误——CI 里直接当闸门用。
三、它不重复造轮子
判定逻辑、报告格式、缓存磁盘格式全部复用主插件 dsh-compat-check,本插件只是在外面套了一层性能与成本的外壳:
· 默认 source=plugin:直接调主插件的 runAction('check'),结论一致;
· 主插件不在:退化为自实现的等价检查,输出里标注 source: "fallback"——不会假装自己跑的是主插件;
· 缓存目录与主插件共用同一份,两边互不失效、互相命中。
四、实测数字
(本机,DSH 0.2.1-rc.5 × 7 个插件,2026-11-02)
· CLI check 冷启动(空缓存):183 ms
· CLI check 命中缓存:85–89 ms
· 进程内连跑 5 次:中位 55 ms,最小 48 ms,最大 106 ms
· app.asar 头缓存:1 条 / 4.76 MB,有效 1 条
· 自检:node _selftest.mjs,47 项断言全过
一句话总结:结论没变,成本变了。
五、诚实边界
· 省 token 靠的是压短描述,不是 deferLoading;
· notes 说「上游读不到」,就是读不到——可能是没网、限流、缓存过期,绝不会渲染成「已是最新」;
· 体检结论与主插件一致,因为它调的就是同一份代码。
工具的价值不在多聪明,而在于把重复的那部分,从每次都付变成只付一次。















































































