dsh-workbuddy-fnos-wenkbaby
Verifieddsh-workbuddy-fnos-wenkbaby · v0.2.3 · MIT · Web UI
把 WorkBuddy 桌面端的模型接入 DeepSeek Harness,支持国际版与国内版,支持多账号导入导出与切换。基于 dsh-workbuddy-connect 扩展。
Install
dsh plugin add dsh-workbuddy-fnos-wenkbaby Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
DSH WorkBuddy(多账号版)
把 WorkBuddy / CodeBuddy 桌面端里可用的模型接入 DeepSeek Harness,并在此基础上增加了:
- 多账号池:同一个版本可保存多个账号,随时切换
- 导入 / 导出:账号凭据可备份、迁移到别的机器
- 渠道校验规避:处理上游对非官方客户端的启发式拦截
本项目 fork 自 dsh-workbuddy-connect(MIT,作者 corrinehu),原版逻辑完整保留,只在其上叠加上述能力。
⚠️ 与 connect 原版冲突:两者注册同一个 provider id
workbuddy,不能同时安装。
安装
前置:本机已安装并登录 WorkBuddy(国内版)或 WorkBuddy AI 桌面 App,或事先准备好账号凭据。
# Web profile(按实际内核固定版本)
dsh plugin --profile web add [email protected]
dsh web
也可以从 GitHub 源码安装:
dsh plugin --profile web add github:Wenk12138baby/dsh-workbuddy-fnos-wenkbaby
版本兼容
| DSH 内核 | 本插件 |
|---|---|
| 0.2.1-rc.2 ~ 0.2.2-alpha.x | ✅ >=0.2.1-rc.2 <0.3.0-0 |
| 0.3.0 及以上 | ❌ 未验证 |
package.json 用 engines.dsh 而不是 peerDependencies 声明兼容范围。原因:dsh 的兼容判定逻辑里,
只要存在 engines.dsh 就单独用它判定,忽略全部 peer 依赖;没有该字段时才会逐个检查
@deepseek-ai/dsh-* 的 peer 版本。原版把 peer 锁死在 0.2.1-rc.2,导致在 rc.5 上插件被静默跳过。
多账号
在界面里管理
侧栏 插件 → 点 dsh-workbuddy-fnos-wenkbaby → 展开 多账号管理(N)。
每个版本(国内版 / 国际版)各有一个「当前」账号:
| 操作 | 说明 |
|---|---|
| 切换 | 把该账号设为当前版本的使用账号,模型列表随后刷新 |
| 删除 | 从账号池移除(当前账号被删时会自动顺延到同版本下一个) |
| 导出全部账号 | 下载 JSON(含明文令牌) |
| 导入 | 粘贴内容或选择文件 |
当前账号的按钮显示为「当前使用中」并禁用,其余为「切换」。
注意:导入会把导入的账号设为该版本的当前账号。如果只想入库、不想改变当前选择,导入后再点一次原来的账号「切换」即可。
存储
账号池文件:$DSH_HOME/workbuddy-accounts.json(权限 600)。
{
"version": 1,
"active": { "cn": "<uid>", "ai": "<uid>" },
"accounts": [
{
"variant": "cn",
"uid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"credential": {
"accessToken": "...",
"refreshToken": "...",
"expiresAtMs": 1794989662372,
"domain": "www.workbuddy.cn",
"uid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"nickname": "你的昵称",
"enterpriseId": ""
}
}
]
}
首次读取时会自动迁移旧的单账号文件(.workbuddy-auth.json / .workbuddy-ai-auth.json),旧文件保留不删。
导出格式
{
"schema": "dsh-workbuddy-export/v1",
"exportedAt": "2026-10-31T00:00:00.000Z",
"accounts": [
{ "variant": "cn", "uid": "...", "nickname": "...", "domain": "...", "credential": { "accessToken": "...", "refreshToken": "...", "expiresAtMs": 0 } }
]
}
导入除了上面的导出格式,还接受:
- 裸数组
[{ variant, credential }] - 单个
{ credential: {...} }(版本按domain推断:*.workbuddy.ai→ 国际版,其余 → 国内版) - WorkBuddy 桌面端的
auth.info明文结构({ auth: {...}, account: {...} })
⚠️ 安全提醒
导出的文件包含明文 accessToken / refreshToken。 任何拿到它的人都能使用你的额度。 只在自有设备间传输,不要发到聊天群、网盘或任何公共位置。 如果泄露,请立即在对应桌面端重新登录以刷新令牌。
渠道校验规避
上游 copilot.tencent.com 会做启发式判定,命中时返回:
{"code":11128,"msg":"Illegal API invocation from an unapproved channel",
"displayMsg":{"zh":"请求被拦截,请重新发送"},
"displayTips":{"zh":"这次调用没通过渠道校验,可能不是官方客户端发出的"}}
已定位并处理的触发点(lib/sanitize.js):
| # | 触发条件 | 处理 |
|---|---|---|
| 1 | system 含 You are an AI agent powered by |
→ You are an assistant powered by |
| 2 | system 含 You are a coding agent powered by |
→ You are a coding assistant powered by |
| 3 | system 含 Web GUI / 浏览器描述 | → 换成 the current interface 等中性说法 |
| 4 | system 含 DSH 的路径规则段 | → 整段替换为一句中性说明 |
| 5 | 连续多条 role:"user" |
合并成一条(\n\n 连接) |
第 4 项值得说明:把 system prompt 按段落累加逐段测试,第 4 段一加入就命中 11128, 但该段里每一句单独发送都能通过 —— 说明判定针对的是「整段特征组合」而非某个关键词, 所以按整段替换处理,而不是逐词打补丁。
开关:
WORKBUDDY_NO_SANITIZE=1 # 关闭全部清洗,行为回到未打补丁的原版
WORKBUDDY_DEBUG=1 # 把发出的请求体与上游错误写入 $TRIM_PKGVAR/workbuddy-debug.log
HTTP API
前缀 /plugins/dsh-workbuddy-fnos/accounts:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | / |
列出账号与激活状态 |
| POST | /activate |
{variant, uid} 切换 |
| POST | /remove |
{variant, uid} 删除 |
| POST | /export |
导出(含明文令牌) |
| POST | /import |
导入 |
已知问题
| 问题 | 说明 |
|---|---|
| 与 connect 原版冲突 | 同一个 provider id workbuddy,不能同时装 |
| 国际版 catalog 无计费 | connect 上游 /console/enterprises/personal/models 对 global 返回 500 |
app.sock EACCES |
与本插件无关,属应用目录权限问题 |
开发
lib/
├── index.js host 半身(provider 注册、HTTP 路由)
├── client.js 浏览器半身(插件配置页 UI)
├── host-heartbeat-*.js 核心逻辑(凭据、上游客户端、catalog)
├── accounts.js 账号池存储
├── pool-store.js store 包装层 + AccountManager
├── account-routes.js HTTP API
└── sanitize.js 渠道校验规避
改包名时:lib/client.js 第 2 行 window.__ModuleLoader__.load({ id }) 的 id
必须与 package.json 的 name 一致,否则前端报 loaded without registering。
host 侧注册的路由前缀(/plugins/dsh-workbuddy-connect/*)不必同步改。
多账号卡片挂在 plugins.bundle.config 槽位上(并入 WorkBuddyConfigPage)。
DSH 0.1.6+ 一个 bundle 只有这一个配置入口,旧的 settings.plugin.item 槽位不再被声明,
挂上去的组件完全不渲染。
许可
MIT。原版 dsh-workbuddy-connect © corrinehu,见 LICENSE 与
THIRD_PARTY_NOTICES.txt。