From 7fddb63ab9ffb826eee514e791ac923067938a04 Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Sat, 14 Feb 2026 06:14:19 +0700 Subject: [PATCH 1/6] feat(codex): add gpt-5.3 preset defaults --- config/base-codex.settings.json | 8 ++++---- src/cliproxy/model-catalog.ts | 6 +++--- ui/src/lib/model-catalogs.ts | 14 +++++++------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/config/base-codex.settings.json b/config/base-codex.settings.json index cf2915ad..b64fe8a4 100644 --- a/config/base-codex.settings.json +++ b/config/base-codex.settings.json @@ -2,9 +2,9 @@ "env": { "ANTHROPIC_BASE_URL": "http://127.0.0.1:8317/api/provider/codex", "ANTHROPIC_AUTH_TOKEN": "ccs-internal-managed", - "ANTHROPIC_MODEL": "gpt-5.1-codex-max", - "ANTHROPIC_DEFAULT_OPUS_MODEL": "gpt-5.1-codex-max-high", - "ANTHROPIC_DEFAULT_SONNET_MODEL": "gpt-5.1-codex-max", - "ANTHROPIC_DEFAULT_HAIKU_MODEL": "gpt-5.1-codex-mini-high" + "ANTHROPIC_MODEL": "gpt-5.3-codex", + "ANTHROPIC_DEFAULT_OPUS_MODEL": "gpt-5.3-codex", + "ANTHROPIC_DEFAULT_SONNET_MODEL": "gpt-5.3-codex", + "ANTHROPIC_DEFAULT_HAIKU_MODEL": "gpt-5.3-codex" } } diff --git a/src/cliproxy/model-catalog.ts b/src/cliproxy/model-catalog.ts index 6948a2e7..9db262ac 100644 --- a/src/cliproxy/model-catalog.ts +++ b/src/cliproxy/model-catalog.ts @@ -160,11 +160,11 @@ export const MODEL_CATALOG: Partial> = codex: { provider: 'codex', displayName: 'Copilot Codex', - defaultModel: 'gpt-5.2-codex', + defaultModel: 'gpt-5.3-codex', models: [ { - id: 'gpt-5.2-codex', - name: 'GPT-5.2 Codex', + id: 'gpt-5.3-codex', + name: 'GPT-5.3 Codex', description: 'Full reasoning support (xhigh)', thinking: { type: 'levels', diff --git a/ui/src/lib/model-catalogs.ts b/ui/src/lib/model-catalogs.ts index 87bce4bd..48e98035 100644 --- a/ui/src/lib/model-catalogs.ts +++ b/ui/src/lib/model-catalogs.ts @@ -133,16 +133,16 @@ export const MODEL_CATALOGS: Record = { codex: { provider: 'codex', displayName: 'Codex', - defaultModel: 'gpt-5.2-codex', + defaultModel: 'gpt-5.3-codex', models: [ { - id: 'gpt-5.2-codex', - name: 'GPT-5.2 Codex', + id: 'gpt-5.3-codex', + name: 'GPT-5.3 Codex', description: 'Full reasoning support (xhigh)', presetMapping: { - default: 'gpt-5.2-codex', - opus: 'gpt-5.2-codex', - sonnet: 'gpt-5.2-codex', + default: 'gpt-5.3-codex', + opus: 'gpt-5.3-codex', + sonnet: 'gpt-5.3-codex', haiku: 'gpt-5-mini', }, }, @@ -152,7 +152,7 @@ export const MODEL_CATALOGS: Record = { description: 'Fast, capped at high reasoning (no xhigh)', presetMapping: { default: 'gpt-5-mini', - opus: 'gpt-5.2-codex', + opus: 'gpt-5.3-codex', sonnet: 'gpt-5-mini', haiku: 'gpt-5-mini', }, From d6aa1d90a6d7722829f5cdb0d9208a22fc4ae7e3 Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Sat, 14 Feb 2026 06:15:31 +0700 Subject: [PATCH 2/6] feat(codex): keep gpt-5.2 catalog entry --- src/cliproxy/model-catalog.ts | 11 +++++++++++ ui/src/lib/model-catalogs.ts | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/cliproxy/model-catalog.ts b/src/cliproxy/model-catalog.ts index 9db262ac..a3f75b24 100644 --- a/src/cliproxy/model-catalog.ts +++ b/src/cliproxy/model-catalog.ts @@ -173,6 +173,17 @@ export const MODEL_CATALOG: Partial> = dynamicAllowed: false, }, }, + { + id: 'gpt-5.2-codex', + name: 'GPT-5.2 Codex', + description: 'Previous stable Codex model', + thinking: { + type: 'levels', + levels: ['medium', 'high', 'xhigh'], + maxLevel: 'xhigh', + dynamicAllowed: false, + }, + }, { id: 'gpt-5-mini', name: 'GPT-5 Mini', diff --git a/ui/src/lib/model-catalogs.ts b/ui/src/lib/model-catalogs.ts index 48e98035..9d31f3bb 100644 --- a/ui/src/lib/model-catalogs.ts +++ b/ui/src/lib/model-catalogs.ts @@ -146,6 +146,17 @@ export const MODEL_CATALOGS: Record = { haiku: 'gpt-5-mini', }, }, + { + id: 'gpt-5.2-codex', + name: 'GPT-5.2 Codex', + description: 'Previous stable Codex model', + presetMapping: { + default: 'gpt-5.2-codex', + opus: 'gpt-5.2-codex', + sonnet: 'gpt-5.2-codex', + haiku: 'gpt-5-mini', + }, + }, { id: 'gpt-5-mini', name: 'GPT-5 Mini', From 164d1953679392772506defc6024cf514fbbb188 Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Sat, 14 Feb 2026 06:21:56 +0700 Subject: [PATCH 3/6] fix(codex): preserve xhigh default effort for gpt-5.3 --- config/base-codex.settings.json | 4 ++-- src/cliproxy/model-config.ts | 6 +++++- src/cliproxy/services/variant-settings.ts | 4 +++- ui/src/lib/model-catalogs.ts | 4 ++-- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/config/base-codex.settings.json b/config/base-codex.settings.json index b64fe8a4..fbf1314a 100644 --- a/config/base-codex.settings.json +++ b/config/base-codex.settings.json @@ -4,7 +4,7 @@ "ANTHROPIC_AUTH_TOKEN": "ccs-internal-managed", "ANTHROPIC_MODEL": "gpt-5.3-codex", "ANTHROPIC_DEFAULT_OPUS_MODEL": "gpt-5.3-codex", - "ANTHROPIC_DEFAULT_SONNET_MODEL": "gpt-5.3-codex", - "ANTHROPIC_DEFAULT_HAIKU_MODEL": "gpt-5.3-codex" + "ANTHROPIC_DEFAULT_SONNET_MODEL": "gpt-5.3-codex-high", + "ANTHROPIC_DEFAULT_HAIKU_MODEL": "gpt-5-mini" } } diff --git a/src/cliproxy/model-config.ts b/src/cliproxy/model-config.ts index 1442a93a..8e1644a2 100644 --- a/src/cliproxy/model-config.ts +++ b/src/cliproxy/model-config.ts @@ -142,6 +142,10 @@ export async function configureProviderModel( // Get base env vars for defaults const baseEnv = getClaudeEnvVars(provider); + const codexSonnetModel = + provider === 'codex' && !selectedModel.match(/-(xhigh|high|medium)$/) + ? `${selectedModel}-high` + : selectedModel; // Read existing settings to preserve user customizations let existingSettings: Record = {}; @@ -165,7 +169,7 @@ export async function configureProviderModel( ANTHROPIC_AUTH_TOKEN: baseEnv.ANTHROPIC_AUTH_TOKEN || '', ANTHROPIC_MODEL: selectedModel, ANTHROPIC_DEFAULT_OPUS_MODEL: selectedModel, - ANTHROPIC_DEFAULT_SONNET_MODEL: selectedModel, + ANTHROPIC_DEFAULT_SONNET_MODEL: codexSonnetModel, ANTHROPIC_DEFAULT_HAIKU_MODEL: baseEnv.ANTHROPIC_DEFAULT_HAIKU_MODEL || '', }; diff --git a/src/cliproxy/services/variant-settings.ts b/src/cliproxy/services/variant-settings.ts index 211ff95c..3dd93b4d 100644 --- a/src/cliproxy/services/variant-settings.ts +++ b/src/cliproxy/services/variant-settings.ts @@ -44,13 +44,15 @@ function buildSettingsEnv( port: number = CLIPROXY_DEFAULT_PORT ): SettingsEnv { const baseEnv = getClaudeEnvVars(provider as CLIProxyProvider, port); + const codexSonnetModel = + provider === 'codex' && !model.match(/-(xhigh|high|medium)$/) ? `${model}-high` : model; return { ANTHROPIC_BASE_URL: baseEnv.ANTHROPIC_BASE_URL || '', ANTHROPIC_AUTH_TOKEN: baseEnv.ANTHROPIC_AUTH_TOKEN || '', ANTHROPIC_MODEL: model, ANTHROPIC_DEFAULT_OPUS_MODEL: model, - ANTHROPIC_DEFAULT_SONNET_MODEL: model, + ANTHROPIC_DEFAULT_SONNET_MODEL: codexSonnetModel, ANTHROPIC_DEFAULT_HAIKU_MODEL: baseEnv.ANTHROPIC_DEFAULT_HAIKU_MODEL || model, }; } diff --git a/ui/src/lib/model-catalogs.ts b/ui/src/lib/model-catalogs.ts index 9d31f3bb..2559cffe 100644 --- a/ui/src/lib/model-catalogs.ts +++ b/ui/src/lib/model-catalogs.ts @@ -142,7 +142,7 @@ export const MODEL_CATALOGS: Record = { presetMapping: { default: 'gpt-5.3-codex', opus: 'gpt-5.3-codex', - sonnet: 'gpt-5.3-codex', + sonnet: 'gpt-5.3-codex-high', haiku: 'gpt-5-mini', }, }, @@ -153,7 +153,7 @@ export const MODEL_CATALOGS: Record = { presetMapping: { default: 'gpt-5.2-codex', opus: 'gpt-5.2-codex', - sonnet: 'gpt-5.2-codex', + sonnet: 'gpt-5.2-codex-high', haiku: 'gpt-5-mini', }, }, From 3410c52f7ed0af34428e0265b1ff510e3f3dafdf Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Sat, 14 Feb 2026 06:33:46 +0700 Subject: [PATCH 4/6] fix(codex): preserve sonnet high alias on variant model updates --- src/cliproxy/services/variant-service.ts | 2 +- src/cliproxy/services/variant-settings.ts | 20 ++++++++++++---- .../cliproxy/variant-update-service.test.ts | 24 +++++++++++++++++++ 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/cliproxy/services/variant-service.ts b/src/cliproxy/services/variant-service.ts index a2372961..5915424e 100644 --- a/src/cliproxy/services/variant-service.ts +++ b/src/cliproxy/services/variant-service.ts @@ -253,7 +253,7 @@ export function updateVariant(name: string, updates: UpdateVariantOptions): Vari existing.port ); } else if (updates.model !== undefined) { - updateSettingsModel(settingsPath, updates.model); + updateSettingsModel(settingsPath, updates.model, existing.provider); } } diff --git a/src/cliproxy/services/variant-settings.ts b/src/cliproxy/services/variant-settings.ts index 3dd93b4d..8dc6425d 100644 --- a/src/cliproxy/services/variant-settings.ts +++ b/src/cliproxy/services/variant-settings.ts @@ -44,8 +44,7 @@ function buildSettingsEnv( port: number = CLIPROXY_DEFAULT_PORT ): SettingsEnv { const baseEnv = getClaudeEnvVars(provider as CLIProxyProvider, port); - const codexSonnetModel = - provider === 'codex' && !model.match(/-(xhigh|high|medium)$/) ? `${model}-high` : model; + const codexSonnetModel = normalizeCodexSonnetModel(provider, model); return { ANTHROPIC_BASE_URL: baseEnv.ANTHROPIC_BASE_URL || '', @@ -57,6 +56,14 @@ function buildSettingsEnv( }; } +function normalizeCodexSonnetModel( + provider: CLIProxyProfileName | undefined, + model: string +): string { + if (provider !== 'codex') return model; + return /-(xhigh|high|medium)$/.test(model) ? model : `${model}-high`; +} + /** * Ensure directory exists */ @@ -268,7 +275,11 @@ export function deleteSettingsFile(settingsPath: string): boolean { /** * Update model in an existing settings file */ -export function updateSettingsModel(settingsPath: string, model: string): void { +export function updateSettingsModel( + settingsPath: string, + model: string, + provider?: CLIProxyProfileName +): void { const fileName = path.basename(settingsPath); if (fileName.startsWith('composite-')) { console.log( @@ -288,9 +299,10 @@ export function updateSettingsModel(settingsPath: string, model: string): void { if (model) { settings.env = settings.env || ({} as SettingsEnv); + const codexSonnetModel = normalizeCodexSonnetModel(provider, model); settings.env.ANTHROPIC_MODEL = model; settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL = model; - settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL = model; + settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL = codexSonnetModel; } else { // Clear model settings to use defaults delete (settings.env as unknown as Record).ANTHROPIC_MODEL; diff --git a/tests/unit/cliproxy/variant-update-service.test.ts b/tests/unit/cliproxy/variant-update-service.test.ts index d23a2e4e..e75c80f7 100644 --- a/tests/unit/cliproxy/variant-update-service.test.ts +++ b/tests/unit/cliproxy/variant-update-service.test.ts @@ -107,4 +107,28 @@ cliproxy: const config = loadOrCreateUnifiedConfig(); expect(config.cliproxy?.variants?.demo?.provider).toBe('codex'); }); + + it('preserves codex sonnet alias on model-only updates', () => { + const toCodex = updateVariant('demo', { + provider: 'codex', + model: 'gpt-5.3-codex', + }); + expect(toCodex.success).toBe(true); + + const settingsPath = path.join(tmpDir, 'gemini-demo.settings.json'); + let settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8')) as { + env: Record; + }; + expect(settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe('gpt-5.3-codex-high'); + + const modelOnly = updateVariant('demo', { model: 'gpt-5.3-codex' }); + expect(modelOnly.success).toBe(true); + + settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8')) as { + env: Record; + }; + expect(settings.env.ANTHROPIC_MODEL).toBe('gpt-5.3-codex'); + expect(settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe('gpt-5.3-codex'); + expect(settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe('gpt-5.3-codex-high'); + }); }); From 41d99788da96b7f59144d391d672d070e34ace00 Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Sat, 14 Feb 2026 06:34:11 +0700 Subject: [PATCH 5/6] fix(codex): type cast provider in model update path --- src/cliproxy/services/variant-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cliproxy/services/variant-service.ts b/src/cliproxy/services/variant-service.ts index 5915424e..5d0dde7a 100644 --- a/src/cliproxy/services/variant-service.ts +++ b/src/cliproxy/services/variant-service.ts @@ -253,7 +253,7 @@ export function updateVariant(name: string, updates: UpdateVariantOptions): Vari existing.port ); } else if (updates.model !== undefined) { - updateSettingsModel(settingsPath, updates.model, existing.provider); + updateSettingsModel(settingsPath, updates.model, existing.provider as CLIProxyProfileName); } } From aaaceb43e0d911292a189f8d0ef71f4078bee47b Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Sat, 14 Feb 2026 06:48:23 +0700 Subject: [PATCH 6/6] feat(codex): use spark as haiku in 5.3 preset --- config/base-codex.settings.json | 2 +- src/cliproxy/model-catalog.ts | 11 +++++++++++ ui/src/lib/model-catalogs.ts | 13 ++++++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/config/base-codex.settings.json b/config/base-codex.settings.json index fbf1314a..a0ef17f4 100644 --- a/config/base-codex.settings.json +++ b/config/base-codex.settings.json @@ -5,6 +5,6 @@ "ANTHROPIC_MODEL": "gpt-5.3-codex", "ANTHROPIC_DEFAULT_OPUS_MODEL": "gpt-5.3-codex", "ANTHROPIC_DEFAULT_SONNET_MODEL": "gpt-5.3-codex-high", - "ANTHROPIC_DEFAULT_HAIKU_MODEL": "gpt-5-mini" + "ANTHROPIC_DEFAULT_HAIKU_MODEL": "gpt-5.3-codex-spark" } } diff --git a/src/cliproxy/model-catalog.ts b/src/cliproxy/model-catalog.ts index a3f75b24..1705fbea 100644 --- a/src/cliproxy/model-catalog.ts +++ b/src/cliproxy/model-catalog.ts @@ -173,6 +173,17 @@ export const MODEL_CATALOG: Partial> = dynamicAllowed: false, }, }, + { + id: 'gpt-5.3-codex-spark', + name: 'GPT-5.3 Codex Spark', + description: 'Ultra-fast coding model', + thinking: { + type: 'levels', + levels: ['medium', 'high', 'xhigh'], + maxLevel: 'xhigh', + dynamicAllowed: false, + }, + }, { id: 'gpt-5.2-codex', name: 'GPT-5.2 Codex', diff --git a/ui/src/lib/model-catalogs.ts b/ui/src/lib/model-catalogs.ts index 2559cffe..54b702d0 100644 --- a/ui/src/lib/model-catalogs.ts +++ b/ui/src/lib/model-catalogs.ts @@ -143,7 +143,18 @@ export const MODEL_CATALOGS: Record = { default: 'gpt-5.3-codex', opus: 'gpt-5.3-codex', sonnet: 'gpt-5.3-codex-high', - haiku: 'gpt-5-mini', + haiku: 'gpt-5.3-codex-spark', + }, + }, + { + id: 'gpt-5.3-codex-spark', + name: 'GPT-5.3 Codex Spark', + description: 'Ultra-fast coding model', + presetMapping: { + default: 'gpt-5.3-codex-spark', + opus: 'gpt-5.3-codex', + sonnet: 'gpt-5.3-codex-high', + haiku: 'gpt-5.3-codex-spark', }, }, {