diff --git a/src/_locales/en/main.json b/src/_locales/en/main.json index c59db9795..8ad74e6ef 100644 --- a/src/_locales/en/main.json +++ b/src/_locales/en/main.json @@ -229,6 +229,7 @@ "OpenAI (GPT-6 Astra)": "OpenAI (GPT-6 Astra)", "OpenAI (GPT-6 Sol)": "OpenAI (GPT-6 Sol)", "OpenAI (GPT-6 Luna)": "OpenAI (GPT-6 Luna)", + "OpenAI (GPT-6.1 Sol)": "OpenAI (GPT-6.1 Sol)", "Anthropic (Claude Sonnet 4.6)": "Anthropic (Claude Sonnet 4.6)", "Anthropic (Claude Sonnet 5.5)": "Anthropic (Claude Sonnet 5.5)", "This provider is still used by other API modes or saved conversations": "This provider is still used by other API modes or saved conversations", diff --git a/src/config/index.mjs b/src/config/index.mjs index b3f983fef..81c956e46 100644 --- a/src/config/index.mjs +++ b/src/config/index.mjs @@ -82,6 +82,7 @@ export const chatgptApiModelKeys = [ 'chatgptApi6Astra', 'chatgptApi6Sol', 'chatgptApi6Luna', + 'chatgptApi6_1Sol', 'chatgptApi4oMini', 'chatgptApi4_1', 'chatgptApi4_1_mini', @@ -340,6 +341,7 @@ export const Models = { chatgptApi6Astra: { value: 'gpt-6-astra', desc: 'OpenAI (GPT-6 Astra)' }, chatgptApi6Sol: { value: 'gpt-6-sol', desc: 'OpenAI (GPT-6 Sol)' }, chatgptApi6Luna: { value: 'gpt-6-luna', desc: 'OpenAI (GPT-6 Luna)' }, + chatgptApi6_1Sol: { value: 'gpt-6.1-sol', desc: 'OpenAI (GPT-6.1 Sol)' }, chatgptApi4_1: { value: 'gpt-4.1', desc: 'OpenAI (GPT-4.1)' }, chatgptApi4_1_mini: { value: 'gpt-4.1-mini', desc: 'OpenAI (GPT-4.1 mini)' }, @@ -774,7 +776,7 @@ export const defaultApiModeIds = [ 'ollamaModel', 'customModel', 'azureOpenAi', - 'chatgptApi6Sol', + 'chatgptApi6_1Sol', 'chatgptApi5_6Terra', 'chatgptApi6Luna', 'chatgptApi6Astra', diff --git a/src/services/apis/openai-token-params.mjs b/src/services/apis/openai-token-params.mjs index 3ad85cf7c..47ff64a7f 100644 --- a/src/services/apis/openai-token-params.mjs +++ b/src/services/apis/openai-token-params.mjs @@ -1,5 +1,5 @@ const OPENAI_MAX_COMPLETION_TOKENS_MODEL_PATTERN = - /^(?:gpt-5(?:[.-]|$)|gpt-6-(?:astra|sol|luna)(?:-|$)|chat-latest$)/ + /^(?:gpt-5(?:[.-]|$)|gpt-6(?:\.1-sol|-(?:astra|sol|luna))(?:-|$)|chat-latest$)/ function shouldUseMaxCompletionTokens(provider, model) { const normalizedProvider = String(provider || '').toLowerCase() diff --git a/src/services/apis/temperature-params.mjs b/src/services/apis/temperature-params.mjs index dce99e9f9..d4d6b91c7 100644 --- a/src/services/apis/temperature-params.mjs +++ b/src/services/apis/temperature-params.mjs @@ -10,6 +10,7 @@ const MODELS_WITHOUT_CUSTOM_TEMPERATURE = new Set([ 'gpt-6-astra', 'gpt-6-sol', 'gpt-6-luna', + 'gpt-6-1-sol', ]) function normalizeModelId(model) { diff --git a/tests/unit/config/config-predicates.test.mjs b/tests/unit/config/config-predicates.test.mjs index 9a07e3997..581008703 100644 --- a/tests/unit/config/config-predicates.test.mjs +++ b/tests/unit/config/config-predicates.test.mjs @@ -55,6 +55,7 @@ const representativeChatgptApiModelNames = [ 'chatgptApi5_6Luna', 'chatgptApi6Sol', 'chatgptApi6Luna', + 'chatgptApi6_1Sol', ] const representativeGptCompletionApiModelNames = ['gptApiInstruct'] const representativeClaudeApiModelNames = ['claudeOpus48Api', 'claudeSonnet46Api'] @@ -85,9 +86,10 @@ afterEach(() => { restoreNavigator() }) -test('GPT-6 Sol and Luna replace their GPT-5.6 counterparts in the default presets', () => { - assert.equal(defaultApiModeIds.includes('chatgptApi6Sol'), true) +test('GPT-6 defaults use GPT-6.1 Sol and GPT-6 Luna', () => { + assert.equal(defaultApiModeIds.includes('chatgptApi6_1Sol'), true) assert.equal(defaultApiModeIds.includes('chatgptApi6Luna'), true) + assert.equal(defaultApiModeIds.includes('chatgptApi6Sol'), false) assert.equal(defaultApiModeIds.includes('chatgptApi5_6Sol'), false) assert.equal(defaultApiModeIds.includes('chatgptApi5_6Luna'), false) }) diff --git a/tests/unit/services/apis/openai-api-compat.test.mjs b/tests/unit/services/apis/openai-api-compat.test.mjs index 8adc7ae87..4e355d3e0 100644 --- a/tests/unit/services/apis/openai-api-compat.test.mjs +++ b/tests/unit/services/apis/openai-api-compat.test.mjs @@ -791,6 +791,7 @@ test('generateAnswersWithOpenAiApi uses max_completion_tokens for GPT-6 and omit for (const [modelName, model] of [ ['chatgptApi6Sol', 'gpt-6-sol'], ['chatgptApi6Luna', 'gpt-6-luna'], + ['chatgptApi6_1Sol', 'gpt-6.1-sol'], ]) { const newSession = { modelName, diff --git a/tests/unit/services/apis/openai-token-params.test.mjs b/tests/unit/services/apis/openai-token-params.test.mjs index b775e06fb..95902e363 100644 --- a/tests/unit/services/apis/openai-token-params.test.mjs +++ b/tests/unit/services/apis/openai-token-params.test.mjs @@ -96,6 +96,9 @@ test('uses completion token limits only for supported OpenAI GPT-6 models', () = 'GPT-6-ASTRA', 'gpt-6-sol', 'gpt-6-luna', + 'gpt-6.1-sol', + 'gpt-6.1-sol-20260929', + 'GPT-6.1-SOL', ]) { assert.deepEqual(getChatCompletionsTokenParams('openai', model, 1024), { max_completion_tokens: 1024, @@ -107,9 +110,13 @@ test('uses completion token limits only for supported OpenAI GPT-6 models', () = for (const model of [ 'gpt-6-astral', 'gpt-6-solar', + 'gpt-6.1-solar', + 'gpt-6.10-sol', 'my-gpt-6-astra', + 'my-gpt-6.1-sol', 'gpt-60', 'openai/gpt-6-astra', + 'openai/gpt-6.1-sol', ]) { assert.deepEqual(getChatCompletionsTokenParams('openai', model, 1024), { max_tokens: 1024, diff --git a/tests/unit/services/apis/temperature-params.test.mjs b/tests/unit/services/apis/temperature-params.test.mjs index 148a4780a..c0eab35fc 100644 --- a/tests/unit/services/apis/temperature-params.test.mjs +++ b/tests/unit/services/apis/temperature-params.test.mjs @@ -115,6 +115,10 @@ test('temperature overrides omit GPT-6 models across provider ID formats', () => 'openai/gpt-6-sol', 'gpt-6-luna', 'openai/gpt-6-luna', + 'gpt-6.1-sol', + 'openai/gpt-6.1-sol', + 'GPT-6.1-SOL', + 'gpt-6.1-sol-20260929', ]) { assert.equal(canApplyTemperatureOverride(model), false, model) assert.deepEqual( @@ -123,7 +127,15 @@ test('temperature overrides omit GPT-6 models across provider ID formats', () => model, ) } - for (const model of ['gpt-6-astral', 'gpt-6-solar', 'my-gpt-6-astra', 'gpt-4.1']) { + for (const model of [ + 'gpt-6-astral', + 'gpt-6-solar', + 'gpt-6.1-solar', + 'gpt-6.10-sol', + 'my-gpt-6-astra', + 'my-gpt-6.1-sol', + 'gpt-4.1', + ]) { assert.equal(canApplyTemperatureOverride(model), true, model) } }) diff --git a/tests/unit/utils/model-name-convert.test.mjs b/tests/unit/utils/model-name-convert.test.mjs index 3feb26aa4..0c8d228b1 100644 --- a/tests/unit/utils/model-name-convert.test.mjs +++ b/tests/unit/utils/model-name-convert.test.mjs @@ -792,6 +792,7 @@ test('modelNameToDesc returns desc for stable GPT API presets', () => { assert.equal(modelNameToDesc('chatgptApi5_6Luna'), 'OpenAI (GPT-5.6 Luna)') assert.equal(modelNameToDesc('chatgptApi6Sol'), 'OpenAI (GPT-6 Sol)') assert.equal(modelNameToDesc('chatgptApi6Luna'), 'OpenAI (GPT-6 Luna)') + assert.equal(modelNameToDesc('chatgptApi6_1Sol'), 'OpenAI (GPT-6.1 Sol)') }) test('modelNameToDesc appends extraCustomModelName for customModel', () => {