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

WorkBuddy 账号池 XDTrees/dsh-xdpool

DeepSeek Harnessv2.4.6
XDTrees0 天前有提交已提供中文文档扫描:含敏感能力

把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…

67.1/100
综合分
359
GitHub 星标
2,223
npm 周下载
—/5
用户评分

数据截至 2026/10/31 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-xdpool
npm 源 · dsh-xdpool 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · model
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功(非静态推断);本次验证针对插件 v2.5.0,当前版本为 v2.4.6
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 0 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-xdpool @ 2.4.6
✓Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/27 15:26:23

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 114 处,展示前 45 条)
  • 读取本地文件
    lib/index.js:2339
    return normalize$1(JSON.parse(await readFile(path, "utf8")));
  • 读取本地文件
    lib/index.js:2355
    return normalize$1(JSON.parse(readFileSync(path, "utf8")));
  • 写入本地文件
    lib/index.js:2374
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/index.js:2376
    await writeFile(temp, `${payload}\n`, "utf8");
  • 写入本地文件
    lib/index.js:2377
    await rename(temp, path);
  • 读取本地文件
    lib/index.js:2465
    text = await readFile(path, "utf8");
  • 写入本地文件
    lib/index.js:2502
    await mkdir(join(path, ".."), { recursive: true });
  • 写入本地文件
    lib/index.js:2504
    await writeFile(tmp, document, "utf8");
  • 写入本地文件
    lib/index.js:2505
    await rename(tmp, path);
  • 读取本地文件
    lib/index.js:2736
    plist = readFileSync(join(bundle, "Contents", "Info.plist"), "utf8");
  • 执行外部命令固定命令
    lib/index.js:2851
    stdout = execFileSync("powershell", [
  • 执行外部命令固定命令
    lib/index.js:2887
    listingBuf = execFileSync("reg", [
  • 执行外部命令固定命令
    lib/index.js:2908
    valueBuf = execFileSync("reg", [
  • 读取本地文件
    lib/index.js:2924
    return path !== "" && existsSync(path);
  • 读取本地文件
    lib/index.js:2956
    if (!existsSync(drive)) continue;
  • 执行外部命令来自配置/变量
    lib/index.js:3013
    execFile(executable, ["-e", "try{process.stdout.write(process._linkedBinding('electron_browser_workbuddy_storage').loggerGet())}catch(e){process.exitC
  • 发起网络请求
    lib/index.js:11438
    const response = await fetch(resolved.modelsUrl, {
  • 发起网络请求
    lib/index.js:11524
    const response = await fetch(resolved.chatUrl, {
  • 发起网络请求
    lib/index.js:13707
    if (stub !== null && typeof stub.fetch === "function") return stub.fetch(url, {
  • 发起网络请求
    lib/index.js:13713
    const request = (target.protocol === "http:" ? http : https).request({
  • 发起网络请求
    lib/index.js:17567
    const response = await fetch(new URL(BILI_PREFIX + path, origin), {
  • 删除本地文件
    lib/index.js:20459
    await rm(path, { force: true });
  • 发起网络请求
    lib/client.js:2102
    const response = await fetch(POOL_USAGE_PATH, {
  • 发起网络请求
    lib/client.js:8063
    const response = await fetch(POOL_MODEL_PROBE_PATH, {
  • 发起网络请求
    lib/client.js:8096
    const response = await fetch(POOL_AGGREGATE_PATH, {
  • 发起网络请求
    lib/client.js:8127
    const response = await fetch(POOL_AGGREGATE_SAVE_PATH, {
  • 发起网络请求
    lib/client.js:8159
    const response = await fetch(POOL_AGGREGATE_TEST_PATH, {
  • 发起网络请求
    lib/client.js:8184
    const response = await fetch(POOL_AGGREGATE_DISCOVER_PATH, {
  • 读取本地文件
    lib/bin.js:2179
    return normalize$1(JSON.parse(await readFile(path, "utf8")));
  • 写入本地文件
    lib/bin.js:2198
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/bin.js:2201
    await rename(temp, path);
  • 读取本地文件
    lib/bin.js:2289
    text = await readFile(path, "utf8");
  • 写入本地文件
    lib/bin.js:2326
    await mkdir(join(path, ".."), { recursive: true });
  • 写入本地文件
    lib/bin.js:2329
    await rename(tmp, path);
  • 读取本地文件
    lib/bin.js:2560
    plist = readFileSync(join(bundle, "Contents", "Info.plist"), "utf8");
  • 执行外部命令固定命令
    lib/bin.js:2675
    stdout = execFileSync("powershell", [
  • 执行外部命令固定命令
    lib/bin.js:2711
    listingBuf = execFileSync("reg", [
  • 执行外部命令固定命令
    lib/bin.js:2732
    valueBuf = execFileSync("reg", [
  • 读取本地文件
    lib/bin.js:2748
    return path !== "" && existsSync(path);
  • 读取本地文件
    lib/bin.js:2780
    if (!existsSync(drive)) continue;
  • 读取本地文件
    lib/bin.js:2794
    for (const entry of readdirSync(root)) {
  • 执行外部命令来自配置/变量
    lib/bin.js:2837
    execFile(executable, ["-e", "try{process.stdout.write(process._linkedBinding('electron_browser_workbuddy_storage').loggerGet())}catch(e){process.exitC
  • 写入本地文件
    lib/bin.js:3845
    mkdirSync(dirname(path), { recursive: true });
  • 写入本地文件
    lib/bin.js:3846
    writeFileSync(`${path}.tmp`, `${JSON.stringify({
  • 删除本地文件
    lib/bin.js:11225
    await rm(path, { force: true });
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-settings-plugins@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-credentials@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-launch-environment@deepseek-ai/dsh-llm@deepseek-ai/dsh-llm-pi-ai@deepseek-ai/dsh-settings
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

6 张 · 点击查看大图

功能亮点

  • 聚合已登录账号成池
  • 自动切换可用账号
  • 自动签到领积分
展开完整介绍(206 字)↓

把 WorkBuddy 桌面 App 里登录过的所有账号(国内版和国际版都支持),合成一个 DSH 模型池。你在 WorkBuddy 里登过几个号,池里就有几个号——不用手动填表,不用一个个录入。 哪个号被限流了、积分用光了,请求自动换到下一个能用的号上去。你只管问,剩下的它自己处理。 另外附送一整套「积分自动化」:签到、领任务奖励、连登兑换、开猫猫旅行……这些每天都要手动点一遍的活儿,插件在后台替你干完了。

v2.5.02026-10-28
#68 到 #83 攒了十来张单子,这批一起收。其中三张是同一类毛病:代码把「没数据」和「数据是空」当成了同一件事。 · 最要紧的三条 | 症状 | 真实原因 | | --- | --- | | 一个失效账号吃掉整次请求的 8 次重试,最后报「API 密钥无效」 | 以「刷新拿到了新 token」判定账号仍可用。有一类账号 refresh 长期有效、chat 恒回 403,判死条件因此恒假 | | buddy 某一轮被中断后,之后每一轮都失败 | 中断留下的 assistant 消息只有 reasoning、没有正文,空字符串被原样发到 wire,国内网关 400/11151 且不在重试集合里 | | zcode 全部模型勾选后,每次重启又变回全禁用 | 用户全开时黑名单是空对象,与「从未选过」无法区分,启动补静音据此又把它们全关一遍 | · 逐条 #68 失效账号耗尽重试预算 — 池车道以「刷新成功」当「账号可用」。改法:单次请求内只允许该账号换一次票(refreshedThisRequest),第二次仍 session_dead 就判死并轮到下一个。取「第二次」而不是把惩罚提到刷新之前,是为了仍给真正过期的 token 一次机会。压缩重试路径同步。 #70 侧栏入口开关 — 新增 sidebarRow 配置(默认开)。只控制左侧栏那一行:设置页的 XD Pool 卡片始终注册,模型池不受影响 —— 关掉入口不能把开关本身也锁在门外。 #72 订阅包余额虚高 30 倍 — fetchCredits 只把 CapacityType === 4 当月包,而 2 是周期订阅包(12 期 × 4000,CapacityRemain 是整期剩余、CycleCapacityRemain 才是当期剩余),落进「一次性」分支。三账号实测:官方 3,399.8 / 插件 102,396 → 修复后 3,366;另两个只有月包的账号(3,049 / 2,771)不变,所以长期没被发现。 #73 中断回合留下的空 assistant 消息 — serializeMessages2 出口加 isBlankWireMessage / dropBlankWireMessages,serializeMessages4 同步。三点取舍都用真实请求验证过:user 空消息不动;不伪造占位内容;有 tool_calls 的 assistant 消息绝不删(它是 tool 结果的配对锚点)。 #74 全开渠道每次重启被重新禁用 — setModelDisabled 打开模型时是删键而不是写 false,于是「用户全开」与「从未选择」在磁盘上是同一个空对象。新增持久标记 selectionTouched,四个用户入口都置位,启动补静音只在标记缺失时执行。影响面是「所有模型都打开」的渠道,目录越小越必然 —— 这解释了为什么只有 zcode 反复被报。 #75 保存模型选择后界面回滚 30 秒 — setDraftFor(region, undefined) 的语义是「退回池子最后报告的状态」,而那份状态靠 30 秒轮询刷新。改成先 refresh(region) 再清草稿(重读失败则保留草稿);settingScope.set 的返回值不再丢弃,revision 冲突时保留草稿、报「设置已在别处被修改」、不谎报成功。 #82 RPC 桥惰性解析 — 2.4.6 的 CHANGELOG 声称这条已修,但发布产物里 installPackRpc 仍只捕获一次。现已改为每次 callPack 前惰性重解析。 · 社区 PR · #81(@jmglsi) 第三条内容指纹:Relative paths resolve from the workspace root → are resolved against the workspace root,语义、长度、换行位置都不变,被网关字符串表收录的子串消失。 · #84(@Refeain) CodeArts 输出上限:三条路径(listModels / resolveModel / wire)统一按 65536 封顶。实测 384000 → HTTP 200 + SSE 帧 InferHub.4001.200,65536 → 正常流式。 · 尚未定性 #69 CodeArts 提示密钥无效、#71 kimi k3.1 pro 没有响应 两张只有一句话。#69 至少有两条来源,其中 InferHub.4001.200 那条已随 #83 修掉;真正的 401/403 需要失败时的原始响应才能确认。#71 请补一下:是空回复、卡住不动、还是有报错文案。 · 验证 · 全套 80 文件 / 1033 用
v2.4.62026-10-23
2.4.4/2.4.5 之后侧栏能进、能滚了,但扫码过的渠道在账号池里经常整片空白,重开也一样。磁盘上账号是齐的(state.json 里 15 条),所以问题全在读取链。 · 16 秒的事实抓取把首屏挡掉了 load() 里先 await fetchChannelModels(...) 再 setEntries(...)。那次采样测到 16.5 秒——它要把每个模型逐个交给宿主适配器解析上下文窗口,冷启动时很慢。卡片区在这十几秒里是空的,看起来就像「没有账号」。 改成两阶段:provider.status 与 account.list 先回来(几十毫秒),卡片立刻渲染;事实(窗口/识图)随后合并进去。 · 失败被渲染成了「空」 provider.status 是「哪些渠道有账号」的唯一判据。它一旦整段返回 401,scanProviders 就是空的,entries 也是空的,组件走到 if (entries.length === 0 && error === undefined) return <> —— 静默渲染空白,一个字都不说。读者无法区分「还没扫码」和「读取失败」。 现在保留原始信封判 ok:真的读失败就把错误显示出来。 · RPC 桥只捕获一次 callPack 必须走 ctx.connection.rpc(裸 fetch('/api/channel-pack') 被宿主 401,因为 /api/* 只允许经 admission 的客户端)。但 installPackRpc(ctx) 在 apply() 里只跑一次,而提供 connection 的是另一个 fiber——那一刻没就绪,桥就永久为空,此后所有 callPack 都回落裸 fetch 吃 401,正好触发上一条的静默空白。 改为保存 ctx、每次调用前惰性解析,就绪后自动恢复。每一步仍各自 try:宿主给客户端 ctx 套的 Proxy 对未声明服务的属性访问会抛异常(并上报运行失败),?. 挡不住抛异常的 getter,只有 ctx.get() 豁免。 · 其他 · 全套 79 文件 1023 用例。
v2.4.52026-10-23
2.4.4 把账号池搬进了侧栏那行,但页面在折叠处被切掉、翻不到下半页。原因不在功能,在容器:@deepseek-ai/dsh-client-ui-layout 把中央列样式成 display:flex; flex-direction:column; overflow:hidden,设置对话框自己带滚动容器,所以我原样搬过去的组件在主区域只能被裁掉。 现在页面外面包了一层滚动容器(height:100%; min-height:0; overflow:auto),并补上设置对话框原本提供的内边距——否则卡片会贴着窗口边缘。设置页那条路径不受影响:那里宿主已经在滚,再加一层会双份。 侧栏那行标签保持 XD Pool,中英文都不译。 npm i dsh-xdpool@2.4.5 装完重启 DSH。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
DSH XD Pool 先加群 微信扫一扫加入 XD 交流群。二维码 7 天内有效;过期了在 issues 说一声会换新。 卡片右上角「点Star」旁边的「交流群」按钮打开的也是这个码 —— 不用回头找 README。 下载量统计沿用旧包名 dsh-workbuddy-xdpool(截至 2026-10-12 为 8,976 次/月,改名前的全部下载;shields 的实时徽章常被 npm 上游限流,所以这里用了快照数字)。新包 dsh-xdpool 的统计会随时间累积,之后徽章会换回实时数据。 把你手上所有能白嫖的模型额度,接进 DSH 的同一个模型池。 它从一件事开始——把本机 WorkBuddy 桌面 App 里登录过的所有账号合成一个自动容错的池子,哪个号被限流了、积分用光了,请求自动换到下一个能用的号上去。你不用挑号,不用手动导入。 然后它长成了六页:账号池之外,还能扫码登录十三家厂商的免费模型、把 76 家厂商的免费额度聚合成一条通道、看用量账本、把几个模型串成链、把池子开成一个本地 OpenAI 兼容网关。
展开完整文档(README 剩余 1 节)
DSH XD Pool

先加群

微信扫一扫加入 XD 交流群。二维码 7 天内有效;过期了在 issues 说一声会换新。

卡片右上角「点Star」旁边的「交流群」按钮打开的也是这个码 —— 不用回头找 README。

下载量统计沿用旧包名 dsh-workbuddy-xdpool(截至 2026-10-12 为 8,976 次/月,改名前的全部下载;shields 的实时徽章常被 npm 上游限流,所以这里用了快照数字)。新包 dsh-xdpool 的统计会随时间累积,之后徽章会换回实时数据。

把你手上所有能白嫖的模型额度,接进 DSH 的同一个模型池。

它从一件事开始——把本机 WorkBuddy 桌面 App 里登录过的所有账号合成一个自动容错的池子,哪个号被限流了、积分用光了,请求自动换到下一个能用的号上去。你不用挑号,不用手动导入。

然后它长成了六页:账号池之外,还能扫码登录十三家厂商的免费模型、把 76 家厂商的免费额度聚合成一条通道、看用量账本、把几个模型串成链、把池子开成一个本地 OpenAI 兼容网关。

| 页面 | 干什么 |
| 账号池 | 本机 WorkBuddy 账号、池健康、实时用量、积分自动化 |
| 扫码登录 | 十三家支持网页 / 扫码登录的厂商,登一次,它们的免费模型就进选择器 |
| 聚合渠道 | 76 家厂商的免费额度接进同一个池(默认一家都不开,填了 key 才亮) |
| 数据看板 | 今天的轮次、调用、失败、换号救回、token、缓存命中、速度 |
| 路由 | 把多个模型串成一条链,按顺序或轮换使用 |
| 网关 | 把池子开成本地 OpenAI 兼容接口,可转发给局域网其它设备 |

另外附送一整套「积分自动化」:签到、领任务奖励、连登兑换、开猫猫旅行……这些每天都要手动点一遍的活儿,插件在后台替你干完了。

和单账号连接插件的区别:dsh-workbuddy-connect 那类插件是「一次一个账号」。XD Pool 把多账号当默认情况——不挑号、不手动导入,你在桌面 App 换登过的每个号都被池记下并跨重启保存,对外用一个 xdpool provider 分组,池内自动容错。

从旧名升级:这个插件以前叫 dsh-workbuddy-xdpool。改名后旧数据会自动接过来(你的 API key、忽略名单、账号 pin 都还在);唯一需要你动手的是「默认模型」如果指向旧 id,见从旧版升级。

先看几张图

账号池(卡片首页:品牌栏 + 六个页面标签,顶部就是用量)

账号池:顶栏显示 XD Pool 与版本号、七个页面标签、用量面板在页面最上方、下方是 WorkBuddy 国内版账号卡与「已接入」状态

扫码登录(十三家支持网页或扫码登录的厂商,登一次就能用它们的免费模型)

扫码登录:十三家厂商列表,CodeArts 华为云、WorkBuddy 国内版与国际版各带说明与登录按钮

聚合渠道(把各家的免费额度接进同一个模型池,76 家厂商按分类筛选)

聚合渠道:聚合开关、搜索框、全部分类 76 / API Key 60 / 免费 1 / 有免费额度 10 / 本地 3 / 需授权 2 的分类筛选

账号积分详情(池中账号:积分包、连签天数、今日已签、保留积分)

账号积分详情:当前使用的账号展开后显示合计积分、连签 16 天、每日 +100 积分、今日已签按钮、CodeBuddy 积分包余额与到期时间,以及保留积分输入框

积分自动化面板

积分自动化:总开关、立即运行按钮、每个任务的上次执行时间与当轮具体领取到的任务清单、连登解锁倒计时

模型选择器(国内版 / 国际版 两个独立分组)

模型选择器:国内版与国际版各占一个分组,每个模型名后显示积分倍率与促销标签

国内版 / 国际版 双供应商(各自独立账号、积分与模型,可同时使用)切换国内版与国际版:未登录的一侧给出该区域的登录步骤

功能

一、多账号池

- 零配置:装上、打开,就完事了。WorkBuddy 桌面 App 里每个登过的账号都会被自动发现、持久保存并入池(重启不丢),不需要在插件里录任何东西。

- 自动容错换号:池子记着每个账号的限流状态。某个号触发 429 就冷却它,后面的请求自动落到下一个健康的号上;冷却结束自动恢复。所有号都在冷却时,请求才排队等待。
- 四种账号分配方式:priority 先用完一个号;round-robin 按顺序轮换;balanced 随机抽、偏向闲置久的;sticky 让一个对话只用一个账号,新对话才换下一个——上游缓存按账号隔离,中途换号等于把整段对话的缓存作废,sticky 就是为这件事准备的。卡片上点一下即可切换,默认仍是 priority。

- 池健康一眼看清:卡片显示「几个账号 / 几个在冷却」「下一个会轮到谁」,以及每个账号的令牌有效期和冷却倒计时。

- 剩余积分实时可见:按账号列出积分包(套餐名 · 剩余 / 总量)和大字合计,跟着上游实时刷新。

- 模型目录带标注:列出池里能用的模型,附带积分倍率(如 GLM-5.2 · x0.79)、免费 / 限时免费 / 夜间折扣标签、能否收图和上下文窗口大小,全部跟随上游实时更新。

- 被限流时告诉你退路:免费档被 429 冷却时,卡片和报错都会点名同名的付费行(如国际版 deepseek-v4.1-flash 对 deepseek-v4.1-flash-sg、国内版 hy3 对 hy3-x)。上游按「行」分别限流,所以免费行被关小黑屋时,收费行通常还是通的。

- 国内版 / 国际版自动适配:按账号凭据里的登录域名自动选上游——国际版登录(workbuddy.ai)走 www.workbuddy.ai,国内版(默认)走 copilot.tencent.com。两种账号可以混在同一个池里。

- 想手动做点啥也行:卡片和命令行都提供「重新检测账号」「清除所有冷却」「每日签到」三个操作。

二、积分自动化

卡片上一个开关,插件在后台把你成长中心的日常动作全做掉。默认全自动,也可以随时点「立即运行」手动跑一轮。

它管这五件事:

| 任务 | 默认时间 | 干什么 |
| 每日签到 | 09:00 | 领取当天签到奖励 |
| 活跃上报 | 10:00 | 报个到,让成长中心知道你还在用 |
| 任务奖励 | 11:00 | 把任务中心的奖励该报名的报名、该领的领掉 |
| 连登奖励 | 12:00 | 连登档位兑换 + 抽奖 |
| 猫猫旅行 | 09:00 · 21:00 | 把猫派出去、回来领奖励 |

「任务奖励」这一项覆盖了 13 个任务,包括那些看起来非得本人坐在电脑前点鼠标才能完成的:

探索优秀灵感 · 使用 5 个模板 · 尝鲜热门技能 · 换「和平精英」主题 · 逛资料库 · 召唤 5 次专家 · 召唤 3 次专家团 · 体验腾讯轻量云专家 · 进入任一小助手应用 · 进入企鹅教师助手 · 设计创意模式建画布 · 创建定时任务 · 猫猫对话

实测一轮跑下来,四个账号合计领到 3300 积分 + 135 能量。

卡片上会告诉你这一轮具体领到了什么——不是只写「领了 8 个任务」,而是把任务名字列出来。连登还差几天解锁也会写清楚(比如「还差 4 天解锁 7 天档」),免得你以为是坏了。

关于「今日收益」:卡片按来源分四行显示——任务奖励、签到、连登、旅行。今天赚了多少一眼看到,跨天自动清零。

关于保留积分:可以给每个账号设一个积分下限,余额低于这个数的账号就不派活了,省着点用。

国际版不显示这个面板——那边的网关压根没有积分系统。

安装

前置条件:装好 WorkBuddy 桌面 App 并登录(插件复用它存在本机的登录状态)。多账号 = 在桌面 App 里换着登几次,每次登录都会被自动吸进池里。

兼容 host 0.1.1-rc.2 起的整个 0.1.x 系列,以及 0.2.0-rc.2。安装设置节时会按 host 能力自动选择 settings.installSection(0.1.2-rc.1+)或更早的自由函数写法;卡片在 0.2.0 上作为设置面板里一个平级标签页渲染。

卡片在哪儿打开:DSH 设置面板本身。开法是侧边栏左下角的齿轮,或者快捷键 Ctrl+Alt+,。
面板顶部是平级标签:通用设置 / 模型 / 内置插件 / Agent 预设 / XD Pool —— 本插件就是最后那个 XD Pool。
(0.1.x 时代它叫「设置 → 插件 → DSH WorkBuddy XD Pool」,0.2.0 起改成了平级标签,按老路径找不到。)

方式一:从 npm 安装(推荐)

dsh 不在 PATH 时,用 node ~/.dsh/profiles/node_modules/@deepseek-ai/dsh/lib/bin.js 代替 dsh
dsh plugin --profile desktop add dsh-xdpool

推荐 npm:需要拉取的依赖只有插件自己(约 1 个包,几秒搞定)。
从 GitHub 源码装会连带装开发依赖(构建器、测试框架等几百个包),慢得多。

方式二:从 GitHub 源码安装

dsh plugin --profile desktop add github:XDTrees/dsh-xdpool

方式三:手动注册 bundle

1) 先装包(npm 或 GitHub 任选)
dsh plugin --profile desktop add dsh-xdpool

2) 注册 bundle:编辑 ~/.dsh/profiles/desktop/package.json,在 "dsh" → "profile" → "bundles" 数组末尾加上 "dsh-xdpool"

3) 重启 DSH Desktop

本地构建(开发者)

pnpm install
pnpm build # 产出 lib/index.js + lib/index.d.ts + lib/bin.js + lib/client.js
pnpm test # 814 项测试
pnpm typecheck # 宿主侧类型检查sh
pnpm typecheck:client # 客户端类型检查

构建产物已随仓库提交(lib/ 不在 gitignore 里),所以从 GitHub 装不需要任何安装期脚本,也不会弹 pnpm 那句「构建脚本被拦截,请放行」。改了 src/ 记得重新 pnpm build 并把 lib/ 一起提交,否则用户拿到的是旧产物。

注意:pnpm install 要用 pnpm 11(npx pnpm@11),必要时加 --config.confirmModulesPurge=false --config.minimumReleaseAge=0——pnpm 11 默认的 minimumReleaseAge 供应链年龄策略会拦下刚发布的 rc 包。

装完以后:模型选择器里会出现 XD Pool(国内版) 和 XD Pool(国际版) 两个分组(另有「聚合渠道」和「XD Pool · 免费模型」按需出现);打开设置面板(左下角齿轮或 Ctrl+Alt+,)切到 XD Pool 一栏,能看池健康、各账号的令牌 / 积分 / 签到 / 冷却状态,还有「重新检测账号」「清除所有冷却」按钮和每个账号的签到按钮。

Web / TUI 配置档也能用(--profile web / --profile dsh-tui)。

从旧版升级

这个插件以前叫 dsh-workbuddy-xdpool(显示名 DSH WorkBuddy XD Pool)。从 2.1.0 起改名为 dsh-xdpool。

你的数据不会丢。 插件自己的目录从 ~/.dsh/.workbuddy-xdpool 变成了 ~/.dsh/.xdpool,启动时会自动把旧目录复制过来——你填过的第三方 API key、忽略名单、账号 pin、启动日志,都在。旧目录只复制、不删除,所以想退回旧版、或者两个版本并存,都还能用。

唯一需要你动手的地方:如果你的「默认模型」指向旧 id,它不会自己改。旧 id 是宿主配置里的一个字符串,插件不去改宿主的配置文件(那等于插件改自己的加载器配置)。

| 旧 id | 新 id |
| workbuddy-xdpool | xdpool |
| workbuddy-xdpool-global | xdpool-global |
| workbuddy-xdpool-aggregate | xdpool-aggregate |
| workbuddy-xdpool-free | xdpool-free |

要改两处(都在配置档目录里): yaml

~/.dsh/profiles/desktop/home/settings.yaml

agent-default-model:
provider: xdpool # 原来是 workbuddy-xdpool model: hy3 yaml

~/.dsh/profiles/desktop/cordis.patch.yml

- id: agent-default-model
config:
provider: xdpool-global # 原来是 workbuddy-xdpool-global

插件每次启动都会把这件事写进 ~/.dsh/.xdpool/startup.log,所以忘了改也能在日志里找到确切该改什么。

命令行

统一用 dsh plugin --profile desktop exec dsh-xdpool <子命令> 调用: sh
dsh plugin --profile desktop exec dsh-xdpool status # 池里几个号 / 几个冷却 + shim 状态(--credits 查积分、--json 机器可读、--rates 看倍率)
dsh plugin --profile desktop exec dsh-xdpool accounts # 已发现的账号(--json)
dsh plugin --profile desktop exec dsh-xdpool doctor # 诊断发现 / 冷却 / 上游连通性
dsh plugin --profile desktop exec dsh-xdpool reset # 立刻清掉所有 429 冷却
dsh plugin --profile desktop exec dsh-xdpool checkin # 查每个账号今天签到了没(--json 机器可读)
dsh plugin --profile desktop exec dsh-xdpool checkin all

领掉所有账号今天的签到奖励;也可以只传一个账号标签领单个

dsh plugin --profile desktop exec dsh-xdpool login # 教你怎么在桌面再加一个号进池

池里怎么多账号?

桌面 App 同一时间只保留当前登录账号的凭据(每次换号都会覆盖同一个文件),所以 XD Pool 自己把账号记下来:你在桌面 App 里换着登几个号,每个号在切走的瞬间就被池收进 ~/.dsh/.xdpool/accounts.json 持久保存——重启 DSH 也不会丢。之后点卡片上的「重新检测账号」,或者直接开始用,池都会带着全部历史账号服务。

如果你想给桌面 App 之外的一次登录做个显式快照(比如临时固定某个号做验证),也可以手动导入: sh

在 WorkBuddy 桌面 App 登录账号后(key 自己起名):

dsh plugin --profile desktop exec dsh-xdpool import myKey

查看 / 删除已导入的快照:

dsh plugin --profile desktop exec dsh-xdpool accounts
dsh plugin --profile desktop exec dsh-xdpool remove myKey

导入的快照与自动保存的账号存在同一个目录 ~/.dsh/.xdpool/ 下,每次扫描都会被一并收进池——不再是「导入了但没人读」。快照以 key 的 MD5 前 8 位命名(key 本身记在文件里),中文、带 /、带空格的 key 都安全。长期使用靠 refresh token 自动续期;失效了就回桌面重新登录,再 import <key> --force 覆盖。

配置池的配置走插件设置节(settings.xdpool),在模型设置页里就能改,改完立即生效:

| 字段 | 说明 | 默认 |
| authFile | 覆盖 WorkBuddy 桌面 auth 文件路径(跨平台自动探测出问题时用,等同于 WORKBUDDY_AUTH_FILE) | 自动探测 |
| cooldownMs | 单账号 429 冷却时长(毫秒) | 60000 |
| distribution | 账号分配方式:sticky(每对话固定一个账号,新对话换下一个)/ priority(先用完一个)/ round-robin(按顺序轮换)/ balanced(随机,偏向闲置久的) | priority |

上游 prompt 缓存按账号隔离,所以对话中途换号会把缓存整段作废。想让多账号同时分摊额度又不想掉命中率,用 sticky。

也可以直接写进 ~/.dsh/settings.yaml: yaml xdpool: cooldownMs: 120000 distribution: sticky

架构

- 宿主侧(src/,跑在 DSH 主进程里)
- index.ts —— 注册 xdpool provider、xdpool 设置节、各条同源路由(状态 / 重新检测 / 清除冷却 / 签到 / 自动化运行 / 保留积分),以及账号发现与模型目录播种。
- accounts.ts —— WorkBuddyAccountPool:发现并持久保存本机 WorkBuddy 账号(account-store.ts 落盘)、429 冷却、轮换与 token 刷新;账号停用与积分保留也在这里。
- scheduler.ts —— 积分自动化的调度器:按本地时点跑五个任务(签到 / 上报 / 任务 / 连登 / 旅行),每日收益账本落盘,手动「立即运行」走的是同一套逻辑。
- task-events.ts —— 13 条任务事件链的构造。每条链都是纯数据,外加它该走哪个指纹通道(桌面 / 网页);需要真实会话的任务(技能、专家)在这里先开一次真对话,拿到服务端 id。
- catalog.ts / upstream.ts —— 上游模型目录(含每模型积分倍率、免费 / 图片能力标签)、积分查询、签到、自动化各接口的上游客户端(按凭据域名自动切国内外)。
- web-status.ts / status-paths.ts —— 卡片读的同源状态文档与路由。写操作按「POST + 回环来源 + 显式 accountId」把关。
- bin.ts —— 上面那套 CLI。
- 客户端(src/client/,浏览器卡片,经 dsh.client 由宿主加载)折叠卡片外壳沿用宿主内置卡的 dsm-plugin-card 样式语言(--dsw-alias- 主题变量),内容类名统一 dsm-xdpool- 前缀,不污染宿主其它卡片;文案命名空间 settings.xdpool。
- 构建 tsdown 产出 lib/index.js(宿主入口)+ lib/index.d.ts(类型)+ lib/bin.js(CLI)+ lib/client.js(CJS,用 window.__ModuleLoader__.load 包起来的浏览器 bundle)。四个产物都随仓库提交,所以安装时不需要任何构建脚本。

已知限制

- WorkBuddy 主账号的登录仍走桌面 App:XD Pool 可以为插件自己的十三家扫码登录渠道发起扫码,但 WorkBuddy 本体的 token 由桌面 App 的腾讯 SSO 铸造并和设备绑定,池不会替你登录 WorkBuddy。加号 = 在桌面 App 里登录 / 切换,XD Pool 自动吸收。

- 自动化里有几个任务刻意没做
- Expert_Philanthropy(公益专家):需要真捐钱,绕不过去。
- black_cat(夜猫子):只在 23:00–08:00 计分,而且没有积分奖励——熬夜白熬。
- Model_chat_GLM5.2(指定模型对话)与 wb_wechat_oa_subscribe_task(关注公众号):路径已经摸清,留到下个版本。

- Expert_team_use_3 偶发卡在 2/3:有个号当天用掉两次专家团后,第三次怎么发都不涨(换个没用过的专家团也不涨)。怀疑该任务对单账号有当日额度、跨天恢复,但没验证。新号不受影响(实测 0/3 → 3/3)。

- 依赖 WorkBuddy 客户端接口(不是官方开放 API),WorkBuddy 更新后插件可能得跟着调。某个账号的 refresh token 失效时,回桌面重新登录即可。

- 如果 Windows 和 Linux 用户名不同、且 Windows 环境变量没传进 WSL,请用 WORKBUDDY_AUTH_FILE 或配置里的 authFile 指定实际位置。

免责声明

- 本项目仅供个人学习和研究使用,仅驱动使用者自己的 WorkBuddy 账号在本机调用,请勿用于商业用途或超出个人合理使用的场景。
- 使用者需遵守 WorkBuddy 的服务条款;因使用本项目产生的任何后果(包括但不限于账号被限制、额度被清空、服务中断),由使用者自行承担。
- 本项目作者不对任何因使用或滥用本项目产生的直接或间接损失负责。
- 本项目与腾讯、WorkBuddy、DeepSeek 均无关联,未获其授权或认可;文中出现的名称仅用于描述兼容关系,其商标权利归各自所有。

致谢

本项目的实现参考了以下已公开的项目,并按其许可证要求保留版权声明。参考方向为设计思路与既有结论,代码为独立实现;关键模块在源文件头部注释中也标注了所参考的项目与模式:

- corrinehu/dsh-workbuddy-connect(MIT)—— 设置节注册(settings.installSection)与 DSH 插件结构、客户端卡片加载机制、桌面端凭据刷新与 loopback shim 加固的核心参照;本项目沿用其「宿主通过 installSection 挂卡片」的打通路径。
- dingminhua/dsh-connect-workbuddy(MIT,Copyright (c) 2026 LaoDing)—— dsm-plugin-card 卡片样式语言与 --dsw-alias-* 主题变量的参照实现;每日签到(/v2/billing/meter/checkin-activity-status 与 /v2/billing/meter/daily-checkin)、积分包聚合口径(区分月度周期套餐与一次性礼包)、国内 / 国际版按 domain 选择上游域名的做法,都参考了该项目已验证的接口形态。
- Sliverkiss/workbuddy2api(MIT)—— WorkBuddy 上游协议(copilot.tencent.com 的 wire behavior)与积分接口的参照实现;积分自动化(成长中心签到 / 活跃上报 / 连登兑换 / 猫猫旅行状态机 / 13 条任务事件链 / 专家召唤链)整体照该项目的 Go 版逆向实现移植,每条事件链的判据与实测结论都来自它。

以上项目的版权归各自作者所有。本项目采用参考设计思路 + 独立实现的方式,未整体复制任何参考项目的源码。若标注有遗漏或不当之处,欢迎提交 issue 指正。

许可证

MIT
预览分享卡片长什么样 ↓XDTrees/dsh-xdpool
分享 · DeepSeek Harness Hub
XDTrees/dsh-xdpool

把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…

回到顶部