diff --git a/config/base-codex.settings.json b/config/base-codex.settings.json index dcc10763..9c92f741 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.3-codex-xhigh", - "ANTHROPIC_DEFAULT_OPUS_MODEL": "gpt-5.3-codex-xhigh", - "ANTHROPIC_DEFAULT_SONNET_MODEL": "gpt-5.3-codex-high", - "ANTHROPIC_DEFAULT_HAIKU_MODEL": "gpt-5-mini-medium" + "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-mini" } } diff --git a/src/cliproxy/model-config.ts b/src/cliproxy/model-config.ts index 1b03a8f4..a9ab8a84 100644 --- a/src/cliproxy/model-config.ts +++ b/src/cliproxy/model-config.ts @@ -21,13 +21,9 @@ function stripCodexEffortSuffix(model: string, provider: CLIProxyProvider): stri return model.replace(CODEX_EFFORT_SUFFIX_REGEX, ''); } -function normalizeCodexTierModel( - provider: CLIProxyProvider, - model: string, - fallbackEffort: 'medium' | 'high' | 'xhigh' -): string { +function normalizeCodexTierModel(provider: CLIProxyProvider, model: string): string { if (provider !== 'codex') return model; - return CODEX_EFFORT_SUFFIX_REGEX.test(model) ? model : `${model}-${fallbackEffort}`; + return stripCodexEffortSuffix(model, provider); } /** @@ -160,13 +156,12 @@ export async function configureProviderModel( // Get base env vars for defaults const baseEnv = getClaudeEnvVars(provider); - const selectedDefaultModel = normalizeCodexTierModel(provider, selectedModel, 'xhigh'); - const selectedOpusModel = normalizeCodexTierModel(provider, selectedModel, 'xhigh'); - const selectedSonnetModel = normalizeCodexTierModel(provider, selectedModel, 'high'); + const selectedDefaultModel = normalizeCodexTierModel(provider, selectedModel); + const selectedOpusModel = normalizeCodexTierModel(provider, selectedModel); + const selectedSonnetModel = normalizeCodexTierModel(provider, selectedModel); const selectedHaikuModel = normalizeCodexTierModel( provider, - baseEnv.ANTHROPIC_DEFAULT_HAIKU_MODEL || selectedModel, - 'medium' + baseEnv.ANTHROPIC_DEFAULT_HAIKU_MODEL || selectedModel ); // Read existing settings to preserve user customizations diff --git a/src/cliproxy/services/variant-settings.ts b/src/cliproxy/services/variant-settings.ts index 551a2f89..36862948 100644 --- a/src/cliproxy/services/variant-settings.ts +++ b/src/cliproxy/services/variant-settings.ts @@ -37,17 +37,12 @@ interface SettingsFile { const CODEX_EFFORT_SUFFIX_REGEX = /-(xhigh|high|medium)$/i; -function hasCodexEffortSuffix(model: string): boolean { - return CODEX_EFFORT_SUFFIX_REGEX.test(model); -} - -function normalizeCodexTierModel( +function canonicalizeModelForProvider( provider: CLIProxyProfileName | undefined, - model: string, - fallbackEffort: 'medium' | 'high' | 'xhigh' + model: string ): string { if (provider !== 'codex') return model; - return hasCodexEffortSuffix(model) ? model : `${model}-${fallbackEffort}`; + return model.replace(CODEX_EFFORT_SUFFIX_REGEX, ''); } /** @@ -59,13 +54,13 @@ function buildSettingsEnv( port: number = CLIPROXY_DEFAULT_PORT ): SettingsEnv { const baseEnv = getClaudeEnvVars(provider as CLIProxyProvider, port); - const defaultModel = normalizeCodexTierModel(provider, model, 'xhigh'); - const opusModel = normalizeCodexTierModel(provider, model, 'xhigh'); - const sonnetModel = normalizeCodexTierModel(provider, model, 'high'); - const haikuModel = normalizeCodexTierModel( + const normalizedModel = canonicalizeModelForProvider(provider, model); + const defaultModel = normalizedModel; + const opusModel = normalizedModel; + const sonnetModel = normalizedModel; + const haikuModel = canonicalizeModelForProvider( provider, - baseEnv.ANTHROPIC_DEFAULT_HAIKU_MODEL || model, - 'medium' + baseEnv.ANTHROPIC_DEFAULT_HAIKU_MODEL || model ); return { @@ -313,18 +308,14 @@ export function updateSettingsModel( if (model) { settings.env = settings.env || ({} as SettingsEnv); - settings.env.ANTHROPIC_MODEL = normalizeCodexTierModel(provider, model, 'xhigh'); - settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL = normalizeCodexTierModel(provider, model, 'xhigh'); - settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL = normalizeCodexTierModel( - provider, - model, - 'high' - ); + const normalizedModel = canonicalizeModelForProvider(provider, model); + settings.env.ANTHROPIC_MODEL = normalizedModel; + settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL = normalizedModel; + settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL = normalizedModel; if (provider === 'codex' && settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL) { - settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL = normalizeCodexTierModel( + settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL = canonicalizeModelForProvider( provider, - settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL, - 'medium' + settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL ); } } else { diff --git a/tests/unit/cliproxy/variant-update-service.test.ts b/tests/unit/cliproxy/variant-update-service.test.ts index 38220280..ae3874a4 100644 --- a/tests/unit/cliproxy/variant-update-service.test.ts +++ b/tests/unit/cliproxy/variant-update-service.test.ts @@ -100,10 +100,10 @@ cliproxy: }; expect(settings.env.ANTHROPIC_BASE_URL).toContain('/api/provider/codex'); - expect(settings.env.ANTHROPIC_MODEL).toBe('gpt-5.1-codex-mini-xhigh'); - expect(settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe('gpt-5.1-codex-mini-xhigh'); - expect(settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe('gpt-5.1-codex-mini-high'); - expect(settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe('gpt-5-mini-medium'); + expect(settings.env.ANTHROPIC_MODEL).toBe('gpt-5.1-codex-mini'); + expect(settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe('gpt-5.1-codex-mini'); + expect(settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe('gpt-5.1-codex-mini'); + expect(settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe('gpt-5-mini'); expect(settings.env.CUSTOM_FLAG).toBe('keep-me'); expect(settings.hooks.PreToolUse.length).toBe(1); @@ -122,10 +122,10 @@ cliproxy: let settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8')) as { env: Record; }; - expect(settings.env.ANTHROPIC_MODEL).toBe('gpt-5.3-codex-xhigh'); - expect(settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe('gpt-5.3-codex-xhigh'); - expect(settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe('gpt-5.3-codex-high'); - expect(settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe('gpt-5-mini-medium'); + 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'); + expect(settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe('gpt-5-mini'); const modelOnly = updateVariant('demo', { model: 'gpt-5.3-codex' }); expect(modelOnly.success).toBe(true); @@ -133,9 +133,9 @@ cliproxy: settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8')) as { env: Record; }; - expect(settings.env.ANTHROPIC_MODEL).toBe('gpt-5.3-codex-xhigh'); - expect(settings.env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe('gpt-5.3-codex-xhigh'); - expect(settings.env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe('gpt-5.3-codex-high'); - expect(settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe('gpt-5-mini-medium'); + 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'); + expect(settings.env.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe('gpt-5-mini'); }); });