修复 buddy 渠道 400 报错并在升级后自动重打补丁
29.8/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/22 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add basaltfold/dsh-tencent-channel-fix该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · model
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 11 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件
查看扫描证据(共 13 处,展示前 12 条)
- 读取本地文件lib/patcher.js:366
for (const entry of readdirSync(profiles, { withFileTypes: true })) { - 读取本地文件lib/patcher.js:385
if (existsSync(join(dir, 'package.json'))) return dir; - 读取本地文件lib/patcher.js:393
const manifest = JSON.parse(readFileSync(join(target, 'package.json'), 'utf8')); - 读取本地文件lib/patcher.js:416
cache.set(file, readFileSync(join(target, file), 'utf8')); - 执行外部命令来自配置/变量lib/patcher.js:470
const piped = spawnSync(process.execPath, ['--check', file], { - 执行外部命令来自配置/变量lib/patcher.js:482
const silent = spawnSync(process.execPath, ['--check', file], { - 读取本地文件lib/patcher.js:539
if (source === undefined) source = readFileSync(join(target, patch.file), 'utf8'); - 写入本地文件lib/patcher.js:562
copyFileSync(absolute, backup); - 写入本地文件lib/patcher.js:564
writeFileSync(absolute, body, 'utf8'); - 写入本地文件lib/patcher.js:579
copyFileSync(backup, absolute); - 读取本地文件lib/patcher.js:610
for (const entry of readdirSync(dir)) { - 写入本地文件lib/patcher.js:623
copyFileSync(newest, absolute);
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
README
由 DeepSeek 最新模型翻译生成dsh-tencent-channel-fix
修复 DeepSeek Harness 调用 buddy / workbuddy 渠道时恒返回 400 / code 11128 的问题,并在插件升级后自动重打。
请求被拦截,请重新发送 · Illegal API invocation from an unapproved channel · INVALID_REQUEST
症状:新建对话,第一条消息就失败,报错里看不出任何有用的信息——它既不说是哪个请求头,也不说是哪句话。
真正的原因
渠道网关同时拒绝了请求里的两个独立内容,只修一个仍然是 400。
1. 归属 User-Agent
dsh-our-free-model/adapter/kernel.js 把 harness 身份当作 User-Agent 发出去:
deepseek-harness/0.2.1-rc.2 (+https://github.com/deepseek-ai/deepseek-harness)
deepseek-harness 这个 token 在黑名单上,且大小写不敏感——DeepSeek-Harness/0.2.1 一样被拦。实测其它所有 UA 都放行,包括 curl、node、axios、undici、codex_cli_rs、claude-cli、opencode 和空 UA。
展开完整文档(README 剩余 1 节)
dsh-tencent-channel-fix
修复 DeepSeek Harness 调用 buddy / workbuddy 渠道时恒返回 400 / code 11128 的问题,并在插件升级后自动重打。
请求被拦截,请重新发送 · Illegal API invocation from an unapproved channel · INVALID_REQUEST
症状:新建对话,第一条消息就失败,报错里看不出任何有用的信息——它既不说是哪个请求头,也不说是哪句话。
真正的原因
渠道网关同时拒绝了请求里的两个独立内容,只修一个仍然是 400。
1. 归属 User-Agent
dsh-our-free-model/adapter/kernel.js 把 harness 身份当作 User-Agent 发出去:
deepseek-harness/0.2.1-rc.2 (+https://github.com/deepseek-ai/deepseek-harness)
deepseek-harness 这个 token 在黑名单上,且大小写不敏感——DeepSeek-Harness/0.2.1 一样被拦。实测其它所有 UA 都放行,包括 curl、node、axios、undici、codex_cli_rs、claude-cli、opencode 和空 UA。
2. 系统提示词里的身份句
DSH 的基础 system prompt 开头是:
You are an AI agent powered by DeepSeek Harness.
网关把 powered by DeepSeek Harness 当作内容指纹,出现在 system 里就整条拒绝。
这一点很隐蔽:dsh-our-free-model 本来就有指纹改写机制(rewriteTencentContentFingerprints),但它只在网关路径(convertMessage / toMessages)里调用。而 buddy 走的是直连 adapter 路径,那里的 system 拼装是裸的 messages.unshift(...),从来没调过改写器——所以那句话原样发了出去。
真机实测:
| 请求 | 结果 |
| 原版 system + 原版 UA | 400 code 11128 |
| 原版 system + 已修 UA | 400 code 11128 |
| 改写 system + 已修 UA | 200 OK |
同一道校验还会拦 Main branch (you will usually use this for PRs)、You are Claude Code, Anthropic's official CLI for Claude. 和 x-anthropic-billing-header——这也是各类 CLI 代理项目撞到同一个报错的原因。本插件只修 DSH 自己会发的这两处。
为什么做成插件,而不是打个补丁
两处缺陷都是 dsh-our-free-model 里的文本。它的更新器是整文件覆盖,手工改的东西在下次更新时必然丢失——这个 bug 上次就是这么复发的:先手工修好,插件一升级又回来了,再修一次。
所以这个插件改成每次启动重打:
- 只写一次,在 apply() 里、任何模型请求之前——pack.js 和 adapter/kernel.js 是被那个插件懒加载的,写入远早于模块缓存。
- 幂等:已修的文件靠 marker 识别,逐字节不动。
- 认漂移:上游把锚点挪走时,该 patch 跳过并报告,不硬改、不写一半。
- 失败自还原:写前备份、写后 node --check,任何一步失败就还原原文件。
于是 dsh-our-free-model 升级不再是回归,而是一次自愈。
安装
dsh plugin add dsh-tencent-channel-fix
或直接从本仓库装:
dsh plugin add github:basaltfold/dsh-tencent-channel-fix
重启一次 DSH,启动日志会出现其中一条:
[dsh-tencent-channel-fix] repair applied — applied attribution-user-agent, content-fingerprints, direct-system-rewrite. Active from the next model request. [dsh-tencent-channel-fix] repair incomplete (upstream dsh-our-free-model changed) — drifted ...
命令
/tencent-fix
| 参数 | 作用 |
| (空)/ status | 三个 patch 的状态、解析到的目标目录与版本 |
| apply | 立刻强制重打,打印哪些落地、哪些漂移 |
| restore | 用最新备份还原,撤销修复 |
| why | 在对话里给出根因说明 |
dsh-tencent-channel-fix · patch revision 1 target: C:\Users\you\.dsh\profiles\desktop\node_modules\dsh-our-free-model dsh-our-free-model: 2.5.7
OK attribution-user-agent — Attribution User-Agent (400 / code 11128) OK content-fingerprints — Rejected system-prompt fingerprints (400 / code 11128) OK direct-system-rewrite — Direct adapter path system rewrite (400 / code 11128)
3/3 patches in place.
GET /dsh-tencent-channel-fix
同样的状态,JSON 格式,仅限本机回环。非 GET 返回 405;写操作只走斜杠命令。
配置
可选,写在 bundle row 里:
- insert:
- id: tencent-channel-fix
name: 'dsh-tencent-channel-fix'
config:
autoApply: true # false = 只报漂移,永不写入 target: '' # 显式指定 dsh-our-free-model 目录 verbose: false # 连无需改动的启动也打日志
target 为空时自动解析:${profile}/node_modules/dsh-our-free-model → Node 自身解析路径 → ~/.dsh/profiles/*/node_modules/。
作用范围
- 只碰两个文件,都在 dsh-our-free-model 里:adapter/kernel.js 与 vendor/channel-pack/pack.js。
- 其它一切不动:provider、model row、路由、凭据、DSH 本体文件。
- 内容改写是按 provider 收敛的(pack.js 内 TENCENT_PROVIDERS = ["buddy", "workbuddy"]),其它渠道原样透传。
- 归属仍然有效:UA 依然存在、非空、保留版本号——只去掉了被拦的 token 和 URL。
验证
npm test # 29 个用例,不联网,不碰真实安装
测试在临时目录里按两个文件的实际出厂形态造目标(kernel.js 是 LF,pack.js 是 CRLF),覆盖幂等、行尾保持、歧义检测、逐 patch 漂移、dry-run、备份还原;还会用 new Function 抽出注入的 sanitizeAttributionUserAgent 并断言其真实输出。
想对真实安装做只读确认:
node -e "import('dsh-tencent-channel-fix/patcher').then(m => console.log(m.formatStatus(m.resolveTarget({}))))"
兼容性
DSH >= 0.2.0-rc.1。已在 0.2.0-rc.2、0.2.1-rc.2 上验证,搭配 dsh-our-free-model 2.5.6(原版,0/3)与 2.5.7(3/3)。
若将来 dsh-our-free-model 挪了锚点,/tencent-fix status 会把它标成 drifted 并给出原因,且跳过而不硬改。到新文件里重新提取锚点,更新 lib/patcher.js 的 PATCHES 即可。
相关
- buddy-proxy#14 — 同一道网关校验,作者确认触发点是系统提示词用词,不是请求头
- magpie#182 — 同样的 11128,同样原因
许可
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
basaltfold/dsh-tencent-channel-fix
修复 buddy 渠道 400 报错并在升级后自动重打补丁
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个给…
★ 761已汉化DSH
68.7
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 379已汉化DSH
67.8
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1