From 58af9cd501f5add0c056ea7d62df32a3f8016435 Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Tue, 5 May 2026 11:38:00 -0400 Subject: [PATCH] fix(ui): surface Claude Opus 4.7 in Claude picker --- ui/src/lib/model-catalogs.ts | 14 +++++++++++++- .../cliproxy/provider-model-selector.test.tsx | 18 ++++++++++++++++++ ui/tests/unit/ui/lib/preset-utils.test.ts | 3 ++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/ui/src/lib/model-catalogs.ts b/ui/src/lib/model-catalogs.ts index 18a40732..ef516b32 100644 --- a/ui/src/lib/model-catalogs.ts +++ b/ui/src/lib/model-catalogs.ts @@ -628,10 +628,22 @@ export const MODEL_CATALOGS: Record = { displayName: 'Claude (Anthropic)', defaultModel: 'claude-sonnet-4-6', models: [ + { + id: 'claude-opus-4-7', + name: 'Claude Opus 4.7', + description: 'Latest flagship model', + extendedContext: true, + presetMapping: { + default: 'claude-opus-4-7', + opus: 'claude-opus-4-7', + sonnet: 'claude-sonnet-4-6', + haiku: 'claude-haiku-4-5-20251001', + }, + }, { id: 'claude-opus-4-6', name: 'Claude Opus 4.6', - description: 'Latest flagship model', + description: 'Previous flagship model', extendedContext: true, presetMapping: { default: 'claude-opus-4-6', diff --git a/ui/tests/unit/components/cliproxy/provider-model-selector.test.tsx b/ui/tests/unit/components/cliproxy/provider-model-selector.test.tsx index abfde015..cddf5b38 100644 --- a/ui/tests/unit/components/cliproxy/provider-model-selector.test.tsx +++ b/ui/tests/unit/components/cliproxy/provider-model-selector.test.tsx @@ -70,6 +70,24 @@ describe('FlexibleModelSelector', () => { expect(screen.queryByText(/All Models \(/i)).not.toBeInTheDocument(); }); + it('surfaces Claude Opus 4.7 in the curated Claude picker', async () => { + render( + + ); + + await userEvent.click(screen.getByRole('button', { name: /select model/i })); + + expect(screen.getByRole('option', { name: /claude-opus-4-7/i })).toBeInTheDocument(); + expect(screen.getByRole('option', { name: /claude-opus-4-6/i })).toBeInTheDocument(); + expect(screen.getByRole('option', { name: /claude-sonnet-4-6/i })).toBeInTheDocument(); + }); + it('preserves a filtered legacy value under the current-value fallback group', async () => { render( { vi.restoreAllMocks(); }); - it('keeps the claude catalog default on Sonnet 4.6', () => { + it('keeps the claude catalog default on Sonnet 4.6 while exposing Opus 4.7', () => { const claudeCatalog = MODEL_CATALOGS.claude; expect(claudeCatalog.defaultModel).toBe('claude-sonnet-4-6'); + expect(claudeCatalog.models.map((model) => model.id)).toContain('claude-opus-4-7'); expect(claudeCatalog.models.map((model) => model.id)).toContain('claude-sonnet-4-6'); });