🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

渠道 400 修复 basaltfold/dsh-tencent-channel-fix

DeepSeek Harness
basaltfold11 天前有提交已提供中文文档扫描:含敏感能力

修复 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
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件
查看扫描证据(共 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
预览分享卡片长什么样 ↓basaltfold/dsh-tencent-channel-fix
分享 · DeepSeek Harness Hub
basaltfold/dsh-tencent-channel-fix

修复 buddy 渠道 400 报错并在升级后自动重打补丁

回到顶部