验证完成Codex 自定义模型接入

自定义模型已经可以显示、切换并调用。

本次完成了本机模型清单配置、菜单筛选问题定位和各入口验证。Dev S / T / L 0.56 已在 Codex 命令行工具、桌面版测试副本和 VS Code 插件中显示或可切换,实际请求仍使用原始业务模型编号。

模型目录Dev S / T / L 0.56对应实际调用编号 dev-s / dev-t / dev-l
服务入口AI能量庄园模型请求的服务地址http://hub.thinvent.com/v1
已验证入口命令行 / 桌面版 / VS Code三个客户端入口
服务端改动0 项路由与授权保持不变

问题不在模型服务,而在客户端列表过滤。

模型清单和服务入口已经正常工作;这里所说的客户端,是安装在每台电脑上的 Codex 桌面版、VS Code 插件或命令行工具(CLI),不包括服务器、new-api 账号与额度系统或中转站。本机软件在渲染模型菜单前,又按模型编号做了一次动态筛选。

我们保留真实模型编号,只修复“看不见”的入口。

模型清单里有两个关键字段:模型编号字段(slug)负责真实请求,显示名称字段(display_name)负责界面展示。此前 dev-* 已经能被 Codex 调用,但没有通过本地菜单的编号筛选,所以显示名称没有机会出现。现在桌面测试副本和 VS Code 插件已完成对应处理。

  • 根因客户端还有一道“模型编号门禁”,不在名单里的模型不会出现在下拉框。
  • 实际处理模型清单先登记三个模型;桌面版复制出独立测试副本,在副本中放行本地编号筛选;插件单独处理内嵌页面。
  • 调用结果界面显示 Dev S / T / L,服务端仍收到 dev-s / dev-t / dev-l。
  • 维护边界客户端升级可能覆盖补丁,需要重新校验;授权信息不进入分发包。
3 个已验证客户端入口
3 个自定义模型可见可选
0 项服务端配置改动
按电脑客户端补丁维护范围

先明确要做到什么,再定义怎么验收。

本次目标是让三个业务模型在本机可见、可切换、可调用,同时不改变 AI能量庄园现有服务入口、授权和业务路由。

01 / 要做什么

三个模型进入菜单

让 Dev S、Dev T、Dev L 分别对应稳定的 dev-* 业务模型编号。

02 / 不改变什么

服务端保持原样

不改 AI能量庄园服务地址、授权、额度和中转站业务路由。

03 / 怎么验收

三个入口都能切换

命令行、桌面版和 VS Code 插件都能看到模型并完成切换。

04 / 还要确认

实际请求编号正确

界面名称可以友好展示,但服务端最终仍收到对应的 dev-* 真实模型编号。

先比较三种可行方案,再验证最合适的一种。

三种方案都能让用户看到可选模型,区别在于改动放在服务器、本机转发程序,还是 Codex 本机菜单。

方案怎么做优点代价 / 本次结论
方案一:服务端别名转换备选方案 本机使用已经允许显示的编号作为菜单别名,中转站收到后再转换成真正的 dev-* 业务模型。 不需要修改每台电脑上的 Codex。 服务器、日志和统计要同时维护“别名”和“真实编号”。本次未采用。
方案二:本机转发改写备选方案 本机运行转发程序,在请求发往服务器前,把请求中的模型字段改成真实的 dev-* 编号。 不改 Codex 本体,服务器仍能按真实编号处理。 每台电脑都要运行、启动和排查转发程序。本次未采用。
方案三:放开本机菜单过滤本次采用并验证 保留官方桌面版不动,复制同版本程序到本机测试目录,只在测试副本中取消按模型编号拦截;模型清单仍决定哪些条目显示。 显示名称、实际编号和日志统计保持一致,不增加服务器映射。 桌面版和插件需要分别处理,客户端升级后要重新校验。
选择方案三的原因:它最贴合当前目标:用户看到的是友好名称,服务端收到的仍是原有真实编号;同时不改服务端,也不要求每台电脑常驻转发程序。

先验证“能不能调用”,再定位“为什么看不见”。

验证先从最基础的命令行开始,再对比桌面版和 VS Code 插件的菜单表现,最后确认服务端实际收到的模型编号。

为什么这样验证:先确认服务端和模型清单没有问题,才能把“模型不显示”准确归因到本机菜单,而不是误改服务器配置。
01 / 基础验证

命令行列出并调用

读取模型清单文件 models.json,确认三个模型能被识别,并能向 AI能量庄园发起请求。

02 / 现象复现

桌面菜单仍缺少模型

同一套配置在桌面版中无法看到 dev-*,说明问题发生在显示入口。

