状态码 401鉴权(401)Codex CLICC Switch

Codex 报 unexpected status 401 Unauthorized 怎么解决

报错原文
unexpected status 401 Unauthorized: {"type":"error","error":{"type":"authentication_error","message":"Missing or invalid API key"}}, url: https://www.ccsub.net/api/v1/responses

Codex CLI / Codex 桌面版连 CCSub 报 unexpected status 401 Unauthorized,先看报错末尾的 url:不是 ccsub.net 说明配置没生效,是 ccsub.net 再看 message。用自定义 model provider 加 env_key 明确指定 Key,最不容易出错。

3 步解决

  1. 1

    看报错末尾的 url

    url 是 https://www.ccsub.net/api/v1/responses,说明请求到了 CCSub、是 Key 有问题;url 是别的地址(比如 OpenAI 或 ChatGPT 的域名),说明你的 base_url 配置根本没生效,先修配置。

  2. 2

    在 config.toml 里用自定义 provider 指定 Key

    在 ~/.codex/config.toml 顶部写 model_provider = "ccsub",再加一个 [model_providers.ccsub] 表,填 base_url = "https://www.ccsub.net/api/v1"、env_key = "OPENAI_API_KEY"、wire_api = "responses"。这样 Codex 只会从 OPENAI_API_KEY 这个变量取 Key。

  3. 3

    在启动 Codex 的环境里设置变量并核对 Key

    export OPENAI_API_KEY="sk-..." 之后在同一个终端运行 codex;Key 从控制台 API Keys 页面重新复制,确认是启用状态。桌面版从 Dock 启动时读不到 ~/.zshrc 里的变量,可以先从终端启动验证。

同一个问题的其他写法

  • unexpected status 401 Unauthorized: {"type":"error","error":{"type":"authentication_error","message":"Invalid or disabled API key"}}, url: https://www.ccsub.net/api/v1/responses
  • Missing environment variable: `OPENAI_API_KEY`.

先看 url,再看 message

Codex 的 401 报错格式是 unexpected status 401 Unauthorized: 返回体, url: 请求地址。末尾的 url 是排查的第一线索:

  • url 是 https://www.ccsub.net/api/v1/responses:请求到了 CCSub,是 Key 被拒了,继续看返回体里的 message。
  • url 是别的域名:你写的 CCSub 地址没有生效,Codex 还在用默认提供方。这时候换 Key 没用,要先修配置文件。

CCSub 返回的 message 只有两种:Missing or invalid API key 表示请求里没有 Key,或者值不是 sk- 开头(ChatGPT 登录令牌就不是 sk- 开头);Invalid or disabled API key 表示带了 sk- 开头的值,但这把 Key 不存在、复制不完整,或者在控制台被禁用、删除了。

推荐的 config.toml 写法

Codex 的官方配置文档支持自定义 model provider:base_url 是接口地址,env_key 指定从哪个环境变量读取 Key,wire_api 目前只支持 responses。接 CCSub 推荐这样写:

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

[model_providers.ccsub]
name = "CCSub"
base_url = "https://www.ccsub.net/api/v1"
env_key = "OPENAI_API_KEY"
wire_api = "responses"

然后在终端里设置变量:

export OPENAI_API_KEY="sk-你的密钥"
codex

env_key 写的是环境变量的名字,不是 Key 本身。这里沿用 OPENAI_API_KEY,和安装文档的写法一致;如果这个变量已经被别的服务占用,可以把 env_key 和 export 两处一起改成别的名字(例如 CCSUB_API_KEY),排查时也一眼能看出 Codex 用的是哪把 Key。model 填 CCSub 型号列表里的 model 标识即可。

容易踩的 4 个坑

1. 顶层配置写到了表的下面

TOML 的规则是:写在 [model_providers.ccsub] 这一行下面的键,都属于这个表。如果你把 model_provider = "ccsub" 追加在文件末尾,它就成了表里的字段,Codex 读不到,于是回到默认提供方,报错里的 url 也就不是 ccsub.net。model、model_provider、openai_base_url 这类顶层配置一定要放在文件最前面、所有 [...] 表头之前。Codex 的 GitHub 上就有用户把 openai_base_url 写进子表导致配置被忽略的案例。

2. 变量设置了,但 Codex 进程看不到

export 只对当前终端和从它启动的程序有效。从 Dock 或开始菜单打开的 Codex 桌面版、编辑器里的插件,通常读不到 ~/.zshrc 里的变量,表现为 Missing environment variable 或 401。先在终端里 export 后直接运行 codex 验证 Key 没问题,再处理桌面应用的环境变量。Windows 用 [System.Environment]::SetEnvironmentVariable 设置用户变量后,要关掉所有终端和 Codex 窗口重新打开。

3. 切换工具改写了配置

CC Switch 这类工具切换供应商时会改写 ~/.codex/config.toml 和 auth.json。你手动改过配置后,再在工具里点一次切换,可能又被覆盖回去。用工具管理就统一在工具里改,手动管理就别再用工具切换。

4. Key 复制不完整或已被禁用

CCSub 的 Key 是 sk- 加 64 位十六进制字符,共 67 个字符。控制台的 API Keys 页面会一直保存完整 Key,可以随时重新复制;被禁用的 Key 重新启用即可。也可以用下面的命令绕开 Codex 单独测 Key(会产生一次很小的计费):

curl -sS -w '\n%{http_code}\n' https://www.ccsub.net/api/v1/responses \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "content-type: application/json" \
  -d '{"model":"gpt-5.5","input":"hi"}'

返回 200 说明 Key 没问题,问题在 Codex 的配置;返回 401 就换一把 Key 再试。

常见问题

我已经 export 了 OPENAI_API_KEY,为什么还是 401?

如果没有在 config.toml 里设置自定义 provider,Codex 会走内置的 openai 提供方,它使用 codex login 保存的凭据(默认存在 ~/.codex/auth.json),不一定读你 export 的变量;之前用 ChatGPT 账号登录过的话,发出去的也不是 CCSub 的 Key。按上面的写法设置 model_provider = "ccsub" 和 env_key,Codex 就只会用 OPENAI_API_KEY 这个变量里的 Key。

OPENAI_BASE_URL 还能用吗?

Codex 已经把 OPENAI_BASE_URL 环境变量标为弃用,改用 config.toml 顶层的 openai_base_url,旧变量目前还能用但会提示警告。接 CCSub 更推荐上面的自定义 provider 写法,地址和 Key 都写在一个地方。

报 Missing environment variable 是什么意思?

这是 Codex 本地的报错:config.toml 里 env_key 指定的变量在当前进程里不存在或为空,请求还没发出去。检查变量名拼写是否一致、是否在同一个终端 export,桌面版和 IDE 插件是否从能读到这个变量的环境启动。

401 会扣费吗?

不会。鉴权失败在转发给模型之前就被拦下,不计费。

还是不行?

还没有 CCSub 账号?

注册后在控制台创建 API Key,填进 Claude Code、Codex 等工具即可使用,按实际用量计费。