前言¶
DeepSeek Harness(DSH)走 WorkBuddy 国内反代时,有些环境会在每轮对话第一步就失败,报错类似「请求被拦截,请重新发送」,标签为 INVALID_REQUEST,底层网关返回 code 11128。同一账号换 WorkBuddy 国际版(www.workbuddy.ai)往往正常,说明问题出在国内网关对请求体的校验,而不是模型额度或网络。
内核默认组装的 system prompt 里会带上多段与 DSH 生态相关的固定文案;国内网关 copilot.tencent.com 在服务端对 system(以及部分 assistant)消息做通道校验,命中规则即拒绝。在 llm/stream 或 system-prompt/assemble 上改已经试过,要么改不动深冻结的选项,要么误伤所有 provider。社区插件 dsh-wb400-guard(维护者 curo22,分类:联网工具)选择在宿主进程包装 globalThis.fetch,只对发往国内网关的请求做语义等价的指纹中性化,从而绕过 11128,又不改动 user / tool 消息及其他 API。
下面介绍它解决什么问题、如何工作,以及如何安装与配置。
这是什么¶
dsh-wb400-guard 是一条命令即可启用的 DSH 插件:在 fetch 层改写发往 copilot.tencent.com 的 chat 请求体里 system / developer / assistant 消息中的已知触发片段,使网关不再返回 11128,同时保持对模型而言的指令含义不变。运行时零 npm 依赖,需 Node ^22.19.0 || >=24.0.0,许可证 MIT,当前资料中版本为 0.1.7。
典型失败表象(资料中的原文包装)如下:
本轮运行失败 400: {"message":"workbuddy upstream client (http 400): 请求被拦截,请重新发送","type":"client","code":"client"}
网关侧原始错误形态为:
{"code":11128,"msg":"Illegal API invocation from an unapproved channel"}
是否需要安装:对照现象¶
资料给出一张快速对照表,前三条同时命中时,基本可认定是本文档针对的问题:
| 现象 | 是否命中 |
|---|---|
报错含「请求被拦截,请重新发送」,标签 INVALID_REQUEST |
是 |
| 换国际版模型正常,换回国内版失败 | 是 |
| 第一步就挂,没有完整回复 | 是 |
| 换账号、模型、机器症状相同 | 是 |
| WorkBuddy 官方客户端手动聊天正常 | 是 |
429 或「usage exceeds frequency limit」 |
否(额度) |
11101 或「Non-stream chat request」 |
否(非流式) |
fetch failed / 502 |
否(网络) |
触发来源(插件为何要改四处)¶
国内网关的拦截与 DSH 默认带入的 system 内容有关。资料归纳四个互不相同的触发源;只修其中一部分,在仍携带其余段的 profile 上仍会 400。
- 文件引用说明(
@deepseek-ai/dsh-file-reference):注入段中含@与特定前段词组组合,不是「单个 @」就会拦;将@换成等义(at)可过网关。 - 内核身份句(
@deepseek-ai/dsh-system-prompt,默认includeHarnessIdentity = true):system 开头的You are an AI agent powered by DeepSeek Harness.(DeepSeek与Harness之间含零宽空格 U+200B)会触发;改标点或句式可过。 - personaPrefix(
@deepseek-ai/dsh-web-app的cordis.patch.yml):You are a coding agent powered by ...句式会触发,与模型名无关。 - Web GUI 段(
@deepseek-ai/dsh-harness-dev-context):位于 system 尾部的两段 DeepSeek Harness Web GUI 相关文案也会触发;仅改「开头锚定」的修法够不到这里。
国际网关不做同类校验,同一份 body 发 www.workbuddy.ai 为 200。
核心功能:fetch 层做了什么¶
插件只对目标 host 的请求生效(默认 copilot.tencent.com),在发出前扫描 system / developer / assistant 消息,按资料中的规则表改写:
| # | 改什么 | 改成什么 |
|---|---|---|
| 1 | 文件引用段里的 @ |
(at) |
| 2 | 开头的身份句(含零宽空格变体) | You are an AI agent powered by DeepSeek-Harness. |
| 3 | You are a coding agent powered by ... |
You are a coding agent running on ...(模型名保留) |
| 4 | DeepSeek Harness Web GUI 相关句 | this Web GUI / Current Web GUI URL 等中性表述 |
最后兜底:将残留的 DeepSeek + 不可见分隔 + Harness 品牌指纹统一为 DeepSeek-Harness(含历史会话冻结段落)。
assistant 消息也要扫:资料实测表明,文件引用段在 assistant 中任意位置都会触发 11128;身份句仍主要在开头触发。user 与 tool 消息 deliberately 不改;DeepSeek、OpenAI、Anthropic、WorkBuddy 国际版等其它 host 原样透传。
选用 fetch 层的原因:11128 重试阶梯会多次重发请求,在 body 组装层改容易漏级;而 stream 事件的 GenerateOptions 深冻结无法改,assemble 事件则会波及所有 provider。
安装与启用¶
推荐:DSH 插件命令¶
把 web 换成你实际使用的 profile 名(桌面版一般为 desktop):
dsh plugin --profile web add github:curo22/dsh-wb400-guard
装完后的确认¶
完全退出并重启 DSH Desktop(不是仅关窗口)。宿主日志中应出现类似:
[I] [dsh-wb400-guard] [dsh-wb400-guard] fetch guard installed for copilot.tencent.com
资料还提供 node install.mjs 等方式安装到 profile 的 vendor 目录并写入 package.json 的 dependencies 与 dsh.profile.bundles;若手动改 profile 的 package.json,避免用 PowerShell 的 ConvertTo-Json | Set-Content,以免 UTF-8/BOM 与中文路径被破坏导致 profile 加载失败。
配置¶
在插件的 cordis.patch.yml 中可调(资料原文):
| 键 | 默认 | 说明 |
|---|---|---|
enabled |
true |
为 false 时不包装 fetch |
gatewayHosts |
["copilot.tencent.com"] |
要防护的 host;以 . 开头可做后缀匹配;国际网关默认不在列表 |
mode |
"anchor" |
anchor 只改两处指纹相关句式;all 在 system 上做更宽兜底替换(资料说明:all 只在 system 上兜底全换,不影响 assistant 里的普通 @) |
适用场景与注意¶
适合谁:在 DSH 中配置 WorkBuddy 国内版反代、稳定复现 11128 /「请求被拦截」且国际版正常的开发者。
注意:
- 插件以当前 DSH 进程权限运行,会在运行时替换全局
fetch行为(仅对配置的 gateway host)。安装前应阅读 GitHub 仓库 源码与 MIT 许可证,确认改写策略可接受。 - 改写目标是语义等价、仅避开网关字面匹配;若腾讯侧规则变化,可能需要插件更新。
- 社区目录 SkillHub 插件页 与 GitHub 为独立生态信息源,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-wb400-guard 把 WorkBuddy 国内网关 400(code 11128)的修复收敛到一条 DSH 安装命令:在 fetch 层对已知 system / assistant 指纹做定向中性化,不碰 user 消息,也不影响国际网关与其它 API。若你符合前文现象对照表,可先安装、重启 Desktop,用日志行确认 guard 已挂载,再发起一轮国内版对话验证。
- 目录页:https://www.skillhub.cn/plugins/curo22/dsh-wb400-guard
- 源码与完整说明:https://github.com/curo22/dsh-wb400-guard