
最近有个朋友来找我吐槽他用 Codex 终端工具跑了一晚上代码审查第二天一看账单掉了 60 美元原因是他一直挂在默认的 GPT 模型上没切下来。聊完之后我直接给他换成了 DeepSeek同样的任务量成本几乎可以忽略更关键的是Codex 对自定义模型提供方的支持其实早就内置了只是一直被很多人忽略。再加上 CC-Switch 这个配置管理工具你完全可以在 Windows、macOS 和 Linux 三套系统上把 DeepSeek 顺畅接入 Codex做完之后想切回 OpenAI 也只需要点一下按钮。这篇就当作一份完整的实操记录来写。我会先讲清楚 CC-Switch、DeepSeek、Codex 这三者是怎么配合的然后给全平台下载安装步骤再深入到配置文件和协议转换的部分最后把我踩过的坑整理成一张故障速查表。适合不想再为 AI 编程接口烧钱、又希望保留 Codex 操作体验的人也适合手里同时有好几个 API 账号、来回切换时经常改错配置的人。1. 容我先说清楚这套组合的整体思路1.1 Codex、DeepSeek、CC-Switch 各自扮演什么角色先确认一个概念Codex 是 OpenAI 出的命令行 AI 编程工具你在终端里敲codex就能直接让它读代码、改文件、跑命令。它默认走 OpenAI 的官方接口但这种闭源绑定并不是唯一的路径因为 Codex 从很早就支持自定义 model provider。你可以自己指定一个模型名称和请求地址它就会把聊天补全请求发到那个地址去。DeepSeek 扮演的是“模型底座”的角色。它对外提供 OpenAI 兼容的 API也就是说 Codex 用习惯了的那套请求格式和数据结构DeepSeek 基本都能对接上。真正需要改的其实只是把 base_url 换成 DeepSeek 的地址把模型名改成deepseek-chat或deepseek-reasoner再把密钥换成你的 DeepSeek API Key。整个过程说白了就像电视机原来只认原厂机顶盒但背面其实留着标准 HDMI 口你只需要一个转接头和另一个盒子。CC-Switch 的角色更偏向“配置管家”。它专门管理这些 AI 工具的服务商配置让你不用每次手动翻配置文件改 base_url 和密钥。你可以在 CC-Switch 里维护多个服务商比如 DeepSeek、OpenAI、硅基流动、通义等等然后在界面里一键切换它负责把正确的配置写回 Codex、Cursor 等工具的配置文件里。1.2 为什么不用手动改配置文件而是多引入一个 CC-Switch很多人会觉得不就改一个config.toml吗我自己写还更干净。这种想法在只有一个 API 账号、只在一台电脑上用的时候没问题但一旦你的使用场景复杂起来痛点就非常明显。我自己的切换频率其实不高但架不住我同事多。有的人需要同一台机器上办公用 OpenAI、开发用 DeepSeek有的人搞评测需要同时对比几个大模型对同一段代码的分析结果还有的人手上好几个 API Key要给团队不同成员分配。这些场景下手动改文件的最大问题是容易出错而且错得隐蔽。比如你改了 model 名但忘了改 env_key报错时你还在排查网络实际上只是密钥环境变量没跟上。CC-Switch 的做法是把你从“改文件”的动作里解放出来。它本身就保存了所有服务商的配置模板你只需要点一下“切换”它就把整套配置覆盖到目标工具的配置目录里。对 Codex 而言它写入的内容就是~/.codex/config.toml。这种思路和你手机上切换输入法、或者游戏里切换装备是一回事本质上就是一套配置的“路由策略”。2. 开工前准备把 DeepSeek API 密钥和 Codex 环境先备齐2.1 注册 DeepSeek 开放平台账号并申请 API KeyDeepSeek 的 API Key 申请入口在 DeepSeek 开放平台官网首页就能找到。注册的时候用手机号或邮箱都行登录后进到“API Keys”管理页点“创建 API Key”系统会生成一串以sk-开头的密钥。注意这个密钥只完整显示一次页面关掉之后就再也看不到了所以创建完一定要立刻复制保存到一个临时文件里或者放进密码管理器。申请完密钥不等于马上能用DeepSeek 的 API 是按量计费的账户里需要先有余额。充值入口在“计费管理”页面支持常见支付方式。这里给一个经验千万别充太多我刚测试时充了 10 块钱断断续续用了一周还没用完。DeepSeek 的定价在同类模型里相当低对于代码补全、函数解释这类 token 消耗不夸张的任务来说小额充值足够跑很久。你需要记住两个模型名。deepseek-chat是通用对话模型适合大多数编码场景响应速度快deepseek-reasoner是推理增强模型思考过程更长适合复杂问题分析但延迟更高、价格也略贵。日常写代码我基本固定用deepseek-chat只有在需要复现复杂逻辑链的时候才临时切到 reasoner。2.2 安装 Codex CLI三个平台的通用做法Codex CLI 本身是基于 Node.js 的所以三个平台安装的第一步都是确认 Node.js 环境。版本要求是 Node 18 以上我建议直接用 20 LTS避免一些终端插件的兼容问题。装好之后打开终端用 npm 全局安装npm install -g openai/codex装完用codex --version验证一下。如果显示版本号说明命令已经可用。Windows 用户注意npm 全局安装的目录通常不在 PATH 里如果提示codex不是内部或外部命令需要把 npm 的全局 bin 目录加进系统 PATH。这个路径可以通过npm config get prefix查出来。macOS 和 Linux 用户相对省心npm 全局 bin 默认就在 PATH 范围内。装完先不用急着登录 OpenAI 账号因为我们要走自定义 provider 的路线登录步骤可以完全跳过。Codex 首次运行会先生成配置目录你可以提前手动创建~/.codex文件夹免得后面工具问东问西。2.3 配置文件的“家”弄懂 config.toml 的位置Codex 的自定义配置集中在~/.codex/config.toml这个文件里。~在不同系统上路径不一样Windows 里是C:\Users\你的用户名\.codex\config.tomlmacOS 和 Linux 里是/Users/你的用户名/.codex/config.toml或/home/你的用户名/.codex/config.toml。这个文件的语法是 TOML格式比 JSON 友好但也更容易在缩进和引号上出错。CC-Switch 帮你写的时候一般不会写错但如果你之后想手动微调一定要记得model_providers下面每个 provider 都是一个独立的[model_providers.xxx]段不能把两个 provider 写进同一个段里。后面接 DeepSeek 时我会把完整文件结构列出来。3. CC-Switch 下载与安装Windows / macOS / Linux 全流程3.1 官方渠道识别别下到打包了广告的版本先说一个大多数人都会忽略的问题CC-Switch 这类工具在搜索引擎里搜很容易点进仿冒站有的站点下载下来会捆绑一堆没用的推广软件。我的建议是只从官方 GitHub 仓库的 Release 页面下载。找到官方仓库之后进 Releases 看最新版通常一个版本会同时发布 Windows、macOS、Linux 三种包文件名里一般带有平台标识和版本号。下载之后建议顺手校验一下文件哈希。GitHub Release 页面通常附带 SHA256 校验值Windows 上用certutil -hashfile 文件名 SHA256验证macOS 和 Linux 上用shasum -a 256 文件名。这一步确实多花三十秒但能避免很多麻烦尤其是你要在公司网段里装软件的时候文件被中间人改动的概率虽然低但不是零。3.2 Windows 安装步骤Windows 下 CC-Switch 一般提供两种包一种是安装版.exe一种是便携版.zip。我的建议是优先选便携版因为这类工具本质上是配置管理器没有太多需要注册系统组件的需求便携版解压就能跑换电脑时直接拷整个文件夹走就行。用安装版的朋友注意安装路径别放在C:\Program Files这种权限高的目录里。CC-Switch 运行起来要读写~/.codex等配置目录放在权限受限的目录下可能触发写入失败。我自己习惯放进D:\Tools\CC-Switch或者C:\Users\你的用户名\Tools下权限干净升级替换也方便。3.3 macOS 安装与 Gatekeeper 处理macOS 用户下载到的一般是.dmg或.app压缩包。如果是 Apple Silicon 的机器记得选带arm64标识的包Intel 芯片选x64的包。下载完双击挂载镜像把 CC-Switch 拖进应用程序文件夹。这里大概率会遇到一个情况双击打开时提示“无法验证开发者”。因为 CC-Switch 不是通过 App Store 分发的macOS 的 Gatekeeper 默认会拦截未签名应用。处理方式是在终端里执行xattr -d com.apple.quarantine /Applications/CC-Switch.app执行完再双击就能正常打开了。异常在于如果解压出来的不是 .app 而是一个可执行文件用chmod x赋予执行权限后再运行。不要为了绕过拦截关闭 SIP那个风险比工具本身能带来的收益大得多。3.4 Linux 安装与缺少图形依赖的坑Linux 的包通常是.AppImage或.tar.gz。AppImage 的好处是免安装但运行需要系统里有 FUSE 库。chmod x CC-Switch-xxx.AppImage之后直接执行就行。如果执行时提示缺少 fuse在 Ubuntu/Debian 系执行sudo apt install libfuse2CentOS/RHEL 系执行sudo yum install fuse。有 CentOS 7.9 用户问过我装完 fuse 还是跑不起来。这种情况一般是 AppImage 文件和旧版 glibc 的兼容问题最简单的办法是把 AppImage 解压后直接运行里面的可执行文件./CC-Switch-xxx.AppImage --appimage-extract cd squashfs-root ./cc-switch解压出来之后不看系统发行版脸色图形界面一样能起。这套方法也适用于 Ubuntu Server 等没装桌面环境的机器前提是你自己挂一个 X 服务或者用转发方式打开界面。4. 核心环节在 CC-Switch 中配置 DeepSeek 并接入 Codex4.1 新增服务商界面字段逐一说明安装完成后打开 CC-Switch主界面会列出当前已经配置过的服务商和目标工具。首次使用界面是空的需要点击“新增”或“”来创建一条服务商记录。我以 DeepSeek 为例说明关键字段怎么填。服务商名称随便写比如“DeepSeek-主力”这个名称只用于你在列表里识别它不会读进 Codex 配置。API Key 填你第二步申请的sk-字符串。接口地址填https://api.deepseek.com/v1。这里有个细节DeepSeek 同时兼容https://api.deepseek.com和https://api.deepseek.com/v1但为了和 Codex 的请求路径拼接逻辑兼容我建议带着/v1写。模型列表里默认可以留空后面在 Codex 配置里手动指定如果工具要求必填就填deepseek-chat。确认页面里还会让你选择接入的目标工具。CC-Switch 不止管 Codex一般还支持 Cursor、Windsurf、Claude Code 等。这一步选了 Codex它才知道要把配置写到哪个目录。选完保存这条服务商记录就建立好了。4.2 生成 Codex 配置config.toml 里到底发生了什么在 CC-Switch 里选中新增的 DeepSeek 服务商点击“切换”或“启用”它就会把配置写进 Codex 的 config.toml。以直连方式为例生成的配置大致是这样的model deepseek-chat model_provider deepseek [model_providers.deepseek] name DeepSeek base_url https://api.deepseek.com/v1 env_key DEEPSEEK_API_KEY注意env_key的意思是 Codex 运行时会从这个环境变量名里读取 API Key。所以光改配置文件不够你还要让系统环境变量DEEPSEEK_API_KEY指向你的密钥。Windows 用户在系统设置里加环境变量后要重启终端macOS 和 Linux 用户建议写进~/.zshrc或~/.bashrcexport DEEPSEEK_API_KEYsk-你的密钥写完执行source ~/.zshrc让当前终端生效。有的版本 CC-Switch 会在启用服务商时弹窗提示让你设置环境变量照着做就行。设置完之后你可以先跑一个简单命令验证整体链路是否通codex exec 输出 hello world 的 Python 代码如果它正常返回代码说明 DeepSeek 接入 Codex 已经走通了。4.3 本地网关模式的原理和实际价值除了直连CC-Switch 还提供一种本地网关模式。这个模式会启用本机的一个小端口比如设置页里显示的127.0.0.1:3456Codex 的请求不是直接发到 DeepSeek而是先发给这个本机地址再由它转发到真正的 DeepSeek 接口。生成的配置会变成model deepseek-chat model_provider cc-switch-deepseek [model_providers.cc-switch-deepseek] name DeepSeek via CC-Switch base_url http://127.0.0.1:3456/v1 env_key DEEPSEEK_API_KEY为什么要多绕这一层因为 Codex 较新版本走的是/responses端点而 DeepSeek 官方 API 主要兼容的是/chat/completions端点。两端数据结构并不完全一致直接对接时可能报错。本地网关的价值就在这它把 Codex 发出的新格式请求在本地转换成 DeepSeek 能理解的格式再返回标准响应相当于在两者之间装了一个翻译器。所以如果直连模式下你遇到接口 404 或者响应格式异常先用网关模式成功率会高很多。注意网关模式启用时CC-Switch 这个程序本身要保持运行最小化到托盘没问题但不能退出。启动后如果看到端口被占用去任务管理器或活动监视器里找到占用进程结束掉再用netstat -ano | findstr 3456Windows或lsof -i :3456macOS/Linux确认端口已经释放。5. 故障速查表与实测排坑5.1 高频报错与解决办法对照表下面这张表是我在实际折腾过程中遇到过的典型问题按概率排了序。排查的时候别跳步从上往下一项一项对。报错关键词可能原因解决办法401 unauthorizedAPI Key 没设置或设置错误检查环境变量DEEPSEEK_API_KEY是否和申请时一致终端是否在修改环境变量后重启过model not found模型名写错或服务商不支持该模型把model改为deepseek-chat不要在模型名后加版本号或空格404 not foundbase_url 路径拼接不对确认 config.toml 里写的是https://api.deepseek.com/v1末尾不要丢/v1connection refused本地网关模式未启动或端口不对重新打开 CC-Switch核对 config.toml 里的端口和设置页是否一致本地连接器报错提示failed while handling codex endpoint /responses模型名或密钥写错导致网关转发失败检查 DeepSeek 账户余额是否充足确认模型名是deepseek-chat在 CC-Switch 里重新保存一次服务商配置ECONNRESET/ 连接被重置网络链路问题或请求体过大降低上下文长度用codex exec --cd控制项目范围换网络环境重试对话上下文无法加载切换服务商后会话历史存储位置变化切回原服务商配置Codex 里用/sessions查看历史会话列表并重新选择5.2 一条命令快速确认 DeepSeek API 状态很多问题其实在配置 Codex 之前就能暴露。加入遇到接口报错我建议先直接用 curl 发一个最小请求确认 DeepSeek API 本身是否正常。在终端里执行curl https://api.deepseek.com/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $DEEPSEEK_API_KEY \ -d {model:deepseek-chat,messages:[{role:user,content:ping}],max_tokens:5}如果返回里包含choices字段说明 API Key、网络链路、账户余额都没问题问题一定出在 Codex 配置这一侧。如果返回认证错误那问题在密钥如果返回余额不足相关字段充值就行。这一步能帮你把问题快速分成“API 服务商问题”和“本地工具问题”两类省下大量瞎折腾的时间。5.3 切换配置后上下文真的就丢了吗有网友问过我用 CC-Switch 切了账号之后之前 Codex 的对话上下文加载不出来这有没有办法解决。这里要说明白Codex 的历史对话记录是按会话 ID 存在本地目录里的通用的位置是~/.codex/sessions。切换服务商配置并不会删除这些文件它只是改变了“当前会话指向的模型提供方”。加载不出来的原因通常是两种。第一种是当前终端会话还停留在旧的会话上下文上新请求却发给了新的提供方Codex 发现上下游配置对不上直接选择不加载旧内容。第二种是你用的会话 ID 本身绑定了旧服务商切过来之后它找不回可兼容的模型设置。解决办法是切换前先用codex 退出当前会话或者在对话里输入/new开启新会话需要回看历史时用/sessions进入会话列表选择而不是直接沿用旧会话继续聊。多账号切换时养成“切配置就开新会话”的习惯你会少踩很多奇怪的 bug。5.4 日志排查的三板斧当你遇到没法通过现象判断原因的报错就直接看日志。Codex 有调试模式运行命令前加上--debug会输出完整的请求日志和响应头。Windows 上当前终端输出过长时可以用codex exec --debug run.log 21把日志重定向到文件再慢慢翻。看日志先看三处请求发出时用的 base_url 是什么、请求头里的 Authorization 有没有带对 Key、响应体里第一个 error 字段的值。大多数问题在这三处就能定位。实在确定不了就把 config.toml 内容和报错信息发给 CC-Switch 的社区仓库维护者把这两样东西给出来对方基本上一眼就知道问题出在哪。6. 绕坑心得与长期使用建议6.1 模型选型什么时候用 chat什么时候用 reasoner配置 DeepSeek 时最常被问到的是deepseek-chat和deepseek-reasoner怎么选。我的经验是默认写deepseek-chat。它可以处理绝大多数编码任务代码补全、重构、测试用例生成都够用响应速度也明显更快。deepseek-reasoner更适合你明确知道当前问题需要复杂推理的场景比如定位一个 StackOverflow 上都搜不到的诡异 bug、分析几段代码之间的并发依赖关系。Reasoner 的思考链很长费用和耗时都会上去不适合挂在编辑器里做随手补全。6.2 API Key 泄露的后果比你想的严重DeepSeek API Key 泄露不一定会立刻扣光余额但别人拿去跑大量任务你的账户会产出异常账单。处理办法只有一个立刻去开放平台删除旧 Key新建一个然后把所有用到旧 Key 的地方全部换掉。不需要尝试“缩小权限”或者“限额”DeepSeek 的 Key 管理不提供这么细的控制粒度。我自己的习惯是Key 只放在环境变量或 CC-Switch 的本地配置里绝不写进项目代码。加入项目里有人把 Key 提交到了 Git 仓库即使立刻删除记录并推送新提交历史记录里依然有所以要用git filter-repo这类工具重写历史或者直接换 Key 更省事。6.3 多账号、多服务商并存时的组织方式如果你最终会同时用 OpenAI、DeepSeek、通义、智谱等好几个服务商我建议在 CC-Switch 里的服务商命名上做到“一看就懂”。比如DeepSeek-工作、OpenAI-个人、DeepSeek-评测不要只写ds1、ds2。同时把各个模型的用途固定在同一个配置里比如 CC-Switch 的某个 profile 固定指向 Codex另一个 profile 固定指向 Cursor避免同一个配置在多工具间互相覆盖。日常我还会定期清理 CC-Switch 里不再使用的旧服务商因为工具切换写配置是“覆盖式”的旧的配置段如果不清理新的配置写进来时容易残留不匹配的字段。删掉不用的服务商就不容易出现切换过去之后模型名还是旧的那种诡异问题。这套组合我实际跑了快一个月整体体感很稳。最后顺手分享一个我每天早上都会用的小操作开机先把 CC-Switch 设为开机启动确保本地网关起得比终端早然后直接在 Codex 里接续昨天的会话。整个过程不需要打开任何配置文件也没有手滑改错的地方成本低到可以忽略。如果你也是那种晚上睡觉前还在跑批处理任务的人把这套流程配好第二天醒来看到的就是齐整的代码输出而不是又一条计费通知。