03 / 根因定位

本机又筛选了一次

动态模型筛选名单(available_models)按编号拦截条目,显示名称因此没有机会出现。

04 / 调用确认

核对服务端收到的编号

切换模型后确认请求仍使用对应的 dev-* 真实模型编号。

定位结论:模型已经登记并能正常调用,真正拦截它的是本机菜单的编号筛选;改显示名称本身不能绕过这道筛选。

按验证结果处理两件事:补充清单,再放行菜单。

服务器继续负责实际路由,本机只补齐模型清单和模型菜单入口。桌面版采用“复制后处理”:保留官方安装版,复制同版本程序到本机测试目录,只修改测试副本中的 app\resources\app.asar(桌面程序打包资源文件)里的本地筛选逻辑;授权、服务入口和真实模型编号都没有被替换。

先看懂三个本地部分。 模型清单文件 models.json 不是登录文件,而是 Codex 的“模型清单”。三个部分分别回答:列表里有哪些模型、从哪里读取清单、哪些模型允许出现在菜单里。
01 / 模型清单

模型清单文件 models.json

做什么:给 Codex 的模型菜单提供条目。每条记录包含真实模型编号和界面显示名称,例如 dev-s-0.56x 对应 Dev S 0.56X

为什么加:服务器能调用模型,不代表本地菜单已经登记了它;没有这条记录,桌面版就没有可显示、可切换的对象。

分发文件是公司提供的模型清单 models.json,安装时先备份本机文件(如果存在),再直接覆盖或创建 ~/.codex/models.json。Windows 中它通常对应当前用户目录下的 .codex\models.json,不与本机旧模型合并。

02 / Codex 总设置

Codex 配置文件 config.toml

做什么:告诉 Codex 使用哪个模型清单、默认选哪个模型,以及请求发往哪个服务入口。

为什么改:让客户端确实读到新增清单并使用指定默认模型;服务地址、登录状态和授权信息保持原样。

本次关注的设置是 model_catalog_json(清单位置)和 model(默认模型)。

03 / 本地菜单筛选

本地模型筛选 available_models

做什么:Codex 在读完模型清单后,还会按模型编号再筛选一次,只有通过的条目才进入下拉菜单。

为什么要处理:dev-* 虽然已经写入清单,却被这道本地筛选挡住,导致名称仍然不显示。本次对桌面测试副本和 VS Code 插件分别处理。

插件的实际改动:脚本定位当前已安装的 openai.chatgpt 插件,在其 webview\assets 内嵌页面脚本中先创建 .company-original 备份,再把“按模型编号过滤”的判断改为只保留“是否隐藏”的判断。这样三个模型可以进入菜单,同时仍遵守模型清单中的隐藏设置。

它不是服务器配置,也不是 API 密钥(API Key);只影响本机菜单是否显示。

服务端提供可调用模型模型清单文件 models.json 登记本地模型筛选放行菜单可见、可切换

已执行的改动

  1. 准备模型清单使用公司提供的 models.json 作为唯一模型目录,安装时备份并覆盖本机文件;模型列表和显示规则以该文件及 Codex 客户端规则为准。
  2. 让 Codex 读取清单在 Codex 配置文件 config.toml 中指定清单位置和默认模型,保留服务地址与授权。
  3. 处理桌面版读取 Microsoft Store 安装目录,复制到 %LOCALAPPDATA%\CodexWhitelistTest\<版本>,定位测试副本的 app\resources\app.asar(桌面程序打包资源文件),先保存为 app.asar.original,再把按模型 ID 判断的筛选条件短路为不生效:跳过 n.has(r.model) 判断,同时保留 !r.hidden 隐藏设置。随后用独立用户目录和“Codex Studio”快捷方式启动。正式版安装目录不改,升级后可按新版本重新构建。
  4. 处理 VS Code 插件找到当前已安装的 openai.chatgpt 插件,在 webview\assets 脚本中备份原文件,再替换按模型编号过滤的判断,保留隐藏状态判断。必须完全退出并重新打开 VS Code,Developer: Reload Window 不会重新加载已缓存的插件资源。
  5. 重启并验证重新打开各入口,确认模型能看到、能切换,实际请求仍使用真实编号。

最终配置关系

可以把下面三项理解成“使用哪个服务、从哪里读模型清单、打开时默认选哪个模型”。

model_provider = "intelalloc"                 # AI能量庄园的内部服务标识
model_catalog_json = "~/.codex/models.json"  # 模型清单文件的位置
model = "dev-l-0.56x"                         # 默认使用的真实模型编号

