From 56b87f70bd36fe6ef3808f1f9cb1dfa3f7753d4b Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Wed, 6 May 2026 10:50:16 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=AE=20feat:=20Add=20GPT-5.5=20Token=20?= =?UTF-8?q?Definitions=20(#12973)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: add gpt-5.5 token definitions * fix: align gpt-5.5 context limit --- api/utils/tokens.spec.js | 39 ++++++++++++++++++++++++++++++++ packages/api/src/utils/tokens.ts | 4 ++++ 2 files changed, 43 insertions(+) diff --git a/api/utils/tokens.spec.js b/api/utils/tokens.spec.js index b890611886..143d3bb246 100644 --- a/api/utils/tokens.spec.js +++ b/api/utils/tokens.spec.js @@ -233,6 +233,31 @@ describe('getModelMaxTokens', () => { ); }); + test('should return correct tokens for gpt-5.5 matches', () => { + expect(maxTokensMap[EModelEndpoint.openAI]['gpt-5.5']).toBe( + maxTokensMap[EModelEndpoint.openAI]['gpt-5.5-pro'], + ); + expect(getModelMaxTokens('gpt-5.5')).toBe(maxTokensMap[EModelEndpoint.openAI]['gpt-5.5']); + expect(getModelMaxTokens('gpt-5.5-thinking')).toBe( + maxTokensMap[EModelEndpoint.openAI]['gpt-5.5'], + ); + expect(getModelMaxTokens('openai/gpt-5.5')).toBe( + maxTokensMap[EModelEndpoint.openAI]['gpt-5.5'], + ); + expect(getModelMaxTokens('gpt-5.5-2026-04-23')).toBe( + maxTokensMap[EModelEndpoint.openAI]['gpt-5.5'], + ); + }); + + test('should return correct tokens for gpt-5.5-pro matches', () => { + expect(getModelMaxTokens('gpt-5.5-pro')).toBe( + maxTokensMap[EModelEndpoint.openAI]['gpt-5.5-pro'], + ); + expect(getModelMaxTokens('openai/gpt-5.5-pro')).toBe( + maxTokensMap[EModelEndpoint.openAI]['gpt-5.5-pro'], + ); + }); + test('should return correct tokens for Anthropic models', () => { const models = [ 'claude-2.1', @@ -516,6 +541,8 @@ describe('getModelMaxTokens', () => { 'gpt-5.3', 'gpt-5.4', 'gpt-5.4-pro', + 'gpt-5.5', + 'gpt-5.5-pro', 'gpt-5-mini', 'gpt-5-nano', 'gpt-5-pro', @@ -567,6 +594,12 @@ describe('findMatchingPattern - longest match wins', () => { ); }); + test('should match gpt-5.5-pro over shorter patterns', () => { + expect(getModelMaxTokens('gpt-5.5-pro-2026-04-23')).toBe( + maxTokensMap[EModelEndpoint.openAI]['gpt-5.5-pro'], + ); + }); + test('should match gpt-5-mini over gpt-5 for mini variants', () => { expect(getModelMaxTokens('gpt-5-mini-chat-2025-01-01')).toBe( maxTokensMap[EModelEndpoint.openAI]['gpt-5-mini'], @@ -831,6 +864,12 @@ describe('matchModelName', () => { expect(matchModelName('gpt-5.4-pro')).toBe('gpt-5.4-pro'); }); + it('should return the closest matching key for gpt-5.5 matches', () => { + expect(matchModelName('openai/gpt-5.5')).toBe('gpt-5.5'); + expect(matchModelName('gpt-5.5-thinking')).toBe('gpt-5.5'); + expect(matchModelName('gpt-5.5-pro')).toBe('gpt-5.5-pro'); + }); + it('should return the input model name if no match is found - Google models', () => { expect(matchModelName('unknown-google-model', EModelEndpoint.google)).toBe( 'unknown-google-model', diff --git a/packages/api/src/utils/tokens.ts b/packages/api/src/utils/tokens.ts index 3ff12bd183..75a579eb40 100644 --- a/packages/api/src/utils/tokens.ts +++ b/packages/api/src/utils/tokens.ts @@ -57,6 +57,8 @@ const openAIModels = { 'gpt-5.3': 400000, 'gpt-5.4': 272000, // standard context; 1M experimental available via API opt-in (2x rate) 'gpt-5.4-pro': 272000, // same window as gpt-5.4 + 'gpt-5.5': 1050000, + 'gpt-5.5-pro': 1050000, 'gpt-5-mini': 400000, 'gpt-5-nano': 400000, 'gpt-5-pro': 400000, @@ -368,6 +370,8 @@ export const modelMaxOutputs = { 'gpt-5.3': 128000, 'gpt-5.4': 128000, 'gpt-5.4-pro': 128000, + 'gpt-5.5': 128000, + 'gpt-5.5-pro': 128000, 'gpt-5-mini': 128000, 'gpt-5-nano': 128000, 'gpt-5-pro': 128000,