dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek Harness 多账号切换插件:本地 grant 库、热切换、余额与自动轮换
在 DeepSeek Harness 里管理多个 DeepSeek 官方账号,并在不重启 GUI、不撤销 token 的前提下切换。可选地按鉴权失效、额度耗尽、限流或低余额自动轮换。
适用版本:DeepSeek Harness Desktop
0.2.1-rc.2(源码 tag 同版本)。插件只使用 Cordis 服务与 Node 内置模块,不依赖任何@deepseek-ai/*运行时包;升级 DSH 后若设置页不出现,请先检查 Host 日志中的account-switcher前缀。
本插件只做切换/轮换;登录、服务器 portal、SSH 隧道、token 缓存都在独立的
dsh-account-login 插件里。两个插件都安装后:
登录管理(登录插件) → 登录新账号 → grant 写入 ~/.dsh/account-login/accounts.json
账号切换(本插件) → 同步登录账号 → 导入 grant → 切换/轮换
dsh plugin --profile web add github:hyqweasd5-png/dsh-account-switcher
安装后重启一次 DeepSeek Harness。
打开 DSH,进入 插件 页。
点 添加插件 → 安装第三方插件。
在包名/路径输入框中填本目录的绝对路径:
/path/to/dsh-account-switcher
(替换成你本机的实际路径)
安装完成后按提示 立即启用,然后重启一次 DeepSeek Harness。
打开 设置,左侧应出现 账号切换。
安装只需要重启这一次;之后所有切换都是热生效。
x-dsh-auth-token 的值)。会先请求平台校验身份,失败则拒绝写入。
chat.deepseek.com 的网页会话 token 不能直接导入:它是另一套服务的凭证,平台接口会返回 code 40003。这类账号请用「添加账号」走一次平台浏览器登录。~/.dsh/.credentials.yaml 中 deepseek-account-platform/default 的 payload.token。platform.deepseek.com,可以从浏览器 DevTools 的任一平台请求复制 Authorization: Bearer ... 的 token。插件会按平台授权页相同的 auth_init → auth_approve → auth_exchange 流程换取 DSH grant,并导入/切换。
chat.deepseek.com 的网页 token 会被平台拒绝(40003)。dsh-account-login 负责;登录后在本页点「同步登录账号」,从 ~/.dsh/account-login/accounts.json 导入 grant。官方账号页的「退出登录」会调用 POST /auth-api/v0/users/logout,在服务器端撤销 token。一旦撤销,账号库里保存的副本也会失效。切换请始终使用本页的「切换」。
默认关闭。开启后按以下信号切换:
| 信号 | 来源 | 行为 |
|---|---|---|
| 登录态失效(401 / 40003) | 账号事件、模型错误 | 当前号标记失效,切下一个 |
额度耗尽(402 / QUOTA) | 模型错误 | 当前号冷却,切下一个 |
限流(429 / RATE_LIMIT) | 模型错误 | 当前号冷却,切下一个;连续两个号都被限流时暂停 5 分钟 |
| 余额低于阈值 | 定时轮询 | 仅在无运行中会话时切换 |
守卫:最小切换间隔 30 秒、10 分钟最多 3 次、账号冷却 10 分钟。没有可用账号时只告警,不删除当前 grant。所有切换写入轮换日志。
余额按币种比较,不跨币种换算。轮询间隔默认 5 分钟。
DSH 的官方账号状态就是凭证存储中的一条记录:
~/.dsh/.credentials.yaml
deepseek-account-platform/default:
kind: grant
payload: { version: 1, token, issuer }
切换时插件用 ctx.credentials.modifyRecord 原子替换这条记录。凭证存储监听文件变化并发出 credentials/record-updated,账号插件收到后清空缓存的资料/余额;推理侧的 resolveToken 每个请求现读记录。因此不需要重启,也不存在“内存里的旧 token”。
账号库保存在独立文件中:
~/.dsh/account-switcher/accounts.json # 0600,目录 0700
只存 grant、显示资料、余额快照和最近 50 条轮换日志。文件损坏时会改名为 accounts.json.corrupt-<时间戳>,不会静默覆盖。
插件卡片、设置分区和页面文案固定为中文。Electron 的 navigator.language 经常是 en-US,如果按它判断,中文界面里会出现英文;因此本插件不跟随浏览器语言。locale/en.json 与 locale/zh.json 都填了中文标题和说明,插件卡片在两种 locale 下都显示中文。
maskedToken(前 6 + 后 4)。x-account-switcher: 1;写请求如果带了 Origin,该 Origin 必须是 loopback(localhost、127.0.0.1、[::1],端口不限)。Electron 有时不发 Origin,此时以自定义头作为 CSRF 门。redirect: 'error'、30 秒超时、响应体上限 64 KiB;日志不记录 token 或响应正文。在 ~/.dsh/profiles/desktop/cordis.patch.yml 中覆盖 bundle patch 的 config:
- id: account-switcher
config:
platformOrigin: https://platform.deepseek.com
debug: false
| 字段 | 默认值 | 说明 |
|---|---|---|
platformOrigin | https://platform.deepseek.com | 官方平台源;开发时可配 loopback HTTP |
debug | false | 开启 POST /account-switcher/api/debug/trigger,用于测试轮换 |
vaultPath | $DSH_HOME/account-switcher/accounts.json | 账号库路径 |
clientVersion | 0.2.1-rc.2 | 平台请求的 x-client-version |
locale | 系统语言 | 平台请求的 x-client-locale |
account-switcher: ready。http://127.0.0.1:<端口> 打开 GUI;API 拒绝非 loopback 或缺少请求标记的调用。token-invalid 标记,重新登录或导入。在 插件 页移除 @local/dsh-account-switcher,重启 App。当前账号的 grant 仍在凭证存储中,不受影响;账号库文件保留,可手动删除:
rm -rf ~/.dsh/account-switcher
dsh-account-switcher/
├── package.json # bundle + client manifest
├── cordis.patch.yml # 插入 Host 插件行
├── lib/
│ ├── index.js # Host 半:服务接线、切换、轮换
│ ├── vault.js # 账号库读写
│ ├── platform.js # 平台资料/余额查询
│ ├── rotation.js # 轮换决策与策略校验
│ ├── routes.js # 同源 JSON API
│ └── client.js # 设置页 lazy-CJS bundle
└── test/ # node --test