Skip to content

About

WorkBuddy / CodeBuddy 账号切换工具(Tauri + Rust),内置 OpenAI 兼容本地反代:账号池轮转、积分签到监控、托盘常驻。Fork of changexbc/workbuddy-switch

Resources

Stars

80 stars

Watchers

1 watching

Forks

Latest commit

 

History

126 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

WorkBuddy-Switch2api

手绘动画风横幅:山坡小屋放出成串绿色与紫色的灯笼,全部汇入右侧一扇发光的石门,标题 WorkBuddy-Switch2api

License: MIT Latest release Platforms: Windows / macOS / Linux Built with Tauri + Rust

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 只读演示(账号、积分与请求记录均为虚构数据,所有业务操作已禁用)

快速开始

npm / webui(本地构建)

浏览器操作界面,与桌面 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 里会整页提示只在桌面端可用。

webui:浏览器里的账号管理页,与桌面 App 同一套界面

Docker(常驻部署)

想让「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/(已脱敏)。

桌面 App

前往 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 的冲突。

Switch 整体架构:兼容客户端 → 本地反代 → 账号池 → 国内版 / 国际版上游;界面 → 命令层 → 认证与配置 → 桌面客户端

  • 外部客户端只认一个本地地址(国内版 7863 / 国际版 7864),选版本、挑号、冷却全在进程内完成,客户端不用改配置
  • 界面只下发命令;真正写认证文件、重启客户端的是命令层
  • 两个版本各有一份认证文件,切换与查询都按档位取

反代请求生命周期

反代请求生命周期:挑版本与挑号 → 出站适配 → SSE 流式透传 → 落用量

出站前会做两件事,都是被上游逼出来的:摘掉 system prompt 里 Claude-Code 式的环境注入块;国际版首条不是 system 就补一条(否则整条请求被 400 打回)。失败的号进冷却,120 秒后自动回池。

账号切换流程

账号切换流程:备份认证文件 → 关闭客户端 → 写入目标账号 → 重启;含共享 / 复制会话与 macOS 授权异常分支

家目录缓存迁移

家目录缓存迁移:普通目录 → 复制 → 校验 → 留底 → 已是联接,失败回滚,源被写入时增量重拷最多三轮

顺带一提:界面在 IPC 层做了一层读缓存 —— 60 秒内直接命中,5 分钟内先给缓存让页面立刻渲染、再后台刷新,所以切回看过的页面是秒开的;点「刷新」始终绕过缓存直连后端。

使用

  1. 添加账号:账号页 →「扫码登录」(OAuth device flow)或「从本机导入」「手动添加」。 账号页顶部有 国内版 / 国际版 标签,扫码与导入都作用在当前标签对应的版本上
  2. 切换账号:账号卡片 →「切换」,默认开启「共享全部会话」(把会话归属清空,切回来还能接着聊),也可勾选把指定会话复制给目标账号。国内版与国际版各自作用于自己的会话库
  3. 自动签到:账号页可直接开关;设置页可调整保活参数、立即签到并查看日志
  4. 查看积分到期:账号页会自动查询各账号积分资源;点击「刷新积分」可手动更新,临近到期的资源会高亮,并把快过期账号按最近到期时间排序,最前面的标记为「建议优先使用」
  5. 查看积分统计:侧栏进入「积分统计」,查看总览、近 30 天趋势、模型分类、账号消耗与请求明细;筛选账号或时间范围不会重复请求官方接口,点击「刷新统计」才会重新采集
  6. 查看 Token 统计:侧栏进入「Token 统计」,选择 WorkBuddy、CodeBuddy CLI 或 CodeBuddy IDE,查看输入、输出、缓存读写和调用次数。图表使用 K/M/B 单位,趋势图将每日 Token 总量与构成、调用次数合并展示;项目、模型和会话排行默认显示 Top 10,不足 10 项时按实际数量展示。
  7. CodeBuddy CN IDE:账号卡片可一键切换国内版桌面客户端(www.codebuddy.cn)。切换会关闭并重启 CodeBuddy CN,把所选账号写入本机 ~/Library/Application Support/CodeBuddy CN 的登录态;首次使用前请先手动打开并登录一次以生成 Keychain Safe Storage。与下方 CLI 切换相互独立。
  8. CodeBuddy CLI:账号页可一键接入/更新认证。macOS/Linux 使用 apiKeyHelper,Windows 使用 ~/.codebuddy/settings.json 的 env.CODEBUDDY_AUTH_TOKEN(保留其他配置,不依赖 .cmd 跳板)。「切换 CodeBuddy」只更新后续加载会话使用的默认账号,当前运行会话不会切换;请由 ACP 重新加载会话,或重启 CodeBuddy CLI 后生效。普通 CLI 在同一进程中执行 /resume 不保证重新读取认证配置。
  9. 自动轮换:设置 → CodeBuddy CLI 自动轮换,开启后后台按间隔检查,并把积分最紧迫的账号设为后续会话的默认账号(策略见下);正在运行的当前会话不会被自动切换。Windows 会同步最新 Token 到 settings,但仍需重新加载会话或重启 CLI。
  10. API 反代:侧栏进入「API 反代」或「国际版 API 反代」,开启并保存后即可把 http://127.0.0.1:7863/v1(国内版)/ http://127.0.0.1:7864/v1(国际版)当作 OpenAI 基址使用;同页可按分组挑选参与轮转的账号、填写「额外放行模型」,并查看请求用量;不知道 model 该填什么时点旁边的「获取模型ID」。详见 API 反代。
  11. 更新:发布包带签名更新清单,装过一次后可以在应用内一键升级;启动时也会检查 Releases 并在左下角提示新版本。签名密钥的维护须知见 应用内自动更新。

