Marsax110/dsh-model-fixer ↗★ 0
dsh-model-fixer
模型无关的沙箱升级修正 + 按模型定制的协议提示段:任何模型(GPT 系最常见)在工具调用中错误携带 sandbox_permissions/justification 导致 "not strictly wider" 死循环时,在工具执行前自动剥离;并按会话模型动态注入适配该模型的协议提示段。
安装
此插件尚未提供可验证的 bundle,或兼容性检查未通过。请先阅读仓库说明。 阅读完整 README ↗
说明文档
阅读完整 README ↗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 "" is not strictly wider than this call's current "" mode
GPT 系模型即使系统提示已说明不要设置,仍会带上这些参数,并在报错后「切换权限档位重试 同一条命令」——形成无限重试循环(真实会话连续报 7 次相同错误后才被中止)。 因为工具 schema 是 registry-global 的,无法按会话对模型隐藏字段,最稳妥的修复点在执行时。
插件做什么
- 剥离(模型无关,
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 均为其权利人所有。