diff --git a/src/config/runtime-config.ts b/src/config/runtime-config.ts index b3363569..1dea8dff 100644 --- a/src/config/runtime-config.ts +++ b/src/config/runtime-config.ts @@ -872,6 +872,7 @@ const DEFAULT_CODEX_MODEL_LIST = [ 'openai-codex/gpt-5-codex', 'openai-codex/gpt-5.3-codex', 'openai-codex/gpt-5.4', + 'openai-codex/gpt-5.5', 'openai-codex/gpt-5.3-codex-spark', 'openai-codex/gpt-5.2-codex', 'openai-codex/gpt-5.1-codex-max', diff --git a/src/providers/codex-discovery.ts b/src/providers/codex-discovery.ts index 381f85d4..be162d66 100644 --- a/src/providers/codex-discovery.ts +++ b/src/providers/codex-discovery.ts @@ -45,6 +45,14 @@ const CODEX_FORWARD_COMPAT_MODELS = [ 'openai-codex/gpt-5.2-codex', ], }, + { + model: 'openai-codex/gpt-5.5', + templateModels: [ + 'openai-codex/gpt-5.4', + 'openai-codex/gpt-5.3-codex', + 'openai-codex/gpt-5.2-codex', + ], + }, ] as const; function normalizeCodexModelName(modelId: string): string { diff --git a/src/providers/hybridai-models.ts b/src/providers/hybridai-models.ts index f4a6965a..504da58a 100644 --- a/src/providers/hybridai-models.ts +++ b/src/providers/hybridai-models.ts @@ -18,6 +18,8 @@ const STATIC_VISION_CAPABLE_MODELS = new Set([ 'gpt-5.4-mini', 'gpt-5.3-codex', 'gpt-5.4', + 'gpt-5.5', + 'gpt-5.5-pro', 'claude-opus-4-6', 'claude-opus-4.6', @@ -73,6 +75,9 @@ const STATIC_MODEL_CONTEXT_WINDOWS: Record = { 'gpt-5.4': 400_000, 'gpt-5.3-codex': 400_000, 'gpt-5.3-codex-spark': 128_000, + 'gpt-5.5': 1_000_000, + 'gpt-5.5-chat-latest': 128_000, + 'gpt-5.5-pro': 1_000_000, }; function collectModelLookupCandidates(modelName: string): string[] { diff --git a/tests/gateway-status.test.ts b/tests/gateway-status.test.ts index a238bb87..d5a5e71b 100644 --- a/tests/gateway-status.test.ts +++ b/tests/gateway-status.test.ts @@ -208,7 +208,7 @@ test('getGatewayStatus includes Codex auth state', async () => { expect(status.providerHealth?.codex).toMatchObject({ kind: 'remote', reachable: true, - modelCount: 8, + modelCount: 9, }); const codexRequest = fetchMock.mock.calls .map(([input, init]) => ({ @@ -308,7 +308,7 @@ test('getGatewayAdminModels discovers Codex models from the models endpoint', as const result = await getGatewayAdminModels(); expect(result.providerStatus?.codex).toMatchObject({ - modelCount: 8, + modelCount: 9, }); const codexRequest = fetchMock.mock.calls .map(([input, init]) => ({ diff --git a/tests/hybridai-models.test.ts b/tests/hybridai-models.test.ts index 9a3a34bd..3b82ae6b 100644 --- a/tests/hybridai-models.test.ts +++ b/tests/hybridai-models.test.ts @@ -40,6 +40,8 @@ test('resolveModelContextWindowFallback resolves known defaults', () => { expect(resolveModelContextWindowFallback('openai-codex/gpt-5.4')).toBe( 400_000, ); + expect(resolveModelContextWindowFallback('gpt-5.5')).toBe(1_000_000); + expect(resolveModelContextWindowFallback('gpt-5.5-pro')).toBe(1_000_000); expect(resolveModelContextWindowFallback('anthropic/claude-opus-4-6')).toBe( 200_000, ); @@ -63,6 +65,8 @@ test('isStaticModelVisionCapable returns true for known vision models', () => { expect(isStaticModelVisionCapable('gpt-4.1-mini')).toBe(true); expect(isStaticModelVisionCapable('gpt-5.4-mini')).toBe(true); expect(isStaticModelVisionCapable('gpt-5.3-codex')).toBe(true); + expect(isStaticModelVisionCapable('gpt-5.5')).toBe(true); + expect(isStaticModelVisionCapable('gpt-5.5-pro')).toBe(true); expect(isStaticModelVisionCapable('claude-opus-4-6')).toBe(true); expect(isStaticModelVisionCapable('gemini-3-pro')).toBe(true); }); diff --git a/tests/model-catalog.test.ts b/tests/model-catalog.test.ts index 5be4a103..e5642cba 100644 --- a/tests/model-catalog.test.ts +++ b/tests/model-catalog.test.ts @@ -417,6 +417,7 @@ test('available model catalog discovers Codex models from the models endpoint', 'openai-codex/gpt-5.3-codex-spark', 'openai-codex/gpt-5.4', 'openai-codex/gpt-5.4-mini', + 'openai-codex/gpt-5.5', ]); const codexRequest = fetchMock.mock.calls .map(([input, init]) => ({ @@ -738,6 +739,7 @@ test('available model catalog discovers Codex models from the current models pay 'openai-codex/gpt-5.3-codex-spark', 'openai-codex/gpt-5.4', 'openai-codex/gpt-5.4-mini', + 'openai-codex/gpt-5.5', ]); expect(catalog.getAvailableModelList('codex')).not.toContain( 'openai-codex/GPT-5.2 Codex (Preview)',