API 反代

侧边栏的 「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 = 随便填(未设置鉴权时)
  1. 打开 Switch →「API 反代」/「国际版 API 反代」→ 打开「启用接口」→ 保存(保存即生效,无需重启)
  2. 之后每次启动 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,并跳过版本校验,不再被判成「属于另一版」。

API 反代页:接口开关、监听地址、API Key、额外放行模型

推荐用法:给日常聊天的 1~2 个号标「桌面端」,其余标「反代API」,反代页点「只选反代API 分组」—— 这样桌面端和 API 出站互不抢号。

出站前会自动处理的两件事

客户端的消息不会原样发给上游,中途会被按需改写 —— 这两条都是实测被拦之后加上的:

  1. 摘掉 Claude-Code 式环境注入块 —— system prompt 里 gitStatus: / Current branch: 那一整段会被上游的渠道校验认成「非官方客户端发来的」。反代从最后一个 gitStatus: 起截断。只影响长会话(环境块累积到完整形态时),所以表现为「时好时坏」。
  2. 国际版补首条 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 账号

账号卡片集中展示登录状态、签到状态、积分余额和到期资源,支持切换 WorkBuddy 当前账号,并设置 CodeBuddy CLI 后续会话的默认账号。临期积分会直接标注在对应卡片内,并按紧迫程度优先排列。

浅色模式 深色模式
账号管理页面(浅色模式,账号信息已脱敏) 账号管理页面(深色模式,账号信息已脱敏)

API 反代

打开开关并保存即生效,之后每次启动 Switch 都会自动拉起本地网关。同页可按分组勾选参与轮转的账号,并查看经过反代的请求用量。

API 反代页面:接口开关、监听地址、API Key、按分组挑选账号与反代用量

Token 统计

Token 统计页按来源展示 Token 总览和每日趋势,覆盖 WorkBuddy、CodeBuddy CLI 与 CodeBuddy IDE:输入、输出、缓存读写使用 K/M/B 紧凑单位,趋势图用堆叠柱表示每日 Token 总量与构成,用虚线表示调用次数;同时提供 Token 构成占比、活跃热力图、项目/模型 Top 10 和会话排行,帮助快速定位主要消耗来源。

Token 统计页面:总览指标、每日 Token 构成与调用次数趋势

再往下是活跃热力图和用量分布 —— 按项目(或按模型)排出消耗榜,直接看出钱花在哪:

Token 统计页面下半:近一年活跃热力图与按项目的用量分布 Top 10

积分统计

积分统计页展示官方请求用量、每日趋势、模型分布、账号消耗和请求明细。数据来源和更新时间会明确显示。

