dsh-huawei-connect

modelnpmMIT

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

下载量 / Downloads
385

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 的附件里:

dsh-huawei-connect-1.3.4.tgz

(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

Links

GitHub · Homepage · npm

Same category