跳到正文

/codex

Codex CLI

把 Codex CLI 接到 OpenToken:改 ~/.codex/config.toml。注意 wire_api 只能填 responses,chat 已被官方移除。

Codex 的接入方式和 Claude Code 不同:它不认环境变量里的地址,而是要在配置文件里定义一个 provider,再把它设为当前使用的 provider。

第一步:定义 provider

~/.codex/config.toml
model = "gpt-5.5"
model_provider = "opentoken"
disable_response_storage = true

[model_providers.opentoken]
name = "OpenToken"
base_url = "https://otokapi.com/v1"
wire_api = "responses"
env_key = "OPENTOKEN_API_KEY"
文件不存在就新建。已有内容的话,把顶部三行合并进去,[model_providers.opentoken] 整段追加到文件末尾。

逐行说明:

  • model —— 必填,Codex 没有默认值。先用 /v1/models 确认这个 ID 在你账号下可用,再填进来。
  • model_provider —— 指向下面那段的 id。opentoken 是自己起的名字,改成别的也行,两处保持一致即可。
  • disable_response_storage —— 关掉 response 存储。第三方中转通常不实现这套接口,关掉更稳妥。
  • base_url —— 必须带 /v1,见下面两个 base URL 不一样
  • env_key —— 告诉 Codex 去哪个环境变量里取密钥。

第二步:把密钥放进环境变量

~/.zshrc(或 ~/.bashrc)
export OPENTOKEN_API_KEY="sk-YOUR-API-KEY"
改完执行 source ~/.zshrc,或者重开一个终端窗口。

两个 base URL 不一样

同时配 Claude Code 和 Codex 的人,最常在这里翻车:

客户端填的地址客户端自己会拼上
Claude Codehttps://otokapi.com/v1/messages
Codex CLIhttps://otokapi.com/v1/responses

**Codex 的带 /v1,Claude Code 的不带。**写反了两边都会 404。

密钥的另一种放法

除了环境变量,Codex 也支持把密钥放进 ~/.codex/auth.json。这是 CC Switch 采用的方案:

~/.codex/config.toml
model = "gpt-5.5"
model_provider = "opentoken"
disable_response_storage = true

[model_providers.opentoken]
name = "OpenToken"
base_url = "https://otokapi.com/v1"
wire_api = "responses"
requires_openai_auth = true
注意这里没有 env_key,换成了 requires_openai_auth。两者不能同时用。
~/.codex/auth.json
{
  "OPENAI_API_KEY": "sk-YOUR-API-KEY"
}
这个文件是明文的,按密码对待——别提交进仓库,别贴进工单或聊天窗口。

两种方式二选一。环境变量那种更推荐,因为它不动 auth.json,你的 ChatGPT 登录态能保留。

三个容易踩的坑

别去覆盖内置的 openai provider

不能写 [model_providers.openai]——内置 provider 的 id 不允许被覆盖。要么像上面那样起一个新 id,要么用顶层的 openai_base_url 只改地址。给中转站起独立 id 是更清楚的做法。

配置必须放在用户级目录

项目里的 .codex/config.toml 会忽略 model_providermodel_providers(还有 openai_base_urlprofiles 等一批键),只在启动时打一行警告。中转站的配置只能写在用户级的 ~/.codex/config.toml

把配置放进项目目录还纳闷为什么不生效的,就是这个原因。

模型 ID 写错要到请求时才知道

和 Claude Code 一样,模型名不会在启动时校验,填错了要等第一次请求才报错。

验证是否接通

先绕开 Codex,直接打 /v1/responses——这正是 wire_api = "responses" 依赖的端点:

终端
curl -X POST "https://otokapi.com/v1/responses" \
  -H "Authorization: Bearer sk-YOUR-API-KEY" \
  -H "content-type: application/json" \
  -d '{"model":"gpt-5.5","input":"ping"}'
返回 JSON 说明地址、密钥、协议三者都对。404 检查地址有没有带 /v1,401 检查密钥。

curl 通了再跑 codex,随便让它做点什么。

在多个中转站之间切换

Codex 有 profile 机制,适合同时挂着好几个中转站。在同一个 config.toml 里定义多个 provider 和 profile:

~/.codex/config.toml
model = "gpt-5.5"
model_provider = "opentoken"

[model_providers.opentoken]
name = "OpenToken"
base_url = "https://otokapi.com/v1"
wire_api = "responses"
env_key = "OPENTOKEN_API_KEY"

[profiles.otok]
model = "gpt-5.5"
model_provider = "opentoken"

[profiles.official]
model = "gpt-5.5"
model_provider = "openai"
用 codex --profile otok 或 codex --profile official 选择。不加 --profile 时走顶层的 model_provider。

觉得手写 TOML 麻烦,CC Switch 提供图形界面做同一件事。

切回官方账号

~/.codex/config.toml 里的 model_provider 改回 openai(或整段删掉自定义 provider),然后 codex login 重新登录。用了 auth.json 方案的话那份文件已被覆盖,必须重新登录才能恢复。