WorkBuddy / CodeBuddy 多账号切换 + 本地 OpenAI 兼容反代
顶部横幅为 AI 生成的手绘风插画,非软件界面截图。
WorkBuddy / CodeBuddy CLI / CodeBuddy CN IDE 账号切换桌面 App(Tauri),并在同一个进程里内置了一个 OpenAI 兼容的本地网关:多账号池轮转、按分组挑选出站账号、请求用量一目了然。
国内版(WorkBuddy)与国际版(WorkBuddy AI)分成两个档位独立管理:各自的认证文件、进程与接口域名, 账号页用标签页分开显示,登录、切换、积分、反代都按档位走。
- 账号切换 —— 多账号共享登录态,一键切换 WorkBuddy 登录账号,支持把当前会话复制给目标账号
- API 反代 —— 把账号库包装成
http://127.0.0.1:7863/v1,任何 OpenAI SDK 客户端都能直接用 - 账号分组 —— 给账号标「桌面端 / 反代API」,两类用途互不抢号
- 用量统计 —— 反代请求数、输入输出 Token、按账号与按模型分布,落盘可查历史
- 积分与签到 —— 积分到期监控、自动签到、Token 保活、CodeBuddy CLI 自动轮换
反代和账号切换跑在同一个进程里,复用同一份账号库与刷新逻辑, 不存在「两个进程各自刷新同一个 refresh token」的冲突。
- 桌面 App —— 从 GitHub Releases 下载 macOS / Windows / Linux 安装包(推荐日常使用)
- npm / webui —— 浏览器操作界面,从本仓库自行构建安装,见下方「快速开始」
- 在线演示 —— GitHub Pages 只读演示(账号、积分与请求记录均为虚构数据,所有业务操作已禁用)
浏览器操作界面,与桌面 App 共用同一套账号管理能力。包名为 workbuddy-switch2api(尚未发布到 npm,从本仓库构建安装;安装后可用的命令仍是 workbuddy-switch):
cd npm
npm i -g .
workbuddy-switch # 起服务 + 打开浏览器(默认 127.0.0.1:57890)
workbuddy-switch serve --port 16060 # 换端口:界面里的接口地址跟着页面走,不用改配置
workbuddy-switch serve --no-open # 只起服务、不开浏览器(服务器 / WSL / SSH 转发用)
workbuddy-switch status # 终端查看当前账号webui 界面与桌面 App 一致:WorkBuddy / CodeBuddy CLI / CodeBuddy IDE 账号切换、积分到期监控、自动签到、会话复制与共享、API 反代、Token 统计与 token 保活。
前端是同一份 dist/ 分别嵌进桌面 App 与 CLI 二进制的,所以两边观感与功能一致;
只有「迁移」和「缓存迁移」依赖系统文件对话框 / NTFS 目录联接,在 webui 里会整页提示只在桌面端可用。
想让「API 反代 + 自动签到 + 自动轮换」常年挂着、不占用一台有图形界面的机器,用容器最省事:
export WB_SWITCH_TOKEN=$(openssl rand -hex 16) # 访问口令,必填
# 用现成镜像(CI 每次发版推到 GHCR)
docker compose -f docker-compose.ghcr.yml up -d
# 或者本地构建(首次 Rust 全量编译,约 10~20 分钟)
docker compose up -d --build
# 浏览器打开: http://<这台机器的IP>:57890/?token=$WB_SWITCH_TOKEN数据全在命名卷 wb-switch-data 里,容器重建不丢。镜像只跑 webui + API 反代这条常驻通道。
细节(环境变量、端口、反代怎么对外、容器里哪些功能用不了、安全说明)见 docs/DOCKER.md。
上游怪癖与排障记录:反代侧的行为差异、11128 各种变体的对照表、以及「用假模型名当探针」
的复现手法,见 API-PROXY.md;一次性排查的完整取证过程见
docs/notes/(已脱敏)。
前往 GitHub Releases 下载对应平台的安装包:
| 平台 | 安装包 | 安装方式 |
|---|---|---|
| macOS Apple Silicon(M 系列,arm64) | WorkBuddy-Switch2api_<版本>_aarch64.dmg |
打开 DMG,将 WorkBuddy-Switch2api.app 拖入「应用程序」 |
| macOS Intel(x86_64) | WorkBuddy-Switch2api_<版本>_x86_64.dmg |
打开 DMG,将 WorkBuddy-Switch2api.app 拖入「应用程序」 |
| Windows x64 | WorkBuddy-Switch2api_<版本>_x64-setup.exe |
运行安装程序并按提示完成安装 |
| Linux x64 | WorkBuddy-Switch2api_<版本>_amd64.deb / WorkBuddy-Switch2api_<版本>_amd64.AppImage |
Debian/Ubuntu 安装 .deb;其他发行版可给 AppImage 添加执行权限后直接运行 |
macOS 首次启动若提示无法验证开发者,先在 Finder 中按住 Control 点击应用并选择「打开」,或前往「系统设置 → 隐私与安全性」选择「仍要打开」。仅当安装包来自上述官方 Releases、且系统仍提示「已损坏」时,再执行:
xattr -rd com.apple.quarantine "/Applications/WorkBuddy-Switch2api.app"应用能启动但切换账号时提示无权限,请参阅下方 macOS 权限说明。
| 模块 | 说明 |
|---|---|
| 账号管理 | OAuth 扫码登录、从本机导入、手动添加 token、删除账号 |
| 账号分组 | 给账号标注「桌面端 / 反代API / 未分组」,账号卡片直接显示标签;反代页按分组挑选出站账号 |
| 账号切换 | 备份认证文件 → 关闭 WorkBuddy → 写入目标账号 → 重启,切换过程实时进度反馈 |
| 国内版 / 国际版 | 账号按客户端档位分开管理。国内版 = WorkBuddy + workbuddy-desktop.info + www.codebuddy.cn;国际版 = WorkBuddyAI + workbuddy-desktop-ai.info + www.workbuddy.ai。扫码登录、从本机导入、切换、Token 刷新、积分查询都按档位走对应域名与进程;账号页用「国内版 / 国际版」标签页分开显示。会话共享 / 复制按档位作用于各自的 workbuddy.db;国际版暂不支持每日签到与成长中心 |
| API 反代 | 内置 OpenAI 兼容网关:账号池轮转与失败冷却、按分组挑号、流式与非流式、/v1/chat/completions、/v1/models、/healthz、/usage-stats。国内版与国际版各占一个独立入口,同时开着互不影响 |
| 反代取模型 ID | 反代页有「获取模型ID」按钮:一键拉出可用模型列表并弹窗展示,逐个或整体复制 —— 不用再查文档猜客户端里 model 填什么。反代开着就问本机端口(零消耗),没开则直连上游;结果与 /v1/models、版本校验放行同一口径 |
| 反代分版本 | 国内版和国际版是两套上游、模型列表不一样,反代侧按版本分流:账号拆成「反代API · 国内版 / 国际版」两组;请求按 model 自动挑对应版本的账号(不再让国际版专属模型落到国内版)。/v1/models 返回并集,owned_by 标出 workbuddy-cn / workbuddy-intl |
| 额外放行模型 | 上游给的模型列表是不完整的:有的模型实测能调通、却根本不在列表里(例如国际版的 deepseek-v4.1-flash)。每个入口都能填「额外放行模型」,填进去的会进 /v1/models、也跳过版本校验,不再被误判成「属于另一版」 |
| 反代出站适配 | 发往上游前自动处理两件会被上游拦下的事:① 摘掉 system prompt 里 Claude-Code 式的环境注入块(长会话必踩);② 国际版要求首条消息必须是 system,客户端没带就补一条。任一改动生效时,响应头会带 x-wb-switch-degraded |
| 反代用量统计 | 经过反代的每一次请求都记录请求数、输入/输出 Token 与 credit,按账号、按模型汇总,并可查看最近请求明细 |
| 会话复制 / 共享 | 两个档位都支持。复制:把勾选的会话以新 id 复制给目标账号(jsonl 正文 + 工具输出目录 / 产物索引 / 历史任务 / 文件改动历史 + workbuddy.db 索引 + edge-sync 注册);共享:把 user_id 置空,任何账号登录都能看到同一份,不产生副本 |
| 跨机器迁移 | 把选中的项目会话 + 全部配置(技能 / MCP 连接器 / 记忆 / 定时任务 / 自定义模型)打成一个 zip,在另一台机器上增量合并进来。导入前先给差异预览(几个新会话、本地缺多少附件、配置会新增什么),可逐项勾选。目标已有的数据默认不动、导入前自动备份、附件按 SHA256 去重、账号凭证默认不带。仅桌面端(webui 没有系统文件对话框,选不了包的位置) |
| 缓存迁移 | WorkBuddy 把运行数据全放在家目录(国内版 ~/.workbuddy、国际版 ~/.workbuddy-ai),实测能到 20+ GB 且全压在系统盘。这一页把数据搬到别的盘、原路径改建 NTFS 目录联接,客户端零感知、不用改任何配置:robocopy 整份复制 → 逐项核对文件数与字节数 → 改名留底 → mklink /J。任一步失败自动回滚。清理备份是整份移入回收站(可还原,清空回收站后空间才真正释放)。勾选的目录才迁,没勾的完全不碰;默认位置可统一,也能逐目录单独换盘(国内外分放不同盘)。仅 Windows 桌面端 |
| 更新防护 | WorkBuddy 的更新缓存按用户共用、不分产品(%LOCALAPPDATA%\@genieworkbuddy-desktop-updater),任一版本下载的包会被另一个版本直接套用、把对方程序目录整个覆盖掉。这一页把更新源指到黑洞(用户级 WORKBUDDY_UPDATE_URL)并隔离已下载的包,一键关掉两个版本的自动更新;同时列出每个安装目录的真实身份(读 cli/product.json),目录里两个启动器 exe 都在但身份只有一个时会明确标出来 |
| 自动签到 | 默认开启;启动时立即检查,运行期间每 30 分钟自动补签;一键全部签到;30 天签到日志 |
| Token 保活 | 惰性刷新(操作前不足阈值刷新)+ 每日保活(默认每天无条件刷新一次,阈值 >0 时仅刷新剩余不足该天数的账号),避免 refresh token 过期 |
| 积分到期查询 | 自动查询每个账号的 WorkBuddy 积分资源、剩余量和到期时间;7 天内到期高亮并按到期优先排序 |
| 积分统计 | 汇总 WorkBuddy 官方请求用量,展示每日趋势、模型分布、账号消耗和请求明细;官方数据不可用时明确回退到本地余额快照观察 |
| Token 统计 | 分别查看 WorkBuddy(国内版)、WorkBuddyAI(国际版)、CodeBuddy CLI 与 CodeBuddy IDE 的 Token 总览,四个来源独立统计不混算;输入、输出、缓存读写按 K/M/B 展示,趋势图同时呈现每日 Token 构成与调用次数,并提供构成占比、热力图、项目/模型 Top 10 和会话排行 |
| CodeBuddy CLI | 与 WorkBuddy 复用同一账号库,但默认账号独立;macOS/Linux 通过 apiKeyHelper,Windows 通过 settings.json.env.CODEBUDDY_AUTH_TOKEN 设置后续会话使用的账号;任何平台都不会修改正在运行的当前会话 |
| CodeBuddy CN IDE | 复用同一账号库,向 CodeBuddy CN 桌面客户端注入 Safe Storage 凭证(state.vscdb / planning-genie.new.accessTokencn)并重启 IDE;与 CodeBuddy CLI、国际版 CodeBuddy 无关 |
| 自动轮换 | 后台定时把 CodeBuddy CLI 的后续启动账号设为积分最紧迫(最早到期)的账号;当前会话保持原账号,重新加载会话或重启 CLI 后使用新的账号 |
| 应用内更新 | 发布产物带 Tauri updater 签名与清单(latest.json),装过一次之后可以在应用内直接升级;启动时也会检查 Releases 并提示新版本 |
| 权限检测 | macOS 授权引导(App 管理 / 完全磁盘访问拖拽授权 + 自动检测) |
下面四张图说明这东西是怎么搭起来的。图为交互版 —— 可切浅色 / 深色、缩放、按关系追踪、搜索节点、导出 SVG / PNG;源文件在 docs/diagrams/(每张图一份 .html 成品 + 一份 .json 规格),克隆仓库后本地打开 .html 即可。下面嵌的是等价的静态快照。
| 图 | 覆盖内容 |
|---|---|
| 整体架构 | 客户端、本地反代、账号池与两版上游的关系,以及「界面 → 命令层 → 认证文件 → 客户端」这条管理路径 |
| 反代请求生命周期 | 一次 /v1/chat/completions 从进来、挑号、出站适配到流式回传的全过程 |
| 账号切换流程 | 备份认证 → 关客户端 → 写认证 → 重启,含 macOS 授权失败那条异常路径 |
| 家目录缓存迁移 | 从「普通目录」走到「已是联接」的状态迁移,含失败回滚与增量重拷 |
一个进程,一份账号库。反代和账号管理跑在同一个进程里,共用同一套刷新逻辑 —— 不存在两个进程各自刷新同一个 refresh token 的冲突。
- 外部客户端只认一个本地地址(国内版
7863/ 国际版7864),选版本、挑号、冷却全在进程内完成,客户端不用改配置 - 界面只下发命令;真正写认证文件、重启客户端的是命令层
- 两个版本各有一份认证文件,切换与查询都按档位取
出站前会做两件事,都是被上游逼出来的:摘掉 system prompt 里 Claude-Code 式的环境注入块;国际版首条不是 system 就补一条(否则整条请求被 400 打回)。失败的号进冷却,120 秒后自动回池。
顺带一提:界面在 IPC 层做了一层读缓存 —— 60 秒内直接命中,5 分钟内先给缓存让页面立刻渲染、再后台刷新,所以切回看过的页面是秒开的;点「刷新」始终绕过缓存直连后端。
- 添加账号:账号页 →「扫码登录」(OAuth device flow)或「从本机导入」「手动添加」。 账号页顶部有 国内版 / 国际版 标签,扫码与导入都作用在当前标签对应的版本上
- 切换账号:账号卡片 →「切换」,默认开启「共享全部会话」(把会话归属清空,切回来还能接着聊),也可勾选把指定会话复制给目标账号。国内版与国际版各自作用于自己的会话库
- 自动签到:账号页可直接开关;设置页可调整保活参数、立即签到并查看日志
- 查看积分到期:账号页会自动查询各账号积分资源;点击「刷新积分」可手动更新,临近到期的资源会高亮,并把快过期账号按最近到期时间排序,最前面的标记为「建议优先使用」
- 查看积分统计:侧栏进入「积分统计」,查看总览、近 30 天趋势、模型分类、账号消耗与请求明细;筛选账号或时间范围不会重复请求官方接口,点击「刷新统计」才会重新采集
- 查看 Token 统计:侧栏进入「Token 统计」,选择 WorkBuddy、CodeBuddy CLI 或 CodeBuddy IDE,查看输入、输出、缓存读写和调用次数。图表使用 K/M/B 单位,趋势图将每日 Token 总量与构成、调用次数合并展示;项目、模型和会话排行默认显示 Top 10,不足 10 项时按实际数量展示。
- CodeBuddy CN IDE:账号卡片可一键切换国内版桌面客户端(www.codebuddy.cn)。切换会关闭并重启 CodeBuddy CN,把所选账号写入本机
~/Library/Application Support/CodeBuddy CN的登录态;首次使用前请先手动打开并登录一次以生成 Keychain Safe Storage。与下方 CLI 切换相互独立。 - CodeBuddy CLI:账号页可一键接入/更新认证。macOS/Linux 使用
apiKeyHelper,Windows 使用~/.codebuddy/settings.json的env.CODEBUDDY_AUTH_TOKEN(保留其他配置,不依赖.cmd跳板)。「切换 CodeBuddy」只更新后续加载会话使用的默认账号,当前运行会话不会切换;请由 ACP 重新加载会话,或重启 CodeBuddy CLI 后生效。普通 CLI 在同一进程中执行/resume不保证重新读取认证配置。 - 自动轮换:设置 → CodeBuddy CLI 自动轮换,开启后后台按间隔检查,并把积分最紧迫的账号设为后续会话的默认账号(策略见下);正在运行的当前会话不会被自动切换。Windows 会同步最新 Token 到 settings,但仍需重新加载会话或重启 CLI。
- API 反代:侧栏进入「API 反代」或「国际版 API 反代」,开启并保存后即可把
http://127.0.0.1:7863/v1(国内版)/http://127.0.0.1:7864/v1(国际版)当作 OpenAI 基址使用;同页可按分组挑选参与轮转的账号、填写「额外放行模型」,并查看请求用量;不知道model该填什么时点旁边的「获取模型ID」。详见 API 反代。 - 更新:发布包带签名更新清单,装过一次后可以在应用内一键升级;启动时也会检查 Releases 并在左下角提示新版本。签名密钥的维护须知见 应用内自动更新。
侧边栏的 「API 反代」 页把当前账号库包装成 OpenAI 兼容接口,任何支持 OpenAI SDK 的客户端都能直接用。国内版与国际版是两个独立入口,各有自己的开关、监听地址、API Key 与账号名单 —— 可以只开一个,也可以同时开:
国内版 base_url = http://127.0.0.1:7863/v1 # 走 www.codebuddy.cn
国际版 base_url = http://127.0.0.1:7864/v1 # 走 www.workbuddy.ai
api_key = 随便填(未设置鉴权时)
- 打开 Switch →「API 反代」/「国际版 API 反代」→ 打开「启用接口」→ 保存(保存即生效,无需重启)
- 之后每次启动 Switch 都会自动拉起(配置存在
~/.wb-switch/proxy.json)
| 接口 | 说明 |
|---|---|
POST /v1/chat/completions |
对话补全,支持 stream: true 流式 |
GET /v1/models |
可用模型列表(上游列表 + 本入口的「额外放行模型」) |
GET /healthz |
健康检查与可用账号数 |
GET /usage-stats |
反代用量统计(JSON) |
账号池:健康账号轮转使用,失败的号冷却 120 秒后自动回到池子;标记了 needs_relogin 的账号不参与。
按分组挑号:关掉「使用全部账号」后可按「反代API / 桌面端 / 未分组」分区勾选,或用「只选反代API 分组」一键把标记过的号全部选入。
额外放行模型:上游给的模型列表是不完整的 —— 有模型实测能调通却没列出来(如国际版的 deepseek-v4.1-flash)。填进这一栏就会进 /v1/models,并跳过版本校验,不再被判成「属于另一版」。
推荐用法:给日常聊天的 1~2 个号标「桌面端」,其余标「反代API」,反代页点「只选反代API 分组」—— 这样桌面端和 API 出站互不抢号。
客户端的消息不会原样发给上游,中途会被按需改写 —— 这两条都是实测被拦之后加上的:
- 摘掉 Claude-Code 式环境注入块 —— system prompt 里
gitStatus:/Current branch:那一整段会被上游的渠道校验认成「非官方客户端发来的」。反代从最后一个gitStatus:起截断。只影响长会话(环境块累积到完整形态时),所以表现为「时好时坏」。 - 国际版补首条
system—— 国际版上游要求第一条消息必须是system,否则整条请求被 400 打回:{"code":11128,"msg":"first message is not system prompt"}。客户端没带时补一条最小的。这条约束只有国际版有,国内版不带也照常。
任一改动生效时,响应头会带上 x-wb-switch-degraded(值为 system-env 或 leading-system),方便排查「为什么这轮模型看不到 git 状态」。
如果本机开着系统代理(梯子),部分客户端会把
127.0.0.1也送去走代理而连不上, 这时设置no_proxy=127.0.0.1,localhost,或用curl --noproxy '*'验证。
实现细节、源码位置与自行编译步骤见 API-PROXY.md。
以下均为实际运行截图。账号名、邮箱与用量数字已做模糊处理。
账号卡片集中展示登录状态、签到状态、积分余额和到期资源,支持切换 WorkBuddy 当前账号,并设置 CodeBuddy CLI 后续会话的默认账号。临期积分会直接标注在对应卡片内,并按紧迫程度优先排列。
| 浅色模式 | 深色模式 |
|---|---|
![]() |
![]() |
打开开关并保存即生效,之后每次启动 Switch 都会自动拉起本地网关。同页可按分组勾选参与轮转的账号,并查看经过反代的请求用量。
Token 统计页按来源展示 Token 总览和每日趋势,覆盖 WorkBuddy、CodeBuddy CLI 与 CodeBuddy IDE:输入、输出、缓存读写使用 K/M/B 紧凑单位,趋势图用堆叠柱表示每日 Token 总量与构成,用虚线表示调用次数;同时提供 Token 构成占比、活跃热力图、项目/模型 Top 10 和会话排行,帮助快速定位主要消耗来源。
再往下是活跃热力图和用量分布 —— 按项目(或按模型)排出消耗榜,直接看出钱花在哪:
积分统计页展示官方请求用量、每日趋势、模型分布、账号消耗和请求明细。数据来源和更新时间会明确显示。
主题、macOS 授权引导、自动签到与保活参数集中在这一页,下方是最近 30 天的签到日志。
自动轮换的目标是防止积分过期浪费:后台定时查询所有账号的积分到期情况,把 CodeBuddy CLI 后续会话的默认账号设为「最紧迫」的账号(最早到期且仍有剩余积分)。macOS/Linux 的 apiKeyHelper 与 Windows 的 settings env 都不会替换正在运行会话已经持有的 token;轮换结果需在 ACP 重新加载会话或重启 CLI 后生效。为避免默认账号频繁变化,每次检查按以下顺序决策:
- 有效账号:查询成功、未过期、有剩余积分的账号才可被选为目标
- 紧迫度检查:所有账号到期都还早(最紧迫的剩余超过
min_urgency_hours,默认 72 小时)→ 不切 - 已是目标:CLI 默认账号就是最紧迫账号 → 不切
- 冷却期:切换后
cooldown_minutes(默认 120)内不重复切 - 活跃保护:最近
active_guard_minutes(默认 30)内 CLI 会话有写入(正在对话)→ 不切 - 价值过滤:目标账号剩余积分低于
min_remaining_credits→ 不值得切(默认 0 关闭;每次检查会把各账号剩余积分写入日志,可据此调整) - 防抖动:目标比当前早到期但差异小于
min_gap_hours(默认 24)→ 不切
生效边界:自动轮换只更新后续 restore/load 使用的默认账号,不会热切换当前会话。macOS/Linux 下一次 helper 执行会读取最新账号;Windows 会把最新 Token 写入 settings。正在运行的会话继续使用启动或加载时取得的账号;请由 ACP 重新加载会话,或重启 CodeBuddy CLI。普通 CLI 在同一进程内执行
/resume不保证重新读取认证配置。
配置项:check_interval_minutes(检查间隔,默认 5)、cooldown_minutes、min_urgency_hours、active_guard_minutes、min_remaining_credits、min_gap_hours。可在设置页调整,或直接编辑 ~/.wb-switch/auto_rotate_config.json。
切换账号需要写入 WorkBuddy 认证文件,macOS 要求授权「App 管理」(或「完全磁盘访问」):
- 首次切换报「无权限」时,点「打开系统设置」
- 优先在 App 管理 里打开 WorkBuddy-Switch2api 开关;若没有,则去 完全磁盘访问 把 WorkBuddy-Switch2api 拖进带箭头的框
- 授权后重启本应用生效;设置页「权限检测」可随时验证
webui 模式:由启动服务的终端进程权限决定;若终端已授权完全磁盘访问则无需额外操作。
发布产物带 Tauri updater 签名与清单,装过一次以后可以在应用内直接升级:
- 每次 tag 发版,CI 会为四个平台产出
.sig签名与latest.json/latest-<target>-<arch>.json - 客户端从我们自己仓库的 Releases 拉清单(
tauri.conf.json→plugins.updater.endpoints) - Linux 有两种安装形态,各发一份清单:AppImage(
latest-linux-x86_64.json)与 deb(latest-linux-deb-x86_64.json)
维护者须知(换签名密钥时):
- 本机生成密钥对:
npx tauri signer generate -w "$HOME/.wb-switch/wb-switch-updater.key" -p <密码> - 公钥写进
src-tauri/tauri.conf.json的plugins.updater.pubkey - 私钥与密码分别写进仓库 Actions secrets:
TAURI_SIGNING_PRIVATE_KEY、TAURI_SIGNING_PRIVATE_KEY_PASSWORD - 私钥丢了就再也签不出能被老客户端接受的更新,注意备份
签名的私钥只放在本机
~/.wb-switch/wb-switch-updater.key与仓库 secrets 里,不要提交进 git。
切换 CodeBuddy CN 账号需要读 Safe Storage 密码,Linux 下走的是系统密钥环
(Secret Service / org.freedesktop.secrets,即 gnome-keyring 或 KWallet):
- 直接按 D-Bus 协议读,不依赖
secret-tool(它来自 libsecret-tools,Ubuntu / Debian 默认不装) - 请确认密钥环服务已启动、登录密钥环已解锁,并先用 CodeBuddy CN 手动登录一次
- 只读取「已解锁」条目:锁定条目会拉起解锁弹窗并可能长时间阻塞,所以宁可报错也不硬读
家目录数据换盘存放。左边列出每个目录的占用与当前状态(普通目录 / 已是联接);下面逐目录勾选这次要迁哪些 —— 只想搬国际版就只勾它,没勾的目录一个字节都不会动。
路径上先给一个默认位置,勾中的目录默认都用它;想给它单独换盘的,直接改那一行的路径(留空即沿用默认位置)。国内版 .workbuddy 和国际版 .workbuddy-ai 可以分开放到不同的盘,也可以都放同一个文件夹。搬到位的目录会在原位置留一个指向新盘的联接。
迁移时只要求退掉要迁的那些目录对应的那个客户端 —— 只想搬国际版,国内版可以照常开着用。页面上会逐行标出哪个目录正被哪个应用占用,只在「已勾选且被占用」时禁用按钮;把那一行取消勾选也能立刻开迁。空间检查按目标盘各算各的;开始前会列出本次要迁的目录清单再确认。复制完用 robocopy 预演核对一遍(和真正复制同一套判定标准),一个文件都不缺才改名建联接 —— 失败自动回滚,源数据不会被删。复制期间源目录若被写入(客户端中途被打开),会自动增量重拷对齐,最多三轮;仍不收敛才中止,并在日志里点名是哪个进程还开着。目标里若留下源中已不存在的文件(复制期间被应用轮转/删掉的日志、LevelDB 片段),只报告、不影响判定 —— 它们不参与校验,也不会导致迁移失败。
确认客户端一切正常之后,可以把遗留的 .moved-* 备份删掉。删除走的是整份移入回收站:逐个删文件在这台机器上要 280 ms/个,二十多万个文件要一个半小时,所以整目录一次交给系统处理,顺带保留了「删错了还能还原」的退路 —— 空间在清空回收站之后才真正释放。
迁移完成后,应用自己的「设置 → 系统缓存目录」仍会显示原来的家目录路径,用资源管理器打开也是那个路径 —— 这是正常的,目录联接对程序完全透明,应用压根不知道数据换盘了。判断有没有真的搬走看两处:本页的状态变成「已是联接」并指向目标盘;应用设置页里那条「磁盘」容量变成目标盘的容量。每行右侧的「打开」按钮可以直接跳到数据真正所在的位置。
WorkBuddy 的更新缓存是按用户放的、不分产品:
%LOCALAPPDATA%\@genieworkbuddy-desktop-updater\installer.exe
国内版和国际版共用这一个目录。任一版本下载的安装包躺在这里,另一个版本启动时看到「版本号更高」就直接套用,不校验包属于哪个产品 —— 于是对方的程序目录被整个覆盖、cli/product.json 里的身份被改写。本机实测已发生两次(2026-10-01 国际版被国内包覆盖;2026-10-08 两个独立安装目录被合并成一个,国内版身份彻底消失、两个快捷方式指向同一份国际版)。
这一页做两件事,缺一不可:
- 把更新源指到黑洞:写用户级环境变量
WORKBUDDY_UPDATE_URL=http://127.0.0.1:1。这是 app.asar 里明确写死的最高优先级更新源覆盖(WORKBUDDY_UPDATE_URL> 运行时租户 endpoint > 硬编码兜底),更新源拉不到东西就不会再下载新包。 - 隔离已下载的包:缓存里已经下好的包不看更新源地址,启动时照样会被应用。所以开启防护时会把它们改名加上
.disabled-<时间>后缀 —— 只是改名,文件还在原处,随时能改回去。
页面下半部分是安装目录身份清单:身份由目录里的 resources/app.asar.unpacked/cli/product.json 决定,和目录名、和 exe 叫什么名字都无关。当两个启动器 exe 同时存在但身份只有一个时(被覆盖后的典型样子),这里会直接标黄提醒 —— 点「国内版」的快捷方式,跑起来的其实是国际版。
选好要带的项目、勾上包内容(配置 / 插件缓存 / 文件改动历史 / 工作区快照 / 账号凭证),打包成 zip; 到另一台机器上选这个包,先看差异预览再决定导入哪些 —— 界面会告诉你哪些会话是新的、本地缺多少附件、配置会新增什么。
本项目基于以下开源工作(完整的第三方声明见 THIRD-PARTY-NOTICES.md):
- changexbc/workbuddy-switch —— 账号切换、积分与 Token 统计、 自动签到、自动轮换等绝大部分功能的作者。本仓库在此之上做了改造与扩展(API 反代、账号分组、反代用量统计、 国内版 / 国际版双档位),在此致谢。
- Harvey-Will/workbuddy-tools(MIT)—— 国际版(WorkBuddy AI)
的数据目录划分与客户端
account-snapshot.json切换机制参考了该项目的core/editions.py与core/accounts.py。 相关代码为独立重写,特此声明来源,遵循 MIT 许可。 - Linux.do 社区 —— 提供交流与反馈。
- 以及 Tauri、React、axum、 reqwest 等开源项目。
有问题、想反馈 bug,或者想聊聊用法,欢迎扫码进群。
QQ 群:1124773537
MIT © 2026 wb-switch / cv-superding
第三方声明(上游与参考项目的版权归属)见 THIRD-PARTY-NOTICES.md。
本仓库与腾讯(WorkBuddy / CodeBuddy)官方无关,仅为本地账号管理与自用网关工具。



















