dsh-model-fixer
模型无关的沙箱升级修正 + 按模型定制的协议提示段:任何模型(GPT 系最常见)在工具调用中错误携带 sandbox_permissions/justification 导致 'not strictly wider' 死循环时自动剥离;并按会话模型动态注入适配提示段。非 bundle 插件,HMR 实时生效。
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 25, 2026
- Updated
- Aug 26, 2026
Introduction
dsh-model-fixer
模型无关的沙箱升级修正 + 按模型定制的协议提示段。
针对代理进 DeepSeek Harness 的模型(GPT 系最常见,但任何模型都可能)在工具调用中
错误携带 sandbox_permissions / justification 导致的
sandbox escalation ... is not strictly wider ... 死循环。
社区项目,非 DeepSeek 官方插件。
先回答两个问题
Q:这个插件只针对 GPT 吗?
A:不是。它由两部分组成,务必分清:
| 部分 | 范围 | 说明 |
|---|---|---|
剥离(tools/execute) | 模型无关 | 任何模型只要在工具调用里带了无效的 sandbox_permissions/justification,执行前就被剥离。GPT 只是最常见的触发者;DeepSeek 等从不发这些参数的模型是纯 no-op |
提示段(systemPrompt) | 按模型定制 | 默认只给 GPT 系(targetModels: ['gpt'] / targetProviders: ['openai'])注入协议提示段;其他模型按需配置(见「做你自己的 fix」) |
Q:我怎么知道自己的模型需不需要它?
A:看「如何发现你自己的模型的问题」。装好后什么都不用做——剥离对所有模型自动生效;
如果日志里出现 [dsh-model-fixer] 已剥离 ...,说明你的模型就是需要修正的那类。
它解决的问题(以 GPT 为例)
dsh 的沙箱升级协议要求请求模式严格更宽于当前生效模式
(read-only → workspace-write → danger-full-access)。满权限下没有任何更宽模式,
因此任何携带 sandbox_permissions 的调用立即失败:
Error: sandbox escalation to "<mode>" is not strictly wider than this call's current "<mode>" mode
GPT 系模型即使系统提示已说明不要设置,仍会带上这些参数,并在报错后「切换权限档位重试 同一条命令」——形成无限重试循环(真实会话连续报 7 次相同错误后才被中止)。 因为工具 schema 是 registry-global 的,无法按会话对模型隐藏字段,最稳妥的修复点在执行时。
上游背景:这是 dsh 已确认的 bug family,不只是模型的问题
这不是「GPT 跟 DSH 不兼容」。dsh 的 sandbox API 对模型的冗余/非最优 tool args 容错不足:
一个会话已经处于 danger-full-access,模型再次携带 sandbox_permissions: "danger-full-access"
(甚至更窄的 "workspace-write")时,dsh 会把「重申当前/更窄模式」误判为一次权限升级请求,
然后以「not strictly wider」拒绝——任何模型都可能踩,GPT 只是最常携带该字段的模型。
上游社区已确认这是 bug family(4 个独立报告 + 1 个第三方复现):
- #3519(hytime)
- #4359(ZergZFZ;修复补丁:共享
normalizeEscalationMode+ 三个 tool consumer 调用顺序调整 + schema 文案) - #4383(XY1998-debug;更窄冗余
workspace-write案例) - #4412(第四次独立报告;argszero 总结 family-complete 谓词)
family-complete 判定(#4412 点名的谓词)与本插件 shouldStrip 用的谓词逐字一致:
// 上游:不严格更宽 → 视为 no-op(执行当前模式,不走审批)
if (!(WIDER_MODES[effectiveMode] ?? []).includes(mode)) return effectiveMode
// 本插件:不严格更宽 → 剥离参数(同样在会话当前权限下执行,不走审批)
const allowed = WIDER_MODES[mode] ?? []
if (!allowed.includes(requested)) return true
因此本插件的定位是:官方修复落地前 / 旧版本上的「执行时兼容层」。官方 normalization 语义一旦进入 dsh,插件的剥离部分会变为冗余(但两者行为一致、幂等,不冲突);插件的 per-model 协议提示段和 logStrips 诊断日志仍是官方不会提供的独立价值。
一处已知差异:上游对「只有
justification没有sandbox_permissions」保持 fail-closed(拒绝), 本插件当前是剥离后放行(更宽松)。两种语义均不会授予任何新权限;如需与上游对齐可调整。
插件做什么
- 剥离(模型无关,
auto模式):- 非严格更宽的升级请求(同档、降档、未知目标、字段不配对、审批通道缺失)→ 剥离参数, 命令在会话当前权限下直接执行,不再报错;
- 真正更宽、且审批通道可用的升级 → 放行,走 dsh 正常的单次操作审批流。
- 剥离发生时打印
[dsh-model-fixer]日志(logStrips,默认开)——这是你发现 「自己的模型有问题」的第一信号。
- 提示段(按模型定制):命中
targetModels/targetProviders的会话才渲染 协议提示段;非命中会话(如 DeepSeek)的系统提示不含该段。
如何发现「你自己的模型」的问题
| 现象 | 含义 | 怎么处理 |
|---|---|---|
日志出现 [dsh-model-fixer] 已剥离 ...(模型 X) | 你的模型在工具调用里错误携带升级参数,已被自动剥离 | 无需处理,已兜底;可顺手把 targetModels 加上 X,让它也收到协议提示段 |
满权限下工具调用报 not strictly wider | 死循环正在发生 | 插件已拦截;确认安装生效(见「验证」) |
报 invalid escalation: sandbox_permissions requires a justification | 字段不配对 | 插件已剥离兜底 |
| 命令能跑,但模型反复「换权限档位重试」 | 死循环被剥离打断 | 正常,观察日志即可 |
| 系统提示里看不到协议段 | targetModels/targetProviders 没命中你的模型 | 调配置(见下) |
| 协议段文案不适合你的模型 | 默认文案是 GPT 视角 | 用 sectionText 写你自己的文案 |
做你自己的 fix(不写代码)
安装后编辑 profile cordis.patch.yml 中该插件的 config:
- insert:
- id: dsh-model-fixer
name: dsh-model-fixer
config:
strip: auto # auto | true | false
targetModels: [gpt] # 命中才注入提示段(大小写不敏感子串)
targetProviders: [openai] # provider 命中才注入
# sectionText: | # 换成你自己模型的协议文案
# # 你的模型专属规则……
# logStrips: true # 剥离时打印诊断日志
| 选项 | 默认 | 含义 |
|---|---|---|
strip | 'auto' | true 总是剥离;false 从不;'auto' 剥离非严格更宽的升级请求,合法升级放行 |
targetModels | ['gpt'] | 注入提示段的模型名匹配 |
targetProviders | ['openai'] | 注入提示段的 provider 匹配 |
sectionName | 'gpt:harness-protocol' | 提示段名 |
sectionOrder | 5 | 渲染顺序 |
sectionText | 内置 GPT 文案 | 自定义协议提示段正文 |
logStrips | true | 剥离时用 ctx.logger.warn 记录,便于发现模型问题 |
示例:给 Claude 用 →
config:
targetModels: [claude]
targetProviders: [anthropic]
sectionText: |
# dsh 工具协议(Claude 适配)
1. 常规调用不要填写 sandbox_permissions / justification……
2. 需要越界访问时,只此一次重发并带 danger-full-access + justification……
做你自己的 fix(扩展插件,模型有别的怪癖时)
剥离只处理「乱带升级参数」这一类问题。如果你的模型还有其他工具调用怪癖:
- fork 本仓库,在
index.mjs的ctx.on('tools/execute', ...)监听器里加你的修正逻辑 (同一扩展点,可读取exec.name/exec.arguments/exec.agent.options); - 需要给特定模型注入专属提示时,用
sectionText(字符串)或改text函数; - 把有用的配置/文案共享回来:提 Issue / PR,或在本仓库 Discussion 里贴你的配置。
安装(非 bundle 插件,HMR 实时生效、无需重启)
- 在 DeepSeek Harness 插件管理里安装
github:Marsax110/dsh-model-fixer, 或dshpm install github:Marsax110/dsh-model-fixer --profile web。 - 安装后写入 profile 的
cordis.patch.yml(dsh-plugin-manager:managed区块), config HMR 立即生效。
验证
npm test # 单元测试:剥离判定(true/false/auto)+ 模型门控 + 自定义文案 + 诊断日志
安装后:用 GPT 会话确认工具调用不再报 not strictly wider;日志出现 [dsh-model-fixer]
说明剥离在工作;DeepSeek 会话的系统提示不含协议段。
许可证与归属
MIT。本插件由社区 preset MirageEarl/dsh-gpt-standard (MIT)的守卫插件演化而来;协议文案参考 DeepSeek Harness 的沙箱升级协议。见 NOTICE。 DeepSeek 与 DeepSeek Harness 均为其权利人所有。