bvbhu/dsh-quilt-compact ↗★ 0

dsh-quilt-compact

Compaction-chain backend for the DeepSeek Harness: tiered model-pool summarization with per-model cooldown, overlapping chunking, and session-model fallback. 适合需要通过多级模型和分块策略来优化长上下文管理的高级用户。

パッケージ
dsh-quilt-compact
互換性
未検証
Harness ピア範囲
>=0.1.7-alpha.2 <0.2.0-0 || >=0.2.0-rc.1 <0.3.0-0
Cordis ピア範囲
~4.0.4
バージョン
0.1.0
ライセンス
MIT
最終更新
2026/10/02

インストール

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:bvbhu/dsh-quilt-compact

ドキュメント

README 全文を読む ↗

配置

两种方式等价:Web UI 的设置页(写入同一份 profile patch),或直接编辑 profile 的 cordis.patch.yml(后层按行生效)。

模型池

- id: dsh-quilt-compact
  config:
    tiers:
      - name: primary
        models:
          - provider: openrouter
            model: openrouter/free
            maxConcurrent: 1
            cooldownHours: 1 

cooldownHours 失败后冷却的小时数 (正数,允许小数,如 0.5 = 30 分钟),从失败时刻起算。默认1 小时。 maxConcurrent 默认 1。

归并窗口(可选)

归并前最多保留多少上下文用 mergeMaxContextTokens(token 数,默认128k)控制,归并时会在池内逐级下降找上下文足够的模型。

    mergeMaxContextTokens: 64000   # 归并前最多保留多少上下文(归并窗口),默认 128000

注意:默认 128k 意味着若主池没有任何 ≥ 128k 的模型,可能会导致归并过程没有模型而失败。

分块

    chunkRatio: 0.8        # 分块占用模型可用输入的比例
    chunkOverlapRatio: 0.1 # 相邻分块重叠占分块预算的比例

Stage 0

    preprocessing:
      dedup: true                              # 合并相邻重复行
      purgeErrors: true                        # 清除终端噪音(ANSI、光标标记、长分隔线等)
      astSkeleton: { enabled: false, maxDepth: 2 }  # 代码骨架化(按缩进层级保留结构行);默认关闭,需显式开启
      logCondense: { mode: balanced, maxLines: 200 }  # 超长日志冷凝

运行记录

可选的质量评估/诊断记录,默认关闭:

    runRecord:
      enabled: false      # 关闭时不产生任何运行记录
      maxEntries: 200     # 文件最多保留多少条(超出裁剪到最近 N 条)
      snapshotChars: 0    # >0 时每条嵌入一段截断的对话原文(默认 0 = 不存原文)
      path: ''            # 固定文件位置;留空用 DSH storage 根目录

启用后,每次压缩追加一行 JSON 到 /storages/dsh_quilt_compact_runs.jsonl(非空 $DSH_HOME 优先,否则 ~/.dsh;path 可覆盖)。每条含统计(trigger、regionChars、chunkCount、mergeLevels 等)和 result(最终摘要文本)。

默认不保存对话原文——记录的是"引用"而不是副本:

  • ref — { sessionId, seqs }:指向会话事件日志里的被压缩区间,需要原文时按 seq 读回(会话是原文唯一合法的存放处)。
  • chunks — 每块模型归属 { chunk, model, lineStart, lineEnd, tokens },回答"哪段是谁处理的",不含文本。
  • cooldowns — 每次进入冷却的报错 { model, job, error, until, hours }:哪个路由、在哪个任务上、因何错误、冷却到何时——排查"某路由为何失败"的第一手证据(聚合尝试计数无法区分真实供应商错误与归属错误)。
  • snapshotChars > 0 才嵌入截断原文副本(隐私 opt-in)。

失败诊断

压缩失败不再只留一句固定文案:

  • error 级日志 — summarize 失败输出一行 dsh-quilt-compact summarize failed (trigger=…): ,原因是扁平化错误链(顶层: 中间: 根因),含整批失败的逐路由尝试摘要(attempts: p1/m1 x1 (last: …); …)。
  • 事务层失败同样记录 — 收缩检查、提交、持久化等 summarize() 之后的失败统一输出 dsh-quilt-compact compaction failed (trigger=…, stage=…): ;跨层传播的同一失败只记一行。
  • 失败也进运行记录 — runRecord 开启时失败写入 failed: true、route: 'error'、error(扁平化原因),与成功同结构;成败比例与失败原因可直接在 JSONL 上统计。
  • 可行动的兜底报错 — "池中无路由装得下归并"的报错会列出 mergeWindow、每个路由的 window 与冷却状态,并给出出路(调低 mergeMaxContextTokens 或增加大窗口模型)。
  • 手动 /compact — ManualCompactionError 的 message 携带底层原因(会话日志的 compaction/end 事件与本插件的日志都会显示它);自动压缩失败(step 压力、上下文溢出)的 warn 行也携带扁平化原因。

宿主的 /compact 命令按错误码输出固定文案并丢弃 error.message;真实原因始终在本插件的 error 级日志(以及 runRecord 开启时的 JSONL)里可查,无需改动宿主导包。