1. 为什么要在 Windows 11 上折腾 Sub2API + Codex CLI
如果你在 Windows 11 上写代码,又想用 Codex CLI 这类命令行 AI 编程工具,大概率会遇到一个尴尬:Codex CLI 官方对 Windows 原生支持并不算顺滑,很多依赖和脚本默认按 Linux 环境设计。而 Sub2API 这类自建 API 聚合服务,又需要 Docker、PostgreSQL、Redis 一整套容器编排。把这两件事塞进 Windows 11,最省心的路径就是 WSL2。
WSL2 是 Windows 11 自带的 Linux 子系统,本质是一个轻量虚拟机,能跑完整的 Ubuntu 内核。你可以在里面装 Docker、跑容器、装 Node.js,同时用 Windows 的浏览器访问服务。Sub2API 则是一个开源的 API 聚合与分发服务,能把多个上游模型账号统一成一个 API Key 对外提供,Codex CLI 只要指向这个统一入口就能用。
这套组合适合谁?适合手头有多个模型账号、想让 Codex CLI 走统一通道的开发者;也适合想在自己机器上做本地 API 网关实验的技术爱好者。整条链路是:Windows 11 → WSL2 Ubuntu → Docker 跑 Sub2API → Codex CLI 通过统一 Key 接入。下面我从零开始,把每一步的命令和配置都写清楚。
2. 前置准备:WSL2、Docker 与 TaoToken 统一 Key
2.1 启用 WSL2 并安装 Ubuntu
在 Windows 11 里以管理员身份打开 PowerShell,执行:
wsl --install这条命令会自动启用虚拟机平台、安装 WSL2 内核并拉取 Ubuntu。重启计算机后,系统会弹出 Ubuntu 初始化窗口,按提示创建 Linux 用户名和密码。装完后验证版本:
wsl -l -v如果 Ubuntu 的 VERSION 显示为 1,手动升级:
wsl --set-default-version 2 wsl --set-version Ubuntu 2进入 Ubuntu 环境并更新基础工具:
wsl sudo apt update && sudo apt upgrade -y sudo apt install -y curl git ca-certificates nano openssl2.2 安装 Docker
新手最省事的方案是 Docker Desktop for Windows。安装后在 Settings → General 勾选 Use the WSL 2 based engine,再到 Settings → Resources → WSL Integration 里开启你的 Ubuntu 集成。回到 Ubuntu 终端验证:
docker version docker compose version docker run hello-world如果你不想装 Docker Desktop,也可以在 Ubuntu 内直接安装 Docker Engine,前提是 WSL 已启用 systemd。两种方式选一种即可,后面都用docker compose操作。
2.3 TaoToken 统一 Key 的定位
Sub2API 负责把上游账号聚合成一个入口,而 TaoToken 在这里扮演的是统一 Key 与 API 通道的角色。你可以把它理解成一把总钥匙:Codex CLI 不需要分别配置多个上游,只要拿到一个统一 Key,指向统一 API 地址,就能完成模型调用。
TaoToken 官网入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
API 基础地址(不带 UTM):https://taotoken.net/api
需要先去控制台创建 API Key,后面配置 Codex CLI 时会用到。创建入口在 API Keys 页面,文档在接入文档里,遇到鉴权问题优先翻这两处。
3. 可复制配置:部署 Sub2API 并接入 Codex CLI
3.1 用 Docker Compose 部署 Sub2API
在 Ubuntu 里建目录并拉取部署脚本:
mkdir -p ~/apps/sub2api-deploy cd ~/apps/sub2api-deploy curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/docker-deploy.sh | bash启动服务并查看状态:
docker compose up -d docker compose ps docker compose logs -f sub2api浏览器打开http://localhost:8080进入安装向导。如果 Windows 浏览器访问不了,先拿 WSL 的 IP:
hostname -I然后用http://WSL_IP:8080访问。向导里按提示填数据库、Redis 和管理员账号,Docker Compose 版本已内置 PostgreSQL 和 Redis 容器,默认配置通常够用。
3.2 Sub2API 后台基础配置
进入后台后做三件事:添加上游账号、创建用户、生成 API Key。上游账号按你实际持有的服务填,生成出来的 Key 是sk-xxxx格式,这就是 Codex CLI 要用的凭证。同时确认后台可用的模型名称,比如gpt-5-codex或后台映射的其他名字,后面config.toml里的model必须和它一致。
3.3 Codex CLI 的 config.toml 骨架
先装 Node.js 和 Codex CLI:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash # 重开终端后 nvm install 22 npm i -g @openai/codex codex --version创建配置文件:
mkdir -p ~/.codex nano ~/.codex/config.toml写入以下骨架,把model换成你后台真实可用的模型名:
model = "gpt-5-codex" model_provider = "sub2api" [model_providers.sub2api] name = "Sub2API" base_url = "http://localhost:8080/v1" env_key = "SUB2API_API_KEY" wire_api = "responses" supports_websockets = false设置环境变量,临时生效:
export SUB2API_API_KEY="sk-你的Sub2API-Key"永久生效:
echo 'export SUB2API_API_KEY="sk-你的Sub2API-Key"' >> ~/.bashrc source ~/.bashrc3.4 settings.json 与 WSL2 端口转发
如果你习惯用 JSON 管理配置,可以在~/.codex/settings.json里放一份等价骨架:
{ "model": "gpt-5-codex", "model_provider": "sub2api", "model_providers": { "sub2api": { "name": "Sub2API", "base_url": "http://localhost:8080/v1", "env_key": "SUB2API_API_KEY", "wire_api": "responses", "supports_websockets": false } } }WSL2 默认会把 localhost 映射到 Windows,但有时需要显式转发。在 Windows PowerShell(管理员)里执行:
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=(wsl hostname -I).Trim()查看已有转发规则:
netsh interface portproxy show all不需要时删除:
netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=0.0.0.04. 验证请求:一次 curl 确认链路可用
配置完成后,先用 curl 直接打 Sub2API 的接口,确认服务本身活着:
curl -s http://localhost:8080/v1/models \ -H "Authorization: Bearer $SUB2API_API_KEY" | head -c 500如果返回模型列表 JSON,说明 Sub2API 和 Key 都正常。接着测 Codex CLI:
codex "用一句话介绍当前目录"预期结果是 Codex CLI 通过sub2api这个 provider 发出请求,Sub2API 转发到上游,再把结果返回终端。如果这一步能出内容,整条链路就通了。
想单独验证 TaoToken 统一通道,可以再打一次:
curl -s https://taotoken.net/api/v1/models \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" | head -c 500把TAOTOKEN_API_KEY换成你在控制台创建的 Key。这一步能返回模型列表,说明统一 Key 通道本身没问题,剩下的就是 Sub2API 与 Codex CLI 的对接细节。
5. 本篇常见错排查
5.1 Docker Compose 启动失败,提示缺少 .env
本地版docker-compose.local.yml需要读取deploy/.env,缺文件或变量为空都会启动失败。解决方式:
cd ~/apps/sub2api-deploy/deploy cp .env.example .env nano .env至少保证这些字段有值:
POSTGRES_USER=sub2api POSTGRES_PASSWORD=设置一个强密码 POSTGRES_DB=sub2api ADMIN_EMAIL=admin@sub2api.local ADMIN_PASSWORD=设置管理员密码 JWT_SECRET=设置随机字符串 TOTP_ENCRYPTION_KEY=设置随机字符串 TZ=Asia/Shanghai生成随机串可以用:
openssl rand -hex 32然后建数据目录并重启:
mkdir -p data postgres_data redis_data docker compose -f docker-compose.local.yml up -d docker compose -f docker-compose.local.yml ps5.2 数据库密码相关报错
如果启动后仍报数据库密码错误,检查.env里的POSTGRES_PASSWORD:等号后不能为空,避免中文、空格和引号。之前启动失败过的话,补好.env再执行一次up -d通常就能恢复。
5.3 Codex CLI 报模型不存在
这是最常见的坑。config.toml里的model必须和 Sub2API 后台可用模型名完全一致,大小写和连字符都不能错。改完配置后重开终端再试。
5.4 鉴权失败
先确认SUB2API_API_KEY是 Sub2API 后台生成的 Key,不是 TaoToken 的 Key,两者别混。再确认环境变量在当前 shell 里真的生效:
echo $SUB2API_API_KEY如果为空,说明~/.bashrc没 source 或者写错了文件。
5.5 Nginx 反向代理丢请求头
如果后续把 Sub2API 放到服务器并用 Nginx 反代,记得在http块加:
underscores_in_headers on;否则带下划线的请求头会被 Nginx 丢弃,Sub2API 的粘性会话和多账号调度会异常。
6. 长期编码与 Agent 场景的接入建议
如果你只是偶尔用 Codex CLI 跑一两个任务,上面的配置已经够用。但如果你打算把 Codex CLI 当成日常编码助手,甚至接进 Agent 工作流,建议把 Key 管理和通道稳定性单独考虑。
TaoToken 的 Coding Plan 适合长期编码和 Agent 场景,模型对话入口适合临时验证模型效果,API Keys 页面负责凭证管理,接入文档负责排障。遇到接入问题优先看 API Keys 和接入文档,验证模型效果走模型对话,长期跑编码任务再考虑 Coding Plan。
安全方面有几条硬建议:不要把 API Key 写进公开仓库,用环境变量或密钥管理服务;固定好JWT_SECRET、TOTP_ENCRYPTION_KEY、POSTGRES_PASSWORD这几个关键配置;生产环境配好防火墙和 HTTPS,定期更新依赖。Sub2API 这类自建聚合服务用于技术学习和研究,上游账号的使用需自行评估风险。
最后留一个实用习惯:每次改完config.toml或.env,先跑一次docker compose logs -f sub2api看日志,再用 curl 打一次/v1/models,最后才用codex发真实请求。三步走下来,问题基本能定位到具体环节,不用靠猜。