From cca644a1d2e0ed03d539b889c295f05ab8e3259d Mon Sep 17 00:00:00 2001 From: 777genius Date: Sat, 18 Apr 2026 12:42:25 +0300 Subject: [PATCH] fix(team): restore anthropic opus 4.6 option --- src/renderer/utils/teamModelCatalog.ts | 36 ++++++++++++++++--- .../utils/teamModelAvailability.test.ts | 10 ++++++ test/renderer/utils/teamModelCatalog.test.ts | 20 +++++++++++ 3 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/renderer/utils/teamModelCatalog.ts b/src/renderer/utils/teamModelCatalog.ts index 4e4bc8d8..f51c161a 100644 --- a/src/renderer/utils/teamModelCatalog.ts +++ b/src/renderer/utils/teamModelCatalog.ts @@ -46,6 +46,24 @@ const ANTHROPIC_ALIAS_LABELS = { haiku: 'Haiku 4.5', } as const; +const ANTHROPIC_VISIBLE_MODEL_FALLBACKS = ['claude-opus-4-7', 'claude-opus-4-7[1m]'] as const; + +const ANTHROPIC_MODEL_ORDER = [ + 'haiku', + 'claude-haiku-4-5-20251001', + 'claude-haiku-4-5', + 'opus', + 'opus[1m]', + 'claude-opus-4-7', + 'claude-opus-4-7[1m]', + 'claude-opus-4-6', + 'claude-opus-4-6[1m]', + 'sonnet', + 'sonnet[1m]', + 'claude-sonnet-4-6', + 'claude-sonnet-4-6[1m]', +] as const; + const TEAM_MODEL_LABEL_OVERRIDES: Record = { default: 'Default', ...ANTHROPIC_ALIAS_LABELS, @@ -75,6 +93,7 @@ const TEAM_PROVIDER_MODEL_OPTIONS: Record> = { - anthropic: new Map( - TEAM_PROVIDER_MODEL_OPTIONS.anthropic.map((option, index) => [option.value, index]) - ), + anthropic: new Map(ANTHROPIC_MODEL_ORDER.map((model, index) => [model, index])), codex: new Map(TEAM_PROVIDER_MODEL_OPTIONS.codex.map((option, index) => [option.value, index])), gemini: new Map(TEAM_PROVIDER_MODEL_OPTIONS.gemini.map((option, index) => [option.value, index])), }; @@ -330,6 +347,17 @@ function isRuntimeHiddenTeamModel( ); } +function getSupplementalVisibleModels( + providerId: SupportedProviderId, + models: readonly string[] +): readonly string[] { + if (providerId !== 'anthropic') { + return models; + } + + return [...models, ...ANTHROPIC_VISIBLE_MODEL_FALLBACKS]; +} + export function getVisibleTeamProviderModels( providerId: SupportedProviderId, models: readonly string[], @@ -337,7 +365,7 @@ export function getVisibleTeamProviderModels( ): string[] { return sortTeamProviderModels( providerId, - filterVisibleProviderRuntimeModels(providerId, models) + filterVisibleProviderRuntimeModels(providerId, getSupplementalVisibleModels(providerId, models)) ).filter((model) => !isRuntimeHiddenTeamModel(providerId, model, providerStatus)); } diff --git a/test/renderer/utils/teamModelAvailability.test.ts b/test/renderer/utils/teamModelAvailability.test.ts index 33bedc93..448710fa 100644 --- a/test/renderer/utils/teamModelAvailability.test.ts +++ b/test/renderer/utils/teamModelAvailability.test.ts @@ -117,6 +117,16 @@ describe('teamModelAvailability', () => { expect(getTeamModelSelectionError('anthropic', 'opus')).toBeNull(); }); + it('keeps both Anthropic Opus 4.7 and explicit Opus 4.6 in the fallback selector options', () => { + expect(getAvailableTeamProviderModelOptions('anthropic')).toEqual([ + { value: '', label: 'Default', badgeLabel: 'Default' }, + { value: 'opus', label: 'Opus 4.7', badgeLabel: 'Opus 4.7' }, + { value: 'claude-opus-4-6', label: 'Opus 4.6', badgeLabel: 'Opus 4.6' }, + { value: 'sonnet', label: 'Sonnet 4.6', badgeLabel: 'Sonnet 4.6' }, + { value: 'haiku', label: 'Haiku 4.5', badgeLabel: 'Haiku 4.5' }, + ]); + }); + it('keeps known Anthropic full model ids selectable without runtime verification', () => { expect(normalizeTeamModelForUi('anthropic', 'claude-opus-4-7')).toBe('claude-opus-4-7'); expect(normalizeTeamModelForUi('anthropic', 'claude-opus-4-7[1m]')).toBe( diff --git a/test/renderer/utils/teamModelCatalog.test.ts b/test/renderer/utils/teamModelCatalog.test.ts index 25d0f55f..8e63878a 100644 --- a/test/renderer/utils/teamModelCatalog.test.ts +++ b/test/renderer/utils/teamModelCatalog.test.ts @@ -23,4 +23,24 @@ describe('teamModelCatalog', () => { 'gpt-5.1-codex-max', ]); }); + + it('adds curated Anthropic Opus 4.7 badges when the runtime list only reports legacy Opus variants', () => { + expect( + getVisibleTeamProviderModels('anthropic', [ + 'claude-haiku-4-5-20251001', + 'claude-opus-4-6', + 'claude-opus-4-6[1m]', + 'claude-sonnet-4-6', + 'claude-sonnet-4-6[1m]', + ]) + ).toEqual([ + 'claude-haiku-4-5-20251001', + 'claude-opus-4-7', + 'claude-opus-4-7[1m]', + 'claude-opus-4-6', + 'claude-opus-4-6[1m]', + 'claude-sonnet-4-6', + 'claude-sonnet-4-6[1m]', + ]); + }); });