Dev S 0.56X  ->  dev-s-0.56x       # 界面名称 -> 实际调用编号
Dev T 0.56X  ->  dev-t-0.56x       # 界面名称 -> 实际调用编号
Dev L 0.56X  ->  dev-l-0.56x       # 界面名称 -> 实际调用编号
服务端不变:请求仍然通过服务地址 http://hub.thinvent.com/v1,中转站继续按业务模型编号路由。
桌面版文件级变更:补丁实际写入的是测试副本中的 app\resources\app.asar,不是 Store 安装目录中的原文件,也不是 ChatGPT.exe。脚本只接受当前版本预期的筛选代码特征,匹配不到时会停止;因此升级后需要重新检查,避免误改其他版本资源。

解决之后,三个入口都能看到并切换模型。

截图用于证明方案三已经落地:命令行能识别,桌面版和 VS Code 插件能显示友好名称,并且实际请求仍使用对应的 dev-* 模型编号。

Codex 命令行模型选择器显示 dev-s-0.56x、dev-t-0.56x 和 dev-l-0.56x
证据 01 / Codex 命令行(CLI)

命令行已识别三个自定义模型。

命令行的模型选择器显示原始模型编号;界面中的 current 表示“当前使用”,对应配置的 dev-l-0.56x。这是显示方式差异,不是调用差异。

Codex 桌面版模型菜单显示 Dev S 0.56X、Dev T 0.56X 和 Dev L 0.56X
证据 02 / Codex 桌面版

桌面模型菜单显示友好名称。

保留官方安装版不动,启动经过本地筛选处理的独立测试副本。测试副本使用独立用户目录,模型菜单显示 Dev S 0.56XDev T 0.56XDev L 0.56X,并可直接切换。

VS Code Codex 插件模型菜单显示 Dev S 0.56X、Dev T 0.56X 和 Dev L 0.56X
证据 03 / VS Code 插件

插件模型菜单同步显示并可切换。

补丁定位当前 openai.chatgpt 插件的 webview\assets 内嵌页面脚本,先备份原文件,再去掉按模型编号过滤的判断。完全退出并重新打开 VS Code 后,菜单显示三个名称并可切换。

截图文件随本 HTML 放在同级的截图文件夹 report-assets 中;点击任意截图可查看原始 1920 × 1080 图片。

配置可以复用,客户端适配按平台区分。

模型清单和业务口径一致,但不同客户端的显示层和程序文件位置不同。macOS 后续教程先覆盖命令行工具(CLI)与 VS Code 插件。

入口当前状态适配方式维护边界
Windows Codex 桌面版桌面测试副本已验证自定义名称可见、可切换复制 Microsoft Store 版本到本机测试目录,修改副本的 app\resources\app.asar,跳过模型 ID 白名单判断并保留隐藏设置;用独立用户目录启动,正式版保持不动升级后检查版本并重新构建测试副本
Windows VS Code 插件Codex 的 VS Code 插件已验证模型菜单显示友好名称定位 openai.chatgptwebview\assets 脚本,备份原文件后去掉模型编号过滤,保留隐藏设置插件升级后重新执行补丁,并完全退出再重启 VS Code
Codex 命令行(CLI)Windows / macOS 均适用已验证可查看和切换模型直接读取当前用户的 Codex 配置文件命令行可能显示原始模型编号,这是正常现象
macOS 桌面应用官方产品存在暂不纳入本次分发当前没有 Mac 环境验证后续单独适配 macOS 应用文件(.app)和应用签名教程先覆盖命令行工具 + VS Code 插件,不复用 Windows 补丁

哪些内容会变化,哪些内容不会变化?

这部分用于说明上线后的维护成本,避免把客户端补丁误认为服务端改造。

会变化:客户端资源

桌面版升级后,旧测试副本不会自动变成新版本;快捷方式会检查版本,发现升级时重新复制、备份并构建。插件升级后,webview\assets 会被替换,需要重新执行补丁;脚本会保留原文件备份并在版本签名不匹配时停止。正式版安装目录保持不改。

不会变化:服务端路由

服务入口地址、授权、额度、日志和中转站业务路由不因本地显示补丁改变。

不会分发:敏感信息

模型清单和脚本不包含登录凭据文件(auth.json)、API 密钥或个人授权信息,每台电脑独立保留登录状态。

补充:为什么重启、清缓存和删除旧任务没有解决问题?

这些操作只会重新加载同一套配置或历史数据,无法改变本机软件内置的动态模型筛选名单(available_models)。问题定位到本地显示逻辑后,只有处理客户端资源或改用服务器别名映射,才能改变模型是否进入选择器。