1. Windows 上让 Codex 同时跑 GPT 和 DeepSeek-V4 的真实痛点
如果你在 Windows 上用 Codex CLI,又想同时保留 ChatGPT 登录态、再挂一个 DeepSeek-V4 的 Flash / Pro 双模型,大概率会撞上同一个坑:官方给的 DeepSeek 接入方式让你直接改主config.toml,并且强制走 API Key 登录。结果就是auth.json被抢,ChatGPT 会话被踢,终端甩你一句API key login is required, but ChatGPT is currently being used. Logging out.,然后你之前登录的 GPT 环境全没了。
这篇就解决这件事。目标很明确:在 Windows 的C:\Users\<用户名>\.codex目录下,用一份独立的deepseek.config.toml把 DeepSeek-V4 的 Flash 和 Pro 挂进 Codex,默认 GPT 配置一行不动,ChatGPT 登录态保留,通过-p deepseek切到 DeepSeek 会话,会话里用/model在 Flash / Pro 之间热切换,不用重启、不用重新登录。适合已经在用 Codex、想低成本加一个国产强模型的 Windows 开发者,也适合刚接触 Codex profile 机制、想搞懂多 provider 隔离怎么配的人。
下面所有路径、命令、JSON 字段都是可复制直接用的,我按「先讲清楚机制 → 再给配置 → 再验证 → 再排错」的顺序走,你跟着敲就行。
2. 前置准备:TaoToken 统一 Key 与 Codex 版本要求
在动配置文件之前,先把两件事准备好,否则后面会卡在鉴权或模型识别上。
第一是 Codex CLI 版本。models.json里的模型目录依赖minimal_client_version,DeepSeek-V4 这两个条目要求Codex CLI 0.144.0 或更高。低版本会出现模型列不出来、/model里看不到 Pro 的情况。先在 PowerShell 里确认:
codex --version如果低于 0.144.0,先升级再继续。
第二是 Key 的管理方式。这里建议用 TaoToken 做统一入口,把 DeepSeek 的调用收敛到一个 Key 上,后面不管换 Flash 还是 Pro、甚至以后加别的模型,都只改一处。TaoToken 的定位就是给多模型场景做统一 Key 和接入管理,官网在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。
你需要先去控制台拿一个 API Key,入口在这里:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,Key 列表页在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。拿到之后先别急着写进配置,记住一条铁律:真实 Key 只存在本机私有配置里,不要提交到 Git 仓库,也不要贴进共享文档或聊天记录。后面配置里我会用<TAOTOKEN_API_KEY>占位,你替换成自己的。
注意:如果你之前按某些教程改过主
config.toml并加了forced_login_method = "api",先把它删掉,否则 ChatGPT 登录态还是会被顶掉。这一步是后面「登录态共存」能成立的前提。
3. 可复制配置:deepseek.config.toml 与 models.json 骨架
Codex 的 profile 机制允许你把不同 provider 拆到独立文件,通过-p <profile>加载。我们要动的目录是:
C:\Users\<用户名>\.codex\ ├── config.toml # 原有默认 GPT 配置,不修改 ├── deepseek.config.toml # DeepSeek profile(Flash / Pro 共用) ├── models.json # DeepSeek 模型目录(含 flash 与 pro) └── auth.json # ChatGPT 登录态,不修改3.1 新建 deepseek.config.toml
在C:\Users\<用户名>\.codex\下新建deepseek.config.toml,内容如下:
model = "deepseek-v4-flash" model_provider = "deepseek" model_reasoning_effort = "high" model_catalog_json = "C:/Users/<用户名>/.codex/models.json" disable_response_storage = true [model_providers.deepseek] name = "deepseek" base_url = "https://taotoken.net/api" wire_api = "responses" requires_openai_auth = false experimental_bearer_token = "<TAOTOKEN_API_KEY>"几个关键点解释一下。model默认设成deepseek-v4-flash,也就是你codex -p deepseek进来默认用 Flash,Pro 通过-m或会话内/model选。model_catalog_json指向同目录的models.json,注意这里用正斜杠/,Windows 下 TOML 里反斜杠要转义,用正斜杠最省事。requires_openai_auth = false是登录态共存的核心,它告诉 Codex 这个 provider 不走 OpenAI 的 auth.json,而是用下面的 bearer token。experimental_bearer_token填你的 TaoToken Key。
base_url我填的是 TaoToken 的 API 入口,这样 Flash 和 Pro 都走统一 Key,切换模型不用换 Key。如果你更想直连 DeepSeek 官方,把base_url换成https://api.deepseek.com/、experimental_bearer_token换成 DeepSeek 官方 Key 即可,其余结构不变。
3.2 新建 models.json
models.json是 Codex 客户端的模型目录,通过model_catalog_json加载,用来识别模型名称、推理档位、上下文长度和工具能力。根节点是models数组,需要包含 flash 与 pro 两个条目,字段结构完全一致。先放 flash 条目:
{ "models": [ { "slug": "deepseek-v4-flash", "display_name": "DeepSeek-V4-Flash", "description": "Latest frontier agentic coding model.", "default_reasoning_level": "high", "supported_reasoning_levels": [ { "effort": "low", "description": "Fast responses with lighter reasoning" }, { "effort": "high", "description": "Extra high reasoning depth for complex problems" }, { "effort": "max", "description": "Maximum reasoning depth for the hardest problems" } ], "shell_type": "shell_command", "visibility": "list", "minimal_client_version": "0.144.0", "supported_in_api": true, "priority": 1, "support_verbosity": true, "default_verbosity": "low", "apply_patch_tool_type": "freeform", "web_search_tool_type": "text", "supports_search_tool": true, "input_modalities": ["text"], "supports_image_detail_original": false, "truncation_policy": { "mode": "tokens", "limit": 10000 }, "supports_parallel_tool_calls": true, "multi_agent_version": "v2", "use_responses_lite": false, "context_window": 1048576, "max_context_window": 1048576, "reasoning_summary_format": "experimental", "default_reasoning_summary": "none", "supports_reasoning_summaries": true, "prefer_websockets": false, "include_skills_usage_instructions": false, "experimental_supported_tools": [] } ] }然后复制一份 flash 条目,只改 4 处就得到 pro 条目,对照如下:
| 字段 | flash | pro |
|---|---|---|
| slug | deepseek-v4-flash | deepseek-v4-pro |
| display_name | DeepSeek-V4-Flash | DeepSeek-V4-Pro |
| description | Latest frontier agentic coding model. | Most capable frontier agentic coding model. |
| priority | 1 | 2 |
把改好的 pro 条目追加到models数组里,两个条目的visibility都保持"list",这样/model才会同时列出两个模型。priority用 1 和 2 区分默认排序,Flash 在前。
提示:
context_window和max_context_window我按 1048576 填,这是模型目录里的声明值,实际可用上下文以服务端返回为准。如果你发现长上下文任务被截断,先检查这里和truncation_policy的limit。
4. 启动、切换与连通性验证
配置写完,先做两步验证,确认登录态没被破坏、DeepSeek 会话能起来。
第一步,确认 ChatGPT 登录态还在:
codex login status正常应该显示Logged in using ChatGPT。如果这里显示未登录,说明你的主config.toml里还有强制 API 登录的残留配置,回去检查forced_login_method和preferred_auth_method。
第二步,启动 DeepSeek 会话:
codex -p deepseek进入后默认是 Flash。在会话里输入/model,应该能看到DeepSeek-V4-Flash和DeepSeek-V4-Pro两个选项,选 Pro 之后后续消息就用 Pro 跑,这个切换只影响当前会话,重启后回到 profile 默认的 Flash。
如果你想直接以 Pro 启动,用:
codex -p deepseek -m deepseek-v4-pro恢复会话也支持指定 profile:
codex resume --last -p deepseek codex resume <SESSION_ID> -p deepseek恢复成 Pro 就在 resume 命令后加-m deepseek-v4-pro。这里-p deepseek是选 provider,-m可选,缺省就是 Flash。
验证连通性最直接的方式,是在 DeepSeek 会话里发一个需要推理的小任务,比如让它读一个本地文件并解释逻辑,观察是否正常返回、工具调用是否触发。如果返回正常,说明 Key、base_url、wire_api 三者都对上了。想单独验证模型对话能力,也可以走模型对话入口:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。
5. 本篇常见错排查
报错一:API key login is required, but ChatGPT is currently being used. Logging out.
这是最典型的。原因是 DeepSeek 配置直接写进了主config.toml,或者 profile 里带了forced_login_method = "api"/preferred_auth_method = "apikey",导致它和 ChatGPT 共用auth.json时抢登录态。解决方式就是本篇的结构:主config.toml保留 GPT 默认配置不动,DeepSeek 单独放deepseek.config.toml,只通过-p deepseek加载,并且设requires_openai_auth = false。切换 DeepSeek 时不要执行codex logout或重新登录。
报错二:/model里只有 Flash,看不到 Pro
先查models.json里 pro 条目是否真的加进了models数组,再查它的visibility是不是"list"。如果两个都对,检查 Codex 版本是否 ≥ 0.144.0,低版本读不了minimal_client_version声明的模型。
报错三:启动后请求 401 或鉴权失败
八成是experimental_bearer_token没替换成真实 Key,或者 Key 前后带了空格、引号。TOML 里字符串用双引号包住,别把<TAOTOKEN_API_KEY>原样留着。另外确认base_url和 Key 是配套的,TaoToken 的 Key 配 TaoToken 的入口,别混用。
报错四:模型能列出但请求超时
检查base_url是否可达,wire_api = "responses"是否和服务端支持的协议一致。DeepSeek 官方 Responses API 的model参数同时支持deepseek-v4-flash和deepseek-v4-pro,如果你直连官方,确认用的是 Responses 协议而不是 Chat Completions。
报错五:改了配置不生效
Codex 读的是启动时加载的 profile 文件,改完deepseek.config.toml或models.json后要退出当前会话重新codex -p deepseek。会话内/model切换只影响当前会话,不会重载文件。
6. 长期编码与 Agent 场景的接入建议
如果你只是偶尔切一下 DeepSeek 试模型,上面的配置就够了。但如果你打算把 DeepSeek-V4 当成日常编码和 Agent 任务的主力,建议把 Key 和额度管理也收敛一下,避免多个项目各配一份 Key 导致对不上账。TaoToken 的 Coding Plan 就是给这种长期编码场景准备的,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,适合把 Flash 当日常快模型、Pro 当复杂任务模型的分工用法。
接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有针对不同客户端的配置说明,遇到字段对不上时可以对照查。如果你用的是 Claude Code 那套 Anthropic 风格的接入,也有对应页面:https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode-anthropic&utm_campaign=rewrite 。
最后留一个我自己的使用习惯:Flash 用来跑文件读写、批量重构、跑测试这类高频轻推理任务,Pro 留给架构设计、复杂 bug 定位、多文件联动改这种需要深推理的场景。会话内/model热切换的好处就是同一个上下文里可以先 Flash 快速铺开、再切 Pro 收口,不用重开会话丢上下文。配置一次,后面基本不用再动。