codex同时使用官方账号与第三方 API

Codex 双环境隔离:在同一台 Windows 上同时使用官方账号与第三方 API

通过 CODEX_HOME 隔离 VS Code Stable、VS Code Insiders、ChatGPT Desktop 与 Codex CLI 的账号和 API 环境。

1. 背景

大家好,这是一个简单的用户隔离操作,我在 Windows 上使用 Codex / ChatGPT / VS Code 插件时,遇到了一个需求:

由于plus账号的codex额度太少,5X的pro对于开发时间分布并不均匀的我来说会造成浪费 而且codex的风控让我不敢贸然使用ccswitch来切换账户 所以我希望在同一台电脑上同时保留两套 Codex 环境:

  • 官方账号环境

    • VS Code Stable
    • ChatGPT Desktop / Codex Desktop
    • 普通 Codex CLI
    • 使用 ChatGPT 官方账号
    • 走官方订阅额度
  • 第三方 API 环境

    • VS Code Insiders
    • 使用第三方 API 中转站
    • 使用独立 API Key
    • 和官方账号完全隔离
    • 不影响 Stable、普通 CLI 和 ChatGPT Desktop

一开始我以为只要安装两个 VS Code,或者使用 VS Code Profile,就可以实现账号隔离。实际测试后发现并不是这样。

最终可维护的方案是:

不依赖 VS Code Profile,也不依赖 Stable / Insiders 天然隔离,而是通过 CODEX_HOME 为 Codex 创建独立的本地身份空间。


2. 问题现象

2.1 VS Code Profile 不能可靠隔离 Codex 账号

我创建了两个 VS Code Profile:

text
复制代码
Codex-Official Codex-API

但两个 Profile 中仍然显示同一个 Codex 账号。

这说明:

text
复制代码
VS Code Profile 只能隔离编辑器设置、扩展列表、UI 状态; 不能可靠隔离 Codex 的认证状态。

2.2 Stable + Insiders 也不是天然隔离

后来我安装了:

text
复制代码
VS Code Stable VS Code Insiders

但如果不做额外配置,二者仍可能读取同一个默认 Codex 认证目录:

text
复制代码
C:\Users\<用户名>\.codex

结果就是:

text
复制代码
Stable 和 Insiders 仍然可能显示同一个 Codex 账号。

2.3 启动脚本中注入代理会引入新的不稳定因素

我为了修复 reconnecting 问题,把代理变量注入 VS Code Insiders 启动脚本:

powershell
复制代码
HTTP_PROXY=http://127.0.0.1:7897 HTTPS_PROXY=http://127.0.0.1:7897 ALL_PROXY=http://127.0.0.1:7897

后来出现了大量网络错误:

text
复制代码
SSL handshake failed ERR_CONNECTION_CLOSED stream disconnected before completion error decoding response body

排查后发现,第三方 API 可以国内直连,因此不应该把代理强行注入到 Insiders 进程中。启动脚本越复杂,后期越难定位问题。


3. 最终架构

最终采用的结构是:

text
复制代码
VS Code Stable / ChatGPT Desktop / 普通 Codex CLI ↓ C:\Users\...\.codex ↓ 官方 ChatGPT 账号 ↓ 官方订阅额度 VS Code Insiders 专用启动器 ↓ CODEX_HOME=C:\Users\...\.codex-insiders-api ↓ 第三方 API Key ↓ 第三方中转站,例如 https://lingsuan.top

核心原则:

text
复制代码
官方账号环境和第三方 API 环境必须使用不同的 CODEX_HOME。

4. 目录规划

4.1 官方账号目录

text
复制代码
C:\Users\...\.codex

用途:

text
复制代码
官方 ChatGPT 账号 VS Code Stable ChatGPT Desktop 普通 Codex CLI

这个目录不要动。

4.2 第三方 API 隔离目录

text
复制代码
C:\Users\...\.codex-insiders-api

用途:

text
复制代码
VS Code Insiders 第三方 API 环境 保存 config.toml 和 auth.json

4.3 Insiders 独立用户数据目录

text
复制代码
C:\Users\...\AppData\Local\VSCode-Insiders-API

用途:

text
复制代码
隔离版 VS Code Insiders 的 user-data-dir 隔离 UI 状态、缓存、扩展 globalState

4.4 Insiders 独立扩展目录

text
复制代码
C:\Users\...\.vscode-insiders-api\extensions

用途:

text
复制代码
隔离版 VS Code Insiders 的扩展目录

5. Codex 配置文件

5.1 config.toml

文件位置:

text
复制代码
C:\Users\...\.codex-insiders-api\config.toml

示例配置:

