Codex 同时兼容 AWS Bedrock 和 OneAPI 的配置教程
Codex 同时兼容 AWS Bedrock 和 OneAPI 的配置教程
最近公司内部同时提供了两种 LLM 接入方式:
AWS BedrockOneAPI
而 Codex 默认只会读取一套 ~/.codex/config.toml。如果直接在同一个文件里来回改 model_provider,短期能用,长期一定会乱:
- 今天切到 Bedrock,明天忘了切回来;
- OneAPI 的 key 和 Bedrock 的配置混在一起,不容易排查;
- 以后再加第三种 provider,整个配置会更难维护。
我最后采用的方案是:
保留一份基础配置 + 用 Codex 原生
profile机制切换不同 provider。
这个方案有几个优点:
- 不需要维护多份
CODEX_HOME - 不需要来回覆盖
config.toml - 切换命令简单,
codex --profile xxx即可 - Bedrock 和 OneAPI 的配置可以完全分开,后面继续扩展也方便
下面把完整做法记录一下。
1. 最终目录结构
我最后采用的是下面这套结构:
~/.codex/
├── .env
├── config.toml
├── bedrock.config.toml
└── oneapi.config.toml
含义分别是:
-
config.toml:基础配置 -
bedrock.config.toml:AWS Bedrock 专用 profile -
oneapi.config.toml:OneAPI 专用 profile -
.env:OneAPI 的 API Key
2. 为什么不用一份 config.toml 硬切
最直接的想法其实是:
model_provider = "amazon-bedrock"
用 Bedrock 时写这个,用 OneAPI 时改成:
model_provider = "oneapi"
但这个方案的问题是:每次切 provider 都要改配置文件本身。
一旦你还有下面这些差异项:
modelmodel_reasoning_effortbase_urlAPI KeyAWS region
那来回切换就会很烦,而且很容易忘。
Codex 本身原生支持 profile 文件,所以更好的思路是:
-
~/.codex/config.toml放基础配置 -
~/.codex/bedrock.config.toml放 Bedrock 差异 -
~/.codex/oneapi.config.toml放 OneAPI 差异
然后使用:
codex --profile bedrock
codex --profile oneapi
来切换。
3. 基础配置:~/.codex/config.toml
我这里保留了当前默认使用 Bedrock 的基础配置:
model = "openai.gpt-5.6-sol"
model_reasoning_effort = "medium"
model_provider = "amazon-bedrock"
[model_providers.amazon-bedrock.aws]
region = "us-east-2"
这里有两个注意点:
- 这份基础配置可以直接默认走 Bedrock。
- 如果你本机还有
trusted project之类的个人配置,可以继续保留,但不要写进公开教程。
4. Bedrock profile:~/.codex/bedrock.config.toml
Bedrock 的 profile 单独拆出来如下:
model = "openai.gpt-5.6-sol"
model_reasoning_effort = "medium"
model_provider = "amazon-bedrock"
[model_providers.amazon-bedrock.aws]
region = "us-east-2"
这份配置很薄,只保留跟 Bedrock 强相关的差异项即可。
如果你们公司用的是 AWS SSO 或命名好的 profile,也可以继续走 AWS 标准凭证链,例如:
export AWS_PROFILE=codex-bedrock
或者事先:
aws sso login --profile codex-bedrock
5. OneAPI profile:~/.codex/oneapi.config.toml
OneAPI 这边的 profile 如下:
model = "gpt-5.5"
model_reasoning_effort = "xhigh"
model_provider = "oneapi"
disable_response_storage = true
[model_providers.oneapi]
name = "oneapi"
base_url = "https://oneapi-comate.baidu-int.com/v1"
wire_api = "responses"
env_key = "ONEAPI_API_KEY"
这里我没有采用把 key 写进 auth.json 的方案,而是改成:
env_key = "ONEAPI_API_KEY"
原因很简单:
-
OneAPI在 Codex 里本质上是一个自定义 provider - 对自定义 provider,使用环境变量提供 key 更干净
- 这样不会和 Bedrock 的认证逻辑混在一起
换句话说,Bedrock 走 AWS 凭证链,OneAPI 走环境变量 key,各自独立,边界清晰。
6. OneAPI 的 key 放哪里
我最后把 OneAPI 的 key 放进了:
~/.codex/.env
内容如下:
ONEAPI_API_KEY=你的_oneapi_key
这样做的好处是:
- key 不需要硬编码进
config.toml - 后面如果还有第二个自定义 provider,也可以继续往
.env里加 -
~/.codex本身就是 Codex 的本地目录,管理起来更集中
7. 让 zsh 自动加载 ~/.codex/.env
如果只是把 key 写进 ~/.codex/.env,但 shell 没有自动导出这个变量,那么运行 codex --profile oneapi 时还是读不到它。
所以我在 ~/.zshrc 里加了这段:
if [ -f "$HOME/.codex/.env" ]; then
set -a
. "$HOME/.codex/.env"
set +a
fi
这段的作用是:
- 自动读取
~/.codex/.env - 并把里面的变量导出成环境变量
这样 OneAPI 的 env_key = "ONEAPI_API_KEY" 才能真正生效。
8. 再加两个快捷命令
为了避免每次都手敲完整参数,我在 ~/.zshrc 里顺手加了两个 alias:
alias codexb='codex --profile bedrock'
alias codexo='codex --profile oneapi'
然后重新加载 shell:
source ~/.zshrc
之后就可以直接:
codexb
codexo
来切换。
9. 实际使用方式
9.1 使用 Bedrock
codexb
或者显式写成:
codex --profile bedrock
9.2 使用 OneAPI
codexo
或者:
codex --profile oneapi
10. 如何验证 OneAPI 配置是否真的生效
最简单的办法不是盯着配置文件看,而是直接跑一个最小请求。
例如:
codex exec --profile oneapi --ephemeral --sandbox read-only "Reply with exactly OK."
如果配置正确,Codex 启动时通常会显示类似信息:
model: gpt-5.5
provider: oneapi
reasoning effort: xhigh
然后正常返回:
OK
我本地实际验证过,这套配置是可以跑通的。
11. 最后总结
如果你也遇到 Codex 需要同时兼容多种 LLM provider 的场景,我的建议是:
- 不要在同一个
config.toml里来回手改model_provider - 优先使用 Codex 原生的
profile机制 - 自定义 provider 的 key 优先走
env_key - Bedrock 继续沿用 AWS 的标准认证链
最终这套方案的核心只有一句话:
基础配置放
config.toml,provider 差异拆到xxx.config.toml,用--profile切换。
这是目前我觉得最简单、最稳、也最好维护的做法。