Back to home@Marsax110

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-onlyworkspace-writedanger-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(拒绝), 本插件当前是剥离后放行(更宽松)。两种语义均不会授予任何新权限;如需与上游对齐可调整。

插件做什么

  1. 剥离(模型无关,auto 模式):
    • 非严格更宽的升级请求(同档、降档、未知目标、字段不配对、审批通道缺失)→ 剥离参数, 命令在会话当前权限下直接执行,不再报错;
    • 真正更宽、且审批通道可用的升级 → 放行,走 dsh 正常的单次操作审批流。
    • 剥离发生时打印 [dsh-model-fixer] 日志(logStrips,默认开)——这是你发现 「自己的模型有问题」的第一信号。
  2. 提示段(按模型定制):命中 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'提示段名
sectionOrder5渲染顺序
sectionText内置 GPT 文案自定义协议提示段正文
logStripstrue剥离时用 ctx.logger.warn 记录,便于发现模型问题

示例:给 Claude 用 →

config:
  targetModels: [claude]
  targetProviders: [anthropic]
  sectionText: |
    # dsh 工具协议(Claude 适配)
    1. 常规调用不要填写 sandbox_permissions / justification……
    2. 需要越界访问时,只此一次重发并带 danger-full-access + justification……

做你自己的 fix(扩展插件,模型有别的怪癖时)

剥离只处理「乱带升级参数」这一类问题。如果你的模型还有其他工具调用怪癖:

  1. fork 本仓库,在 index.mjsctx.on('tools/execute', ...) 监听器里加你的修正逻辑 (同一扩展点,可读取 exec.name / exec.arguments / exec.agent.options);
  2. 需要给特定模型注入专属提示时,用 sectionText(字符串)或改 text 函数;
  3. 把有用的配置/文案共享回来:提 Issue / PR,或在本仓库 Discussion 里贴你的配置。

安装(非 bundle 插件,HMR 实时生效、无需重启)

  • 在 DeepSeek Harness 插件管理里安装 github:Marsax110/dsh-model-fixer, 或 dshpm install github:Marsax110/dsh-model-fixer --profile web
  • 安装后写入 profile 的 cordis.patch.ymldsh-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 均为其权利人所有。