From c600f59e09628f8a77e78a243d23f6e8a2de5032 Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Wed, 29 Oct 2025 15:48:40 -0600 Subject: [PATCH 1/2] feat(defaults): set Claude Sonnet 4.5 as default for Anthropic, Bedrock, OpenRouter, Claude Code, and Unbound; update tests --- packages/types/src/providers/anthropic.ts | 2 +- packages/types/src/providers/bedrock.ts | 2 +- packages/types/src/providers/claude-code.ts | 2 +- packages/types/src/providers/openrouter.ts | 2 +- packages/types/src/providers/unbound.ts | 2 +- src/api/providers/__tests__/claude-code.spec.ts | 4 ++-- src/api/providers/__tests__/openrouter.spec.ts | 2 +- src/api/providers/__tests__/unbound.spec.ts | 2 +- .../components/ui/hooks/__tests__/useSelectedModel.spec.ts | 4 ++-- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/types/src/providers/anthropic.ts b/packages/types/src/providers/anthropic.ts index 5fbf62d507..ade4c2da45 100644 --- a/packages/types/src/providers/anthropic.ts +++ b/packages/types/src/providers/anthropic.ts @@ -3,7 +3,7 @@ import type { ModelInfo } from "../model.js" // https://docs.anthropic.com/en/docs/about-claude/models export type AnthropicModelId = keyof typeof anthropicModels -export const anthropicDefaultModelId: AnthropicModelId = "claude-sonnet-4-20250514" +export const anthropicDefaultModelId: AnthropicModelId = "claude-sonnet-4-5" export const anthropicModels = { "claude-sonnet-4-5": { diff --git a/packages/types/src/providers/bedrock.ts b/packages/types/src/providers/bedrock.ts index 9935d90b12..170a1ec6ac 100644 --- a/packages/types/src/providers/bedrock.ts +++ b/packages/types/src/providers/bedrock.ts @@ -4,7 +4,7 @@ import type { ModelInfo } from "../model.js" export type BedrockModelId = keyof typeof bedrockModels -export const bedrockDefaultModelId: BedrockModelId = "anthropic.claude-sonnet-4-20250514-v1:0" +export const bedrockDefaultModelId: BedrockModelId = "anthropic.claude-sonnet-4-5-20250929-v1:0" export const bedrockDefaultPromptRouterModelId: BedrockModelId = "anthropic.claude-3-sonnet-20240229-v1:0" diff --git a/packages/types/src/providers/claude-code.ts b/packages/types/src/providers/claude-code.ts index d0b0f680af..c0982889a7 100644 --- a/packages/types/src/providers/claude-code.ts +++ b/packages/types/src/providers/claude-code.ts @@ -21,7 +21,7 @@ export function convertModelNameForVertex(modelName: string): string { // Claude Code export type ClaudeCodeModelId = keyof typeof claudeCodeModels -export const claudeCodeDefaultModelId: ClaudeCodeModelId = "claude-sonnet-4-20250514" +export const claudeCodeDefaultModelId: ClaudeCodeModelId = "claude-sonnet-4-5" export const CLAUDE_CODE_DEFAULT_MAX_OUTPUT_TOKENS = 16000 /** diff --git a/packages/types/src/providers/openrouter.ts b/packages/types/src/providers/openrouter.ts index 3a77ba14fc..e151570796 100644 --- a/packages/types/src/providers/openrouter.ts +++ b/packages/types/src/providers/openrouter.ts @@ -1,7 +1,7 @@ import type { ModelInfo } from "../model.js" // https://openrouter.ai/models?order=newest&supported_parameters=tools -export const openRouterDefaultModelId = "anthropic/claude-sonnet-4" +export const openRouterDefaultModelId = "anthropic/claude-sonnet-4.5" export const openRouterDefaultModelInfo: ModelInfo = { maxTokens: 8192, diff --git a/packages/types/src/providers/unbound.ts b/packages/types/src/providers/unbound.ts index cc73f420d1..9715b835c9 100644 --- a/packages/types/src/providers/unbound.ts +++ b/packages/types/src/providers/unbound.ts @@ -1,6 +1,6 @@ import type { ModelInfo } from "../model.js" -export const unboundDefaultModelId = "anthropic/claude-3-7-sonnet-20250219" +export const unboundDefaultModelId = "anthropic/claude-sonnet-4-5" export const unboundDefaultModelInfo: ModelInfo = { maxTokens: 8192, diff --git a/src/api/providers/__tests__/claude-code.spec.ts b/src/api/providers/__tests__/claude-code.spec.ts index 8d154d794f..4137543202 100644 --- a/src/api/providers/__tests__/claude-code.spec.ts +++ b/src/api/providers/__tests__/claude-code.spec.ts @@ -44,7 +44,7 @@ describe("ClaudeCodeHandler", () => { const handlerWithInvalidModel = new ClaudeCodeHandler(options) const model = handlerWithInvalidModel.getModel() - expect(model.id).toBe("claude-sonnet-4-20250514") // default model + expect(model.id).toBe("claude-sonnet-4-5") // default model }) test("should override maxTokens when claudeCodeMaxOutputTokens is provided", () => { @@ -69,7 +69,7 @@ describe("ClaudeCodeHandler", () => { const handlerWithMaxTokens = new ClaudeCodeHandler(options) const model = handlerWithMaxTokens.getModel() - expect(model.id).toBe("claude-sonnet-4-20250514") // default model + expect(model.id).toBe("claude-sonnet-4-5") // default model expect(model.info.maxTokens).toBe(16384) // Should use the configured value }) diff --git a/src/api/providers/__tests__/openrouter.spec.ts b/src/api/providers/__tests__/openrouter.spec.ts index bf130a0582..1f6b3f23a6 100644 --- a/src/api/providers/__tests__/openrouter.spec.ts +++ b/src/api/providers/__tests__/openrouter.spec.ts @@ -83,7 +83,7 @@ describe("OpenRouterHandler", () => { it("returns default model info when options are not provided", async () => { const handler = new OpenRouterHandler({}) const result = await handler.fetchModel() - expect(result.id).toBe("anthropic/claude-sonnet-4") + expect(result.id).toBe("anthropic/claude-sonnet-4.5") expect(result.info.supportsPromptCache).toBe(true) }) diff --git a/src/api/providers/__tests__/unbound.spec.ts b/src/api/providers/__tests__/unbound.spec.ts index c49685b121..6ebb4f7133 100644 --- a/src/api/providers/__tests__/unbound.spec.ts +++ b/src/api/providers/__tests__/unbound.spec.ts @@ -312,7 +312,7 @@ describe("UnboundHandler", () => { it("should return default model when invalid model provided", async () => { const handlerWithInvalidModel = new UnboundHandler({ ...mockOptions, unboundModelId: "invalid/model" }) const modelInfo = await handlerWithInvalidModel.fetchModel() - expect(modelInfo.id).toBe("anthropic/claude-3-7-sonnet-20250219") + expect(modelInfo.id).toBe("anthropic/claude-sonnet-4-5") expect(modelInfo.info).toBeDefined() }) }) diff --git a/webview-ui/src/components/ui/hooks/__tests__/useSelectedModel.spec.ts b/webview-ui/src/components/ui/hooks/__tests__/useSelectedModel.spec.ts index e49944a997..6260fdcfde 100644 --- a/webview-ui/src/components/ui/hooks/__tests__/useSelectedModel.spec.ts +++ b/webview-ui/src/components/ui/hooks/__tests__/useSelectedModel.spec.ts @@ -367,7 +367,7 @@ describe("useSelectedModel", () => { const { result } = renderHook(() => useSelectedModel(), { wrapper }) expect(result.current.provider).toBe("anthropic") - expect(result.current.id).toBe("claude-sonnet-4-20250514") + expect(result.current.id).toBe("claude-sonnet-4-5") expect(result.current.info).toBeUndefined() }) }) @@ -439,7 +439,7 @@ describe("useSelectedModel", () => { const { result } = renderHook(() => useSelectedModel(apiConfiguration), { wrapper }) expect(result.current.provider).toBe("claude-code") - expect(result.current.id).toBe("claude-sonnet-4-20250514") // Default model + expect(result.current.id).toBe("claude-sonnet-4-5") // Default model expect(result.current.info).toBeDefined() expect(result.current.info?.supportsImages).toBe(false) }) From a844a7bccdd339c065f4d3a7f4ad61436423b2a2 Mon Sep 17 00:00:00 2001 From: Hannes Rudolph Date: Wed, 29 Oct 2025 16:27:32 -0600 Subject: [PATCH 2/2] test: include new default models in mocks for OpenRouter and Unbound (claude-sonnet-4.5 / claude-sonnet-4-5) --- src/api/providers/__tests__/openrouter.spec.ts | 12 ++++++++++++ src/api/providers/__tests__/unbound.spec.ts | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/api/providers/__tests__/openrouter.spec.ts b/src/api/providers/__tests__/openrouter.spec.ts index 1f6b3f23a6..f5067ef34c 100644 --- a/src/api/providers/__tests__/openrouter.spec.ts +++ b/src/api/providers/__tests__/openrouter.spec.ts @@ -28,6 +28,18 @@ vitest.mock("../fetchers/modelCache", () => ({ description: "Claude 3.7 Sonnet", thinking: false, }, + "anthropic/claude-sonnet-4.5": { + maxTokens: 8192, + contextWindow: 200000, + supportsImages: true, + supportsPromptCache: true, + inputPrice: 3, + outputPrice: 15, + cacheWritesPrice: 3.75, + cacheReadsPrice: 0.3, + description: "Claude 4.5 Sonnet", + thinking: false, + }, "anthropic/claude-3.7-sonnet:thinking": { maxTokens: 128000, contextWindow: 200000, diff --git a/src/api/providers/__tests__/unbound.spec.ts b/src/api/providers/__tests__/unbound.spec.ts index 6ebb4f7133..fb52e2cb8c 100644 --- a/src/api/providers/__tests__/unbound.spec.ts +++ b/src/api/providers/__tests__/unbound.spec.ts @@ -22,6 +22,18 @@ vitest.mock("../fetchers/modelCache", () => ({ description: "Claude 3.5 Sonnet", thinking: false, }, + "anthropic/claude-sonnet-4-5": { + maxTokens: 8192, + contextWindow: 200000, + supportsImages: true, + supportsPromptCache: true, + inputPrice: 3, + outputPrice: 15, + cacheWritesPrice: 3.75, + cacheReadsPrice: 0.3, + description: "Claude 4.5 Sonnet", + thinking: false, + }, "anthropic/claude-3-7-sonnet-20250219": { maxTokens: 8192, contextWindow: 200000,