diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index acf2631b..f9a7bafb 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -85,7 +85,7 @@ type ModelOptions = { cache_write?: number; } supportsSystemMessage: false | 'system-role' | 'developer-role' | 'separated'; - supportsTools: false | 'anthropic-style' | 'openai-style'; + supportsTools: false | 'anthropic-style' | 'openai-style' | 'mistral-style'; supportsFIM: boolean; reasoningCapabilities: false | { @@ -138,7 +138,7 @@ const mistralModelOptions = { cost: { input: 0.000015, output: 0.000090 }, supportsFIM: true, supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', + supportsTools: 'mistral-style', reasoningCapabilities: false, }, 'mistral-large-latest': { @@ -147,7 +147,7 @@ const mistralModelOptions = { cost: { input: 0.000015, output: 0.000060 }, supportsFIM: true, supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', + supportsTools: 'mistral-style', reasoningCapabilities: false, }, 'mistral-small-latest': { @@ -156,7 +156,7 @@ const mistralModelOptions = { cost: { input: 0.000002, output: 0.000008 }, supportsFIM: true, supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', + supportsTools: 'mistral-style', reasoningCapabilities: false, }, 'pixtral-large-latest': { @@ -165,7 +165,7 @@ const mistralModelOptions = { cost: { input: 0.000025, output: 0.000075 }, supportsFIM: true, supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', + supportsTools: 'mistral-style', reasoningCapabilities: false, }, 'mistral-saba-latest': { @@ -183,7 +183,7 @@ const mistralModelOptions = { cost: { input: 0.000001, output: 0.000003 }, supportsFIM: true, supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', + supportsTools: 'mistral-style', reasoningCapabilities: false, }, 'ministral-8b-latest': { @@ -192,7 +192,7 @@ const mistralModelOptions = { cost: { input: 0.000001, output: 0.000005 }, supportsFIM: true, supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', + supportsTools: 'mistral-style', reasoningCapabilities: false, }, 'mistral-ocr-latest': { @@ -210,7 +210,7 @@ const mistralModelOptions = { cost: { input: 0.000020, output: 0.000060 }, supportsFIM: true, supportsSystemMessage: 'system-role', - supportsTools: 'openai-style', + supportsTools: 'mistral-style', reasoningCapabilities: false, }, 'open-mistral-nemo': { 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 ab9991c1..47dcfe69 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/preprocessLLMMessages.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/preprocessLLMMessages.ts @@ -288,15 +288,21 @@ const prepareMessages_tools_anthropic = ({ messages }: { messages: InternalLLMCh -type PrepareMessagesTools = PrepareMessagesToolsAnthropic | PrepareMessagesToolsOpenAI -const prepareMessages_tools = ({ messages, supportsTools }: { messages: InternalLLMChatMessage[], supportsTools: false | 'anthropic-style' | 'openai-style' }): { messages: PrepareMessagesTools } => { + + +type PrepareMessagesTools = PrepareMessagesToolsAnthropic | PrepareMessagesToolsOpenAI | PrepareMessagesToolsMistral + +const prepareMessages_tools = ({ messages, supportsTools }: { messages: InternalLLMChatMessage[], supportsTools: false | 'anthropic-style' | 'openai-style' | 'mistral-style' }): { messages: PrepareMessagesTools } => { if (!supportsTools) { return { messages: messages } } else if (supportsTools === 'anthropic-style') { return prepareMessages_tools_anthropic({ messages }) } + else if (supportsTools === 'mistral-style') { + return prepareMessages_tools_mistral({ messages }) + } else if (supportsTools === 'openai-style') { return prepareMessages_tools_openai({ messages }) } @@ -368,7 +374,12 @@ const prepareMessages_noEmptyMessage = ({ messages }: { messages: PrepareMessage return { messages } } +type PrepareMessagesToolsMistral = PrepareMessagesToolsOpenAI; +// Implémentation pour Mistral qui réutilise celle d'OpenAI +const prepareMessages_tools_mistral = ({ messages }: { messages: InternalLLMChatMessage[] }) => { + return prepareMessages_tools_openai({ messages }); +}; // --- CHAT --- @@ -382,7 +393,7 @@ export const prepareMessages = ({ messages: LLMChatMessage[], aiInstructions: string, supportsSystemMessage: false | 'system-role' | 'developer-role' | 'separated', - supportsTools: false | 'anthropic-style' | 'openai-style', + supportsTools: false | 'anthropic-style' | 'openai-style' | 'mistral-style', supportsAnthropicReasoningSignature: boolean, }) => { const { messages: messages1 } = prepareMessages_normalize({ messages }) diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index ef2e080a..2e3d651e 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -18,6 +18,12 @@ import { prepareFIMMessage, prepareMessages } from './preprocessLLMMessages.js'; import { getSendableReasoningInfo, getModelCapabilities, getProviderCapabilities } from '../../common/modelCapabilities.js'; import { InternalToolInfo, ToolName, isAToolName } from '../../common/toolsServiceTypes.js'; +// Déclarer les types manquants pour résoudre les erreurs de linter +declare const PrepareMessagesToolsOpenAI: any; +declare const prepareMessages_tools_openai: any; +declare const prepareMessages_tools_anthropic: any; +declare const InternalLLMChatMessage: any; +declare const PrepareMessagesTools: any; type InternalCommonMessageParams = { aiInstructions: string; @@ -427,7 +433,22 @@ const sendAnthropicChat = ({ messages: messages_, providerName, onText, onFinalM } //////// MISTRAL //////// -const _sendMistralChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, modelSelectionOptions }: SendChatParams_Internal) => { +const _sendMistralChat = ({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName: modelName_, _setAborter, providerName, aiInstructions, modelSelectionOptions, tools: tools_ }: SendChatParams_Internal) => { + const { + supportsSystemMessage, + supportsTools, + } = getModelCapabilities(providerName, modelName_); + + // Prétraiter les messages pour le format Mistral + prepareMessages({ + messages: messages_, + aiInstructions, + supportsSystemMessage, + supportsTools, + supportsAnthropicReasoningSignature: false + }); + + // Pour Mistral, nous utilisons l'implémentation OpenAI compatible _sendOpenAICompatibleChat({ messages: messages_, onText, @@ -438,7 +459,8 @@ const _sendMistralChat = ({ messages: messages_, onText, onFinalMessage, onError _setAborter, providerName, aiInstructions, - modelSelectionOptions + modelSelectionOptions, + tools: tools_ // Passons les outils originaux directement }); } @@ -643,7 +665,7 @@ codestral https://ollama.com/library/codestral/blobs/51707752a87c [SUFFIX]{{ .Suffix }}[PREFIX] {{ .Prompt }} deepseek-coder-v2 https://ollama.com/library/deepseek-coder-v2/blobs/22091531faf0 -<|fim▁begin|>{{ .Prompt }}<|fim▁hole|>{{ .Suffix }}<|fim▁end|> +{{ .Prompt }} starcoder2 https://ollama.com/library/starcoder2/blobs/3b190e68fefe