☰
Codex 桌面端自定义模型:接入 DeepSeek V4.1 Flash,和 GPT-6.1 Sol 在同一个下拉框里随时切(不用 CC Switch,0.159 实测)
2026/10/3 16:31:22 网站建设 项目流程

本文所有命令和输出,都是 2026-09-30 在 Codex 桌面端(Mac,应用版本 26.928,内置引擎 codex 0.159.2)上实测的原样结果。

先说结论

最近被问得最多的问题:Codex 桌面端能不能用 DeepSeek?能不能和 GPT 来回切?

能,而且不用装 CC Switch,也不用在本地跑桥接。三步:

  1. 桌面端更新到最新版
  2. config.toml里配一个同时有 GPT 和 DeepSeek 的服务商
  3. 跑一个脚本,把 DeepSeek 加进模型目录,然后完全退出、重新打开

之后输入框下面的模型下拉里,GPT-6.1 Sol 和 DeepSeek V4.1 Flash 就排在一起了。同一个对话里也能换,前面聊过的内容会带过去。

1. 先搞懂两件事,后面的坑就都懂了

第一,桌面端和命令行共用一套配置。桌面端里干活的就是 Codex 命令行那个引擎(我这台 Mac 上在/Applications/ChatGPT.app/Contents/Resources/codex-cli/下面,版本 0.159.2),读的也是同一个~/.codex/config.toml。所以命令行教程里的配置,在桌面端一样生效。

第二,下拉框里有哪些模型,全看「模型目录」。Codex 自带一份目录,里面是 GPT-6.1 Sol、Astra 这些官方模型。DeepSeek 不在里面,要自己加。

