1. Codex 接 Deepseek 为什么总卡在 auth.json 这一步
Codex 是 OpenAI 出的命令行编码代理工具,能读你本地仓库、改文件、跑命令,适合习惯在终端里写代码的人。Deepseek 则是国内开发者常用的高性价比模型,代码能力够用、价格友好。把这两个凑一块,理论上就是「便宜又能干」的组合。但真正动手时,多数人卡住的地方不是模型本身,而是 Codex 的请求通道怎么改。
Codex 默认走 OpenAI 官方账号体系,登录、鉴权、模型列表都绑死。你想让它去调 Deepseek,就得在中间加一层兼容层,把 Codex 发出的 OpenAI 格式请求翻译成 Deepseek 能懂的格式,再把返回结果翻回来。这一层通常靠 CCX 这类协议转换网关来做,而 Codex 这边要改的核心文件就是auth.json。
auth.json是 Codex 存放鉴权信息的地方,里面记录了 API Key、Base URL、模型 ID 这些关键字段。很多人第一次改的时候只换了 Key,没换 Base URL,结果请求还是打到 OpenAI 官方,自然报 401。也有人把 Base URL 写成了带/v1结尾的地址,Codex 自己又拼一次路径,最后变成/v1/v1/chat/completions,直接 404。
这篇就按「一站式安装」的思路,从环境准备、TaoToken 通道配置、auth.json 完整片段、连通性验证,到 401 和 local proxy failed 的排查,一步步走完。适合已经装好 Node 和 Git、想用 Deepseek 跑 Codex 但被配置卡住的开发者。核心检索词就三个:Codex、Deepseek、auth.json 配置。你跟着改完,应该能直接在终端里让 Codex 用 Deepseek 干活。
先说清楚整体链路:Codex → auth.json 指向本地或远程网关 → 网关转发到 TaoToken 统一通道 → TaoToken 再路由到 Deepseek。TaoToken 在这里的角色是统一 Key 和 API 通道,你只需要维护一个 Key,不用在多个平台之间来回切换。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api ,注意 API 地址不带 UTM 参数,配置时别把跟踪参数写进去。
环境准备这块,Node 建议 18 以上,Git 随便一个近两年的版本都行。装完在终端敲node -v和git --version确认能输出版本号。Codex 本身通过 npm 全局安装,命令是npm install -g @openai/codex,装完敲codex --version看是否正常。如果提示命令找不到,多半是 npm 全局 bin 目录没进 PATH,Windows 下检查%APPDATA%\npm,macOS/Linux 下检查/usr/local/bin或~/.npm-global/bin。
Deepseek 的 API Key 在 Deepseek 开放平台创建,创建后立刻复制保存,关掉弹窗就再也看不到。这个 Key 后面会填进 TaoToken 的渠道配置里,不是直接填进 Codex。TaoToken 的 Key 则在控制台的 API Keys 页面生成,这个才是 Codex 的 auth.json 里要写的。两个 Key 别搞混,一个是对上游 Deepseek 的凭证,一个是对 TaoToken 的凭证。
CCX 和 CC-Switch 这两个工具,CCX 负责协议转换,CC-Switch 负责在多个供应商配置之间快速切换。如果你只用一个通道,CC-Switch 可以不用,但如果你同时要切 Deepseek、Claude、GPT,CC-Switch 能省不少事。CCX 下载后双击运行,默认监听本机 3000 端口,浏览器打开http://localhost:3000,默认密码 123456,登录后进 Codex 菜单添加渠道。渠道的 API 地址填https://api.deepseek.com,Key 填 Deepseek 的 Key,服务类型选 OpenAI Chat,创建即可。
这一步做完,CCX 就变成了一个本地网关,它对外暴露的是 OpenAI 兼容接口,对内转发到 Deepseek。Codex 只要把 Base URL 指向 CCX,就能用 Deepseek 了。但如果你不想本地跑 CCX,也可以直接把 Base URL 指向 TaoToken 的 API 地址,让 TaoToken 来做统一路由。两种方式都行,本地 CCX 适合想自己掌控转发逻辑的人,TaoToken 直连适合想少维护一个进程的人。
接下来就是改 auth.json。这个文件的位置在不同系统下不一样,macOS/Linux 通常在~/.config/codex/auth.json,Windows 在%APPDATA%\codex\auth.json。如果文件不存在,手动创建一个。文件内容是 JSON 格式,核心字段包括api_key、base_url、model。下面给一个可复制的完整片段,你按自己的实际值替换。
{ "api_key": "sk-你的TaoTokenKey", "base_url": "https://taotoken.net/api", "model": "deepseek-chat", "provider": "openai", "extra_headers": { "Content-Type": "application/json" } }注意base_url不要带/v1,Codex 内部会自己拼/v1/chat/completions。如果你填了https://taotoken.net/api/v1,最后请求路径会变成/api/v1/v1/chat/completions,直接报错。model字段填 Deepseek 的模型 ID,常见的是deepseek-chat和deepseek-coder,具体以 TaoToken 控制台模型列表为准。provider保持openai,因为 Codex 认的是 OpenAI 协议格式。
如果你走本地 CCX,base_url就改成http://localhost:3000/v1,api_key填 CCX 的登录密钥。这里有个细节:CCX 的登录密钥和 Deepseek 的 Key 是两回事,CCX 登录密钥是你在 CCX 里设置的访问密码,Deepseek Key 是 CCX 转发时用的上游凭证。别把 Deepseek Key 填到 Codex 的 auth.json 里,那样 CCX 会拒绝,因为它只认自己的访问密钥。
环境变量这块,Codex 也支持通过环境变量覆盖 auth.json 的部分字段。常用的有OPENAI_API_KEY和OPENAI_BASE_URL。如果你在 CI 环境里跑 Codex,不方便写文件,就可以用环境变量。命令是export OPENAI_API_KEY=sk-你的Key和export OPENAI_BASE_URL=https://taotoken.net/api。Windows 下用set或$env:。环境变量的优先级高于 auth.json,两者同时存在时以环境变量为准。
配置改完,先别急着跑 Codex,先用 curl 验证通道是否通。这一步能帮你快速定位是通道问题还是 Codex 配置问题。命令如下:
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的TaoTokenKey" \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-chat", "messages": [{"role": "user", "content": "你好"}], "max_tokens": 50 }'如果返回里有choices字段和正常的中文回复,说明通道没问题。如果返回 401,说明 Key 不对或没带上。如果返回local proxy failed,说明本地 CCX 没启动或端口不对。如果返回reading choices相关错误,说明返回格式不是 OpenAI 兼容格式,多半是 Base URL 指错了地方。
验证通过后,在终端敲codex启动。第一次启动它会读 auth.json,如果配置正确,直接就能对话。你可以输入帮我看看当前目录下有哪些文件测试它能不能读本地仓库。如果能正常列出文件并给出解释,说明整条链路通了。如果 Codex 提示要登录 OpenAI 账号,说明 auth.json 没被读到,检查文件路径和 JSON 格式是否正确,JSON 里不能有注释和尾逗号。
常见错误排查这块,401 是最多的。原因通常有三个:Key 写错、Key 没带 Bearer 前缀、Base URL 指到了需要不同鉴权方式的地方。先确认 auth.json 里的api_key和 TaoToken 控制台生成的一致,然后确认base_url是https://taotoken.net/api而不是别的。如果走 CCX,确认 CCX 的访问密钥填对了,并且 CCX 进程在跑。
local proxy failed这个报错,基本就是本地网关没起来。检查 CCX 是否在运行,端口 3000 是否被占用。用lsof -i :3000或netstat -ano | findstr 3000看端口状态。如果 CCX 没启动,重新双击运行或make run。如果端口被别的程序占了,改 CCX 的.env文件里的端口配置,然后同步改 Codex 的base_url。
reading choices这类错误,通常是返回体里没有choices字段。原因可能是 Base URL 指向了一个非 OpenAI 兼容的接口,或者模型 ID 写错了导致上游返回错误。先确认model字段是deepseek-chat或deepseek-coder,再确认 Base URL 没有多余路径。如果走 TaoToken 直连,确认 API 地址是https://taotoken.net/api,不要加/v1。
OAuth 相关报错,说明 Codex 还在尝试走 OpenAI 官方登录流程。这通常是因为 auth.json 没生效,Codex 回退到了默认鉴权。检查 auth.json 是否在正确路径,文件权限是否可读。macOS/Linux 下用chmod 600 ~/.config/codex/auth.json确保权限。Windows 下确认文件没有被其他程序占用。
还有一个坑是模型列表获取。CC-Switch 里点「获取模型列表」时,如果 Base URL 填的是 CCX 地址,它会去问 CCX 要模型列表。CCX 如果没配好上游渠道,这个列表就是空的。所以顺序要对:先在 CCX 里配好 Deepseek 渠道,再用 CC-Switch 去获取。如果走 TaoToken 直连,模型列表在 TaoToken 控制台看,不用 CC-Switch 获取。
关于 CC Switch、Cline MCP、Codex auth.json 这三件套,如果你同时用多个工具,建议统一用 TaoToken 的 Base URL 和 Key。CC Switch 里配置自定义供应商时,API 请求地址填https://taotoken.net/api,API Key 填 TaoToken 的 Key,然后获取模型列表,选deepseek-chat添加。Cline MCP 那边也是同样的 Base URL 和 Key,Model ID 填deepseek-chat。这样三个工具共用一个通道,Key 只需要维护一份。
长期跑编码任务的话,Coding Plan 比按量计费更划算。TaoToken 的 Coding Plan 入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,适合每天都要用 Codex 干活的场景。如果只是偶尔验证一下模型通不通,用模型对话页面就行,入口在 https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。API Key 管理在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
最后说一个实测下来的经验:auth.json 改完后,Codex 有时候会缓存旧的配置。如果你改了文件但行为没变,把 Codex 完全退出再重开,或者删掉~/.codex下的缓存目录。Windows 下在%APPDATA%\codex里找缓存。这个坑我踩过,改了 Base URL 但 Codex 还在打旧地址,重启后才生效。
配置过程中如果遇到 401,先别怀疑 Key 本身,用 curl 单独测一次。curl 通了说明 Key 没问题,问题在 Codex 的读取路径或格式。curl 不通说明 Key 或 Base URL 有问题,去 TaoToken 控制台重新生成一个 Key 再试。这个二分法能省很多时间。
整条链路跑通后,你可以在 Codex 里直接让它读项目、改代码、跑测试。Deepseek 的代码能力在deepseek-chat上表现稳定,日常重构和补全够用。如果遇到复杂推理任务,可以切到deepseek-coder试试。模型切换只需要改 auth.json 里的model字段,改完重启 Codex 即可。
关于 Claude Code 的接入,逻辑和 Codex 类似,也是改 Base URL 和 Key,只是配置文件路径不同。Claude Code 的配置在~/.claude/settings.json或项目级的.claude/settings.json。如果你同时用 Codex 和 Claude Code,建议把两者的 Base URL 都指向 TaoToken,Key 用同一个,这样管理起来最简单。Claude Code 的 Anthropic 兼容入口在 https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,配置时注意协议格式是 Anthropic 而不是 OpenAI。
控制台入口在 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面可以看用量、管 Key、查日志。如果请求失败,先去控制台的日志里看具体报错,比在终端里猜要快。日志里会显示请求打到了哪个模型、返回了什么状态码,定位问题很直接。
auth.json 的完整配置再强调一遍:api_key填 TaoToken Key,base_url填https://taotoken.net/api,model填deepseek-chat,provider填openai。这四个字段对了,基本就能跑。如果走本地 CCX,base_url改成http://localhost:3000/v1,api_key填 CCX 访问密钥。两种方式选一种,别混着填。
验证命令除了 curl,还可以用 Codex 自带的codex --check或类似参数看配置加载情况。不同版本参数可能不一样,敲codex --help看有没有诊断相关的子命令。如果有,跑一次能直接告诉你 auth.json 读到了什么、Base URL 是什么,省得自己猜。
环境变量清单再列一下:OPENAI_API_KEY、OPENAI_BASE_URL、OPENAI_MODEL。这三个在 CI 或容器环境里很有用。设置后 Codex 会优先读环境变量,auth.json 可以留空或只放非敏感字段。注意环境变量里的 Base URL 同样不要带/v1。
CCX 的.env文件里,PROXY_ACCESS_KEY字段控制访问密钥,默认是 123456,建议改掉。改完后 Codex 的 auth.json 里api_key要同步改成新值。CCX 的端口也在.env里改,改完重启 CCX,Codex 的base_url同步更新。这个联动关系别漏了,漏一个就连不上。
Deepseek 的 Key 在 CCX 渠道配置里填一次就行,之后 CCX 转发时自动带上。Codex 不需要知道 Deepseek Key,它只认 CCX 的访问密钥。这样设计的好处是 Deepseek Key 不暴露给 Codex,安全性更好。如果你走 TaoToken 直连,TaoToken 那边也是同样的逻辑,上游 Key 在 TaoToken 控制台配,Codex 只认 TaoToken Key。
模型 ID 这块,Deepseek 官方文档里deepseek-chat对应 V3,deepseek-coder对应代码专用版本。TaoToken 控制台的模型列表里会显示可用的 ID,以那个为准。如果填了不存在的模型 ID,上游会返回模型不存在错误,Codex 里表现为请求失败。遇到这种报错,先去 TaoToken 控制台确认模型 ID 拼写。
最后一步验证:在 Codex 里输入写一个 Python 函数,计算斐波那契数列前 N 项,看它能不能正常返回代码。如果能返回且代码可运行,说明整条链路完全通了。如果返回的是英文且格式奇怪,检查provider字段是不是openai,有时候填错会导致解析异常。
配置完成后,日常使用就是直接敲codex进交互模式,或者codex "你的任务描述"直接执行。Deepseek 的响应速度在 TaoToken 通道上实测稳定,日常编码够用。如果遇到高峰期延迟,可以在 TaoToken 控制台看用量和延迟统计,判断是不是上游限流。
auth.json 改到 TaoToken 的完整配置就这些。核心就三件事:Key 填对、Base URL 不带/v1、模型 ID 拼对。这三件事做完,Codex 加 Deepseek 的组合就能跑起来。剩下的排查都是围绕这三个点展开,遇到报错先回头检查这三项,大部分问题都能自己解决。