Back to home

gameswu

dsh-pref-kit

缓解部分dsh性能问题的插件

Stars
0
Language
TypeScript
Created
Aug 15, 2026
Updated
Aug 15, 2026

Introduction

dsh-pref-kit

在数据流层面削减 DSH 会话事件量的性能插件:在 llm/stream 瀑布上合并模型流式输出的同类 delta, 减少写入日志、磁盘与推送到前端的会话记录。

功能

  • 合并 text-delta / reasoning-delta(仅同一 block index、同一类型;30ms 窗口,0–200ms 可调,0 = 关闭)
  • assistant/chunk 事件量显著下降(离线基准实测 54–70%,见基准测试),宿主内存 / JSONL 磁盘 / 推送字节同步下降
  • Settings → Plugins 提供 dsh-pref-kit 配置卡片(windowMs 字段,与内置插件卡片同款折叠样式 + 保存/放弃按钮,保存后热生效、跨重启保留,无需重启)
  • 不改渲染、不改事件语义与线上协议

安装

插件按官方 bundle 形式发布:包自带 cordis.patch.ymldsh.bundle.patch), dsh plugin add 会自动把插件行挂入 profile 组合,无需手工编辑 patch 文件。

# 1. 构建插件模块(产出 dist/host/plugin.js、lib/client.js 与 typert 工件)
cd dsh-pref-kit
npm run build

# 2. 将 bundle 装入目标 profile(以 web 为例;自动注册 dsh.profile.bundles 并挂载插件行)
dsh plugin --profile web add "file:$(pwd)"

# 3. 检查组合结果(应出现 pref-kit 行)
dsh --profile web --dump-config | grep -A3 'id: pref-kit'

# 4. 重启 DSH 生效(启动日志出现 [dsh-pref-kit] llm/stream coalescer active)

卸载:dsh plugin --profile web remove dsh-pref-kit(插件行随 bundle 一并移除)。

更新:重新 npm run build 后先 dsh plugin --profile web remove dsh-pref-kitaddfile: 依赖按拷贝安装,需要 remove+add 刷新)。

配置

配置项位置默认范围
合并窗口 windowMsSettings → Plugins → dsh-pref-kit 卡片30 ms0–200 ms(0 = 关闭合并)

组合行 config.windowMs 是设置值的 base 层(初始默认);UI 修改写入用户设置层并热生效, 恢复默认即回到组合值。窗口越小流式显示越即时,越大事件削减越多(首 chunk 延迟 ≈ 窗口)。

实现说明:Host 侧为类插件(PrefKitPlugin extends TypertRemoteService@Remote('get'/'set')), Remote 端点由 typert-loader 依据本包 exports["./typert"] 清单自动注册进 typert 注册表; Client 侧配置卡片经标准客户端 RPC 通道(connection.rpc.call('/api', 'prefKit/…'),与内置 Remote 相同)读写,仅注册 Settings → Plugins 卡片,不触碰渲染器与原版样式。

基准测试

离线基准(uv 隔离环境:不连接 DSH、合成数据、虚拟时钟、确定性复现)实测 30ms 窗口的削减效果:

场景事件数(基线 → 合并)线上+日志字节(基线 → 合并)
短回复(600 token + 推理 + 2 工具)810 → 375(−53.7%)0.2MB → 0.1MB(−49.9%)
长回复(8000 token + 推理 + 4 工具)9674 → 3281(−66.1%)2.2MB → 0.8MB(−62.6%)
6 个并发 agent(各 5000 token)35592 → 10847(−69.5%)8.1MB → 2.7MB(−66.0%)

窗口灵敏度(100 条 delta、4ms 间隔):窗口 0/30/100ms → 100/13/4 个事件,首个 chunk 延迟 0/32/100ms(≈窗口大小)。

fig1:合并器离线基准

运行:npm run benchmark(或 uv run --project benchmark python benchmark/benchmark.py)。

项目结构

dsh-pref-kit/
├── package.json            # typecheck / build / benchmark / verify;dsh.bundle + dsh.client 声明
├── tsconfig.json
├── cordis.patch.yml        # bundle 补丁层:插入 pref-kit 插件行(config.windowMs 为 base 层)
├── build.mjs               # 客户端打包(src/client → lib/client.js,__ModuleLoader__ bundle)
├── src/
│   ├── types.ts            # 编译期类型
│   ├── host/
│   │   ├── plugin.ts       # Host 插件(类形态:TypertRemoteService + @Remote;settings 持久层)
│   │   └── typert.ts       # exports["./typert"] 工件:prefKit/get|set 严格 Remote 清单
│   └── client/entry.ts     # Client 插件:Settings → Plugins 配置卡片
├── lib/client.js           # 客户端 bundle(构建产物,纳入版本控制)
├── scripts/
│   └── verify-session-log.js
├── benchmark/              # 离线基准(uv 隔离环境,Python + matplotlib)
│   ├── benchmark.py        # 脚本(生产合并逻辑的忠实镜像)
│   └── pyproject.toml / uv.lock / .python-version
├── docs/
│   ├── perf-bottlenecks.md
│   └── figures/fig1-coalescer-baseline.png  # 基准图表(fig1,由 benchmark 产物复制)
└── dist/                   # host/plugin.js 等(构建产物,不纳入版本控制)

开发

npm run typecheck  # 严格模式类型检查
npm run build      # 编译插件模块到 dist/ 与 lib/
npm run benchmark  # 离线基准(uv run,输出图表与数据到 benchmark/)
npm run verify     # 校验会话日志完整性

文档

许可证

MIT