今天准备用 OpenDesign 修复一个项目的 UI,需要通过 Codex CLI 调用火山的 GLM-5.2。与此同时,我还有一个终端正在使用 OpenAI 官方的 GPT-5.6 Sol 执行长任务。
如果直接使用 CC Switch 切换 Provider,当前正在运行的任务也会受到影响。因此,我研究了一下如何让不同终端分别使用不同的配置,并且互不影响,现在将学习成果分享给大家。
一、基本知识
以 Windows 操作系统为例,默认情况下,Codex CLI 会读取:
%USERPROFILE%\.codex
例如:
C:\Users\Administrator\.codex
这里通常包含下面两个核心文件,但它们不一定同时存在,具体取决于配置和凭据存储方式:
.codex
├── config.toml
├── auth.json
├── ...
├── ...
├── ...
auth.json:保存 API Key等敏感信息。
config.toml:配置模型、Provider、Base URL、Reasoning Effort、MCP、插件等运行参数。
我们如果一直使用这一个配置没问题,但是有时候我们另开一个终端,也就是需要同时使用多个 Provider(供应商) 时,就会变得非常麻烦。因为每个供应商的key、baseurl和model可能都不相同。
比如我有这么几个配置组合:OpenAI官方、OpenRouter、君の公益、自建中转站。每次切换都去修改:model、base_url、API Key、Provider,效率很低,而且容易改错。
虽然很多人和作者一样都在使用 CC Switch 管理不同的 Provider,但它更适合切换当前默认配置,并不适合多个终端同时使用不同配置。
二、使用 CODEX_HOME 实现配置隔离
2.1 原理
Codex CLI 支持通过环境变量 CODEX_HOME 指定配置目录。
例如,在 PowerShell 中运行如下命令:
$env:CODEX_HOME="C:\CodexProfiles\OpenRouter"
codex
在 CMD 中对应的命令为:
set "CODEX_HOME=C:\CodexProfiles\OpenRouter"
codex
也可以写成一行:
set "CODEX_HOME=C:\CodexProfiles\OpenRouter" && codex
以上设置都只对当前终端窗口及其启动的子进程生效,不会影响其他终端。
那么 Codex 就会读取:
C:\CodexProfiles\OpenRouter
中的:
config.toml
auth.json
而不是默认目录的两个配置文件。
同理,在 PowerShell 中运行如下命令即可切换到另一套配置,整个过程无需修改任何文件。
$env:CODEX_HOME="C:\CodexProfiles\Official"
codex
2.2 第一步,创建配置文件夹
创建一个专门且安全的目录,然后在其中创建 N 个文件夹,每个文件夹对应一套配置。如下所示,在 CodexProfiles 文件夹下创建了 4 个配置目录。
C:\
└── CodexProfiles
├── Official
│ ├── config.toml
│ └── auth.json
│
├── OpenRouter
│ ├── config.toml
│ └── auth.json
│
├── 君の公益
│ ├── config.toml
│ └── auth.json
│
└── 自建中转站
├── config.toml
└── auth.json
每个目录都是一套相互独立的环境,大部分配置,如 Provider、API Key、Base URL、model等,都可以实现隔离。
2.3 第二步,复制CC Switch的配置过来
CC Switch 的每个配置项中都有如下参数:

把 auth.json 和 config.toml 的内容分别复制到对应配置目录中的同名文件。
如果你不是用的 CC Switch,也可以直接复制默认 ~/.codex 目录中的 config.toml 与 auth.json,然后根据需要修改即可。
2.4 第三步,使用对应的配置开始会话
PowerShell:
$env:CODEX_HOME="C:\CodexProfiles\OpenRouter"
codex
另一个窗口:
$env:CODEX_HOME="C:\CodexProfiles\Official"
codex
多个终端可以同时运行,例如一个使用 OpenAI 官方模型,一个使用第三方 Provider,另一个使用自建兼容服务,彼此互不影响。
Codex CLI 也支持通过 --profile 切换命名配置。如果只需要切换模型、推理强度等参数,使用 Profile 更轻量;本文选择 CODEX_HOME,是因为它还能隔离认证凭据和其他本地状态,也就是可以换API提供商。
三、踩坑
3.1 问题1
3.1.1 问题
一开始,我把几个配置项放到了:
C:\Users\Administrator\.codex\providers
例如:
C:\Users\Administrator\.codex\providers\公益站
然后运行如下环境变量后启动 Codex
$env:CODEX_HOME="C:\Users\Administrator\.codex\providers\公益站"
结果我发现模型跟我配置文件的不一样,且出现了下面的警告:
Ignored unsupported project-local config keys...
例如:
Ignored unsupported project-local config keys in
C:\Users\Administrator\.codex\config.toml
然后模型还不生效。
3.1.1 解决方案
方法其实很简单:使用 cd 切换到实际项目目录,或者切换到一个不包含冲突 .codex\config.toml 的目录,然后再启动 Codex。例如:
cd "C:\Projects\MyProject"
codex
3.1.3 问题出现的原因
当时,我通过 CODEX_HOME 指定的新用户级配置是:
C:\Users\Administrator\.codex\providers\公益站\config.toml
与此同时,我的 PowerShell 当前工作目录正好是:
C:\Users\Administrator
而该目录下原本就存在 Codex 的默认配置文件:
C:\Users\Administrator\.codex\config.toml
在没有修改 CODEX_HOME 时,这份文件通常作为用户级配置使用。
但是,当我通过 CODEX_HOME 将用户级配置切换到其他目录后,原来的配置文件便不再是本次运行的用户级配置。由于它的路径又刚好符合:
<当前工作目录>\.codex\config.toml
Codex 将其额外作为当前目录的项目级配置加载。
问题就出在这里:一个 config.toml 文件中可以写入 model_provider、model_providers 和 notify 等字段,但这些字段能不能生效,还要取决于这份文件是作为用户级配置还是项目级配置加载。
原来的配置文件本就是由 CC Switch 作为用户级配置生成的,因此其中包含:
model_provider = "custom"
[model_providers.custom]
name = "SakuraAPI"
base_url = "https://saxxx1.icu"
notify = [ ... ]
但这次运行中,它被 Codex 当作项目级配置加载。Codex 读取到这些字段后,认为它们不支持从项目配置层生效,因此将其忽略,并输出:
Ignored unsupported project-local config keys:
model_provider, model_providers, notify
例如,原来的配置中还有:
model = "gpt-5.5"
而我新指定的配置中设置的是:
model = "gpt-5.6-sol"
由于项目级配置的优先级高于用户级配置,旧文件中的 model = "gpt-5.5" 仍然生效,并覆盖了新用户配置中的 model = "gpt-5.6-sol"。
当我使用 cd 切换到一个没有 .codex\config.toml 的目录后,原来的默认配置不再被识别为当前目录的项目配置,新 CODEX_HOME 中的配置就正常生效了。
3.2 问题2
现象如下:
PS C:\Users\Administrator\Desktop> $env:CODEX_HOME="C:\Users\Administrator\.codex\providers\SakuraAPI"
PS C:\Users\Administrator\Desktop> codex
Error loading configuration: 系统找不到指定的文件。 (os error 2)
经查,这是CC-Switch干的好事,由于我们在CC-Switch配置供应商时候,开启了模型映射,所以出现了这一配置项,如下图所示。

解决方案,就是直接在config.toml中删除下面这一行:
model_catalog_json = "cc-switch-model-catalog.json"