坑在这里:用model_catalog_json指定自己的目录时,它会把自带目录整个替换掉,不是往里追加(Codex 官方仓库的 issue #29156 里也有人踩到)。

下面是我用桌面端引擎的model/list接口(桌面端的模型下拉读的就是它)查出来的三种情况:

中间那种最常见:目录是几周前导出的,后来桌面端更新了,自带目录里多了 GPT-6.1 Sol,可你的旧目录把它盖住了,下拉框里就没有。

所以正确做法是:用你当前版本的 Codex 导出它自带的目录,再往里加一条 DeepSeek。桌面端每次大版本更新之后,重新做一遍。

2. 第 0 步:先把桌面端更新到最新

老版本导出来的自带目录里没有 GPT-6 系列。我这台机器更新前的内置引擎是 0.145,导出来只有 GPT-5.6 那一代。先更新,再往下做。

3. 第 1 步:配置服务商和 key

打开~/.codex/config.toml(Windows 是%USERPROFILE%\.codex\config.toml,没有就新建)。本文以 wanapis 为例,换成你用的服务商地址即可。在文件最上面写:

model_provider = "wanapis" model = "gpt-6.1-sol" model_catalog_json = "/Users/你的用户名/.codex/models.json" [model_providers.wanapis] name = "wanapis" base_url = "https://api.wanapis.com/v1" wire_api = "responses" requires_openai_auth = true

key 放在~/.codex/auth.json,整个文件只有这一行:

{"OPENAI_API_KEY": "sk-你在服务商后台拿到的key"}

几个容易错的地方:

  • model_catalog_json必须写在最上面,任何[xxx]小节之前;写到[model_providers.wanapis]下面,就成了那个小节的字段,不生效。路径要写绝对路径。
  • wire_api只能写responses。服务商要原生支持 Responses 协议,Codex 才能直连;不支持的才需要 CC Switch 这类工具在本地转协议。
  • 原来配置里的其他内容(MCP、projects 之类)不用动,这几行加在最上面就行。
  • 上下文窗口在目录里按模型单独写,不要在config.toml里写全局的model_context_window,它不分模型。

为什么 key 不用环境变量:从 Dock 或启动台打开的桌面 App 读不到你在~/.zshrc里 export 的变量,命令行里好好的,桌面端一跑就 401。requires_openai_auth = true会让 Codex 带上auth.json里的这个 key。

如果你之前在桌面端登录过 ChatGPT 账号,auth.json里存的是账号的登录信息,先备份一份再改,想切回官方账号的时候换回来。

4. 第 2 步:把 DeepSeek 加进下拉框

方法一:跑脚本(推荐)

把下面的代码存成add_deepseek.py,然后执行:

python3 add_deepseek.py
#!/usr/bin/env python3 """把 DeepSeek V4.1 Flash 加进 Codex 桌面端的模型下拉框。 用法:python3 add_deepseek.py [codex 可执行文件路径]""" import copy, json, os, shutil, subprocess, sys, time CANDIDATES = ["/Applications/ChatGPT.app/Contents/Resources/codex-cli/bin/codex", # Mac 桌面端(2026-09 新版) "/Applications/ChatGPT.app/Contents/Resources/codex", # Mac 桌面端(旧版) "/Applications/Codex.app/Contents/Resources/codex"] cx = sys.argv[1] if len(sys.argv) > 1 else (next((p for p in CANDIDATES if os.path.exists(p)), None) or shutil.which("codex")) if not cx: sys.exit("没找到 codex:把可执行文件的路径作为参数传进来,或者先装命令行版 npm i -g @openai/codex") # 1. 导出你这个版本自带的模型目录,GPT-6.1 Sol 这些官方模型一个不少 out = subprocess.run([cx, "debug", "models", "--bundled"], capture_output=True, text=True) if out.returncode != 0: sys.exit("导出模型目录失败:\n" + out.stderr[-500:]) catalog = json.loads(out.stdout) models = [m for m in catalog["models"] if m["slug"] != "deepseek-v4.1-flash"] # 2. 复制 gpt-5.5 那一条改成 DeepSeek(别复制 GPT-6 系列的:它们走 code_mode,DeepSeek 接不住) base = next((m for m in models if m["slug"] == "gpt-5.5"), None) \ or next((m for m in models if m.get("tool_mode") != "code_mode_only"), None) if base is None: sys.exit("这个版本的目录里找不到能当模板的条目,请用文章里的手动方法") ds = copy.deepcopy(base) for k in ("service_tiers", "additional_speed_tiers", "availability_nux", "upgrade", "model_messages", "tool_mode", "multi_agent_version", "multi_agent_reasoning_effort"): ds.pop(k, None) ds.update({ "slug": "deepseek-v4.1-flash", # 必须和服务商那边的模型名一字不差 "display_name": "DeepSeek V4.1 Flash", # 下拉框里显示的名字 "description": "DeepSeek V4.1 Flash", "visibility": "list", # list = 出现在下拉框里 "priority": 5, # 越小越靠前:5 = 排在 GPT-6 系列后面;改成 0 会排第一并变成默认模型 "input_modalities": ["text"], # DeepSeek 不看图,别让桌面端把截图发给它 "use_responses_lite": False, "context_window": 272000, "default_reasoning_level": "high", "supported_reasoning_levels": [{"effort": "low", "description": "Faster"}, {"effort": "high", "description": "Think more"}], }) catalog["models"] = [ds] + models # 3. 写到 ~/.codex/models.json,原来的先备份 home = os.path.join(os.path.expanduser("~"), ".codex") os.makedirs(home, exist_ok=True) path = os.path.join(home, "models.json") if os.path.exists(path): bak = path + time.strftime(".bak-%Y%m%d-%H%M%S") shutil.copy(path, bak) print("原来的目录已备份到", bak) with open(path, "w", encoding="utf-8") as f: json.dump(catalog, f, ensure_ascii=False, indent=1) shown = [m["slug"] for m in sorted(catalog["models"], key=lambda m: m.get("priority", 99)) if m.get("visibility") == "list"] print("已写入", path) print("下拉框里会有 %d 个模型:%s" % (len(shown), "、".join(shown))) print("\nconfig.toml 最上面(任何 [xxx] 小节之前)要有这一行:") print("model_catalog_json = '%s'" % path) print("\n然后完全退出 Codex 桌面端(Mac 上 Cmd+Q)再打开。")

跑完是这样:

为什么复制 gpt-5.5 而不是 GPT-6:GPT-6 系列的条目里写着tool_mode: code_mode_only,这是专门给 GPT 设计的一套调用工具的方式,DeepSeek 接不住(第 6 节有翻车现场)。gpt-5.5 那条是普通的工具调用,DeepSeek 用起来没问题,改文件也走和 GPT 一样的apply_patch。

Windows 上脚本找不到 Mac 的路径,先装命令行版npm i -g @openai/codex,脚本会自动用它。我手上只有 Mac,Windows 这一步没有实测。

方法二:手动加(电脑上没有 Python 时)

先导出自带目录:

"/Applications/ChatGPT.app/Contents/Resources/codex-cli/bin/codex" debug models --bundled > ~/.codex/models.json

再打开~/.codex/models.json,在"models": [后面粘上下面这一段,注意末尾的逗号:

{ "slug": "deepseek-v4.1-flash", "display_name": "DeepSeek V4.1 Flash", "description": "DeepSeek V4.1 Flash", "base_instructions": "You are Codex, a coding assistant. Complete the user's task carefully, use available tools as needed, preserve unrelated changes, and verify your work. Never expose credentials.", "default_reasoning_level": "low", "supported_reasoning_levels": [{"effort": "low", "description": "Default reasoning"}], "shell_type": "shell_command", "visibility": "list", "supported_in_api": true, "priority": 5, "prefer_websockets": false, "support_verbosity": false, "supports_parallel_tool_calls": false, "supports_search_tool": false, "experimental_supported_tools": [], "input_modalities": ["text"], "context_window": 128000, "truncation_policy": {"mode": "tokens", "limit": 10000}, "use_responses_lite": false },

这是精简版:字段少,改文件走 shell 命令,不走apply_patch。实测和方法一一样能过全部测试题。粘完可以用python3 -m json.tool ~/.codex/models.json > /dev/null检查一下有没有粘坏。

5. 第 3 步:完全退出,再打开

Mac 上按 Cmd+Q(只关窗口不算),再打开。输入框下面的模型下拉里就有 DeepSeek V4.1 Flash 了。

怎么切:点输入框右下角的模型名(比如「DeepSeek V4.1 Flash 轻度」)。先弹出来的是思考强度;再点浮层最上面那行模型名,才是上图的模型列表。选一个,下一条消息就用它。下拉里官方模型的名字会被缩写成「6.1 Sol」「6 Astra」这样。

同一个对话里也能换:GPT 和 DeepSeek 走的是同一个服务商,Codex 支持对话中途换模型;换服务商才不行(issue #29156 说的就是这个)。我用桌面端同款引擎实测:先让 GPT-6.1 Sol 记一个暗号,再切到 DeepSeek 问,答得出来;反过来也一样。

有一点要知道:中途换模型时,Codex 会先把前面的对话压缩成一段摘要再交给新模型(桌面端里显示「上下文已自动压缩」,命令行里是context compacted);命令行里还会多一句提示「这个会话是用另一个模型录的」。暗号这种关键信息记得住,长对话里的细节可能会丢一些。换完模型,把要紧的约束再说一遍最稳;要做一件全新的事,干脆开个新对话。

在桌面端里实际操作一遍是这样(会话日志里,第一轮的模型是 gpt-6.1-sol,第二轮是 deepseek-v4.1-flash):

6. 实测:DeepSeek 在桌面端能不能真干活

光能聊天没用,得能跑命令、改文件。我用桌面端自带的引擎(0.159.2,带上桌面端启动时的同一组开关),拿 4 道带隐藏测试用例的小题测了一遍:修 bug、按注释实现函数、找根因、加命令行参数。

表里最后一行是很多老教程的做法:把 GPT-6 的条目复制一份改个名字。DeepSeek 会把调用工具的指令当成文字吐出来,然后就停了,一个文件都没改:

如果你在桌面端看到 DeepSeek 的回复里冒出一串<||DSML|| calls>,就是这个原因,换成本文的条目。

7. 常见问题

加完 DeepSeek,GPT-6.1 Sol 不见了?自定义目录是替换不是追加,重新跑一遍第 2 步。桌面端每次大版本更新之后都要重跑,不然新出的官方模型进不了下拉框。

下拉框里还是没有 DeepSeek?按顺序查:① 没有完全退出(Cmd+Q);②model_catalog_json没写在config.toml最上面;③ 路径不是绝对路径;④models.json粘坏了,用上面那条json.tool命令检查。

报 401 Unauthorized?key 不对,或者auth.json里还是 ChatGPT 账号的登录信息。

切到 DeepSeek 报「分组 xxx 下模型 xxx 无可用渠道」?你的 key 所在的分组里没有这个模型。比如 key 建在只开了 GPT 的分组里,GPT 能用、一切到 DeepSeek 就报这个。建 key 时选一个同时包含 GPT 和 DeepSeek 的分组(比如自动、默认这类分组)。

能给 DeepSeek 发截图吗?条目里只开了文本输入,图片能不能通我没测。要看图就切回 GPT。

思考强度选 low 还是 high?同一道题实测两档差别很小,默认就行。

想让 GPT 用 ChatGPT 会员的额度、DeepSeek 走第三方,能在一个下拉框里切吗?目前不行。两个服务商之间桌面端没有切换入口(issue #29156 还开着),只能改配置再重启。想在一个下拉框里随便切,GPT 和 DeepSeek 得在同一个服务商下面。

附:最终配置

~/.codex/config.toml最上面:

model_provider = "wanapis" model = "gpt-6.1-sol" model_catalog_json = "/Users/你的用户名/.codex/models.json" [model_providers.wanapis] name = "wanapis" base_url = "https://api.wanapis.com/v1" wire_api = "responses" requires_openai_auth = true

~/.codex/auth.json:

{"OPENAI_API_KEY": "sk-你在服务商后台拿到的key"}

~/.codex/models.json:用第 2 步的脚本生成。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询