diff --git a/src/cliproxy/ai-providers/__tests__/codex-plan-compatibility.test.ts b/src/cliproxy/ai-providers/__tests__/codex-plan-compatibility.test.ts index 28201039..45548c1d 100644 --- a/src/cliproxy/ai-providers/__tests__/codex-plan-compatibility.test.ts +++ b/src/cliproxy/ai-providers/__tests__/codex-plan-compatibility.test.ts @@ -78,6 +78,21 @@ describe('codex plan compatibility', () => { ).toBe('gpt-5.4-mini'); }); + it('prefers a rejected model explicit free-plan fallback over saved paid-only models', () => { + expect( + resolveRuntimeCodexFallbackModel({ + requestedModel: 'gpt-5.3-codex-spark', + modelMap: { + defaultModel: 'gpt-5.3-codex', + opusModel: 'gpt-5.3-codex', + sonnetModel: 'gpt-5.3-codex', + haikuModel: 'gpt-5.3-codex-spark', + }, + excludeModels: ['gpt-5.3-codex-spark'], + }) + ).toBe('gpt-5.4-mini'); + }); + it('tracks Codex thinking caps for current safe defaults, paid models, and legacy aliases', () => { expect(getModelMaxLevel('codex', 'gpt-5.5')).toBe('xhigh'); expect(getModelMaxLevel('codex', 'gpt-5.4')).toBe('xhigh'); diff --git a/src/cliproxy/ai-providers/codex-plan-compatibility.ts b/src/cliproxy/ai-providers/codex-plan-compatibility.ts index 291b396e..dad29a02 100644 --- a/src/cliproxy/ai-providers/codex-plan-compatibility.ts +++ b/src/cliproxy/ai-providers/codex-plan-compatibility.ts @@ -114,8 +114,8 @@ export function resolveRuntimeCodexFallbackModel(options: { (options.excludeModels ?? []).map((model) => normalizeCodexModelId(model)).filter(Boolean) ); const candidates = [ - options.modelMap.defaultModel, getFreePlanFallbackCodexModel(requestedModel), + options.modelMap.defaultModel, options.modelMap.opusModel, options.modelMap.sonnetModel, options.modelMap.haikuModel,