5.0 KiB
5.0 KiB
dsh 思考强度报错解决方案(11128 请求被拦截 / developer role 400)
适用症状:dsh(DeepSeek Harness)在
settings.yaml给模型声明reasoningEfforts后(注意:声明即触发,与选了哪个档位无关,含 off),请求第三方/私有 OpenAI 兼容网关时失败:
- 网关带内容审计时:
本轮运行失败 {"error":{"code":"11128","message":"请求被拦截,请重新发送","type":"invalid_request_error"}}- 网关严格校验 role 时:
400 ... messages[0].role: unknown variant 'developer', expected one of 'system', 'user', 'assistant', 'tool', ...已于 2026-10-16 在 Windows + dsh 0.1.1-rc.2 上验证解决(示例 provider:coderelay,本地网关
http://127.0.0.1:11435/v1,上游带内容审计)。
根因(代码级因果链)
settings.yaml给模型声明reasoningEfforts(字典)后,dsh-llm-pi-ai 的resolveModelReasoning把该模型标记为reasoning: true并生成thinkingLevelMap。- pi-ai 构造请求时据此决定系统提示词是否改用
developerrole:openai-completions.js:787—useDeveloperRole = model.reasoning && compat.supportsDeveloperRole supportsDeveloperRole的默认值按 provider 名 / baseURL 识别:只有非标准名单(nvidia / cerebras / xai / together / deepseek.com / zai / moonshot / opencode 等)默认 false;私有网关不在名单里,默认 true(openai-completions.js:1148)。- 于是系统提示词以
developerrole 发出。上游网关不认识(或审计层直接拦截)时:严格校验的报 400 反序列化错误;带内容审计的直接拦截报 11128「请求被拦截」。
上游参考:deepseek-ai/deepseek-harness Discussion #636(第三方模型设置思考强度报错),评论区有腾讯系网关 content-audit 拒绝 developer role 的实测结论。
解决方案:加一行 compat
在 ~/.dsh/settings.yaml(Windows:C:\Users\<用户名>\.dsh\settings.yaml)对应 provider 下加:
llm-pi-ai:
providers:
<provider 名>:
displayName: ...
apiKeyEnv: ...
api: openai-completions
baseURL: ...
compat:
supportsDeveloperRole: false # ← 新增:系统提示词改回 system role 发送
models:
- id: ...
reasoningEfforts:
...
- 配在 provider(路由)级即对该 provider 下所有模型生效;也可配在单个 model 级。逐字段优先级:模型 → 路由 → 内置 catalog → pi-ai 自动检测。
- 思考强度功能保留,
reasoning_effort照常传递,只是 role 从developer改回system。 - 改完重启 dsh 生效。多个 provider 都报同样错时每个都加。
本机实例(coderelay):
coderelay:
displayName: coderelay
apiKeyEnv: CODERELAY_API_KEY
api: openai-completions
baseURL: http://127.0.0.1:11435/v1
compat:
supportsDeveloperRole: false
models:
- id: deepseek-v4-pro
...
- id: deepseek-v4.1-flash
...
reasoningEfforts:
# ③ 逐模型声明可选档位
off: # 提供"关闭"档,发送时省略参数
low: low
medium: medium
high: high
max: max
新机器上先检查版本
compat.supportsDeveloperRole 需要 dsh-llm-pi-ai 0.1.1-rc.2 及以上(更早版本 compat schema 没有这个开关,配置会被拒绝)。验证:
grep -c "supportsDeveloperRole" "$(npm root -g)/@deepseek-ai/dsh/node_modules/@deepseek-ai/dsh-llm-pi-ai/lib/index.js"
返回 >0 即支持本方案;否则先把 dsh 升级到 0.1.1-rc.2(本机版本)再改配置。
改了还没好时的备用手段
按网关实际报错继续补 compat(同在 provider 的 compat 下):
- 输出上限字段被拒:
maxTokensField: max_tokens(未识别网关默认发max_completion_tokens) - 思考参数传输格式不对:
thinkingFormat: deepseek等 - 替代路线:
- 本地起一个几十行的 Node 转发器:把请求体里
messages[].role === "developer"改写为"system"后原样透传(含 reasoning_effort),settings.yaml 的baseURL指向转发器。 dsh plugin --profile web add pi2dsh+ 对应网关的 Pi provider 包(Discussion #636 评论里的通用插件方案,较重)。- 保底:删掉模型的
reasoningEfforts声明,并把agent-default-model.reasoningEffort一起去掉;代价是思考强度功能不可用。
- 本地起一个几十行的 Node 转发器:把请求体里
相关路径速查
| 内容 | 路径 |
|---|---|
| 配置 | ~/.dsh/settings.yaml |
| pi-ai developer role 判定 | <dsh 安装目录>/node_modules/@deepseek-ai/dsh/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js(787、1148 行) |
| 插件 compat schema | <dsh 安装目录>/node_modules/@deepseek-ai/dsh/node_modules/@deepseek-ai/dsh-llm-pi-ai/lib/index.js(compatProfile,884 行起) |
| 插件中文文档 | 同目录 README.zh.md(含 supportsDeveloperRole: false 的官方私有网关示例) |