toml
复制代码
cli_auth_credentials_store = "file" forced_login_method = "api" model_provider = "OpenAI" model = "gpt-5.6-sol" review_model = "gpt-5.6-sol" model_reasoning_effort = "xhigh" disable_response_storage = true network_access = "enabled" windows_wsl_setup_acknowledged = true [model_providers.OpenAI] name = "OpenAI" base_url = "中转站提供网址" wire_api = "responses" requires_openai_auth = true [features] goals = true

5.2 关键字段解释

toml
复制代码
cli_auth_credentials_store = "file"

表示认证信息保存在当前 CODEX_HOME 下的文件中,而不是系统凭据库。

toml
复制代码
forced_login_method = "api"

表示这个环境只允许 API Key 登录,避免误用 ChatGPT OAuth 登录。

toml
复制代码
model_provider = "OpenAI"

这里的 OpenAI 是本地 Provider 名称,不一定代表请求一定发往官方 OpenAI。

toml
复制代码
base_url = "中转站提供网址"

表示请求发往第三方中转站。

toml
复制代码
wire_api = "responses"

表示使用 Responses API 协议。

toml
复制代码
requires_openai_auth = true

表示使用 OpenAI 风格的 Bearer Token,即从 auth.json 中读取:

json
复制代码
{ "OPENAI_API_KEY": "..." }

6. API Key 放在哪里

API Key 不要写进:

text
复制代码
config.toml 启动脚本 项目代码 README 环境变量 setx

只写在:

text
复制代码
C:\Users\...\.codex-insiders-api\auth.json

格式:

json
复制代码
{ "OPENAI_API_KEY": "你的第三方 API Key" }

7. VS Code Insiders 专用启动脚本

文件位置:

text
复制代码
C:\Users\...\Tools\codex-insiders-api\Start-Codex-Insiders-API.ps1

脚本内容:

powershell
复制代码
param( [string]$ProjectPath ) $ErrorActionPreference = "Stop" # 只设置 Codex 隔离目录,不注入代理 $env:CODEX_HOME = "$env:USERPROFILE\.codex-insiders-api" $UserDataDir = "$env:LOCALAPPDATA\VSCode-Insiders-API" $ExtensionsDir = "$env:USERPROFILE\.vscode-insiders-api\extensions" $CandidatePaths = @() $Cmd = Get-Command code-insiders -ErrorAction SilentlyContinue if ($Cmd) { $CandidatePaths += $Cmd.Source } $CandidatePaths += @( "D:\Microsoft VS Code Insiders\Code - Insiders.exe", "$env:LOCALAPPDATA\Programs\Microsoft VS Code Insiders\Code - Insiders.exe", "$env:ProgramFiles\Microsoft VS Code Insiders\Code - Insiders.exe", "${env:ProgramFiles(x86)}\Microsoft VS Code Insiders\Code - Insiders.exe" ) $InsidersExe = $CandidatePaths | Where-Object { $_ -and (Test-Path $_) } | Select-Object -First 1 if (-not $InsidersExe) { throw "未找到 VS Code Insiders 可执行文件。" } $Arguments = @( "--user-data-dir", $UserDataDir, "--extensions-dir", $ExtensionsDir, "--new-window" ) if ($ProjectPath) { if (-not (Test-Path $ProjectPath)) { throw "项目路径不存在:$ProjectPath" } $Arguments += $ProjectPath } Write-Host "Insiders executable: $InsidersExe" Write-Host "" Write-Host "=== Isolated Environment ===" Write-Host "CODEX_HOME = $env:CODEX_HOME" Write-Host "User Data Dir = $UserDataDir" Write-Host "Extensions Dir = $ExtensionsDir" Write-Host "Proxy = disabled" Write-Host "" Start-Process -FilePath $InsidersExe -ArgumentList $Arguments

这个脚本只做三件事:

text
复制代码
1. 设置 CODEX_HOME 2. 指定 VS Code user-data-dir 3. 指定 VS Code extensions-dir

不做:

text
复制代码
HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY setx 注册表修改

8. 桌面启动器

文件位置:

text
复制代码
C:\Users\...\Desktop\Codex Insiders API.cmd

内容:

bat
复制代码
@echo off powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%USERPROFILE%\Tools\codex-insiders-api\Start-Codex-Insiders-API.ps1" pause

如果想指定项目路径,可以写成:

bat
复制代码
@echo off powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%USERPROFILE%\Tools\codex-insiders-api\Start-Codex-Insiders-API.ps1" -ProjectPath "C:\Users\...\Desktop\question glm5.2" pause

以后打开第三方 API 版 Insiders,只用这个入口。

不要使用普通的:

text
复制代码
Visual Studio Code - Insiders.lnk

否则可能不会加载专用 CODEX_HOME


9. 验证隔离是否成功

打开隔离版 VS Code Insiders 后,在集成终端执行:

powershell
复制代码
$env:CODEX_HOME

期望输出:

text
复制代码
C:\Users\...\.codex-insiders-api

