diff --git a/.changeset/add-opus-4-1-model.md b/.changeset/add-opus-4-1-model.md new file mode 100644 index 00000000000..9b0e840e5b6 --- /dev/null +++ b/.changeset/add-opus-4-1-model.md @@ -0,0 +1,11 @@ +--- +"@roo-code/types": patch +"roo-code": patch +--- + +Add support for Claude Opus 4.1 (claude-opus-4-1-20250805) + +- Added claude-opus-4-1-20250805 to anthropicModels with 8192 max tokens and reasoning budget support +- Added support across all providers: Anthropic, Claude Code, Bedrock, Vertex AI, OpenRouter, and LiteLLM +- Updated anthropic.ts provider to handle prompt caching for the new model +- Pricing: $15/M input tokens, $75/M output tokens, $18.75/M cache writes, $1.5/M cache reads diff --git a/packages/types/src/providers/anthropic.ts b/packages/types/src/providers/anthropic.ts index d0f1629ee94..0c3323cffe0 100644 --- a/packages/types/src/providers/anthropic.ts +++ b/packages/types/src/providers/anthropic.ts @@ -18,6 +18,18 @@ export const anthropicModels = { cacheReadsPrice: 0.3, // $0.30 per million tokens supportsReasoningBudget: true, }, + "claude-opus-4-1-20250805": { + maxTokens: 8192, + contextWindow: 200_000, + supportsImages: true, + supportsComputerUse: true, + supportsPromptCache: true, + inputPrice: 15.0, // $15 per million input tokens + outputPrice: 75.0, // $75 per million output tokens + cacheWritesPrice: 18.75, // $18.75 per million tokens + cacheReadsPrice: 1.5, // $1.50 per million tokens + supportsReasoningBudget: true, + }, "claude-opus-4-20250514": { maxTokens: 32_000, // Overridden to 8k if `enableReasoningEffort` is false. contextWindow: 200_000, diff --git a/packages/types/src/providers/bedrock.ts b/packages/types/src/providers/bedrock.ts index 9c1f3493340..3d3aa8b9847 100644 --- a/packages/types/src/providers/bedrock.ts +++ b/packages/types/src/providers/bedrock.ts @@ -82,6 +82,21 @@ export const bedrockModels = { maxCachePoints: 4, cachableFields: ["system", "messages", "tools"], }, + "anthropic.claude-opus-4-1-20250805-v1:0": { + maxTokens: 8192, + contextWindow: 200_000, + supportsImages: true, + supportsComputerUse: true, + supportsPromptCache: true, + supportsReasoningBudget: true, + inputPrice: 15.0, + outputPrice: 75.0, + cacheWritesPrice: 18.75, + cacheReadsPrice: 1.5, + minTokensPerCachePoint: 1024, + maxCachePoints: 4, + cachableFields: ["system", "messages", "tools"], + }, "anthropic.claude-opus-4-20250514-v1:0": { maxTokens: 8192, contextWindow: 200_000, diff --git a/packages/types/src/providers/claude-code.ts b/packages/types/src/providers/claude-code.ts index 6f72baf0085..d9b658319a4 100644 --- a/packages/types/src/providers/claude-code.ts +++ b/packages/types/src/providers/claude-code.ts @@ -48,6 +48,14 @@ export const claudeCodeModels = { supportsReasoningBudget: false, requiredReasoningBudget: false, }, + "claude-opus-4-1-20250805": { + ...anthropicModels["claude-opus-4-1-20250805"], + supportsImages: false, + supportsPromptCache: true, // Claude Code does report cache tokens + supportsReasoningEffort: false, + supportsReasoningBudget: false, + requiredReasoningBudget: false, + }, "claude-opus-4-20250514": { ...anthropicModels["claude-opus-4-20250514"], supportsImages: false, diff --git a/packages/types/src/providers/lite-llm.ts b/packages/types/src/providers/lite-llm.ts index 303aa2b298e..fdfef95bc62 100644 --- a/packages/types/src/providers/lite-llm.ts +++ b/packages/types/src/providers/lite-llm.ts @@ -17,6 +17,7 @@ export const litellmDefaultModelInfo: ModelInfo = { export const LITELLM_COMPUTER_USE_MODELS = new Set([ "claude-3-5-sonnet-latest", + "claude-opus-4-1-20250805", "claude-opus-4-20250514", "claude-sonnet-4-20250514", "claude-3-7-sonnet-latest", @@ -26,22 +27,26 @@ export const LITELLM_COMPUTER_USE_MODELS = new Set([ "vertex_ai/claude-3-5-sonnet-v2", "vertex_ai/claude-3-5-sonnet-v2@20241022", "vertex_ai/claude-3-7-sonnet@20250219", + "vertex_ai/claude-opus-4-1@20250805", "vertex_ai/claude-opus-4@20250514", "vertex_ai/claude-sonnet-4@20250514", "openrouter/anthropic/claude-3.5-sonnet", "openrouter/anthropic/claude-3.5-sonnet:beta", "openrouter/anthropic/claude-3.7-sonnet", "openrouter/anthropic/claude-3.7-sonnet:beta", + "anthropic.claude-opus-4-1-20250805-v1:0", "anthropic.claude-opus-4-20250514-v1:0", "anthropic.claude-sonnet-4-20250514-v1:0", "anthropic.claude-3-7-sonnet-20250219-v1:0", "anthropic.claude-3-5-sonnet-20241022-v2:0", "us.anthropic.claude-3-5-sonnet-20241022-v2:0", "us.anthropic.claude-3-7-sonnet-20250219-v1:0", + "us.anthropic.claude-opus-4-1-20250805-v1:0", "us.anthropic.claude-opus-4-20250514-v1:0", "us.anthropic.claude-sonnet-4-20250514-v1:0", "eu.anthropic.claude-3-5-sonnet-20241022-v2:0", "eu.anthropic.claude-3-7-sonnet-20250219-v1:0", + "eu.anthropic.claude-opus-4-1-20250805-v1:0", "eu.anthropic.claude-opus-4-20250514-v1:0", "eu.anthropic.claude-sonnet-4-20250514-v1:0", "snowflake/claude-3-5-sonnet", diff --git a/packages/types/src/providers/openrouter.ts b/packages/types/src/providers/openrouter.ts index bbdbc7e7328..51d096130bd 100644 --- a/packages/types/src/providers/openrouter.ts +++ b/packages/types/src/providers/openrouter.ts @@ -39,6 +39,7 @@ export const OPEN_ROUTER_PROMPT_CACHING_MODELS = new Set([ "anthropic/claude-3.7-sonnet:thinking", "anthropic/claude-sonnet-4", "anthropic/claude-opus-4", + "anthropic/claude-opus-4.1", "google/gemini-2.5-flash-preview", "google/gemini-2.5-flash-preview:thinking", "google/gemini-2.5-flash-preview-05-20", @@ -59,6 +60,7 @@ export const OPEN_ROUTER_COMPUTER_USE_MODELS = new Set([ "anthropic/claude-3.7-sonnet:thinking", "anthropic/claude-sonnet-4", "anthropic/claude-opus-4", + "anthropic/claude-opus-4.1", ]) // When we first launched these models we didn't have support for @@ -77,6 +79,7 @@ export const OPEN_ROUTER_REQUIRED_REASONING_BUDGET_MODELS = new Set([ export const OPEN_ROUTER_REASONING_BUDGET_MODELS = new Set([ "anthropic/claude-3.7-sonnet:beta", "anthropic/claude-opus-4", + "anthropic/claude-opus-4.1", "anthropic/claude-sonnet-4", "google/gemini-2.5-pro-preview", "google/gemini-2.5-pro", diff --git a/packages/types/src/providers/vertex.ts b/packages/types/src/providers/vertex.ts index a48ebacdfb1..ee8a56ae2c0 100644 --- a/packages/types/src/providers/vertex.ts +++ b/packages/types/src/providers/vertex.ts @@ -175,6 +175,18 @@ export const vertexModels = { cacheReadsPrice: 0.3, supportsReasoningBudget: true, }, + "claude-opus-4-1@20250805": { + maxTokens: 8192, + contextWindow: 200_000, + supportsImages: true, + supportsComputerUse: true, + supportsPromptCache: true, + inputPrice: 15.0, + outputPrice: 75.0, + cacheWritesPrice: 18.75, + cacheReadsPrice: 1.5, + supportsReasoningBudget: true, + }, "claude-opus-4@20250514": { maxTokens: 8192, contextWindow: 200_000, diff --git a/src/api/providers/anthropic.ts b/src/api/providers/anthropic.ts index 52dec1ae55d..f456586762b 100644 --- a/src/api/providers/anthropic.ts +++ b/src/api/providers/anthropic.ts @@ -47,6 +47,7 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa switch (modelId) { case "claude-sonnet-4-20250514": + case "claude-opus-4-1-20250805": case "claude-opus-4-20250514": case "claude-3-7-sonnet-20250219": case "claude-3-5-sonnet-20241022": @@ -105,6 +106,7 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa // Then check for models that support prompt caching switch (modelId) { case "claude-sonnet-4-20250514": + case "claude-opus-4-1-20250805": case "claude-opus-4-20250514": case "claude-3-7-sonnet-20250219": case "claude-3-5-sonnet-20241022": diff --git a/src/api/providers/fetchers/__tests__/openrouter.spec.ts b/src/api/providers/fetchers/__tests__/openrouter.spec.ts index 5b620395c05..44892d2024a 100644 --- a/src/api/providers/fetchers/__tests__/openrouter.spec.ts +++ b/src/api/providers/fetchers/__tests__/openrouter.spec.ts @@ -32,6 +32,7 @@ describe("OpenRouter API", () => { "google/gemini-2.5-pro-preview", // Excluded due to lag issue (#4487) "google/gemini-2.5-flash", // OpenRouter doesn't report this as supporting prompt caching "google/gemini-2.5-flash-lite-preview-06-17", // OpenRouter doesn't report this as supporting prompt caching + "anthropic/claude-opus-4.1", // Not yet available in OpenRouter API ]) const ourCachingModels = Array.from(OPEN_ROUTER_PROMPT_CACHING_MODELS).filter( @@ -48,12 +49,20 @@ describe("OpenRouter API", () => { expect(ourCachingModels.sort()).toEqual(expectedCachingModels) + const excludedComputerUseModels = new Set([ + "anthropic/claude-opus-4.1", // Not yet available in OpenRouter API + ]) + + const expectedComputerUseModels = Array.from(OPEN_ROUTER_COMPUTER_USE_MODELS) + .filter((id) => !excludedComputerUseModels.has(id)) + .sort() + expect( Object.entries(models) .filter(([_, model]) => model.supportsComputerUse) .map(([id, _]) => id) .sort(), - ).toEqual(Array.from(OPEN_ROUTER_COMPUTER_USE_MODELS).sort()) + ).toEqual(expectedComputerUseModels) expect( Object.entries(models) @@ -67,6 +76,7 @@ describe("OpenRouter API", () => { "anthropic/claude-3.7-sonnet:beta", "anthropic/claude-3.7-sonnet:thinking", "anthropic/claude-opus-4", + // "anthropic/claude-opus-4.1", // Not yet available in OpenRouter API "anthropic/claude-sonnet-4", "arliai/qwq-32b-arliai-rpr-v1:free", "cognitivecomputations/dolphin3.0-r1-mistral-24b:free", @@ -122,6 +132,7 @@ describe("OpenRouter API", () => { "google/gemini-2.5-flash", "google/gemini-2.5-flash-lite-preview-06-17", "google/gemini-2.5-pro", + "anthropic/claude-opus-4.1", // Not yet available in OpenRouter API ]) const expectedReasoningBudgetModels = Array.from(OPEN_ROUTER_REASONING_BUDGET_MODELS) diff --git a/src/api/providers/fetchers/openrouter.ts b/src/api/providers/fetchers/openrouter.ts index bb3b97e7aa0..be8fb26f7a3 100644 --- a/src/api/providers/fetchers/openrouter.ts +++ b/src/api/providers/fetchers/openrouter.ts @@ -232,6 +232,11 @@ export const parseOpenRouterModel = ({ modelInfo.maxTokens = anthropicModels["claude-3-7-sonnet-20250219:thinking"].maxTokens } + // Set claude-opus-4.1 model to use the correct configuration + if (id === "anthropic/claude-opus-4.1") { + modelInfo.maxTokens = anthropicModels["claude-opus-4-1-20250805"].maxTokens + } + // Set horizon-alpha model to 32k max tokens if (id === "openrouter/horizon-alpha") { modelInfo.maxTokens = 32768