Skip to content

v2.4.1 — 11128 的真正成因:system 内容指纹

Choose a tag to compare

@XDTrees XDTrees released this 21 Oct 04:16
· 27 commits to main since this release

这一版修的是「为什么还是 11128」

2.4.0 把 400 / 11128 Illegal API invocation from an unapproved channel 归因于缺少会话身份头。这个归因是错的——实测证明国内网关根本不检查那三个头,不带它们照样放行。

真正的触发条件是 system 消息里的自报句:网关按内容指纹判断「这是不是官方客户端发出来的」,命中串是 You are an AI agent powered by DeepSeek Harness。这句话由宿主的第一方插件 @deepseek-ai/dsh-system-prompt 固定注入,任何未改装的安装都会 100% 命中,与账号、密钥、渠道、UA 全部无关。这也解释了为什么它的表现是「第一个账号失败后不再重试」——每个账号都会失败,重试没有意义。

修法是在发送前把这句话改写成网关放行的同义句(powered by → running on),只动命中的文本块,图片与缓存块的引用原样透传;没命中时返回同一个引用,不为「什么都没改」付深拷贝代价。改写清单做成了数组,将来网关加句子只是多一行。

实测(真实国内网关,同一账号三组对照)

请求体 结果
经本插件改写 429 / 6004(通过渠道校验,仅受频率限制)
原样含该句(对照) 400 / 11128
system 干净(基线) 429 / 6004

另外两条只在特定网关成立的规则

11128 是多路复用的错误码——同一个码在不同网关指向完全不同的成因,所以这次也一并处理了另外两个。

国际网关要求首条消息是 system

www.workbuddy.ai 对一个以 user 开头的请求体回 400 / 11128 "first message is not system prompt",而同一个请求体在国内网关是被接受的。现在国际版请求若首条不是 system,会在最前面补一条占位 system,你自己的消息位置和措辞一个字符都不动。

思考档位「关闭」会被两区同时拒绝

适配层把 thinkingLevelMap.off 钉成字面量 'off',而 pi-ai 对「没有显式指定档位」的请求发的就是它——所以选「默认」和选「关闭」产生了同一个请求体。两区都不接受这个值:国际版 GPT 族回 400 / 11133(extError.param === 'reasoning.effort'),国内版在声明了 onlyReasoning 的模型上报错。现在发送前把它删掉,让上游走自己的默认档。

省略是唯一在各个区、各个模型上都实测通过的写法;换成字面量 'none' 不是安全替代(GPT-5.6 族接受,别的模型拒绝)。

实测(真实双网关,同一账号前后对照)

请求 修复前 修复后
国际版,首条为 user 400 / 11128 first message is not system prompt 200
国际版,reasoning_effort: "off" 400 / 11133 extError.param=reasoning.effort 200

免费模型限流提示说清了配额口径

免费车道的拒绝原文是「the provider asked to wait 74558s」——二十小时,读起来像整个免费车道被封了。实际配额按上游会话计,换一个会话(或换一个模型)就另有一份额度。现在限流错误的文案补上了这一句;只有限流类错误带这句,凭据失效、模型不存在之类加上去只会引导用户去做无用重试。


升级

dsh plugin add dsh-xdpool@2.4.1

升级后请重启 DSH 让新版本生效。

测试

全套 70 文件 / 931 用例。本版新增:

  • system 内容指纹改写 8 例
  • 区域专属请求体规则 12 例(含反向验证:把两条规则去掉会有 5 个用例转红)
  • 免费车道会话配额提示 1 例