Merge every locally signed-in WorkBuddy account into DeepSeek Harness as one auto-failing-over model pool (multi-account rotation, live credits, and a model catalog showing per-model credit multipliers and free/night-discount tags).
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:XDTrees/dsh-workbuddy-xdpool
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
Join the group
English | 中文
Every free model quota you can get your hands on, wired into one DSH model pool.
It started as one thing: every account you've signed into the WorkBuddy desktop app, merged into one auto-failing-over pool. An account gets rate-limited or runs out of credits, and the request moves to the next one that works. No picking favourites, no manual import.
Then it grew into six pages. Beyond the account pool: sign in to thirteen vendors' free models by web or QR, aggregate 76 vendors' free quotas into one lane, read a usage ledger, chain models together, and expose the pool as a local OpenAI-compatible gateway.
| Page | What it does |
|---|---|
| Account pool | Local WorkBuddy accounts, pool health, live usage, points automation |
| Login channels | Thirteen vendors that sign in by web or QR — once, and their free models join the picker |
| Aggregate | 76 vendors' free quotas into one pool (none on by default; a vendor lights up when it has a key) |
| Dashboard | Today's turns, calls, failures, failover rescues, tokens, cache hits, speed |
| Routing | Chain several models, in order or round-robin |
| Gateway | Expose the pool as a local OpenAI-compatible endpoint, optionally to your LAN |
It also throws in a full points-automation suite: check-ins, task rewards, streak redemption, the buddy trip — all the chores you'd otherwise click through every day, done in the background.
How this differs from the single-account connectors: plugins like
dsh-workbuddy-connecthandle one account at a time. XD Pool treats multiple accounts as the normal case — it doesn't pick favourites or ask you to import anything. Every account you've switched through on the desktop app is remembered across restarts, exposed as a singlexdpoolprovider group, with automatic failover inside.
Upgrading from the old name: this plugin used to be
dsh-workbuddy-xdpool. Your data is carried over automatically (API keys, ignore list, account pin). The one thing you may need to do by hand is a default model pinned to an old id — see Upgrading from an older version.
Screenshots
Account pool (the card's home page: brand bar plus seven page tabs, usage right at the top)

Login channels (thirteen vendors that sign in by web or QR — sign in once and their free models are yours)

Aggregate channels (every vendor's free quota wired into one model pool, 76 vendors filterable by category)

Account credit detail (a pool account: credit packages, streak, today's check-in, the credit reserve)

The points-automation panel

Model picker (CN and global as two separate groups)

CN / global dual provider (separate accounts, credits and models, usable at the same time)

Features
1. The multi-account pool
Zero config: install it, turn it on, done. Every account signed into the WorkBuddy desktop app is discovered and pooled automatically — nothing to enter by hand.
Automatic failover: the pool tracks each account's rate-limit state. Hit a 429 and that account cools down while later requests land on the next healthy one; it rejoins automatically once the cooldown ends. Requests only wait when every account is cooling.
Pool health at a glance: the card shows how many accounts there are, how many are cooling, which one is next, plus each account's token expiry and cooldown countdown.
Live credit balances: per-account credit packages (
package · remaining / total) with a large total, refreshed from upstream as it changes.An annotated model catalog: pool models with their credit multiplier (e.g.
GLM-5.2 · x0.79), free / limited-free / night-discount tags, image-input support and context window — all tracking upstream live.CN / global auto-detection: the upstream origin is picked per account from its login domain — a global sign-in (
workbuddy.ai) goes towww.workbuddy.ai, CN (the default) tocopilot.tencent.com. Both kinds can live in the same pool.Manual controls when you want them: re-detect accounts, clear all cooldowns, and daily check-in — on the card and in the CLI.
2. Points automation
One switch on the card, and the plugin works through your growth-centre routine for you. On by default, and you can hit "Run now" to force a pass whenever you like.
Five jobs:
| Job | Default time | What it does |
|---|---|---|
| Daily check-in | 09:00 | Collect today's check-in reward |
| Activity report | 10:00 | Report activity so the growth centre counts the day |
| Task rewards | 11:00 | Enrol in open tasks and collect every reward that's ready |
| Streak bonus | 12:00 | Redeem streak tiers and spend the lottery draws |
| Buddy trip | 09:00 · 21:00 | Send the cat out, collect it when it's back |
The task-rewards pass covers 13 board tasks, including the ones that read as "somebody has to sit at the desktop and click these menus":
Browse inspiration · Use 5 templates · Try a hot skill · Apply the "Peacekeeper Elite" theme · Read the library · Summon 5 experts · Summon 3 expert teams · Try the Tencent Lighthouse expert · Open any assistant app · Enter the QQ teacher assistant · Create a design canvas · Create a scheduled task · Chat with the cat
Measured across four accounts, one pass collected 3300 credits and 135 energy.
The card tells you what a pass actually collected — it lists the task names rather than reporting a bare count. The streak countdown is spelled out too ("7d in 4d"), so a locked tier doesn't look like a failure.
"Earned today" breaks the day down by source — task rewards, check-in, streak, buddy trip — and resets at midnight.
Credit floor per account: set a minimum balance and an account below it stops being given work, so you can keep some credits in reserve.
The global region doesn't show this panel — that gateway has no growth system at all.
Install
Prerequisite: the WorkBuddy desktop app installed and signed in (the plugin reuses the sign-in state it stores locally). Multi-account = sign in and out a few times in the desktop app; each sign-in is absorbed into the pool. Built against DSH Desktop host 0.1.2.
Compatible with the
0.1.1-rc.2/0.1.2host line: the settings section installs viasettings.installSection(0.1.2-rc.1+) or the earlier free-function form, whichever the host supports.
Option A — install from npm (recommended)
# if dsh is not on PATH, use node ~/.dsh/profiles/node_modules/@deepseek-ai/dsh/lib/bin.js instead
dsh plugin --profile desktop add dsh-xdpool
npm is the fast path: the only dependency pulled in is the plugin itself (roughly 1 package, a few seconds). Installing from the GitHub source drags in the dev dependencies (bundler, test runner, hundreds of packages) and is much slower.
Option B — install from the GitHub source
dsh plugin --profile desktop add github:XDTrees/dsh-xdpool
Option C — register the bundle by hand
# 1) install the package (npm or GitHub)
dsh plugin --profile desktop add dsh-xdpool
# 2) register the bundle: edit ~/.dsh/profiles/desktop/package.json and append
# "dsh-xdpool" to the end of the "dsh" → "profile" → "bundles" array
# 3) restart DSH Desktop
Building locally (developers)
pnpm install
pnpm build # produces lib/index.js + lib/index.d.ts + lib/bin.js + lib/client.js
pnpm test # 138 tests
pnpm typecheck # host side
pnpm typecheck:client # client side
The build output is committed (
lib/is not gitignored), so a GitHub install needs no install-time script and never trips pnpm's "build scripts were blocked" prompt. After changingsrc/, re-runpnpm buildand commitlib/too — otherwise users get the old build.
Note:
pnpm installwants pnpm 11 (npx pnpm@11), and may need--config.confirmModulesPurge=false --config.minimumReleaseAge=0— pnpm 11's defaultminimumReleaseAgesupply-chain policy blocks just-published rc packages.
Once installed: XD Pool(国内版) and XD Pool(国际版) groups appear in the model picker (plus "聚合渠道" and "XD Pool · 免费模型" when those lanes are configured), and the XD Pool settings tab shows pool health, each account's token / credits / check-in / cooldown state, the "Detect accounts again" and "Clear all cooldowns" buttons, and a check-in button per account.
It also works under the Web / TUI profiles (--profile web / --profile dsh-tui).
Upgrading from an older version
This plugin used to be dsh-workbuddy-xdpool (display name DSH WorkBuddy XD Pool). As of 2.1.0 it is dsh-xdpool.
Your data is not lost. The plugin's own directory moved from ~/.dsh/.workbuddy-xdpool to ~/.dsh/.xdpool, and startup copies the old one across automatically — the third-party API keys you typed, your ignore list, your account pin, the startup trace. The old directory is copied, never deleted, so a rollback or a side-by-side install still works.
The one thing that does not migrate itself: a default model pinned to an old provider id. That pin is a plain string in the host's own config, and the plugin does not rewrite the host config that loads it.
| Old id | New id |
|---|---|
workbuddy-xdpool |
xdpool |
workbuddy-xdpool-global |
xdpool-global |
workbuddy-xdpool-aggregate |
xdpool-aggregate |
workbuddy-xdpool-free |
xdpool-free |
Two places to edit, both inside the profile directory:
# ~/.dsh/profiles/desktop/home/settings.yaml
agent-default-model:
provider: xdpool # was workbuddy-xdpool
model: hy3
# ~/.dsh/profiles/desktop/cordis.patch.yml
- id: agent-default-model
config:
provider: xdpool-global # was workbuddy-xdpool-global
Every startup writes this to ~/.dsh/.xdpool/startup.log, so if you forget, the log tells you exactly what to change.
CLI
All commands run through dsh plugin --profile desktop exec dsh-xdpool <subcommand>:
dsh plugin --profile desktop exec dsh-xdpool status # pool accounts/cooldown + shim state (--credits, --json, --rates)
dsh plugin --profile desktop exec dsh-xdpool accounts # discovered accounts (--json)
dsh plugin --profile desktop exec dsh-xdpool doctor # diagnose discovery/cooldown/upstream
dsh plugin --profile desktop exec dsh-xdpool reset # clear all 429 cooldowns now
dsh plugin --profile desktop exec dsh-xdpool checkin # today's check-in state per account (--json)
dsh plugin --profile desktop exec dsh-xdpool checkin all
# collect every account's daily reward (or pass one label)
dsh plugin --profile desktop exec dsh-xdpool login # guide to adding another desktop account
How accounts get into the pool
The desktop app keeps only the currently signed-in account on disk (each switch overwrites the same file), so XD Pool remembers accounts itself: every time you switch sign-ins in the desktop app, the outgoing account is captured into ~/.dsh/.xdpool/accounts.json and survives restarts. Hit "Detect accounts again" or just start using the pool — every historical account comes back.
To snapshot an extra login explicitly (e.g. to pin one account for verification):
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
Imported snapshots live in the same directory, ~/.dsh/.xdpool/, and every scan absorbs them into the pool — they are no longer written and never read back. Snapshots are named by the MD5-8 prefix of their key (so keys with Chinese, /, or spaces are safe). Long-lived use relies on refresh-token auto-renewal; if it lapses, re-sign-in on the desktop and import <key> --force.
Configuration
Effective config is read from the plugin settings section (settings.xdpool), editable on the Models settings page and applied live:
| Field | Description | Default |
|---|---|---|
authFile |
Override the WorkBuddy desktop auth-file path (equiv. to WORKBUDDY_AUTH_FILE) |
auto-probed |
cooldownMs |
Per-account 429 cooldown in milliseconds | 60000 |
Or set it directly in ~/.dsh/settings.yaml:
xdpool:
cooldownMs: 120000
Architecture
- Host side (
src/, inside the DSH main process)index.ts— registers thexdpoolprovider, thexdpoolsettings section, the same-origin routes (status / re-scan / clear cooldowns / check-in / automation run / credit reserve), plus account discovery and catalog seeding.accounts.ts—WorkBuddyAccountPool: discovers and durably stores local WorkBuddy accounts (account-store.ts), 429 cooldowns, rotation and token refresh; account disabling and credit reserves live here too.scheduler.ts— the points-automation scheduler: runs five jobs on local time points (check-in / report / tasks / streak / travel), persists the daily earnings ledger, and backs the card's "Run now" button with the same code path.task-events.ts— builds the 13 task event chains. Each chain is plain data plus the fingerprint channel it must go out on (desktop or web); the tasks that need a REAL conversation (skill, experts) open one here to get the server-side id.catalog.ts/upstream.ts— the upstream client: model catalog (with per-model multipliers and free / image tags), credits, check-in, and every automation endpoint, switching CN/global by credential domain.web-status.ts/status-paths.ts— the same-origin status document and routes the card reads. Mutations are gated on POST + loopback origin + an explicitaccountId.bin.ts— the CLI above.
- Client (
src/client/, the browser card loaded viadsh.client) The collapsible shell reuses the host'sdsm-plugin-card*style language (--dsw-alias-*theme tokens); content classes are namespaceddsm-xdpool-*, and copy lives under thesettings.xdpoolnamespace. - Build
tsdownproduceslib/index.js(host entry) +lib/index.d.ts(types) +lib/bin.js(CLI) +lib/client.js(CJS browser bundle wrapped inwindow.__ModuleLoader__.load). All four are committed, so an install needs no build-time script.
Known limitations
The WorkBuddy sign-in itself still goes through the desktop app: XD Pool can launch QR sign-in for its own thirteen login channels, but WorkBuddy's own token is minted by the desktop app's Tencent SSO and bound to the device — the pool will not sign you in to WorkBuddy. Adding an account = signing in on the desktop app; XD Pool absorbs it.
A few automation tasks are deliberately not implemented
Expert_Philanthropy(charity expert): requires a real donation; there is no way around it.black_cat(night owl): only scores between 23:00 and 08:00, and pays no credits — all-nighters for nothing.Model_chat_GLM5.2(chat with a specific model) andwb_wechat_oa_subscribe_task(follow the official account): the path is mapped out, deferred to the next release.
Expert_team_use_3occasionally sticks at 2/3: on one account, after two expert teams had been used that day, the third would not register (using a different, unused team didn't help either). Suspected per-account daily quota that resets the next day, unconfirmed. Fresh accounts are unaffected (measured 0/3 → 3/3).Depends on WorkBuddy's client APIs (not an official public API), so a WorkBuddy update may require a matching plugin update. If an account's refresh token lapses, sign in again on the desktop.
If your Windows and Linux usernames differ and the Windows environment variable doesn't reach WSL, point
WORKBUDDY_AUTH_FILE(orauthFile) at the real location.
Disclaimer
- This project is for personal study and research only. It drives only your own WorkBuddy accounts from your own machine — do not use it commercially or beyond reasonable personal use.
- You are responsible for complying with WorkBuddy's terms of service. Any consequences of using this project (including but not limited to account restrictions, cleared balances, or service interruption) are yours to bear.
- The authors accept no liability for any direct or indirect loss arising from the use or misuse of this project.
- This project is not affiliated with, authorised by, or endorsed by Tencent, WorkBuddy, or DeepSeek. Product names appear only to describe compatibility; trademarks belong to their respective owners.
Acknowledgments
This project draws on the following public projects and keeps their copyright notices as their licences require. What was taken is design approach and established findings; the code is an independent implementation. The modules that lean on a specific source say so in their file headers:
- corrinehu/dsh-workbuddy-connect (MIT) — the primary reference for settings-section registration (
settings.installSection) and the DSH plugin structure, the client card loading mechanism, and desktop credential refresh plus loopback-shim hardening. This project follows its "host mounts the card via installSection" path. - dingminhua/dsh-connect-workbuddy (MIT, Copyright (c) 2026 LaoDing) — the reference implementation for the
dsm-plugin-card*card style language and--dsw-alias-*theme tokens; daily check-in (/v2/billing/meter/checkin-activity-statusand/v2/billing/meter/daily-checkin), the credit-package aggregation rules (monthly vs one-off packs), and picking the upstream origin per credentialdomainall follow interface shapes that project verified. - Sliverkiss/workbuddy2api (MIT) — the reference for the WorkBuddy upstream protocol (
copilot.tencent.comwire behaviour) and the credits APIs; points automation (growth-centre check-in, activity report, streak redemption, the buddy-trip state machine, the 13 task event chains, and the expert summon chains) was ported wholesale from that project's Go reverse-engineering, including the scoring criteria and measured conclusions behind every event chain.
All copyright in the above belongs to their respective authors. This project uses a reference-the-approach, implement-independently method and does not copy any reference project's source wholesale. If anything is mis-attributed or missing, please open an issue.
License
Links
More in this category
Ebony-Vinyl/dsh-our-free-model★ 62526
Adds free model lanes to DeepSeek Harness — DeepSeek V4.1 Flash, Kimi K3 and others — with no login, sign-up or API key, plus a local OpenAI-compatible gateway, fallback routing and a usage dashboard.
dingminhua/dsh-connect-workbuddy★ 1198
Connects locally signed-in WorkBuddy models, CN and international alike, to DSH, reading each model's credit multiplier from the upstream catalog on every refresh, with per-model image input toggles, account switching backed by an auto-failing-over pool, manual daily check-in, and read-only credit overviews shown as compact pills on the card and in the composer.
Alice-Marx/dsh-model-router★ 806
Routes DeepSeek Harness work across configured model APIs and supported vendor CLIs with dependency-aware packages and cost previews.
V1ki/dsh-plugin-subscriptions★ 561
Use ChatGPT (Codex), Claude, and Grok subscriptions as DeepSeek Harness LLM providers, with Settings login, model catalogs, usage, plus image_generate, video_generate, and x_search tools.
Mars-Sea/dsh-commandcode-provider★ 458
Unofficial Command Code LLM provider: registers a `commandcode` route with a live model catalog and reasoning-effort support.
XDTrees/dsh-xdpool★ 436
Merge every locally signed-in WorkBuddy account into DeepSeek Harness as one auto-failing-over model pool: multi-account rotation, 429 cooldowns, live credits, a model catalog with per-model credit multipliers and free/night-discount tags, QR-code login for 13 vendors, and aggregate free-tier channels. Accounts persist across restarts.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.