教程

在 Codex 中通过 Token Station 运行任意模型

OpenAI 提了一个不张扬却很实用的点:Codex 的 app、CLI 和 SDK 可以运行任意模型,不只是 OpenAI 自家的。真正的产品是这套工具,背后用哪个模型是你的选择。所以你完全可以继续用 Codex,把它指向 GPT-5.5、Claude,或是 GLM-5.2、Kimi K2.7 这样的开源权重模型,哪个适合当前任务就用哪个。

但有一个坑,很多人会栽进去。自 2026 年 2 月起,Codex 统一改用了 OpenAI 的 Responses API。它的模型提供商对接要求 wire_api = "responses",旧的 Chat Completions 通道不再是入口。这意味着你给 Codex 对接的模型平台必须原生支持 Responses API,仅支持 Chat Completions 是不够的。大多数网关只做了后者,到这里就连不上了。

Token Station 把它托管的每一个模型都通过 OpenAI 的 Responses API/v1/responses)暴露出来,所以 Codex 可以直接连上,不需要任何中间层。本文给出完整的配置、验证命令、如何用一行切换模型,以及 smart routing 在其中的位置。

为什么要自定义 provider(光靠环境变量不行)

在 Claude Code 里,你只靠环境变量就能把请求重定向到别的端点。Codex 不一样。它内置的 OpenAI provider 会忽略 OPENAI_BASE_URL,永远去连 api.openai.com。对默认 provider 设这个变量没有任何作用。

按照 OpenAI 的高级配置文档,受支持的做法是在 ~/.codex/config.toml 里用 [model_providers.<id>] 定义你自己的条目,再用 model_provider 选中它。(要改内置 provider 得用 openai_base_url,而且不能复用保留的 openai 这个 id,所以定义一个有名字的自定义 provider 是更干净的路径。)你的 API key 仍然放在环境变量里,配置通过 env_key 来引用,密钥本身永远不会落进文件。

一次性配置

创建配置文件。这会定义一个走 Responses API 的 token_station provider,并把它设为默认:

mkdir -p ~/.codex
cat > ~/.codex/config.toml <<'EOF'
model = "openai/gpt-5.5"
model_provider = "token_station"

[model_providers.token_station]
name = "Token Station"
base_url = "https://models.bytefuture.ai/v1"
env_key = "TOKEN_STATION_API_KEY"
wire_api = "responses"
EOF

然后导出你的 Token Station key(变量名要和上面的 env_key 一致),跑一行命令验证:

export TOKEN_STATION_API_KEY="YOUR_TOKEN_STATION_KEY"

codex exec "Respond with exactly the word: pong"

如果它打印出 pong,说明 Codex 已经通过 Responses API 连上了 Token Station。之后直接运行 codex 就会用同一个 provider 打开交互式会话。

每个字段的含义

字段含义
modelCodex 默认请求的模型 ID,采用 provider/model 形式(这里是 openai/gpt-5.5)。
model_provider使用哪个 provider 块,必须和 [model_providers.<id>] 里的 id 一致。
name给人看的标签,自由文本,不是 id。
base_urlToken Station 的 OpenAI 兼容根地址 https://models.bytefuture.ai/v1,Codex 会自动拼上 /responses
env_keyCodex 从哪个环境变量读取 key,密钥本身不进文件。
wire_api"responses"。这一项才是关键:它选定了 Responses API,正是 Codex 强制要求、而 Token Station 原生支持的协议。

它与 OpenAI 官方文档一致

上面每一个字段都直接来自 OpenAI 文档里自定义 provider 的 schema:顶层的 modelmodel_provider,然后是一个带 namebase_urlenv_keywire_api[model_providers.<id>] 表。token_station 这个 id 是允许的,因为它不属于保留 id(openaiollamalmstudio)。对今天的 Codex 而言,唯一必须填准的值就是 wire_api = "responses"。这一块里没有任何 Token Station 专有的语法,它和你为任何 provider 写的配置形状完全一样。

一行切换模型

因为 Token Station 上的每个模型都在同一个 key、同一个 Responses 端点后面,切换模型只需要改配置里的一处 model,或者在启动时加一个参数:

codex --model anthropic/claude-opus-4-8 exec "Summarize git diff and suggest a commit message"

下面这些模型 ID 现在就能直接填进 model,全部基于同一份配置:

模型 ID适合
openai/gpt-5.5OpenAI 的旗舰,也是 Codex 的原生默认模型。
anthropic/claude-opus-4-8长链路的智能体编码与大规模重构。
glm/glm-5.2开源权重、100 万 token 上下文,代码能力强且价格低。
kimi/kimi-k2.7-code便宜的开源权重编码模型,适合日常活儿。
xai/grok-build-0.1又快又便宜,输出成本只有旗舰的一小部分。

OpenAI 想说的那个点在这里落地了:Codex 与模型无关。难活交给贵的模型,样板代码交给便宜的开源权重模型,全程不用离开这套工具,改的也只是一行而已。

Smart routing:让一个 ID 自动挑模型

给每个任务写死一个模型当然可以,但 Token Station 还允许你按规则路由,而不是按名字。你为某个工作负载定义一条策略(达到质量底线的前提下选最便宜的、把延迟压在某个阈值内并限定 provider 白名单、或者一条严格的回退链,比如主模型背后挂一个备用模型),Token Station 就会逐请求地替你挑模型。

对 Codex 来说这很顺手,因为 Codex 本身只发出一个模型 ID。把 model 指向你配好路由的工作负载,决策就移到了服务端:如果主模型慢或不可用,备用模型来应答,而你的 Codex 会话完全无需知情。你在 Token Station 里改路由,而不是动 config.toml,所以同一套 Codex 配置会随着你的策略演进而自动跟上。

Codex 只发出一个模型 ID。Smart routing 决定实际由谁应答,于是成本和回退逻辑都放在 Token Station 里,而不是写死在你的配置里。

如果连不上

  • 它还是去连 api.openai.com你设了 OPENAI_BASE_URL,指望内置 provider 跟着走,它不会。请用上面的自定义 provider,并设 model_provider = "token_station"
  • 401 / 鉴权错误。导出的变量名必须和 env_key 完全一致(TOKEN_STATION_API_KEY),而且 key 要在运行 codex 的同一个 shell 里导出。
  • 模型报协议错误或 404。确认 wire_api = "responses"。Codex 强制要求 Responses API,只支持 Chat Completions 的网关满足不了它。
  • 模型 id 写错了。要用 provider/model 形式(例如 anthropic/claude-opus-4-8),不要只写一个裸的模型名。

开始上手

让 Codex 运行任意模型,归根结底就是四行 TOML 加一个环境变量,唯一会绊住你的要求就是 Responses API。Token Station 把它托管的每个模型都通过这个 API 提供,所以上面的配置原封不动就能用,无论你跑的是 GPT-5.5、Claude、GLM-5.2,还是一个配了路由的工作负载。

models.bytefuture.ai 注册(10 美元免费额度,无需信用卡),把 key 填进 TOKEN_STATION_API_KEY,跑一下 pong 验证。一个 key、一个端点,你的 Codex 会话需要的每个模型都在这里。


分享这篇文章 Post LinkedIn Facebook Hacker News Reddit