Repository navigation
v2.4.1 — 11128 的真正成因:system 内容指纹
这一版修的是「为什么还是 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 例