检查代理是否为空:

powershell
复制代码
$env:HTTP_PROXY $env:HTTPS_PROXY $env:ALL_PROXY

期望为空。

检查配置:

powershell
复制代码
Get-Content "$env:CODEX_HOME\config.toml"

应看到:

toml
复制代码
model_provider = "OpenAI" model = "gpt-5.6-sol" review_model = "gpt-5.6-sol" [model_providers.OpenAI] base_url = "https://lingsuan.top" wire_api = "responses" requires_openai_auth = true

不要执行:

powershell
复制代码
Get-Content "$env:CODEX_HOME\auth.json"

因为里面是 API Key。

只检查是否存在:

powershell
复制代码
Test-Path "$env:CODEX_HOME\auth.json"

10. 验证官方环境是否未被影响

打开普通 PowerShell,不要从 Insiders 中打开。

执行:

powershell
复制代码
$env:CODEX_HOME

期望为空。

这说明普通 Codex CLI 仍然使用默认目录:

text
复制代码
C:\Users\...\.codex

不要在普通 PowerShell 中执行:

powershell
复制代码
codex logout

否则可能退出官方账号环境。


11. 常见问题排查

11.1 Insiders 仍显示官方账号

原因通常是:

text
复制代码
没有通过专用启动器启动 CODEX_HOME 没有生效

检查:

powershell
复制代码
$env:CODEX_HOME

必须是:

text
复制代码
C:\Users\...\.codex-insiders-api

11.2 出现 SSL handshake failed

如果看到:

text
复制代码
SSL handshake failed ERR_CONNECTION_CLOSED

优先检查:

powershell
复制代码
$env:HTTP_PROXY $env:HTTPS_PROXY $env:ALL_PROXY

如果不为空,说明仍然有代理注入。

最终方案不建议给 Insiders 注入代理,因为第三方 API 可以国内直连。

11.3 出现 stream disconnected / error decoding response body

典型错误:

text
复制代码
Error running remote compact task: stream disconnected before completion: Transport error: network error error decoding response body

如果启动脚本无代理、CODEX_HOME 正确、config.toml 正确,那么这通常不是本地配置问题,而是第三方中转站对 Responses API streaming、长上下文、remote compact 场景兼容不稳定。

规避方式:

text
复制代码
1. 新建任务窗口,减少上下文长度 2. 不要在一个 Codex 会话里连续塞太多任务 3. 长任务拆成多个小任务 4. 换更稳定的中转站或模型

12. 维护原则

12.1 只换 API Key

只改:

text
复制代码
C:\Users\...\.codex-insiders-api\auth.json

不要动:

text
复制代码
config.toml 启动脚本 C:\Users\...\.codex

12.2 只换模型

只改:

toml
复制代码
model = "新模型ID" review_model = "新模型ID"

12.3 换中转站

才改:

toml
复制代码
[model_providers.OpenAI] base_url = "新中转站地址"

必要时同步改:

toml
复制代码
model = "新模型ID" review_model = "新模型ID"

13. 最终经验总结

13.1 VS Code Profile 不是 Codex 身份隔离边界

Profile 能隔离 UI 和扩展配置,但不能保证隔离 Codex 登录态。

真正可靠的隔离方式是:

text
复制代码
CODEX_HOME

13.2 Stable + Insiders 也不是天然隔离

两个 VS Code 版本可以帮助分离 UI,但如果它们读同一个:

text
复制代码
C:\Users\...\.codex

那么 Codex 账号仍然可能是同一个。

13.3 启动脚本不要承担过多职责

启动脚本应该只负责:

text
复制代码
CODEX_HOME user-data-dir extensions-dir

不应该混入:

text
复制代码
代理 模型 API Key 业务项目配置

否则后期非常难排查。

13.4 第三方中转的最大风险是 Streaming 兼容性

短请求能成功,不代表长任务、remote compact、上下文压缩也一定稳定。

如果总是在:

text
复制代码
remote compact task stream disconnected error decoding response body

阶段失败,优先怀疑中转站对 Responses API streaming 的兼容性。


14. 最终推荐结构

text
复制代码
官方环境: C:\Users\...\.codex → ChatGPT 官方账号 → Stable / Desktop / 普通 CLI 第三方 API 环境: C:\Users\...\.codex-insiders-api → 第三方 API Key → VS Code Insiders 专用启动器 启动脚本: 只设置 CODEX_HOME / user-data-dir / extensions-dir config.toml: 管理供应商、模型、base_url、wire_api auth.json: 只保存 API Key

一句话总结:

在同一台 Windows 电脑上同时使用 Codex 官方账号和第三方 API,真正可维护的方案不是切账号,而是用 CODEX_HOME 创建两个互不共享的 Codex 本地身份空间。

希望对大家有所帮助

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP