前言¶
用 DeepSeek Harness(DSH)跑长会话时,上下文会不断膨胀:推理模型在生成阶段会产出大量 Wait、Hmm 等反思标记,这些内容写入会话后,每次请求都会原样带上。若在出口对已发送历史做小块压缩(例如官方 compaction-basic 的自动压缩),往往会打断前缀缓存,下一次从断点起整段按未命中价重算,作者 README 里把这类代价称为「断点税」。
下面介绍社区插件 dsh-entry-shaper(维护者 MaudieHakimi,GitHub 仓库 MaudieHakimi/dsh-entry-shaper,SkillHub 分类为「模型推理」)。它的思路是把塑形挪到入口:在会话元素首次出网前按类别跑 op 链定型,此后不再改写已发送形态,从而尽量保持出网 payload 前缀单调。插件当前版本 1.0.6,状态为实验性、默认关闭,要求 Node ≥ 20,MIT 许可,测试 94/94。
这是什么¶
dsh-entry-shaper 是 DSH 的 payload 塑形插件:按 reasoning、toolResult、toolArgs、assistantText 等类别配置 op 链,在代理通道的 wire 层对尚未发送的内容做变换。它不干预模型生成中的推理过程,只改变之后进入上下文、再次出网时模型「看到自己曾经想过什么」的形态。
README 强调:它不是消除所有断点的万能方案——官方自动压缩、缓存 TTL、换 provider、改配置等仍可能打断前缀;它保证的是自身不在已发送内容上再做有状态改写。默认策略主要塑形 reasoning 一类,其余类别多为 keep,省幅上限取决于推理在 payload 中的占比(README 实测约 −21% ~ −47%)。
核心机制与能力¶
入口定型 vs 出口压缩¶
生成结束后,内置策略(如 extract)可把长推理压成较短决策句再出网;上下文里后续请求携带的是定型后的文本,而不是完整的填充词链。这与「生成时保留反思标记的增益、进入上下文后去掉其负担」的设计目标一致——文献与边界说明见仓库 README 与 docs/。
可插拔 op 链¶
插件提供纯 op(keep、drop、extract、head、tail、truncate 等)以及三种外部接入方式,可在同一链上混用:
| 传输 | 含义 |
|---|---|
inline |
进程内算法,可热改配置 |
exec |
子进程(python / node / 任意命令) |
http |
OpenAI 兼容端点的 LLM 压摘要 |
外部调用统一 I/O:输入信封含 text、kind、meta、op、protocol: 1;返回 { "text": "…" }、 { "text": null }(整块删除)或裸文本。单 op 失败或超时则 fail-open(跳过该步,不阻断会话)。非纯 op 依赖内容哈希缓存以保持确定性;README 称长会话缓存命中率约 98.4% ~ 99.6%。
代理与配置热读¶
配置放在 ~/.dsh-entry-shaper.config.json(不要写进 cordis.patch.yml,否则市场热挂载会受限)。开启 proxy.enabled: true 后会惰性注册路由(默认 provider 名 deepseek-shaped),将会话或默认 provider 指向该名即可。改配置按 mtime 热读,一般无需重启;建空文件 ~/.dsh-entry-shaper.OFF 可立刻原样转发。
安装与启用¶
插件以 DSH 当前进程权限运行,安装前请自行审阅 源码与 LICENSE,勿凭名称臆造安装命令。README 给出的方式为本地目录安装(路径换成你本机位置):
dsh plugin --profile web add "file:D:\plugins\dsh-entry-shaper"
也可手动:复制目录到 profile 的 node_modules,并在 profile 的 package.json 中同时加入 dependencies 与 dsh.profile.bundles,且 dsh.bundle.patch 仍指向本包 cordis.patch.yml。
挂载方式另有:SkillHub 市场页热开关(patch 为纯 insert 时无需重启)、或在 cordis 上下文里 ctx.plugin(module) 做实验。注意 dsh plugin … add "file:…" 安装的是物理副本而非符号链接,只改源码目录不会生效,需复制进 node_modules 或重新 add。
典型配置¶
先在用户目录创建或编辑 ~/.dsh-entry-shaper.config.json。README 示例(总开关、按类别的 op 链、缓存与代理)如下:
{
"enabled": true,
"shapeReasoning": true,
"policy": {
"reasoning": { "ops": [{ "op": "extract", "maxChars": 240 }] },
"toolResult": { "ops": [{ "op": "keep" }] },
"toolArgs": { "ops": [{ "op": "keep" }] },
"assistantText": { "ops": [{ "op": "keep" }] }
},
"cache": { "enabled": true, "path": "~/.dsh-entry-shaper.cache.jsonl", "maxBytes": 8388608 },
"proxy": { "enabled": true, "provider": "deepseek-shaped", "upstream": "deepseek-official" },
"opTimeoutMs": 8000,
"logPath": "~/.dsh-entry-shaper.log"
}
README 特别提醒:配置里的路径不会展开 ~,误写会在当前目录下建名为 ~ 的文件夹;建议省略路径键使用默认绝对路径,或写完整绝对路径。
常用推理策略片段(同 README「复制即用」):
// 默认思路:推理只留决策句
"reasoning": { "ops": [{ "op": "extract", "maxChars": 240 }] }
// 保守:保留真实开头
"reasoning": { "ops": [{ "op": "head", "chars": 800 }] }
// 自定义进程内过滤(示例)
"reasoning": { "ops": [{ "op": "inline", "use": "code",
"code": "return text.split('\\n').filter(l => !/^(Let me|I will)\\b/.test(l)).join('\\n')" }] }
extract 的 marker 默认为 false;若设为 true 会加 [reasoning extract: …] 前缀,文档标明该标记会污染模型上下文(见 docs/POLLUTION.md)。
适用场景与注意¶
适合谁:长会话、推理占比高、希望在不频繁改已发送历史的前提下缩小出网 token;或愿意用 exec / http / inline 接入自研塑形算法,复用插件的缓存、超时与 fail-open。
务必知晓的限制(均来自 README,非营销承诺):
- 「更干净」≠ 已证明「更聪明」:插件未做去掉填充词后的行为对照实验,只保证出网形态与生成过程分离。
- 内置
extract的已知偏差:决策句规则会保留大量Let me/I will类长填充,README 称保留句中约 76.9% 仍为自我叙述标记,详见docs/FILLER-WORDS.md§5(候选修法尚未实施)。 - 会话日志污染:实测日志中可能出现塑形形态的推理块,原文不保证保留;侧路可用
node tools/original.mjs回溯当前轮原文(见docs/POLLUTION.md)。 - 改配置会改前缀形态:下一次请求可能整份全价重算(README 量级约 $0.2),宜一次定好策略。
- 与官方栈分工:官方已有 tool-result-pruner、compaction 等;启用本插件前建议读
docs/OFFICIAL-STACK.md,避免重复裁剪或预期冲突。
DSH 生态是「一切皆插件」;SkillHub 目录页 为社区站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-entry-shaper 把上下文压缩从出口挪到入口:在 wire 层对首次出网的会话元素做确定性塑形,默认聚焦推理块,并留出统一协议供自定义算法接入。若你在 Harness 上跑 R1 类推理模型且关心 payload 与前缀稳定,可在审阅源码后按 README 安装,从 enabled 与 policy.reasoning 小步试起。