From f6358e319bd1c3d6e839026dcfe06da5914c261a Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Sun, 6 Apr 2025 17:31:11 -0700 Subject: [PATCH] model capabilities progress --- .../contrib/void/common/modelCapabilities.ts | 96 ++++++++++++++++--- 1 file changed, 82 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index b1316474..a5c488e3 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -123,36 +123,53 @@ const modelOptionsDefaults: ModelOptions = { } + +// TODO!!! double check all context sizes below +// TODO!!! add openrouter common models +// TODO!!! allow user to modify capabilities and tell them if autodetected model or falling back + const openSourceModelOptions_assumingOAICompat = { 'deepseekR1': { supportsFIM: false, supportsSystemMessage: false, supportsTools: false, reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: false, canIOReasoning: true, openSourceThinkTags: ['', ''] }, + contextWindow: 32_000, maxOutputTokens: 4_096, + }, + 'deepseekCoderV3': { + supportsFIM: false, + supportsSystemMessage: false, // unstable + supportsTools: false, + reasoningCapabilities: false, + contextWindow: 32_000, maxOutputTokens: 4_096, }, 'deepseekCoderV2': { supportsFIM: false, supportsSystemMessage: false, // unstable supportsTools: false, reasoningCapabilities: false, + contextWindow: 32_000, maxOutputTokens: 4_096, }, 'codestral': { supportsFIM: true, supportsSystemMessage: 'system-role', supportsTools: 'openai-style', reasoningCapabilities: false, + contextWindow: 32_000, maxOutputTokens: 4_096, }, 'openhands-lm-32b': { // https://www.all-hands.dev/blog/introducing-openhands-lm-32b----a-strong-open-coding-agent-model supportsFIM: false, supportsSystemMessage: 'system-role', supportsTools: 'openai-style', reasoningCapabilities: false, // built on qwen 2.5 32B instruct + contextWindow: 128_000, maxOutputTokens: 4_096 }, 'phi4': { supportsFIM: false, supportsSystemMessage: 'system-role', supportsTools: false, reasoningCapabilities: false, + contextWindow: 16_000, maxOutputTokens: 4_096, }, 'gemma': { // https://news.ycombinator.com/item?id=43451406 @@ -160,32 +177,52 @@ const openSourceModelOptions_assumingOAICompat = { supportsSystemMessage: 'system-role', supportsTools: false, reasoningCapabilities: false, + contextWindow: 32_000, maxOutputTokens: 4_096, + }, + // llama 4 https://ai.meta.com/blog/llama-4-multimodal-intelligence/ + 'llama4-scout': { + supportsFIM: false, + supportsSystemMessage: 'system-role', + supportsTools: 'openai-style', + reasoningCapabilities: false, + contextWindow: 10_000_000, maxOutputTokens: 4_096, + }, + 'llama4-maverick': { + supportsFIM: false, + supportsSystemMessage: 'system-role', + supportsTools: 'openai-style', + reasoningCapabilities: false, + contextWindow: 10_000_000, maxOutputTokens: 4_096, }, - // llama + // llama 3 'llama3': { supportsFIM: false, supportsSystemMessage: 'system-role', supportsTools: 'openai-style', reasoningCapabilities: false, + contextWindow: 32_000, maxOutputTokens: 4_096, }, 'llama3.1': { supportsFIM: false, supportsSystemMessage: 'system-role', supportsTools: 'openai-style', reasoningCapabilities: false, + contextWindow: 32_000, maxOutputTokens: 4_096, }, 'llama3.2': { supportsFIM: false, supportsSystemMessage: 'system-role', supportsTools: 'openai-style', reasoningCapabilities: false, + contextWindow: 32_000, maxOutputTokens: 4_096, }, 'llama3.3': { supportsFIM: false, supportsSystemMessage: 'system-role', supportsTools: 'openai-style', reasoningCapabilities: false, + contextWindow: 32_000, maxOutputTokens: 4_096, }, // qwen 'qwen2.5coder': { @@ -193,12 +230,14 @@ const openSourceModelOptions_assumingOAICompat = { supportsSystemMessage: 'system-role', supportsTools: 'openai-style', reasoningCapabilities: false, + contextWindow: 32_000, maxOutputTokens: 4_096, }, 'qwq': { supportsFIM: false, // no FIM, yes reasoning supportsSystemMessage: 'system-role', supportsTools: 'openai-style', reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: false, canIOReasoning: true, openSourceThinkTags: ['', ''] }, + contextWindow: 128_000, maxOutputTokens: 8_192, }, // FIM only 'starcoder2': { @@ -206,14 +245,18 @@ const openSourceModelOptions_assumingOAICompat = { supportsSystemMessage: false, supportsTools: false, reasoningCapabilities: false, + contextWindow: 128_000, maxOutputTokens: 8_192, + }, 'codegemma:2b': { supportsFIM: true, supportsSystemMessage: false, supportsTools: false, reasoningCapabilities: false, + contextWindow: 128_000, maxOutputTokens: 8_192, + }, -} as const satisfies { [s: string]: Partial } +} as const satisfies { [s: string]: Omit } @@ -230,21 +273,46 @@ const extensiveModelFallback: ProviderSettings['modelOptionsFallback'] = (modelN cost: { input: 0, output: 0 }, } } - if (lower.includes('gpt-4o')) return toFallback(openAIModelOptions['gpt-4o']) + if (Object.keys(openSourceModelOptions_assumingOAICompat).map(k => k.toLowerCase()).includes(lower)) + return toFallback(openSourceModelOptions_assumingOAICompat[lower as keyof typeof openSourceModelOptions_assumingOAICompat]) + + 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-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']) + if (lower.includes('grok')) return toFallback(xAIModelOptions['grok-2']) - if (lower.includes('deepseek-r1') || lower.includes('deepseek-reasoner')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.deepseekR1, contextWindow: 32_000, maxOutputTokens: 4_096, }) - if (lower.includes('deepseek')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.deepseekCoderV2, contextWindow: 32_000, maxOutputTokens: 4_096, }) - if (lower.includes('llama3')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.llama3, contextWindow: 32_000, maxOutputTokens: 4_096, }) - if (lower.includes('qwen') && lower.includes('2.5') && lower.includes('coder')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['qwen2.5coder'], contextWindow: 32_000, maxOutputTokens: 4_096, }) - if (lower.includes('codestral')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.codestral, contextWindow: 32_000, maxOutputTokens: 4_096, }) - if (lower.includes('qwq')) { return toFallback({ ...openSourceModelOptions_assumingOAICompat.qwq, contextWindow: 128_000, maxOutputTokens: 8_192, }) } - 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('phi4')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.phi4, contextWindow: 16_000, maxOutputTokens: 4_096, }) - if (lower.includes('gemma')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.gemma, contextWindow: 32_000, maxOutputTokens: 4_096, }) - if (lower.includes('openhands')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['openhands-lm-32b'], contextWindow: 128_000, maxOutputTokens: 4_096 }) // max output unclear - if (/\bo1\b/.test(modelName) || /\bo3\b/.test(modelName)) return toFallback(openAIModelOptions['o1']) + + if (lower.includes('deepseek-r1') || lower.includes('deepseek-reasoner')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.deepseekR1 }) + if (lower.includes('deepseek') && lower.includes('v2')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.deepseekCoderV2 }) + if (lower.includes('deepseek')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.deepseekCoderV3 }) + + if (lower.includes('llama3')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.llama3, }) + if (lower.includes('llama3.1')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['llama3.1'], }) + if (lower.includes('llama3.2')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['llama3.2'], }) + if (lower.includes('llama3.3')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['llama3.3'], }) + if (lower.includes('llama') || lower.includes('scout')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['llama4-scout'] }) + if (lower.includes('llama') || lower.includes('maverick')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['llama4-scout'] }) + if (lower.includes('llama')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['llama4-scout'] }) + + if (lower.includes('qwen') && lower.includes('2.5') && lower.includes('coder')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['qwen2.5coder'] }) + if (lower.includes('qwq')) { return toFallback({ ...openSourceModelOptions_assumingOAICompat.qwq, }) } + if (lower.includes('phi4')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.phi4, }) + if (lower.includes('codestral')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.codestral }) + + if (lower.includes('gemma')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.gemma, }) + + if (lower.includes('starcoder2')) return toFallback({ ...openSourceModelOptions_assumingOAICompat.starcoder2, }) + + if (lower.includes('openhands')) return toFallback({ ...openSourceModelOptions_assumingOAICompat['openhands-lm-32b'], }) // max output unclear + + if (lower.includes('4o') && lower.includes('mini')) return toFallback(openAIModelOptions['gpt-4o-mini']) + if (lower.includes('4o')) return toFallback(openAIModelOptions['gpt-4o']) + if (lower.includes('o1') && lower.includes('mini')) return toFallback(openAIModelOptions['o1-mini']) + if (lower.includes('o1')) return toFallback(openAIModelOptions['o1']) + if (lower.includes('o3') && lower.includes('mini')) return toFallback(openAIModelOptions['o3-mini']) + // if (lower.includes('o3')) return toFallback(openAIModelOptions['o3']) + return toFallback(modelOptionsDefaults) }