From 2a99b5a2a9a9e7317374f7b6bd331ea6dd1eec85 Mon Sep 17 00:00:00 2001 From: sqersters <109853788+bouclem@users.noreply.github.com> Date: Fri, 22 May 2026 08:05:09 +0200 Subject: [PATCH] =?UTF-8?q?Add=202026=20model=20catalog=20(GPT-5.x,=20Clau?= =?UTF-8?q?de=204.5=E2=80=934.7,=20Gemini=203,=20Grok=204.3,=20DeepSeek=20?= =?UTF-8?q?v4,=20gpt-oss)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds capability entries for the new generation of models so they get proper context windows, tool format, and reasoning support instead of falling through to the 4K default. OpenAI: - gpt-5.5, gpt-5.5-pro, gpt-5.4, gpt-5.4-pro, gpt-5.4-mini, gpt-5.4-nano - effort_slider extended to include `xhigh` for gpt-5.x - pro variants don't expose a `none` reasoning option (reasoning-only) - fallback handles dated IDs (e.g. gpt-5.4-mini-2026-03-17) Anthropic: - claude-opus-4-7 (1M ctx, adaptive thinking only, no reasoning toggle) - claude-sonnet-4-6 (1M ctx, extended thinking) - claude-haiku-4-5-20251001 (200K ctx, extended thinking) - fallback ordered most-specific last so 4-7/4-6/4-5 win over 4-x Gemini: - gemini-3.5-flash, gemini-3.1-pro-preview, gemini-3-flash-preview - replaces the previous always-null fallback xAI: - grok-4.3-latest (1M ctx, configurable reasoning) DeepSeek: - deepseek-v4-flash and deepseek-v4-pro (1M ctx, 384K max output) - v4-pro cost is the list price; the 75% promo isn't encoded - replaces the previous always-null fallback Groq: - openai/gpt-oss-120b (131K ctx, openai-style tools) Defaults: - defaultModelsOfProvider updated to the 2026 lineup - removed grok-4-1-fast and groq/compound (not suitable for IDE coding) - old entries (gpt-4o, claude-3.x, gemini-2.x, deepseek-chat) kept in *ModelOptions for OpenRouter / OpenAI-compat / legacy users --- .../contrib/void/common/modelCapabilities.ts | 301 ++++++++++++++++-- 1 file changed, 266 insertions(+), 35 deletions(-) diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index 76f552ee..9c781af5 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -73,41 +73,31 @@ export const defaultProviderSettings = { export const defaultModelsOfProvider = { openAI: [ // https://platform.openai.com/docs/models/gp - 'gpt-4.1', - 'gpt-4.1-mini', - 'gpt-4.1-nano', - 'o3', - 'o4-mini', - // 'o1', - // 'o1-mini', + 'gpt-5.5', + 'gpt-5.5-pro-2026-04-23', + 'gpt-5.4-2026-03-05', + 'gpt-5.4-pro-2026-03-05', + 'gpt-5.4-mini-2026-03-17', + 'gpt-5.4-nano-2026-03-17', // 'gpt-4o', // 'gpt-4o-mini', ], anthropic: [ // https://docs.anthropic.com/en/docs/about-claude/models - 'claude-opus-4-0', - 'claude-sonnet-4-0', - 'claude-3-7-sonnet-latest', - 'claude-3-5-sonnet-latest', - 'claude-3-5-haiku-latest', - 'claude-3-opus-latest', + 'claude-opus-4-7', + 'claude-sonnet-4-6', + 'claude-haiku-4-5-20251001', ], xAI: [ // https://docs.x.ai/docs/models?cluster=us-east-1 - 'grok-2', - 'grok-3', - 'grok-3-mini', - 'grok-3-fast', - 'grok-3-mini-fast' + 'grok-4.3-latest', ], gemini: [ // https://ai.google.dev/gemini-api/docs/models/gemini - 'gemini-2.5-pro-exp-03-25', - 'gemini-2.5-flash-preview-04-17', - 'gemini-2.0-flash', - 'gemini-2.0-flash-lite', - 'gemini-2.5-pro-preview-05-06', + 'gemini-3.5-flash', + 'gemini-3.1-pro-preview', + 'gemini-3-flash-preview', ], deepseek: [ // https://api-docs.deepseek.com/quick_start/pricing - 'deepseek-chat', - 'deepseek-reasoner', + 'deepseek-v4-flash', + 'deepseek-v4-pro', ], ollama: [ // autodetected ], @@ -117,14 +107,14 @@ export const defaultModelsOfProvider = { openRouter: [ // https://openrouter.ai/models // 'anthropic/claude-3.7-sonnet:thinking', - 'anthropic/claude-opus-4', - 'anthropic/claude-sonnet-4', - 'qwen/qwen3-235b-a22b', - 'anthropic/claude-3.7-sonnet', - 'anthropic/claude-3.5-sonnet', - 'deepseek/deepseek-r1', - 'deepseek/deepseek-r1-zero:free', - 'mistralai/devstral-small:free' + //'anthropic/claude-opus-4', + //'anthropic/claude-sonnet-4', + //'qwen/qwen3-235b-a22b', + //'anthropic/claude-3.7-sonnet', + //'anthropic/claude-3.5-sonnet', + //'deepseek/deepseek-r1', + //'deepseek/deepseek-r1-zero:free', + // 'mistralai/devstral-small:free' // 'openrouter/quasar-alpha', // 'google/gemini-2.5-pro-preview-03-25', // 'mistralai/codestral-2501', @@ -138,6 +128,7 @@ export const defaultModelsOfProvider = { 'qwen-qwq-32b', 'llama-3.3-70b-versatile', 'llama-3.1-8b-instant', + 'openai/gpt-oss-120b', // 'qwen-2.5-coder-32b', // preview mode (experimental) ], mistral: [ // https://docs.mistral.ai/getting-started/models/models_overview/ @@ -414,8 +405,14 @@ const extensiveModelOptionsFallback: VoidStaticProviderInfo['modelOptionsFallbac }; } + if (lower.includes('gemini') && (lower.includes('3.5') || lower.includes('3-5')) && lower.includes('flash')) return toFallback(geminiModelOptions, 'gemini-3.5-flash') + if (lower.includes('gemini') && (lower.includes('3.1') || lower.includes('3-1')) && lower.includes('pro')) return toFallback(geminiModelOptions, 'gemini-3.1-pro-preview') + if (lower.includes('gemini') && lower.includes('3') && lower.includes('flash')) return toFallback(geminiModelOptions, 'gemini-3-flash-preview') if (lower.includes('gemini') && (lower.includes('2.5') || lower.includes('2-5'))) return toFallback(geminiModelOptions, 'gemini-2.5-pro-exp-03-25') + if (lower.includes('claude-haiku-4-5') || lower.includes('claude-4-5-haiku')) return toFallback(anthropicModelOptions, 'claude-haiku-4-5-20251001') + if (lower.includes('claude-sonnet-4-6') || lower.includes('claude-4-6-sonnet')) return toFallback(anthropicModelOptions, 'claude-sonnet-4-6') + if (lower.includes('claude-opus-4-7') || lower.includes('claude-4-7-opus')) return toFallback(anthropicModelOptions, 'claude-opus-4-7') if (lower.includes('claude-3-5') || lower.includes('claude-3.5')) return toFallback(anthropicModelOptions, 'claude-3-5-sonnet-20241022') if (lower.includes('claude')) return toFallback(anthropicModelOptions, 'claude-3-7-sonnet-20250219') @@ -454,6 +451,13 @@ const extensiveModelOptionsFallback: VoidStaticProviderInfo['modelOptionsFallbac if (lower.includes('gpt') && lower.includes('nano') && (lower.includes('4.1') || lower.includes('4-1'))) return toFallback(openAIModelOptions, 'gpt-4.1-nano') if (lower.includes('gpt') && (lower.includes('4.1') || lower.includes('4-1'))) return toFallback(openAIModelOptions, 'gpt-4.1') + if (lower.includes('gpt-5.5') && lower.includes('pro')) return toFallback(openAIModelOptions, 'gpt-5.5-pro') + if (lower.includes('gpt-5.5')) return toFallback(openAIModelOptions, 'gpt-5.5') + if (lower.includes('gpt-5.4') && lower.includes('mini')) return toFallback(openAIModelOptions, 'gpt-5.4-mini') + if (lower.includes('gpt-5.4') && lower.includes('nano')) return toFallback(openAIModelOptions, 'gpt-5.4-nano') + if (lower.includes('gpt-5.4') && lower.includes('pro')) return toFallback(openAIModelOptions, 'gpt-5.4-pro') + if (lower.includes('gpt-5.4')) return toFallback(openAIModelOptions, 'gpt-5.4') + if (lower.includes('4o') && lower.includes('mini')) return toFallback(openAIModelOptions, 'gpt-4o-mini') if (lower.includes('4o')) return toFallback(openAIModelOptions, 'gpt-4o') @@ -477,6 +481,48 @@ const extensiveModelOptionsFallback: VoidStaticProviderInfo['modelOptionsFallbac // ---------------- ANTHROPIC ---------------- const anthropicModelOptions = { + 'claude-opus-4-7': { // https://docs.anthropic.com/en/docs/about-claude/models/all-models + contextWindow: 1_000_000, + reservedOutputTokenSpace: 128_000, + cost: { input: 5.00, output: 25.00 }, + downloadable: false, + supportsFIM: false, + specialToolFormat: 'anthropic-style', + supportsSystemMessage: 'separated', + reasoningCapabilities: false, // adaptive thinking only, no extended thinking API + }, + 'claude-sonnet-4-6': { + contextWindow: 1_000_000, + reservedOutputTokenSpace: 64_000, + cost: { input: 3.00, output: 15.00 }, + downloadable: false, + supportsFIM: false, + specialToolFormat: 'anthropic-style', + supportsSystemMessage: 'separated', + reasoningCapabilities: { + supportsReasoning: true, + canTurnOffReasoning: true, + canIOReasoning: true, + reasoningReservedOutputTokenSpace: 8192, + reasoningSlider: { type: 'budget_slider', min: 1024, max: 8192, default: 1024 }, + }, + }, + 'claude-haiku-4-5-20251001': { + contextWindow: 200_000, + reservedOutputTokenSpace: 64_000, + cost: { input: 1.00, output: 5.00 }, + downloadable: false, + supportsFIM: false, + specialToolFormat: 'anthropic-style', + supportsSystemMessage: 'separated', + reasoningCapabilities: { + supportsReasoning: true, + canTurnOffReasoning: true, + canIOReasoning: true, + reasoningReservedOutputTokenSpace: 8192, + reasoningSlider: { type: 'budget_slider', min: 1024, max: 8192, default: 1024 }, + }, + }, 'claude-3-7-sonnet-20250219': { // https://docs.anthropic.com/en/docs/about-claude/models/all-models#model-comparison-table contextWindow: 200_000, reservedOutputTokenSpace: 8_192, @@ -588,6 +634,9 @@ const anthropicSettings: VoidStaticProviderInfo = { let fallbackName: keyof typeof anthropicModelOptions | null = null if (lower.includes('claude-4-opus') || lower.includes('claude-opus-4')) fallbackName = 'claude-opus-4-20250514' if (lower.includes('claude-4-sonnet') || lower.includes('claude-sonnet-4')) fallbackName = 'claude-sonnet-4-20250514' + if (lower.includes('claude-opus-4-7') || lower.includes('claude-4-7-opus')) fallbackName = 'claude-opus-4-7' + if (lower.includes('claude-sonnet-4-6') || lower.includes('claude-4-6-sonnet')) fallbackName = 'claude-sonnet-4-6' + if (lower.includes('claude-haiku-4-5') || lower.includes('claude-4-5-haiku')) fallbackName = 'claude-haiku-4-5-20251001' if (lower.includes('claude-3-7-sonnet')) fallbackName = 'claude-3-7-sonnet-20250219' @@ -603,6 +652,66 @@ const anthropicSettings: VoidStaticProviderInfo = { // ---------------- OPENAI ---------------- const openAIModelOptions = { // https://platform.openai.com/docs/pricing + 'gpt-5.5': { + contextWindow: 1_000_000, + reservedOutputTokenSpace: 128_000, + cost: { input: 5.00, output: 30.00, cache_read: 0.50 }, + downloadable: false, + supportsFIM: false, + specialToolFormat: 'openai-style', + supportsSystemMessage: 'developer-role', + reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: true, canIOReasoning: false, reasoningSlider: { type: 'effort_slider', values: ['low', 'medium', 'high', 'xhigh'], default: 'low' } }, + }, + 'gpt-5.5-pro': { + contextWindow: 1_050_000, + reservedOutputTokenSpace: 128_000, + cost: { input: 30.00, output: 180.00 }, + downloadable: false, + supportsFIM: false, + specialToolFormat: 'openai-style', + supportsSystemMessage: 'developer-role', + reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: false, canIOReasoning: false, reasoningSlider: { type: 'effort_slider', values: ['medium', 'high', 'xhigh'], default: 'medium' } }, + }, + 'gpt-5.4': { + contextWindow: 1_000_000, + reservedOutputTokenSpace: 128_000, + cost: { input: 2.50, output: 15.00, cache_read: 0.25 }, + downloadable: false, + supportsFIM: false, + specialToolFormat: 'openai-style', + supportsSystemMessage: 'developer-role', + reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: true, canIOReasoning: false, reasoningSlider: { type: 'effort_slider', values: ['low', 'medium', 'high', 'xhigh'], default: 'low' } }, + }, + 'gpt-5.4-pro': { + contextWindow: 1_050_000, + reservedOutputTokenSpace: 128_000, + cost: { input: 30.00, output: 180.00 }, + downloadable: false, + supportsFIM: false, + specialToolFormat: 'openai-style', + supportsSystemMessage: 'developer-role', + reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: false, canIOReasoning: false, reasoningSlider: { type: 'effort_slider', values: ['medium', 'high', 'xhigh'], default: 'medium' } }, + }, + 'gpt-5.4-mini': { + contextWindow: 400_000, + reservedOutputTokenSpace: 128_000, + cost: { input: 0.75, output: 4.50, cache_read: 0.075 }, + downloadable: false, + supportsFIM: false, + specialToolFormat: 'openai-style', + supportsSystemMessage: 'developer-role', + reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: true, canIOReasoning: false, reasoningSlider: { type: 'effort_slider', values: ['low', 'medium', 'high', 'xhigh'], default: 'low' } }, + }, + 'gpt-5.4-nano': { + contextWindow: 400_000, + reservedOutputTokenSpace: 128_000, + cost: { input: 0.20, output: 1.25, cache_read: 0.02 }, + downloadable: false, + supportsFIM: false, + specialToolFormat: 'openai-style', + supportsSystemMessage: 'developer-role', + reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: true, canIOReasoning: false, reasoningSlider: { type: 'effort_slider', values: ['low', 'medium', 'high', 'xhigh'], default: 'low' } }, + }, 'o3': { contextWindow: 1_047_576, reservedOutputTokenSpace: 32_768, @@ -721,6 +830,13 @@ const openAISettings: VoidStaticProviderInfo = { if (lower.includes('o1')) { fallbackName = 'o1' } if (lower.includes('o3-mini')) { fallbackName = 'o3-mini' } if (lower.includes('gpt-4o')) { fallbackName = 'gpt-4o' } + // gpt-5.x family — ordered general -> specific so longer matches win + if (lower.includes('gpt-5.5')) { fallbackName = 'gpt-5.5' } + if (lower.includes('gpt-5.5') && lower.includes('pro')) { fallbackName = 'gpt-5.5-pro' } + if (lower.includes('gpt-5.4')) { fallbackName = 'gpt-5.4' } + if (lower.includes('gpt-5.4') && lower.includes('mini')) { fallbackName = 'gpt-5.4-mini' } + if (lower.includes('gpt-5.4') && lower.includes('nano')) { fallbackName = 'gpt-5.4-nano' } + if (lower.includes('gpt-5.4') && lower.includes('pro')) { fallbackName = 'gpt-5.4-pro' } if (fallbackName) return { modelName: fallbackName, recognizedModelName: fallbackName, ...openAIModelOptions[fallbackName] } return null }, @@ -733,6 +849,16 @@ const openAISettings: VoidStaticProviderInfo = { const xAIModelOptions = { // https://docs.x.ai/docs/guides/reasoning#reasoning // https://docs.x.ai/docs/models#models-and-pricing + 'grok-4.3-latest': { + contextWindow: 1_000_000, + reservedOutputTokenSpace: null, + cost: { input: 1.25, output: 2.50 }, + downloadable: false, + supportsFIM: false, + supportsSystemMessage: 'system-role', + specialToolFormat: 'openai-style', + reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: true, canIOReasoning: false, reasoningSlider: { type: 'effort_slider', values: ['low', 'high'], default: 'low' } }, + }, 'grok-2': { contextWindow: 131_072, reservedOutputTokenSpace: null, @@ -793,6 +919,7 @@ const xAISettings: VoidStaticProviderInfo = { let fallbackName: keyof typeof xAIModelOptions | null = null if (lower.includes('grok-2')) fallbackName = 'grok-2' if (lower.includes('grok-3')) fallbackName = 'grok-3' + if (lower.includes('grok-4')) fallbackName = 'grok-4.3-latest' if (lower.includes('grok')) fallbackName = 'grok-3' if (fallbackName) return { modelName: fallbackName, recognizedModelName: fallbackName, ...xAIModelOptions[fallbackName] } return null @@ -806,6 +933,54 @@ const xAISettings: VoidStaticProviderInfo = { // ---------------- GEMINI ---------------- const geminiModelOptions = { // https://ai.google.dev/gemini-api/docs/pricing + 'gemini-3.5-flash': { + contextWindow: 1_048_576, + reservedOutputTokenSpace: 65_536, + cost: { input: 0, output: 0 }, // TODO: pricing not yet documented in docs + downloadable: false, + supportsFIM: false, + supportsSystemMessage: 'separated', + specialToolFormat: 'gemini-style', + reasoningCapabilities: { + supportsReasoning: true, + canTurnOffReasoning: true, + canIOReasoning: false, + reasoningSlider: { type: 'budget_slider', min: 1024, max: 8192, default: 1024 }, + reasoningReservedOutputTokenSpace: 8192, + }, + }, + 'gemini-3.1-pro-preview': { + contextWindow: 1_048_576, + reservedOutputTokenSpace: 65_536, + cost: { input: 0, output: 0 }, // preview, pricing not yet final + downloadable: false, + supportsFIM: false, + supportsSystemMessage: 'separated', + specialToolFormat: 'gemini-style', + reasoningCapabilities: { + supportsReasoning: true, + canTurnOffReasoning: true, + canIOReasoning: false, + reasoningSlider: { type: 'budget_slider', min: 1024, max: 8192, default: 1024 }, + reasoningReservedOutputTokenSpace: 8192, + }, + }, + 'gemini-3-flash-preview': { + contextWindow: 1_048_576, + reservedOutputTokenSpace: 65_536, + cost: { input: 0, output: 0 }, // preview, pricing not yet final + downloadable: false, + supportsFIM: false, + supportsSystemMessage: 'separated', + specialToolFormat: 'gemini-style', + reasoningCapabilities: { + supportsReasoning: true, + canTurnOffReasoning: true, + canIOReasoning: false, + reasoningSlider: { type: 'budget_slider', min: 1024, max: 8192, default: 1024 }, + reasoningReservedOutputTokenSpace: 8192, + }, + }, // https://ai.google.dev/gemini-api/docs/thinking#set-budget 'gemini-2.5-pro-preview-05-06': { contextWindow: 1_048_576, @@ -919,13 +1094,52 @@ const geminiModelOptions = { // https://ai.google.dev/gemini-api/docs/pricing const geminiSettings: VoidStaticProviderInfo = { modelOptions: geminiModelOptions, - modelOptionsFallback: (modelName) => { return null }, + modelOptionsFallback: (modelName) => { + const lower = modelName.toLowerCase() + let fallbackName: keyof typeof geminiModelOptions | null = null + if (lower.includes('gemini-3.5-flash') || lower.includes('gemini-3-5-flash')) fallbackName = 'gemini-3.5-flash' + if (lower.includes('gemini-3.1-pro') || lower.includes('gemini-3-1-pro')) fallbackName = 'gemini-3.1-pro-preview' + if (lower.includes('gemini-3-flash')) fallbackName = 'gemini-3-flash-preview' + if (fallbackName) return { modelName: fallbackName, recognizedModelName: fallbackName, ...geminiModelOptions[fallbackName] } + return null + }, } // ---------------- DEEPSEEK API ---------------- const deepseekModelOptions = { + 'deepseek-v4-flash': { // https://api-docs.deepseek.com/quick_start/pricing + contextWindow: 1_000_000, + reservedOutputTokenSpace: 384_000, + cost: { cache_read: 0.0028, input: 0.14, output: 0.28 }, + downloadable: false, + supportsFIM: false, // FIM is non-thinking-mode only + supportsSystemMessage: 'system-role', + specialToolFormat: 'openai-style', + reasoningCapabilities: { + supportsReasoning: true, + canTurnOffReasoning: true, + canIOReasoning: true, + openSourceThinkTags: ['', ''], + }, + }, + 'deepseek-v4-pro': { + contextWindow: 1_000_000, + reservedOutputTokenSpace: 384_000, + // list price; 75% promo applies at the time of writing + cost: { cache_read: 0.0145, input: 1.74, output: 3.48 }, + downloadable: false, + supportsFIM: false, + supportsSystemMessage: 'system-role', + specialToolFormat: 'openai-style', + reasoningCapabilities: { + supportsReasoning: true, + canTurnOffReasoning: true, + canIOReasoning: true, + openSourceThinkTags: ['', ''], + }, + }, 'deepseek-chat': { ...openSourceModelOptions_assumingOAICompat.deepseekR1, contextWindow: 64_000, // https://api-docs.deepseek.com/quick_start/pricing @@ -945,7 +1159,14 @@ const deepseekModelOptions = { const deepseekSettings: VoidStaticProviderInfo = { modelOptions: deepseekModelOptions, - modelOptionsFallback: (modelName) => { return null }, + modelOptionsFallback: (modelName) => { + const lower = modelName.toLowerCase() + let fallbackName: keyof typeof deepseekModelOptions | null = null + if (lower.includes('deepseek-v4-flash') || lower.includes('deepseek-v4.flash')) fallbackName = 'deepseek-v4-flash' + if (lower.includes('deepseek-v4-pro') || lower.includes('deepseek-v4.pro')) fallbackName = 'deepseek-v4-pro' + if (fallbackName) return { modelName: fallbackName, recognizedModelName: fallbackName, ...deepseekModelOptions[fallbackName] } + return null + }, providerReasoningIOSettings: { // reasoning: OAICompat + response.choices[0].delta.reasoning_content // https://api-docs.deepseek.com/guides/reasoning_model input: { includeInPayload: openAICompatIncludeInPayloadReasoning }, @@ -1079,6 +1300,16 @@ const groqModelOptions = { // https://console.groq.com/docs/models, https://groq supportsSystemMessage: 'system-role', reasoningCapabilities: { supportsReasoning: true, canIOReasoning: true, canTurnOffReasoning: false, openSourceThinkTags: ['', ''] }, // we're using reasoning_format:parsed so really don't need to know openSourceThinkTags }, + 'openai/gpt-oss-120b': { // https://console.groq.com/docs/models + contextWindow: 131_072, + reservedOutputTokenSpace: 65_536, + cost: { input: 0.15, output: 0.60 }, + downloadable: false, + supportsFIM: false, + supportsSystemMessage: 'system-role', + specialToolFormat: 'openai-style', + reasoningCapabilities: false, + }, } as const satisfies { [s: string]: VoidStaticModelInfo } const groqSettings: VoidStaticProviderInfo = { modelOptions: groqModelOptions,