积分统计页面:总览、官方积分消耗趋势与按模型分类

设置

主题、macOS 授权引导、自动签到与保活参数集中在这一页,下方是最近 30 天的签到日志。

设置页:外观、权限检测、自动签到配置与签到日志

自动轮换策略

自动轮换的目标是防止积分过期浪费:后台定时查询所有账号的积分到期情况,把 CodeBuddy CLI 后续会话的默认账号设为「最紧迫」的账号(最早到期且仍有剩余积分)。macOS/Linux 的 apiKeyHelper 与 Windows 的 settings env 都不会替换正在运行会话已经持有的 token;轮换结果需在 ACP 重新加载会话或重启 CLI 后生效。为避免默认账号频繁变化,每次检查按以下顺序决策:

  1. 有效账号:查询成功、未过期、有剩余积分的账号才可被选为目标
  2. 紧迫度检查:所有账号到期都还早(最紧迫的剩余超过 min_urgency_hours,默认 72 小时)→ 不切
  3. 已是目标:CLI 默认账号就是最紧迫账号 → 不切
  4. 冷却期:切换后 cooldown_minutes(默认 120)内不重复切
  5. 活跃保护:最近 active_guard_minutes(默认 30)内 CLI 会话有写入(正在对话)→ 不切
  6. 价值过滤:目标账号剩余积分低于 min_remaining_credits → 不值得切(默认 0 关闭;每次检查会把各账号剩余积分写入日志,可据此调整)
  7. 防抖动:目标比当前早到期但差异小于 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。

macOS 权限说明

切换账号需要写入 WorkBuddy 认证文件,macOS 要求授权「App 管理」(或「完全磁盘访问」):

  1. 首次切换报「无权限」时,点「打开系统设置」
  2. 优先在 App 管理 里打开 WorkBuddy-Switch2api 开关;若没有,则去 完全磁盘访问 把 WorkBuddy-Switch2api 拖进带箭头的框
  3. 授权后重启本应用生效;设置页「权限检测」可随时验证

webui 模式:由启动服务的终端进程权限决定;若终端已授权完全磁盘访问则无需额外操作。

应用内自动更新(Windows / macOS / Linux)

发布产物带 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)

维护者须知(换签名密钥时):

  1. 本机生成密钥对:npx tauri signer generate -w "$HOME/.wb-switch/wb-switch-updater.key" -p <密码>
  2. 公钥写进 src-tauri/tauri.conf.json 的 plugins.updater.pubkey
  3. 私钥与密码分别写进仓库 Actions secrets:TAURI_SIGNING_PRIVATE_KEY、TAURI_SIGNING_PRIVATE_KEY_PASSWORD
  4. 私钥丢了就再也签不出能被老客户端接受的更新,注意备份

签名的私钥只放在本机 ~/.wb-switch/wb-switch-updater.key 与仓库 secrets 里,不要提交进 git。

Linux 说明(密钥环)

切换 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 两个独立安装目录被合并成一个,国内版身份彻底消失、两个快捷方式指向同一份国际版)。

这一页做两件事,缺一不可:

  1. 把更新源指到黑洞:写用户级环境变量 WORKBUDDY_UPDATE_URL=http://127.0.0.1:1。这是 app.asar 里明确写死的最高优先级更新源覆盖(WORKBUDDY_UPDATE_URL > 运行时租户 endpoint > 硬编码兜底),更新源拉不到东西就不会再下载新包。
  2. 隔离已下载的包:缓存里已经下好的包不看更新源地址,启动时照样会被应用。所以开启防护时会把它们改名加上 .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(dsh-ds-web-login)

QQ 群:1124773537

许可

MIT © 2026 wb-switch / cv-superding

第三方声明(上游与参考项目的版权归属)见 THIRD-PARTY-NOTICES.md。

本仓库与腾讯(WorkBuddy / CodeBuddy)官方无关,仅为本地账号管理与自用网关工具。

About

WorkBuddy / CodeBuddy 账号切换工具(Tauri + Rust),内置 OpenAI 兼容本地反代:账号池轮转、积分签到监控、托盘常驻。Fork of changexbc/workbuddy-switch

Resources

Stars

80 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages