Codex客户端ChatGPT不显示模型5.6的解决办法
原标题:解决codex新客户端ChatGPT不显示5.6的解决办法
速览
该办法利用CMD封装PowerShell脚本,自动解包并修改ChatGPT Codex桌面版app.asar文件中的JS逻辑,将模型下拉菜单的白名单限制移除,使所有隐藏模型(如5.6)得以显示。脚本还实现了版本检测、自动升级补丁等功能,不需要修改原版Store应用。
AI 深度解读
背景
OpenAI 为 ChatGPT 推出了基于微软商店(Microsoft Store)分发的桌面客户端,名为 OpenAI.Codex(通常称为 Codex)。这一客户端在 Windows 上通过 Store 机制安装,并由 Statsig 等特征标记(feature flag)系统控制模型可见性。部分用户发现,在较新的版本(如 v5.6)中,模型下拉菜单不再显示所有可用模型,而是仅展示 Statsig 白名单(available_models)所列的模型。这导致用户无法直接访问尚未被官方纳入白名单的模型(如 GPT-4 的某些变体或第三方托管模型)。社区用户(主要来自 LINUX DO 论坛)通过逆向工程和补丁方式解决了这一问题,制作了一键执行的 CMD 脚本,使得模型选择恢复为基于目录(catalog)中未隐藏模型的显示逻辑。
核心内容
该解决方案是一个自包含的 CMD 可执行文件(Install-ChatGPT-Codex-CatalogPatch.zip),内部嵌入了一个经过 Base64 编码的 PowerShell 安装器。其工作原理和操作流程如下:
结构设计
- CMD 外壳 + 内嵌 PowerShell 安装器:CMD 文件本身是外壳程序,内部保存了完整 PowerShell 脚本的 Base64 字符串。
- 执行流程:
- 双击 CMD 文件后,CMD 将 Base64 内容解码并写入
%TEMP%目录下的临时 PS1 文件。 - 调用该临时 PS1 执行安装操作。
- 安装完成后删除临时 PS1 文件。
- 双击 CMD 文件后,CMD 将 Base64 内容解码并写入
- Base64 用途:仅用于将两份文件(CMD 和 PS1)封装成单个可执行文件,并非加密。
PowerShell 安装器的工作步骤
- 查找安装目录:通过
Get-AppxPackage OpenAI.Codex命令获取当前微软商店版 Codex 的安装路径(通常是受保护的应用包目录)。 - 解密复制应用文件:将受保护的 AppX 应用文件解密并复制到用户目录下的
%LOCALAPPDATA%\Programs\ChatGPT-Codex-Patched-<版本号>中。此步骤是因为 Store 应用的原始文件受到系统保护,无法直接修改。 - 解包 app.asar:利用 Codex 自带的 Node.js 和 npm 临时加载
@electron/asar包,解压缩app.asar文件(Electron 应用的主打包文件)。 - 修改模型过滤逻辑:在解包后的 JavaScript 文件中,寻找包含以下逻辑的代码段:
将其替换为:if(u?n.has(r.model):!r.hidden)if(!r.hidden)- 原逻辑中,
u?n.has(r.model)部分使用了 Statsig 的available_models白名单(u?n代表某个条件或函数,has(r.model)检查当前模型是否在白名单内)。修改后彻底移除白名单限制,仅根据r.hidden属性决定是否显示模型(!r.hidden表示仅隐藏目录中标记为隐藏的模型,所有未隐藏的模型都会显示)。
- 原逻辑中,
- 重新打包:使用
@electron/asar将修改后的文件重新打包为app.asar。 - 校验:逐项对比原包和补丁包的文件数量以及 unpacked 模式状态,确保没有文件丢失或异常。
- 关闭原进程:CMD 脚本会尝试正常关闭 Store 版 Codex 进程;如果进程未响应,则强制结束。
- 启动补丁版:执行用户目录中补丁后的可执行文件,启动修改版的 ChatGPT。
版本更新自动适配
- 补丁版本号基于原始 Store 应用的版本号。当用户再次双击同版本的 CMD 文件时,脚本检测到对应补丁已存在(通过目录是否存在判断),跳过复制和打包步骤,直接关闭 Store 版并启动现有补丁版。
- 当 Store 版 Codex 自动更新到新版本后,由于安装目录包含版本号,脚本会为新版本自动重新创建补丁(因为旧补丁目录的版本号不匹配,脚本视为未安装)。
关键要点
- Base64 封装:CMD 文件将 PowerShell 脚本压缩为 Base64 字符串,使得最终用户只需双击一个文件即可完成所有操作,无需手动下载或执行多个脚本。
- 核心修改逻辑:将
if(u?n.has(r.model):!r.hidden)改为if(!r.hidden),完全移除 Statsig 白名单过滤,只保留基于目录的隐藏属性筛选。 - Store 应用保持原样:补丁仅在用户目录下创建副本,原始 Store 安装包不受任何修改,确保卸载或重装后系统不会残留。
- 自愈式升级处理:通过检测补丁目录版本号与当前 Store 版本号是否一致,自动判断是否需要为新版本重新制作补丁;若版本号不匹配则视为未安装,触发完整补丁流程。
- 临时环境使用自带的 Node:解包和打包操作依赖 Codex 本身附带的 Node.js 和 npm,无需用户额外安装开发环境。
- 进程管理:脚本确保在启动补丁版之前正确关闭 Store 版进程,避免冲突;同时针对无法正常退出的进程使用强制结束。
意义与影响
- 用户自主权增强:该补丁让用户能够绕过开发者通过 Statsig 施加的模型可见性限制,直接访问目录中存在的所有模型(包括非官方或实验性模型)。对于希望测试不同模型或使用本地推理工具的开发者而言,这一点尤为关键。
- 社区协作的范例:该项目源自多个论坛用户(LINUX DO)的技术讨论和代码贡献,最终整合为一键式工具,体现了社区协作解决实际问题的能力。补丁原理清晰,便于其他开发者理解和改进。
- 风险与注意事项:修改 app.asar 属于非官方行为,可能违反 OpenAI 的服务条款;同时补丁版本不受官方更新机制保护,Store 版更新后需要重新执行补丁。脚本中的强制结束进程操作可能影响未保存的数据,但实际情况中 ChatGPT 客户端在关闭前通常会触发保存。
- 技术方法论价值:该方案展示了如何对 Electron 应用(尤其是 Store 分发的受保护应用)进行逆向分析和动态补丁:通过解密复制应用文件、修改 JavaScript 逻辑、重新打包,并利用应用自带的 Node 环境完成操作。这种方法对其他需要定制第三方 Store 应用的用户具有参考意义。
- 对未来版本的影响:若 OpenAI 在后续版本中更改模型筛选逻辑(例如完全移除白名单或采用不同的实现方式),本补丁可能失效;但社区完全可以根据新的源码再次修改。同时,该补丁的存在也促使官方更透明地讨论模型可见性策略。
查看原文 →linux.do
