From 7747f6a10bdaf908652f57873daa7a7c3fecaea1 Mon Sep 17 00:00:00 2001 From: Roo Code Date: Sat, 9 May 2026 08:26:59 +0000 Subject: [PATCH] feat: add Claude Opus 4.7 support across all providers Add claude-opus-4-7 model definitions and references to: - Anthropic direct API types and handler (1M context, prompt caching, extended thinking) - OpenRouter model sets and fetcher maxTokens override - Vercel AI Gateway prompt caching and vision+tools sets - WebView 1M context beta tier pricing check --- packages/types/src/providers/anthropic.ts | 21 +++++++++++++++++++ packages/types/src/providers/openrouter.ts | 2 ++ .../types/src/providers/vercel-ai-gateway.ts | 2 ++ src/api/providers/anthropic.ts | 10 ++++++--- src/api/providers/fetchers/openrouter.ts | 5 +++++ .../components/ui/hooks/useSelectedModel.ts | 3 ++- 6 files changed, 39 insertions(+), 4 deletions(-) diff --git a/packages/types/src/providers/anthropic.ts b/packages/types/src/providers/anthropic.ts index 40a3d885d8..35a0793d26 100644 --- a/packages/types/src/providers/anthropic.ts +++ b/packages/types/src/providers/anthropic.ts @@ -91,6 +91,27 @@ export const anthropicModels = { }, ], }, + "claude-opus-4-7": { + maxTokens: 128_000, // Overridden to 8k if `enableReasoningEffort` is false. + contextWindow: 200_000, // Default 200K, extendable to 1M with beta flag + supportsImages: true, + supportsPromptCache: true, + inputPrice: 5.0, // $5 per million input tokens (≤200K context) + outputPrice: 25.0, // $25 per million output tokens (≤200K context) + cacheWritesPrice: 6.25, // $6.25 per million tokens + cacheReadsPrice: 0.5, // $0.50 per million tokens + supportsReasoningBudget: true, + // Tiered pricing for extended context (requires beta flag) + tiers: [ + { + contextWindow: 1_000_000, // 1M tokens with beta flag + inputPrice: 10.0, // $10 per million input tokens (>200K context) + outputPrice: 37.5, // $37.50 per million output tokens (>200K context) + cacheWritesPrice: 12.5, // $12.50 per million tokens (>200K context) + cacheReadsPrice: 1.0, // $1.00 per million tokens (>200K context) + }, + ], + }, "claude-opus-4-5-20251101": { maxTokens: 32_000, // Overridden to 8k if `enableReasoningEffort` is false. contextWindow: 200_000, diff --git a/packages/types/src/providers/openrouter.ts b/packages/types/src/providers/openrouter.ts index 834f40528e..a5af8948ef 100644 --- a/packages/types/src/providers/openrouter.ts +++ b/packages/types/src/providers/openrouter.ts @@ -43,6 +43,7 @@ export const OPEN_ROUTER_PROMPT_CACHING_MODELS = new Set([ "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", + "anthropic/claude-opus-4.7", "anthropic/claude-haiku-4.5", "google/gemini-2.5-flash-preview", "google/gemini-2.5-flash-preview:thinking", @@ -74,6 +75,7 @@ export const OPEN_ROUTER_REASONING_BUDGET_MODELS = new Set([ "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", + "anthropic/claude-opus-4.7", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.5", "anthropic/claude-sonnet-4.6", diff --git a/packages/types/src/providers/vercel-ai-gateway.ts b/packages/types/src/providers/vercel-ai-gateway.ts index ac633747ba..ad292ee19c 100644 --- a/packages/types/src/providers/vercel-ai-gateway.ts +++ b/packages/types/src/providers/vercel-ai-gateway.ts @@ -13,6 +13,7 @@ export const VERCEL_AI_GATEWAY_PROMPT_CACHING_MODELS = new Set([ "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", + "anthropic/claude-opus-4.7", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.6", "openai/gpt-4.1", @@ -55,6 +56,7 @@ export const VERCEL_AI_GATEWAY_VISION_AND_TOOLS_MODELS = new Set([ "anthropic/claude-opus-4.1", "anthropic/claude-opus-4.5", "anthropic/claude-opus-4.6", + "anthropic/claude-opus-4.7", "anthropic/claude-sonnet-4", "anthropic/claude-sonnet-4.6", "google/gemini-1.5-flash", diff --git a/src/api/providers/anthropic.ts b/src/api/providers/anthropic.ts index 5ccf38500c..04e0a40af0 100644 --- a/src/api/providers/anthropic.ts +++ b/src/api/providers/anthropic.ts @@ -62,12 +62,13 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa // Filter out non-Anthropic blocks (reasoning, thoughtSignature, etc.) before sending to the API const sanitizedMessages = filterNonAnthropicBlocks(messages) - // Add 1M context beta flag if enabled for supported models (Claude Sonnet 4/4.5/4.6, Opus 4.6) + // Add 1M context beta flag if enabled for supported models (Claude Sonnet 4/4.5/4.6, Opus 4.6/4.7) if ( (modelId === "claude-sonnet-4-20250514" || modelId === "claude-sonnet-4-5" || modelId === "claude-sonnet-4-6" || - modelId === "claude-opus-4-6") && + modelId === "claude-opus-4-6" || + modelId === "claude-opus-4-7") && this.options.anthropicBeta1MContext ) { betas.push("context-1m-2025-08-07") @@ -82,6 +83,7 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa case "claude-sonnet-4-6": case "claude-sonnet-4-5": case "claude-sonnet-4-20250514": + case "claude-opus-4-7": case "claude-opus-4-6": case "claude-opus-4-5-20251101": case "claude-opus-4-1-20250805": @@ -147,6 +149,7 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa case "claude-sonnet-4-6": case "claude-sonnet-4-5": case "claude-sonnet-4-20250514": + case "claude-opus-4-7": case "claude-opus-4-6": case "claude-opus-4-5-20251101": case "claude-opus-4-1-20250805": @@ -316,7 +319,8 @@ export class AnthropicHandler extends BaseProvider implements SingleCompletionHa (id === "claude-sonnet-4-20250514" || id === "claude-sonnet-4-5" || id === "claude-sonnet-4-6" || - id === "claude-opus-4-6") && + id === "claude-opus-4-6" || + id === "claude-opus-4-7") && this.options.anthropicBeta1MContext ) { // Use the tier pricing for 1M context diff --git a/src/api/providers/fetchers/openrouter.ts b/src/api/providers/fetchers/openrouter.ts index 0cf65fb09c..81f61e225e 100644 --- a/src/api/providers/fetchers/openrouter.ts +++ b/src/api/providers/fetchers/openrouter.ts @@ -263,6 +263,11 @@ export const parseOpenRouterModel = ({ modelInfo.maxTokens = anthropicModels["claude-opus-4-6"].maxTokens } + // Set claude-opus-4.7 model to use the correct configuration + if (id === "anthropic/claude-opus-4.7") { + modelInfo.maxTokens = anthropicModels["claude-opus-4-7"].maxTokens + } + // Ensure correct reasoning handling for Claude Haiku 4.5 on OpenRouter // Use budget control and disable effort-based reasoning fallback if (id === "anthropic/claude-haiku-4.5") { diff --git a/webview-ui/src/components/ui/hooks/useSelectedModel.ts b/webview-ui/src/components/ui/hooks/useSelectedModel.ts index bf78236b82..14862e6bcf 100644 --- a/webview-ui/src/components/ui/hooks/useSelectedModel.ts +++ b/webview-ui/src/components/ui/hooks/useSelectedModel.ts @@ -349,7 +349,8 @@ function getSelectedModel({ (id === "claude-sonnet-4-20250514" || id === "claude-sonnet-4-5" || id === "claude-sonnet-4-6" || - id === "claude-opus-4-6") && + id === "claude-opus-4-6" || + id === "claude-opus-4-7") && apiConfiguration.anthropicBeta1MContext && baseInfo ) {