diff --git a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts index 379a4817..29963ec9 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts @@ -56,7 +56,8 @@ export const defaultModelsOfProvider = { 'gpt-4o-mini', ], anthropic: [ // https://docs.anthropic.com/en/docs/about-claude/models - 'claude-3-5-sonnet-latest', + 'claude-3-7-sonnet-latest', + // 'claude-3-5-sonnet-latest', 'claude-3-5-haiku-latest', 'claude-3-opus-latest', ], diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/MODELS.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/MODELS.ts index a4ad5487..00cb8831 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/MODELS.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/MODELS.ts @@ -146,10 +146,19 @@ const openAISettings: ProviderSettings = { // ---------------- ANTHROPIC ---------------- const anthropicModelOptions = { + 'claude-3-7-sonnet-20250219': { // https://docs.anthropic.com/en/docs/about-claude/models/all-models#model-comparison-table + contextWindow: 200_000, + maxOutputTokens: 8_192, // TODO!!! 64_000 for extended thinking, can bump it to 128_000 with output-128k-2025-02-19 + cost: { input: 3.00, output: 15.00 }, + supportsFIM: false, + supportsSystemMessage: 'separated', + supportsTools: 'anthropic-style', + supportsReasoningOutput: {}, // TODO!!!! + }, 'claude-3-5-sonnet-20241022': { contextWindow: 200_000, maxOutputTokens: 8_192, - cost: { input: 3.00, cache_read: 0.30, cache_write: 3.75, output: 15.00 }, + cost: { input: 3.00, output: 15.00 }, supportsFIM: false, supportsSystemMessage: 'separated', supportsTools: 'anthropic-style', @@ -158,7 +167,7 @@ const anthropicModelOptions = { 'claude-3-5-haiku-20241022': { contextWindow: 200_000, maxOutputTokens: 8_192, - cost: { input: 0.80, cache_read: 0.08, cache_write: 1.00, output: 4.00 }, + cost: { input: 0.80, output: 4.00 }, supportsFIM: false, supportsSystemMessage: 'separated', supportsTools: 'anthropic-style', @@ -167,15 +176,16 @@ const anthropicModelOptions = { 'claude-3-opus-20240229': { contextWindow: 200_000, maxOutputTokens: 4_096, - cost: { input: 15.00, cache_read: 1.50, cache_write: 18.75, output: 75.00 }, + cost: { input: 15.00, output: 75.00 }, supportsFIM: false, supportsSystemMessage: 'separated', supportsTools: 'anthropic-style', supportsReasoningOutput: false, }, 'claude-3-sonnet-20240229': { // no point of using this, but including this for people who put it in - contextWindow: 200_000, cost: { input: 3.00, output: 15.00 }, + contextWindow: 200_000, maxOutputTokens: 4_096, + cost: { input: 3.00, output: 15.00 }, supportsFIM: false, supportsSystemMessage: 'separated', supportsTools: 'anthropic-style', @@ -187,6 +197,7 @@ const anthropicSettings: ProviderSettings = { modelOptions: anthropicModelOptions, modelOptionsFallback: (modelName) => { let fallbackName: keyof typeof anthropicModelOptions | null = null + if (modelName.includes('claude-3-7-sonnet')) fallbackName = 'claude-3-7-sonnet-20250219' if (modelName.includes('claude-3-5-sonnet')) fallbackName = 'claude-3-5-sonnet-20241022' if (modelName.includes('claude-3-5-haiku')) fallbackName = 'claude-3-5-haiku-20241022' if (modelName.includes('claude-3-opus')) fallbackName = 'claude-3-opus-20240229' diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/preprocessLLMMessages.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/preprocessLLMMessages.ts index 32b91d07..755729ce 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/preprocessLLMMessages.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/preprocessLLMMessages.ts @@ -14,9 +14,22 @@ export const parseObject = (args: unknown) => { } -const prepareMessages_cloneAndTrim = ({ messages: messages_ }: { messages: LLMChatMessage[] }) => { - const messages = deepClone(messages_).map(m => ({ ...m, content: m.content.trim(), })) - return { messages } +const prepareMessages_normalize = ({ messages: messages_ }: { messages: LLMChatMessage[] }) => { + const messages = deepClone(messages_) + const newMessages: LLMChatMessage[] = [] + for (let i = 1; i < messages.length; i += 1) { + const curr = messages[i] + const prev = messages[i - 1] + // if found a repeated role, put the current content in the prev + if ((curr.role === 'user' && prev.role === 'user') || (curr.role === 'assistant' && prev.role === 'assistant')) { + prev.content += '\n' + curr.content + continue + } + // add the message + newMessages.push(curr) + } + const finalMessages = newMessages.map(m => ({ ...m, content: m.content.trim() })) + return { messages: finalMessages } } // no matter whether the model supports a system message or not (or what format it supports), add it in some way @@ -313,7 +326,7 @@ export const prepareMessages = ({ supportsSystemMessage: false | 'system-role' | 'developer-role' | 'separated', supportsTools: false | 'anthropic-style' | 'openai-style', }) => { - const { messages: messages1 } = prepareMessages_cloneAndTrim({ messages }) + const { messages: messages1 } = prepareMessages_normalize({ messages }) const { messages: messages2, separateSystemMessageStr } = prepareMessages_systemMessage({ messages: messages1, aiInstructions, supportsSystemMessage }) const { messages: messages3 } = prepareMessages_tools({ messages: messages2, supportsTools }) return {