- 补充 Windows Store / MSIX 安装的 Codex 缓存路径;缓存链中的损坏响应不再遮挡后续有效记录。
- 已核验账号归属的重置记录不再依赖切换时间或新的额度日志,只有重置次数时也能保存。
- 并发刷新保留较新的重置记录,防止旧响应覆盖余额。仍只读取本地数据,未知不当作零次。
主窗口标题上方和浮窗左上角显示版本号,点击即可手动检查 GitHub 最新正式版。发现更新时,按当前系统与架构匹配安装包,点击“下载安装包”通过浏览器下载,再运行安装包更新。检查失败可以重试;本机版本较新时不会提示降级。
仅手动检查时请求本项目的公开 GitHub Release 接口,不携带账号、凭证或用量数据;不后台检查、不自动安装。实现使用 GitHub Releases API。
安装后,.codexauth 加密凭证文件使用 CodexAuth 应用图标。导入仍通过主窗口的“导入凭证文件”完成。
主窗口提供“导出当前账号”和“导入凭证文件”。在 A 电脑设置至少 10 个字符的迁移密码,保存加密的 .codexauth 文件;在 B 电脑安装本版本或更新版本,选择导入并输入相同密码,再在账号列表点击“切换”。导入不会自动切换或重启当前账号。
迁移文件使用 scrypt 派生密钥和 AES-256-GCM 加密,账号名称及凭证均在密文内,不导出明文 auth.json。B 电脑会重新使用本机 DPAPI / macOS Keychain 保存凭证。已有非当前账号更新前会确认并备份;当前已登录的同一账号保留本机凭证。
凭证有效时通常无需重新登录,但无法绕过官方验证。凭证过期、撤销或刷新令牌变化后可能需要重新导出或官方登录。请分别妥善保管迁移文件和密码,密码不会保存,遗失后无法恢复文件。验证命令:npm run portable:validate。
- 移除浮窗、账号详情及用量看板中的其他额度池展示,保留会话额度、周额度和重置次数。
- 浮窗不再为额外额度池预留高度,最小尺寸仍可完整显示两个账号。
维护时从 Codex 或终端更新已安装程序后,使用 scripts/start-installed-independent.ps1 -ExecutablePath "E:\CodexAuth\CodexAuth Switch.exe" 独立启动(路径按实际安装位置调整)。脚本由 Windows 进程服务启动程序,避免沿用维护宿主的进程生命周期;平时仍可使用桌面快捷方式。
- 初始化期间重复打开程序会等待接口就绪,再显示主窗口或浮窗,避免
No handler registered for 'state:get'。 - 启动失败会明确提示并退出,不再留下无法加载账号的窗口。验证:
npm run startup:validate。
- 提高浮窗最小高度,包含其他额度池信息时仍完整显示至少两个账号;已保存的较小尺寸会自动纠正。
- 压缩重置栏高度,来源标签统一为“Codex缓存”。
- 悬浮窗账号快速看板和主窗口账号详情展示各账号保存的重置次数、来源及时间,并补充其他额度池。
- 切到其他账号后仍可查看历史快照;缺失数据保持未知,旧重置记录标注待更新,不联网刷新其他账号。
- 只读 Codex 内置浏览器已保存的用量响应缓存,同时匹配账号 ID 与用户 ID,读取实际可用重置次数。
- 标注“浏览器缓存”和数据时间;旧缓存提示待更新。缺失或无法核验时仍显示未知,不主动请求官方 API。
- 新增验证:
npm run browser-cache:validate。
- 按额度池 ID 分别展示,正确识别只有周窗口的套餐;缺失百分比显示未知。
- Token 使用逐事件增量,覆盖 sessions 与 archived_sessions,重复历史去重,按实际模型/日期归属;支持 gzip 与运行时可用的 Zstandard。展示完整整数、缓存输入/推理输出子项和扫描覆盖情况。计数回退或缺失基准不猜测补齐。
- 额度估算只使用本账号、同模型、明确速度档、同额度池和窗口的本地样本,至少 3 个样本;新模型不再套用 GPT-5.5 价格。样本不足仍展示本地快照。
- 重置次数只接受结构化本地 Codex 记录;没有记录显示“未知”,旧记录或过期记录明确标注。不联网查询,也不提供兑换重置操作。
- 自检展示实际运行版本、凭据同步与日志状态;索引损坏时先保留原索引和加密快照,再恢复可解密账号。恢复目录不自动删除。
- 当前账号统计从最近一次切换起,不能据此推断其他设备用量。首次完整统计可能较慢,后续复用未变化文件的解析结果。
- 新增验证:
npm run local-data:validate。
English README | 中文说明
CodexAuth Switch 是一个 Windows 与 macOS 本地桌面工具,用来在多个 Codex App 登录账号之间快速切换。
它适合同时使用多个 OpenAI / Codex App 账号的人:先把每个账号的本地登录状态保存下来,之后通过这个工具切换当前生效的 Codex 登录。应用只操作本机文件,额度和用量来自本地 Codex 日志解析,不请求远程额度接口,也不会上传 Codex 会话历史。
一句话定位:CodexAuth Switch 是一个本地优先的 Codex App 多账号切换工具,支持 auth.json 快照管理、Windows DPAPI / macOS Keychain 加密、额度查看和 token 用量统计。
这是非官方项目,与 OpenAI 无官方关联。
- 想在 Windows 或 macOS 上管理多个 Codex App 登录账号。
- 想快速切换 OpenAI Codex / Codex App 当前账号。
- 想安全保存和恢复本地
~/.codex/auth.json登录快照。 - 想查看 Codex 本地会话额度、周额度、剩余重置次数、token 用量和最近会话。
- 想坚持本地日志估算,不把 token、账号信息或会话历史发到远程额度接口。
Codex 账号切换、Codex 多账号、Codex App 账号管理、OpenAI Codex 账号切换工具、Codex auth.json 切换、Codex 本地登录管理、Codex 额度查看、Codex token 用量统计、Codex Windows macOS 桌面工具、Codex DPAPI Keychain 加密、Codex 本地预估、Codex 本地额度估算、Codex 本地历史只读。
- 导入当前 Codex App 登录状态。
- 保存多个本地账号快照。
- 通过替换
~/.codex/auth.json切换当前 Codex 登录。 - Windows 使用 DPAPI、macOS 使用 Keychain 支持的系统安全存储加密账号凭据,仅当前系统用户可解密。
- 切换、重新登录、删除当前账号前自动备份原始
auth.json。 - 提供主窗口、系统托盘菜单和悬浮快捷窗。
- 从本地 Codex 日志读取额度和 token 使用情况。
- 使用本地 token 事件索引辅助额度预估,减少重复扫描并提升刷新稳定性。
- 显示会话额度、周额度和各账号保存的剩余重置次数;缺失或过期的数据会明确标注。
- 渲染页面禁用网络请求;额度读取路径也保持本地-only。
| 主窗口 | 悬浮快捷窗 |
|---|---|
![]() |
![]() |
CodexAuth Switch 的设计目标是把影响范围限制在本机登录文件和本应用自己的存储目录内。
~/.codex/auth.json- Codex App 当前使用的本地登录文件。
- 切换账号时,应用会用已保存的账号快照替换这个文件。
~/.codex/config.toml- 自动确保顶层配置包含
cli_auth_credentials_store = "file",让新版 Codex 继续使用可切换的auth.json文件凭据。 - 修改前会在同目录生成带时间戳的
config.toml.codexauth-backup-*备份。
- 自动确保顶层配置包含
- 本应用的账号元数据:Windows 为
%APPDATA%\codex-auth-switcher\accounts.json;macOS 为~/Library/Application Support/codex-auth-switcher/accounts.json。 - 加密账号凭据快照:Windows 为
%APPDATA%\codex-auth-switcher\accounts\*.dpapi;macOS 为~/Library/Application Support/codex-auth-switcher/accounts/*.keychain。 - 操作当前账号前的加密备份:Windows 为
%APPDATA%\codex-auth-switcher\backups\*.dpapi;macOS 为~/Library/Application Support/codex-auth-switcher/backups/*.keychain。
~/.codex/auth.json- 用于导入当前登录、识别账号身份。
~/.codex/sessions/**/rollout-*.jsonl- 用于本地统计用量和额度快照。
~/.codex/session_index.jsonl- 存在时用于补充本地会话元数据。
~/.codex/logs_2.sqlite- 以只读方式打开,用于读取 Codex 本地写入的额度事件。
- 不修改 Codex 会话历史。
- 不删除
~/.codex/sessions。 - 不写入
logs_2.sqlite。 - 不上传 token、账号信息、会话日志或用量记录。
- 不使用当前 access token 请求远程额度接口。
- 不自行刷新 OpenAI token。
- 不调用远程额度接口。
会影响 Codex App 当前运行状态的功能只有:切换账号、重新登录、删除当前账号、重启 Codex App。这些操作可能会更新 config.toml、替换或移除当前 auth.json,并重启 Codex App,让新的本地登录状态生效。
导入当前登录时,应用会读取 ~/.codex/auth.json,并验证它是否是 Codex App 的 ChatGPT 登录格式。
应用会在本地解析 JWT payload,提取邮箱、用户 ID、workspace/account ID 等字段。账号匹配不会只依赖单个字段,而是尽量组合个人身份和工作区身份,因为同一个人可能加入多个工作区,同一个工作区也可能包含多个成员。
保存账号时,应用不会明文存储 auth.json:Windows 使用 DPAPI,macOS 使用 Electron safeStorage 与系统 Keychain。
Windows 使用 DataProtectionScope.CurrentUser;macOS 使用当前用户的 Keychain。
这表示加密后的账号快照绑定到当前操作系统用户,其他用户、其他机器或不同操作系统不能直接解密。
账号快照存储在:
- Windows:
%APPDATA%\codex-auth-switcher\accounts - macOS:
~/Library/Application Support/codex-auth-switcher/accounts
操作当前登录前的备份存储在:
- Windows:
%APPDATA%\codex-auth-switcher\backups - macOS:
~/Library/Application Support/codex-auth-switcher/backups
应用不自行调用 OpenAI 刷新接口。Codex 在账号实际使用时自动刷新 access / refresh token;CodexAuth Switch 监听当前 auth.json 的写回,并把新内容重新加密同步到对应账号快照。access token 到期本身不代表登录失效,只有 Codex 明确无法刷新时才需要重新登录。
加密备份保留最新 60 份;超过一小时的原子写临时残留会在启动时清理,避免长期切换和统计产生无上限缓存。
切换账号时,应用会执行以下步骤:
- 读取当前
~/.codex/auth.json。 - 如果当前登录存在,先生成当前平台安全存储加密的备份。
- 解密目标账号的本地快照。
- 校验目标快照是否是有效的 Codex 登录文件。
- 先写入临时文件。
- 再通过原子重命名替换
~/.codex/auth.json。 - 根据用户选择重启 Codex App。
使用临时文件加原子替换,是为了避免 Codex App 读到写入一半的 auth.json。
Windows 会结束属于 Codex 安装目录的桌面进程组并重新启动应用;macOS 会识别当前 ChatGPT / 旧版 Codex 应用进程,等待退出后通过 Launch Services 重新启动。
如果某个已保存账号的 refresh token 失效,应用可以发起重新登录流程:
- 备份当前
auth.json。 - 删除当前本地
auth.json。 - 重启 Codex App。
- 用户在 Codex App 里走官方登录流程。
- Codex App 写入新的
auth.json后,CodexAuth Switch 自动监听并保存到对应账号。
这个过程不绕过官方登录,也不代替官方登录。真正的登录仍然发生在 Codex App 内。
额度面板采用本地预估模式,只读取 Codex App 已经写到本机的日志,不请求 chatgpt.com 或其他远程额度接口。
本地预估模式读取以下数据:
- session JSONL 文件里的
codex.rate_limits。 - 自动发现最新
logs_N.sqlite里的codex.rate_limits和 usage-limit 记录。 - session 文件里的
token_count事件。 - 按文件大小和修改时间缓存解析结果,对完整日志事件去重;账号元数据只保存额度快照和各模型、服务档位独立的校准样本。旧版
local-token-ledger.json不再参与统计。
应用会监听本地日志文件变化,并用短延迟防抖刷新显示;同时用低频轮询检查 SQLite 文件更新时间,避免文件监听漏事件。
额度快照只保存到本应用自己的账号元数据中,不会写回 Codex 的日志文件。
多账号统计以账号最近一次切换时间为边界。跨切换时间继续运行的同一会话按相邻 Token 快照的增量归属,额度校准也只融合当前账号切入后的事件和该账号自己的历史校准,避免同套餐账号互相串数。
应用会根据当前已用百分比、额度窗口长度和重置时间估算当前消耗速度,显示“消耗速度宽松 / 消耗速度正常 / 按当前速度会提前用完”。这只是趋势提示,不代表下一次对话会准确消耗多少额度。
Electron 窗口启用了以下安全配置:
contextIsolation: true
nodeIntegration: false
sandbox: true
webSecurity: true页面 CSP 禁止网络连接:
connect-src 'none'主进程还通过 Electron webRequest.onBeforeRequest 拦截并取消以下出站请求:
http://
https://
ws://
wss://
这些限制用于确保渲染页面保持本地工具属性,避免账号信息或本地历史被上传。额度读取同样保持本地-only。
例外是用户主动点击的 GitHub 更新检查:主进程使用独立 HTTPS 请求访问固定的公开仓库地址。只接受本仓库当前版本对应的安装包链接,并通过系统浏览器打开;不读取 GitHub 登录信息或 Codex 凭证。
npm installnpm startWindows 本地隐藏调试启动:
npm run dev:hidden- 打开 Codex App,并登录第一个账号。
- 打开 CodexAuth Switch。
- 点击导入当前 Codex 登录。
- 回到 Codex App,退出并登录另一个账号。
- 再回到 CodexAuth Switch,继续导入当前登录。
- 重复以上步骤,保存所有需要切换的账号。
- 在 CodexAuth Switch 中选择一个已保存账号。
- 点击切换。
- 如果 Codex App 仍显示旧账号,重启 Codex App。
应用会把新版 Codex 固定为文件凭据模式,并在启用“切换后重启”时完整重启桌面应用;新账号会在重新启动后生效。
当 Codex 提示 refresh token 无法刷新,或某个保存账号已经失效时,使用重新登录功能。
应用会清理当前本地登录并重启 Codex App。你只需要在 Codex App 里正常完成官方登录,新的 auth.json 写入后会被 CodexAuth Switch 捕获并保存。
npm run lintnpm run local-data:validate这个命令使用隔离测试日志,检查 Token 增量、重复和分叉、账号边界、额度池、周窗口、重置次数来源、估算校准及账号恢复。quota:validate 保留用于旧价格权重算法的历史回放,不作为当前算法的验收。
npm run pack:win请在 macOS 上运行:
npm run pack:mac命令会同时生成 Intel (x64) 与 Apple Silicon (arm64) DMG。
安装包输出到:
release/
release 目录是本地构建产物,默认不提交到 Git。
src/main.js Electron 主进程,本地文件访问、账号切换、额度逻辑
src/preload.js 安全 IPC bridge
src/ui/index.html 主窗口页面
src/ui/app.js 主窗口渲染逻辑
src/ui/widget.html 悬浮快捷窗页面
src/ui/widget.js 悬浮快捷窗渲染逻辑
scripts/generate-icon.js 本地图标生成
scripts/start-dev-hidden.ps1 隐藏调试启动脚本
scripts/validate-quota-estimate.js 额度逻辑回放校验脚本
QUOTA-LOGIC.md 额度估算逻辑说明
- 支持 Windows 与 macOS,暂不支持 Linux。
- Windows 与 macOS 的加密快照绑定各自系统用户,不能跨机器或跨平台直接复制使用。
- 目标是 Codex App 本地登录切换,不是 Codex CLI-only 工作流。
- 本地预估模式来自本地日志解析,属于本地近似展示。
- Codex 没有写入新的本地 rate-limit 记录时,额度快照可能暂时不更新。
- 不要跨机器或跨系统用户共享已保存的凭据快照。
Windows 安装包以及 Intel / Apple Silicon macOS DMG 会随 GitHub Release 上传。当前安装包没有商业代码签名或 Apple 公证,操作系统可能显示安全提醒。
MIT License. See LICENSE.
请只保存和切换你自己拥有或被授权使用的账号。不要把 auth.json、加密快照、备份文件分享给其他人。


