dsh-huawei-connect
Connect Huawei CodeArts and OfficeAce models to DeepSeek Harness: it reuses existing logins (a logged-in CodeArts desktop client or dsh-codearts; the OfficeAce desktop app running and logged in on Windows), shows each account's remaining credits, toggles models per platform, and shapes requests like
Install
dsh plugin --profile web add dsh-huawei-connect
Sandbox test
This plugin has not been tested yet. Submit a test →
README
DSH Huawei Connect
把华为两个平台的模型接进 DeepSeek Harness(DSH):
码道 CodeArts(编码)与 果办 OfficeAce(办公)。一次装配,两条 provider 路由,
积分余量、模型勾选、以及按官方客户端形态构造的请求,全在设置卡片里。
功能
- 两个平台、两条路由:
codearts与officeace各自出现在 DSH 的模型选择器里。
可以只用其中一个,也可以两个一起用。
- 积分余量:码道走
/snap-manager/v1/statistics/plugin(实测体验版 10500 分),
果办走本机控制面 /api/subscription/current(实测 4600 分)与
/api/codeagent-package/usage(码道兼容包剩余)。两个平台的额度口径不同,卡片
分开显示,互不影响。
- 模型勾选:卡片里按平台勾选(码道一栏、果办一栏互不牵连),写回宿主 settings,模型选择器实时生效。勾只代表「明确勾上」;某一栏一个都不勾 = 该平台不限制(全部开放),此时该栏会写明「不限制」。点一行只改这一行。
- 登录态自动发现:码道读
dsh-codearts已有的账号文件,果办读 Windows 凭据管理器。
两边都只读,都不要求用户重复登录。
- 请求伪装:按官方客户端的请求形态构造(身份头、字段白名单、认证方式),
详见 [§4](#4-请求伪装实测依据)。
- 不影响另一个平台:一个平台挂了,另一个照常;卡片上的错误就地显示。
安装
本插件是一个标准的 DSH 组合包(bundle):宿主读 package.json 的 dsh.bundle.patch
装载服务端,读 exports["./client"] 装载浏览器端设置卡片。所以它走宿主的插件安装通道,
不需要手工往 node_modules 里拷文件。
兼容性写在 engines.dsh: ">=0.1.7-rc.1 <0.3.0-0" 里:宿主版本落在区间外时安装会被
明确拒绝(而不是装上去再崩)。当前桌面端 0.2.1-rc.5、dsh web 0.2.1 都在区间内。
方式 A:从 GitHub 链接直接安装(推荐,已实测)
# 1.3.4 的发布标签 dsh plugin --profile <你的 profile> add github:wang111928/dsh-huawei-connect#v1.3.4 # 想钉死到某一次提交,把 #v1.3.4 换成 40 位提交号即可: # ... add github:wang111928/dsh-huawei-connect#<40位提交>
dsh plugin 后面的参数是原样转交给 profile 目录里的 pnpm 的(官方帮助:
"forwards the remaining arguments to pnpm in the profile directory"),所以 pnpm 支持的
spec 都能装。实测(全新 profile、非拷贝):初始化 profile 后从 GitHub 拉源码,
约 1 分钟装完并报 + dsh-huawei-connect 1.3.4;profile 的 package.json 里记录成
git+https://github.com/wang111928/dsh-huawei-connect.git#v1.3.4,之后的升级、卸载、
备份都认这条记录。首次拉取偶尔会网络超时,重试即可。
桌面端(DSH Desktop)请用它自己的 设置 → 插件 装:那个 profile 归应用的插件管理器
所有,应用运行期间命令行改不了它。在「从 Git / GitHub 安装」里填同一个 spec 即可。
方式 B:压缩包(离线,或访问不到 GitHub 时)
压缩包挂在 Release v1.3.4 的附件里:
(92,623 字节,sha256 50aa9ae52361aebb05958415e00df2306b620c857fb146a71cf5dfa20e691631)。
# 下载后把它指给宿主自己的插件安装器: dsh plugin --profile <你的 profile> add file:/绝对路径/dsh-huawei-connect-1.3.4.tgz
桌面端选「从本地压缩包安装」并指向同一个 .tgz。
方式 C:npm(尚未发布)
dsh plugin --profile <你的 profile> add dsh-huawei-connect@1.3.4
不要手动git clone到node_modules:那样装出来的目录不带 profile 的依赖解析与
兼容性校验,升级、卸载、备份都不认它。
装好后重启 DSH → 设置 → 插件 → 华为双平台 卡片 → 「同步登录态」。
前置条件
平台 · 需要
码道 · 用码道桌面端登录过(或装过 dsh-codearts 并登录)。读 $DSH_HOME/.codearts-accounts.json
果办 · 打开果办并登录。读 Windows 凭据管理器 OfficeAce/auth-sessions/... 与 ~/.office-claw/session.cookie
使用
1. 设置 → 插件 → 华为双平台 → 同步登录态。
2. 卡片上会显示每个平台的账号、积分余量、模型数。
3. 新建对话 → 模型选择器里选 码道 CodeArts 或 果办 OfficeAce 下的模型。
4. 想只留几个模型:在卡片里点掉其它模型 → 保存选择。
命令行
node lib/bin.mjs status # 账号、积分、套餐(不含任何密钥,可直接贴出来) node lib/bin.mjs models # 上游真实模型清单 node lib/bin.mjs sync # 从上游同步登录态
3. 登录与账号池
插件自带浏览器登录,不再依赖上游客户端已经登录过。
3.1 为什么能一套代码登两个平台
实测(2026-10-23):码道(codearts-agent)与果办(pdp5_for_agentarts)用的是
同一个 IAM——同一个授权页、同一个换 token 端点、同一套 PKCE + DPoP。而且两个
client_id 都接受 http://127.0.0.1:<port>/... 的本机回调(都返回 302 跳登录页)。
所以 lib/oauth.mjs 是一套引擎,平台差异只有 client_id 与授权页的拼法:
· 码道 · 果办
client_id · codearts-agent · pdp5_for_agentarts
授权页 · codearts.huaweicloud.com/portal/authorize?... · auth.huaweicloud.com/authui/login.html?service=...
换 token · sts.cn-north-4.myhuaweicloud.com/v1/oauth2/tokens · 同左
3.2 流程
点「使用华为云账号登录」 → 本机 127.0.0.1 随机端口起回调服务 → 生成 PKCE(verifier + S256 challenge)与 DPoP 密钥对 → 浏览器打开授权页,用户登录 → 华为回调 ?code=... 到本机 → 用 code + verifier + DPoP proof 换 STS token + 临时 AK/SK + refresh_token → 凭证落盘到 ~/.dsh/.huawei-connect/accounts.json (0600)
DPoP 私钥必须与 refresh_token 一起保存:refresh_token 签发时就和那时的公钥绑定,
续期时服务端会核对"是不是当初那把钥匙"。私钥丢了,refresh_token 就废了,只能重新登录。
3.3 自动续期
凭证约 24 小时过期(实测),续期用 refresh_token。三个关键点:
1. refresh_token 是一次性的——每续一次上游就换一个新的,所以续完必须立刻落盘。
2. 单飞——同一账号并发续期只会真正续一次(pool.mjs 按账号加锁)。两个并发
续期会让后到的那个失败,并把账号弄坏。
3. 失败不致命——续期失败但当前 token 还没过期时,继续用旧的。一次网络抖动不该
让一个本来能成功的请求失败。
3.4 账号池
为什么需要:码道对每个账号只开 3 个并发会话(见 §4.4)。这不是买额度能解决的,
是账号级硬计数。两个账号 = 6 个槽,四个 = 12 个。
池的行为:
事件 · 处理 · 为什么
认证失败 · 停用 1 小时 · 只能重新登录,重试无意义
积分耗尽 · 冷却 30 分钟 · 额度周期会重置,不该永久踢出
并发撞墙 · 不惩罚 · 这是容量问题,不是账号坏了——踢掉好号只会更糟
上游 5xx · 冷却 30 秒 · 通常是暂时的
TPM 限流 · 冷却 15 秒 · 按分钟窗口重置
轮转顺序:可用账号里按"最少使用"排序。这样不会总用同一个号把它的额度先耗光。
3.5 凭证来源的三种情况
origin · 含义 · 能续期吗
login · 在本插件里点的登录 · ✅ 有完整 OAuth 凭证
import · 从上游客户端读来的副本 · ❌ 只能用到过期
import+oauth · 从上游读来,但接管了它的 refresh_token · ✅ 接管后由本插件独占
接管的风险:如果 dsh-codearts 与本插件同时在用同一个账号,两边都续期会让对方的
token 作废。建议只保留一个。接管时机是首次 同步登录态。
3.6 命令行
node lib/bin.mjs login codearts # 打印授权地址,在浏览器打开 node lib/bin.mjs login officeace node lib/bin.mjs status # 账号、积分、池健康度
4. 请求伪装:实测依据
这一节是本文档最需要读的部分——它说明本插件做了什么伪装、没做什么,以及为什么。
每一条结论前面都标了实测日期与探针方式。
4.1 为什么 workbuddy 那套不能照搬
dsh-connect-workbuddy 的核心问题在上游:它按提示词内容做渠道指纹拦截。
网关拿到请求后逐条匹配 system / assistant 消息的开头(以及提示词中段的某些长
字符串),命中就回 11128,而 displayTips 一律写成"渠道校验失败"——从不告诉你是
哪一句触发的。那套解法(加中性头、在句读处插零宽空格、失败后重放整轮)是为**那个
具体缺陷**写的补丁。
4.2 华为这两个平台不做这件事(逐条实测)
2026-10-23,同一个真实账号,两个平台各发一次:
探针 · 码道 · 果办
裸 user 消息 · 200 · 200
system 开头是 DSH 官方提示词 "You are an AI agent powered by DeepSeek Harness." · 200 · 200
system 开头是 Claude Code 的身份句 · 200 · —
assistant 历史里复述上述身份句 · 200 · —
所以本插件不改写用户的提示词。抄那套补丁只会让你的提示词被无声篡改,
换不到任何好处——那是针对另一个上游的具体缺陷的方案。
4.3 真正会被拒的五件事(全部实测,全部已在插件里处理
…(truncated)
Rendered from the README published on npm. Formatted only, not edited.
Versions
Published on npm::2,最后更新 2026-10-30