
最近我把 Codex CLI 从官方默认模型切到了 DeepSeek本来以为就是改两行环境变量的事结果真正折腾下来发现坑多得能凑一桌麻将。尤其是用 CC-Switch 做渠道管理时反复出现的 local proxy failed、model not supported、上下文加载不出来每一个都值得单独开一节来说。这篇文章就是我完整复现一遍 CC-Switch 下载安装、DeepSeek 渠道配置、Codex 接入的实操记录所有命令和配置都是我自己跑过的你可以直接照着抄。这篇文章适合三类人第一类是已经在用 Codex但想换到 DeepSeek 这类兼容 OpenAI 接口的模型服务上省点成本第二类是同时维护着多个 API 渠道不想每次都在命令行里改环境变量想用 CC-Switch 统一管理的开发者第三类是刚接触这些工具对 base_url、api_key、端点格式还分不清的新手。我会尽量把每一步为什么这么做也讲清楚而不只是给结论。1. 项目需求拆解与技术选型1.1 这件事到底在解决什么问题先理清这三个工具各是什么角色。Codex 是 OpenAI 出品的终端 AI 编程助手它能直接读写项目文件、执行命令、帮你完成从需求到代码的闭环。但它默认只认 OpenAI 官方的服务和模型想要让它接入 DeepSeek本质上要解决三个问题API 地址怎么指过去、认证用什么 key、请求格式走哪个端点。DeepSeek 的 API 对外号称兼容 OpenAI 格式这听起来很美好但实际操作中“兼容”是有边界的。它实现了/v1/chat/completions这套最通用的端点但 OpenAI 新版本的 Codex CLI 默认走的是/v1/responses这个新端点DeepSeek 并没有实现。这一层错位就是网上铺天盖地报cc switch local proxy failed while handling codex endpoint /responses的根本原因。CC-Switch 在这里起的作用是“中间调度”。它可以把多个 AI 提供商的配置集中存起来按需一键切换甚至起一个本地代理来转发请求。但代理只是把请求转发出去并不能凭空把 /responses 变成 /chat/completions所以兼容性问题还得靠 Codex 侧的配置来解决。搞清楚这层关系后面的所有配置你都不会看懵。1.2 为什么用 CC-Switch 而不是手动改环境变量有人可能会说我不就是改两个环境变量的事吗为什么非要装个桌面工具如果你只接 DeepSeek 一个渠道确实没必要用 CC-Switch。但我自己的场景是今天用 DeepSeek 跑日常任务明天切回官方模型测兼容性后天还要试另一个服务商的推理模型每次都在终端里敲export OPENAI_BASE_URL...敲错一个字符就要排查半天。CC-Switch 解决的是“多渠道频繁切换”这个真实痛点。它把每个服务商的配置保存成一个独立的渠道界面上点一下就能切换Codex 通过它读取对应的 base_url 和 api_key。相当于把原本散落在命令行和配置文件里的信息收拢到一个可视化的面板里。如果你只需要一个固定的 API直接看第 4 节的 config.toml 配置就够了如果要多渠道管理就认真看第 3 节的 CC-Switch 部分。1.3 选 DeepSeek 渠道的合理性选择 DeepSeek 作为演示渠道是因为它的 API 是国产模型里对 OpenAI 生态兼容做得比较省心的一个。注册之后直接创建 API Key不需要什么额外审批模型名就两个deepseek-chat对应对话模型deepseek-reasoner对应推理模型非常直白。而且 DeepSeek 的定价逻辑对开发者比较友好日常写代码、改 bug、做脚本这类场景用量大但单次请求消耗不大很适合把 Codex 这种高频调用的工具接上去。另外它的中英文代码理解能力都很强代码生成的风格更贴近中文开发者的习惯。当然这不是唯一选择只要 API 是 OpenAI 兼容格式的接入思路完全一样。2. 环境准备与基础安装2.1 装机前的检查清单开始之前先把基础环境确认好不然装到一半才发现缺东西很容易心态崩。Codex CLI 是基于 Node.js 的所以第一件事是确认 Node.js 版本。建议装 LTS 版本也就是 18 以上最好能到 20 或者 22。直接在终端里跑node -v npm -v如果输出类似v20.11.1和10.2.4那就没问题。如果提示 command not found先去 Node.js 官网下载对应你操作系统的安装包一路下一步装完再回来。这里有个小坑macOS 上如果之前用 Homebrew 装过旧版本 Node版本号可能比较老建议顺手brew update brew upgrade node一下。CC-Switch 是桌面应用对系统没有太苛刻的要求macOS、Windows、Linux 都支持。你只需要知道自己电脑的芯片架构是 Intel 还是 Apple Silicon下载对应版本身。Windows 的话注意区分 x64 和 arm64一般家用电脑选 x64 就行。2.2 安装 Codex CLICodex 的安装方式官方推荐用 npm 全局安装一条命令就搞定npm install -g openai/codex装完验证一下版本codex --version能输出版本号就说明装好了。如果这一步报权限错误尤其是在 macOS 上通常是因为 Node.js 全局目录没有写权限。我的建议是不要直接用 sudo 硬装更好的做法是调整 npm 的全局目录到当前用户目录下不然以后每次npm install -g都要 sudo烦得很。npm config set prefix ~/.npm-global export PATH~/.npm-global/bin:$PATH把第二行写进 shell 的配置文件.zshrc或.bashrc里重新打开终端就能生效。还有人在 Windows 上遇到codex 无法加载或者“Windows 设置未完成”的提示这多半是因为 PowerShell 执行策略限制需要以管理员身份运行一次Set-ExecutionPolicy RemoteSigned -Scope CurrentUser装完之后先别急着配置直接跑一下codex它会提示你登录或者配置我们后面统一处理。你可以先感受一下这个工具的交互界面和 ChatGPT 网页版的体验完全不同它是在终端里以对话方式操作你的真实项目这种感觉很奇妙。2.3 下载安装 CC-SwitchCC-Switch 的安装包一般发布在 GitHub Releases 页面。打开 Releases 之后找到最新版本根据系统选择安装包。macOS 用户下载.dmg文件Windows 用户下载.exeLinux 用户下载.AppImage。这里有一个很多人忽略的细节macOS 首次打开从 GitHub 下载的未签名应用会被 Gatekeeper 拦截。打开之后系统提示“已损坏”或“无法验证开发者”不要慌去“系统设置 - 隐私与安全性”里找到“仍要打开”的选项点一下就行。如果实在找不到可以在终端里执行xattr -d com.apple.quarantine /Applications/CC-Switch.appWindows 用户下载安装时SmartScreen 可能会弹风险提示同样选择“仍要运行”。这些只是对这些个人开发者发布软件的常规拦截软件本身是正常的。安装完成后打开 CC-Switch界面会比较简洁主要分几个区域渠道列表、当前激活的配置、以及一个代理服务开关。第一次打开可能什么都不显示不用管我们直接开始往里加渠道。2.4 申请 DeepSeek API Key接下来去 DeepSeek 开放平台注册账号然后进入 API Keys 管理页面创建一个新的 Key。创建完之后 API Key 只会完整显示一次一定要马上复制保存到安全的地方。如果你关掉页面再回头找就只能重新创建了。创建 Key 的同时平台页面会显示你当前的账户余额。DeepSeek 的计费是预付费模式余额不足就无法调用所以创建完 Key 之后顺手充一点钱进去别等到 Codex 调了半天才发现报余额不足的错误。关于 API 地址官网上明确写了可以填https://api.deepseek.com也可以填https://api.deepseek.com/v1。这两个都能用但为了和 OpenAI 的习惯保持一致建议在 Codex 配置里统一用带/v1的形式。模型名按照官网文档填deepseek-chat和deepseek-reasoner不用额外注册模型权限。3. 在 CC-Switch 里配置 DeepSeek 渠道3.1 新建渠道的核心步骤打开 CC-Switch 后找到“新建渠道”或者“添加 Provider”的入口。不同版本的 CC-Switch 界面文字可能略有差异但核心字段都是相通的。我按自己的实际操作梳理出下面几个必填项渠道名称随便起比如DS-Chat、DeepSeek-Pro方便自己在列表里认出来就行。Base URL填https://api.deepseek.com/v1。API Key粘贴刚才保存的sk-开头的密钥。支持的模型写上deepseek-chat和deepseek-reasoner多个模型名用逗号分隔。填完之后保存列表里就会多出一个渠道。这时候点一下“启用”或“设为当前”CC-Switch 会把这个渠道标记为活动状态。这一步的本质是把“当前应该用哪家 AI 服务”这个状态从命令行搬到了图形界面里。3.2 本地代理的启用与识别CC-Switch 的另一个重要功能是本地代理。启用之后它会在你电脑上开一个本地端口把 Codex、Claude Code 这类工具的请求统一转发到你当前激活的渠道去。这个设计的好处是Codex 不用知道你到底连接的哪家服务商它只管把请求发给本地代理代理帮你做路由。端口号不一定固定以你 CC-Switch 界面上显示的为准常见的大概是23456、23800这种。记下这个地址后面配置 Codex 时要用。格式大概是http://127.0.0.1:23456/v1。启用代理后可以先用 curl 做一个快速连通性测试确认代理本身没有挂掉curl http://127.0.0.1:23456/v1/models -H Authorization: Bearer your-api-key如果返回一串模型列表说明 CC-Switch 到 DeepSeek 这一段的链路是通的。如果返回错误优先检查 API Key 是否带上了空格或者 base_url 是不是填成了带/v1和没带/v1混起来的情况。3.3 别忽略 Key 的管理细节有很多人配完 CC-Switch 之后发现切来切去偶尔不生效问题往往出在 Key 上。比如 Key 里面不小心复制了空格或者填了旧 Key 导致权限不足。CC-Switch 本身不做 Key 鉴权它只是把你填的字符串原样传出去所以填错一个字它也不会提醒你直到请求失败才报错。我的习惯是每个渠道单独用一个环境变量文件管理 Key不在界面上反复修改。CC-Switch 支持从环境变量或配置文件读取的话就尽量用不支持的话就在本地记事本里维护一份 Key 和用途的对照表避免时间久了忘掉哪个 Key 对应哪家服务。4. Codex 接入与配置4.1 方式一直接编辑 config.tomlCodex 的配置文件默认在用户目录下的~/.codex/config.toml。如果这个文件不存在手动创建就行。把这个文件当作 Codex 的“总开关”里面可以指定默认模型、默认 Provider以及各个 Provider 的连接信息。直连 DeepSeek 的配置如下model deepseek-chat model_provider deepseek [model_providers.deepseek] name DeepSeek base_url https://api.deepseek.com/v1 env_key DEEPSEEK_API_KEY wire_api chat这里env_key DEEPSEEK_API_KEY表示 Codex 会从环境变量里读取真正的 Key。所以你还得在 shell 配置文件中导出一个环境变量export DEEPSEEK_API_KEYsk-你的密钥为什么不用api_key直接写在配置文件里因为config.toml可能会被别人看到也可能在项目协作中被提交到版本控制里去。用env_key这种间接方式至少把敏感信息隔离在环境变量层安全性高很多。4.2 方式二走 CC-Switch 本地代理如果你要用 CC-Switch 管理多个渠道Codex 的配置就不直接指向 DeepSeek 了而是指向 CC-Switch 的本地代理。两者差别不大只是 base_url 变成本地地址model deepseek-chat model_provider ccswitch-deepseek [model_providers.ccswitch-deepseek] name CCSwitch-DeepSeek base_url http://127.0.0.1:23456/v1 env_key CCSWITCH_DS_KEY wire_api chat这样配置之后你在 CC-Switch 里切换渠道Codex 不需要任何改动因为它的请求始终打给本地代理代理自己会路由到不同的上游服务。这就是我前面说的“把切换动作从命令行搬到图形界面”真正做到切换渠道不影响 Codex。4.3 验证配置是否生效配置完成后在任意一个项目目录里运行codex如果进入对话界面说明基础连接已经成功。你可以先让它做一件简单的事比如“统计这个项目里有多少个文件”看看它是怎么思考和执行的。一旦它真的开始列文件、调用命令就说明 Codex 成功通过 DeepSeek 在工作了。如果它直接报错不要慌往下看。绝大多数问题都集中在端点格式和模型名上我在第 5 节把这两个问题彻底拆解开了。4.4 关于登录态的一个提醒Codex 默认会尝试走 OpenAI 的登录认证。就算你已经在 config.toml 里指了 DeepSeek它可能还是会先尝试登录导致出现codex 无法加载组织设置这类报错。网上很多教程让人登录但如果你已经用自定义 Provider根本没有必要走 OpenAI 登录。解决方法是确保 config.toml 里的model_provider和model都指向你自己的服务并且 Provider 里没有设置requires_openai_auth true。同时如果~/.codex/auth.json记录过旧的登录信息建议先把它备份再删掉。这样 Codex 就会老老实实走你配置的自定义通道不再纠结组织设置。5. 核心坑点endpoint 兼容性问题5.1 local proxy failed 到底错在哪这是被搜索最多的一个问题报错信息长这样cc switch local proxy failed while handling codex endpoint /responses。provider...。看到/responses这个关键字问题就已经定位了一半。Codex 较新的版本默认走的是 OpenAI 新出的 Responses API也就是POST /v1/responses。而 DeepSeek 这类第三方服务往往只实现了更早的 Chat Completions API即POST /v1/chat/completions。CC-Switch 的本地代理确实是正常工作的但当它把请求转发给 DeepSeek 时DeepSeek 发现路径对不上就返回了一个不支持的错误CC-Switch 把这层错误原样抛出来就成了你看到的 local proxy failed。这个报错并不代表 CC-Switch 坏了而是上游服务商不认识这个端点。所以排查顺序应该是先看是 Codex 直接连 DeepSeek 报错还是通过 CC-Switch 报错然后统一在 Codex 侧把请求格式切换到 Chat Completions。5.2 用 wire_api 让 Codex 走兼容端点解决上面这个问题的关键字段是wire_api。在 config.toml 的 Provider 配置里加上wire_api chat意思是告诉 Codex“你对这个 Provider 发起请求时请用 Chat Completions 协议而不是默认的 Responses 协议。”[model_providers.deepseek] name DeepSeek base_url https://api.deepseek.com/v1 env_key DEEPSEEK_API_KEY wire_api chat加了这一行之后请求路径就变成https://api.deepseek.com/v1/chat/completionsDeepSeek 就能正常处理了。我当时排查这个问题的过程有点曲折一开始以为是 CC-Switch 代理配置错了反反复复重装了两遍最后才发现核心是这个协议字段。这也是我为什么强调遇到了不要急着卸载重装先看协议层。5.3 模型名报错的两种典型情况另一种高频报错是the gpt-5.6-sol model is not supported when using codex with a...。看到这个错误第一反应就是Codex 没有按你指定的模型名请求。出现这种情况有两个可能。第一config.toml 里没有设置model字段Codex 用了内置默认模型名也就是 OpenAI 专属的模型名DeepSeek 当然不认识。第二你设置了model_provider但拼写和[model_providers.xxx]里的名称对不上Codex 找不到对应的 Provider就会回退到默认配置。正确的配置组合应该是model deepseek-chat model_provider deepseek并且[model_providers.deepseek]这一段名字必须和上面model_provider保持一致。如果你用的是ccswitch-deepseek那 Provider 段也要一样。这种低级错误很容易因为手滑出现排查的时候可以直接把两行配置放到一起逐字对比。5.4 切换渠道后对话上下文丢失这是一个使用体验问题不是技术故障。CC-Switch 切换渠道后新建的对话默认是干净的这个设计本身是合理的因为不同渠道的会话历史本来就不共享。但如果你切来切去之后发现之前和 Codex 聊到一半的上下文找不到了那就是你没有用对会话管理功能。Codex 支持会话恢复具体命令是codex resume它会列出可恢复的历史会话选择之前遇到问题的那个上下文就回来了。在 CC-Switch 的语境下只要你不清空~/.codex/sessions目录切换渠道不会删除历史会话只是当前激活的是新会话而已。我个人习惯是重要的开发任务尽量不中途切换渠道一条任务线保持一个渠道遇到需要对比模型效果时再开一个新任务对话。6. 常见问题速查与实操心得6.1 问题速查表我把实际见过的问题整理成了一张表方便你遇到时快速对照现象根本原因处理方式local proxy failed while handling /responsesCodex 默认走 Responses 端点DeepSeek 不支持Provider 配置加wire_api chatgpt-5.6-sol model not supported没有指定模型名或 model_provider 拼写不匹配指定model deepseek-chat并核对 Provider 名codex 无法加载组织设置本地存在旧登录态走了 OpenAI 认证流程清理~/.codex/auth改用 env_key 自定义 Provider切换 CC-Switch 渠道后上下文空白新渠道不共享旧会话这是正常隔离用codex resume恢复指定会话codex windows 设置未完成PowerShell 执行策略限制运行Set-ExecutionPolicy RemoteSignedcc-switch 切账号后旧对话不加载各渠道会话存储在本地但未自动关联切换回原渠道再用codex resume恢复DeepSeek 到对话上限后新对话无法承接上下文过长了被模型输入长度限制挡住手动精简上下文或让 Codex 总结后开新会话6.2 一份可以直接抄的最终配置模板这里是我当前在实际使用的完整模板直接作为~/.codex/config.toml的内容你可以根据自己的 Key 和环境变量名微调model deepseek-chat model_provider deepseek [model_providers.deepseek] name DeepSeek base_url https://api.deepseek.com/v1 env_key DEEPSEEK_API_KEY wire_api chat # 如果走 CC-Switch 代理把上面 provider 段换成下面这样 # [model_providers.ccswitch-deepseek] # name CCSwitch-DeepSeek # base_url http://127.0.0.1:23456/v1 # env_key CCSWITCH_DS_KEY # wire_api chat同时保证 shell 配置文件里有export DEEPSEEK_API_KEY你的key这套组合我跑了快两周没有出现过断连或者上下文消失的问题。日常用来写脚本、重构代码、解释复杂逻辑都很稳定。6.3 几个提高效率的小习惯最后分享几个我实打实用出来的经验。第一给 DeepSeek 平台账户设置好余额报警阈值别等 Codex 工作到一半突然报余额不足那比你手动改十次配置还难受。第二CC-Switch 方便切换但每切换一次Codex 的感知模型就换了一次尽量不要在同一个任务里频繁切换模型不然 Codex 对项目的理解会断层。第三如果要用deepseek-reasoner跑复杂推理任务记得把model字段单独改成deepseek-reasoner因为它的响应速度和对话风格跟普通对话模型不一样。我自己最常用的是deepseek-chat做日常编码偶尔用deepseek-reasoner来分析复杂的算法逻辑。两个模型在同一个 Provider 下切换只需要改配置里的一个model字段非常方便。说到底这套组合的本质就是用 CC-Switch 解决渠道管理用 DeepSeek 解决模型服务用 Codex 解决终端编程体验。三者各管一段又通过 OpenAI 兼容协议串在一起。我在这个配置上踩过的坑基本都写在这篇文章里了。如果你照着配置完还是有问题多半是卡在环境变量或者路径这类细节上回去逐项检查一下第 2 节和第 4 节的配置应该就能解决。