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/responsesCodex CLI / Codex 桌面版连 CCSub 报 unexpected status 401 Unauthorized,先看报错末尾的 url:不是 ccsub.net 说明配置没生效,是 ccsub.net 再看 message。用自定义 model provider 加 env_key 明确指定 Key,最不容易出错。
3 步解决
- 1
看报错末尾的 url
url 是 https://www.ccsub.net/api/v1/responses,说明请求到了 CCSub、是 Key 有问题;url 是别的地址(比如 OpenAI 或 ChatGPT 的域名),说明你的 base_url 配置根本没生效,先修配置。
- 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
在启动 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/responsesMissing 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 会扣费吗?
不会。鉴权失败在转发给模型之前就被拦下,不计费。
还是不行?
- 按症状查《故障排查》文档
- 联系客服:发邮件到 support@ccsub.net,附上工具名和版本、系统、完整报错文本和注册邮箱(不要发 API Key)。
- 对照接入教程重新检查配置:Codex CLI 接入教程、CC Switch 接入教程
相关报错
API Error: 401 {"type":"error","error":{"type":"authentication_error","message":"Invalid or disabled API key"}}Key 没带上或带错了。用 /status 看 Claude Code 实际用的是哪个变量,到 /keys 重新复制完整 Key,删掉多余的 ANTHROPIC_API_KEY 后重开终端。stream disconnected before completion: stream closed before response.completed流在结束前断了。确认 base_url 是 https://www.ccsub.net/api/v1,去掉干扰终端的代理,过长的单轮任务调低推理强度或拆小,并在 provider 里调大 stream_max_retries。There's an issue with the selected model (claude-opus-6). It may not exist or you may not have access to it. Run /model to pick a different model.model 标识写错了,按 /api/v1/models 列表里的 id 改(用短横线);如果所有型号都 404、返回的是一整页 HTML,就是 Base URL 写错了。
还没有 CCSub 账号?
注册后在控制台创建 API Key,填进 Claude Code、Codex 等工具即可使用,按实际用量计费。