From b73c11429cedfe252af6e7dfdbdc566afc9fa8e7 Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Mon, 5 May 2025 01:15:51 -0700 Subject: [PATCH] finish adding effort budget --- .../react/src/sidebar-tsx/SidebarChat.tsx | 17 ++--- .../contrib/void/common/modelCapabilities.ts | 64 ++++++++++++++----- 2 files changed, 55 insertions(+), 26 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx index 592ad006..bf88dbbd 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx @@ -199,7 +199,7 @@ const ReasoningOptionSlider = ({ featureName }: { featureName: FeatureName }) => step={stepSize} value={value} onChange={(newVal) => { - const isOff = canTurnOffReasoning && newVal === min + const isOff = canTurnOffReasoning && newVal === valueIfOff voidSettingsService.setOptionsOfModelSelection(featureName, modelSelection.providerName, modelSelection.modelName, { reasoningEnabled: !isOff, reasoningBudget: newVal }) }} /> @@ -214,27 +214,24 @@ const ReasoningOptionSlider = ({ featureName }: { featureName: FeatureName }) => const min = canTurnOffReasoning ? -1 : 0 const max = values.length - 1 + const currentEffort = voidSettingsState.optionsOfModelSelection[featureName][modelSelection.providerName]?.[modelSelection.modelName]?.reasoningEffort ?? defaultVal const valueIfOff = -1 - - const value = isReasoningEnabled ? - values.indexOf(voidSettingsState.optionsOfModelSelection[featureName][modelSelection.providerName]?.[modelSelection.modelName]?.reasoningEffort ?? defaultVal) - : valueIfOff - + const value = isReasoningEnabled && currentEffort ? values.indexOf(currentEffort) : valueIfOff return
Thinking { - const isOff = canTurnOffReasoning && newVal === min - voidSettingsService.setOptionsOfModelSelection(featureName, modelSelection.providerName, modelSelection.modelName, { reasoningEnabled: !isOff, reasoningBudget: newVal }) + const isOff = canTurnOffReasoning && newVal === valueIfOff + voidSettingsService.setOptionsOfModelSelection(featureName, modelSelection.providerName, modelSelection.modelName, { reasoningEnabled: !isOff, reasoningEffort: values[newVal] ?? undefined }) }} /> - {isReasoningEnabled ? `${value}` : 'Thinking disabled'} + {isReasoningEnabled ? `${currentEffort}` : 'Thinking disabled'}
} diff --git a/src/vs/workbench/contrib/void/common/modelCapabilities.ts b/src/vs/workbench/contrib/void/common/modelCapabilities.ts index b6e8da66..9490d390 100644 --- a/src/vs/workbench/contrib/void/common/modelCapabilities.ts +++ b/src/vs/workbench/contrib/void/common/modelCapabilities.ts @@ -517,7 +517,7 @@ const openAIModelOptions = { // https://platform.openai.com/docs/pricing supportsFIM: false, specialToolFormat: 'openai-style', supportsSystemMessage: 'developer-role', - reasoningCapabilities: false, + reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: false, canIOReasoning: false, reasoningSlider: { type: 'effort_slider', values: ['low', 'medium', 'high'], default: 'low' } }, }, 'o4-mini': { contextWindow: 1_047_576, @@ -527,7 +527,7 @@ const openAIModelOptions = { // https://platform.openai.com/docs/pricing supportsFIM: false, specialToolFormat: 'openai-style', supportsSystemMessage: 'developer-role', - reasoningCapabilities: false, + reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: false, canIOReasoning: false, reasoningSlider: { type: 'effort_slider', values: ['low', 'medium', 'high'], default: 'low' } }, }, 'gpt-4.1': { contextWindow: 1_047_576, @@ -566,7 +566,7 @@ const openAIModelOptions = { // https://platform.openai.com/docs/pricing downloadable: false, supportsFIM: false, supportsSystemMessage: 'developer-role', - reasoningCapabilities: { supportsReasoning: true, canIOReasoning: false, canTurnOffReasoning: false }, // it doesn't actually output reasoning, but our logic is fine with it + reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: false, canIOReasoning: false, reasoningSlider: { type: 'effort_slider', values: ['low', 'medium', 'high'], default: 'low' } }, }, 'o3-mini': { contextWindow: 200_000, @@ -575,7 +575,7 @@ const openAIModelOptions = { // https://platform.openai.com/docs/pricing downloadable: false, supportsFIM: false, supportsSystemMessage: 'developer-role', - reasoningCapabilities: { supportsReasoning: true, canIOReasoning: false, canTurnOffReasoning: false }, + reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: false, canIOReasoning: false, reasoningSlider: { type: 'effort_slider', values: ['low', 'medium', 'high'], default: 'low' } }, }, 'gpt-4o': { contextWindow: 128_000, @@ -594,7 +594,7 @@ const openAIModelOptions = { // https://platform.openai.com/docs/pricing downloadable: false, supportsFIM: false, supportsSystemMessage: false, // does not support any system - reasoningCapabilities: { supportsReasoning: true, canIOReasoning: false, canTurnOffReasoning: false }, + reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: false, canIOReasoning: false, reasoningSlider: { type: 'effort_slider', values: ['low', 'medium', 'high'], default: 'low' } }, }, 'gpt-4o-mini': { contextWindow: 128_000, @@ -635,24 +635,54 @@ const openAISettings: VoidStaticProviderInfo = { // ---------------- XAI ---------------- const xAIModelOptions = { + // https://docs.x.ai/docs/guides/reasoning#reasoning + // https://docs.x.ai/docs/models#models-and-pricing 'grok-2': { contextWindow: 131_072, - reservedOutputTokenSpace: null, // 131_072, + reservedOutputTokenSpace: null, cost: { input: 2.00, output: 10.00 }, downloadable: false, supportsFIM: false, supportsSystemMessage: 'system-role', reasoningCapabilities: false, }, - // 'grok-3': { - // contextWindow: 1_000_000, - // reservedOutputTokenSpace: null, - // cost: {}, - // downloadable: false, - // supportsFIM: false, - // supportsSystemMessage: 'system-role', - // reasoningCapabilities: {canIOReasoning:false, canTurnOffReasoning:true,}, - // } + 'grok-3': { + contextWindow: 131_072, + reservedOutputTokenSpace: null, + cost: { input: 3.00, output: 15.00 }, + downloadable: false, + supportsFIM: false, + supportsSystemMessage: 'system-role', + reasoningCapabilities: false, + }, + 'grok-3-fast': { + contextWindow: 131_072, + reservedOutputTokenSpace: null, + cost: { input: 5.00, output: 25.00 }, + downloadable: false, + supportsFIM: false, + supportsSystemMessage: 'system-role', + reasoningCapabilities: false, + }, + // only mini supports thinking + 'grok-3-mini': { + contextWindow: 131_072, + reservedOutputTokenSpace: null, + cost: { input: 0.30, output: 0.50 }, + downloadable: false, + supportsFIM: false, + supportsSystemMessage: 'system-role', + reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: false, canIOReasoning: false, reasoningSlider: { type: 'effort_slider', values: ['low', 'high'], default: 'low' } }, + }, + 'grok-3-mini-fast': { + contextWindow: 131_072, + reservedOutputTokenSpace: null, + cost: { input: 0.60, output: 4.00 }, + downloadable: false, + supportsFIM: false, + supportsSystemMessage: 'system-role', + reasoningCapabilities: { supportsReasoning: true, canTurnOffReasoning: false, canIOReasoning: false, reasoningSlider: { type: 'effort_slider', values: ['low', 'high'], default: 'low' } }, + }, } as const satisfies { [s: string]: VoidStaticModelInfo } const xAISettings: VoidStaticProviderInfo = { @@ -663,7 +693,9 @@ const xAISettings: VoidStaticProviderInfo = { if (lower.includes('grok-2')) fallbackName = 'grok-2' if (fallbackName) return { modelName: fallbackName, ...xAIModelOptions[fallbackName] } return null - } + }, + // same implementation as openai + providerReasoningIOSettings: openAISettings.providerReasoningIOSettings, }