diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/ModelDropdown.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/ModelDropdown.tsx index 42f4de23..813968a4 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/ModelDropdown.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/ModelDropdown.tsx @@ -86,7 +86,7 @@ const MemoizedModelDropdown = ({ featureName, className }: { featureName: Featur useEffect(() => { const oldOptions = oldOptionsRef.current - const newOptions = settingsState._modelOptions.filter((o) => filter(o.selection)) + const newOptions = settingsState._modelOptions.filter((o) => filter(o.selection, { chatMode: settingsState.globalSettings.chatMode })) if (!optionsEqual(oldOptions, newOptions)) { setMemoizedOptions(newOptions) @@ -95,7 +95,7 @@ const MemoizedModelDropdown = ({ featureName, className }: { featureName: Featur }, [settingsState._modelOptions, filter]) if (memoizedOptions.length === 0) { // Pretty sure this will never be reached unless filter is enabled - return + return } return @@ -116,7 +116,7 @@ export const ModelDropdown = ({ featureName, className }: { featureName: Feature const isDisabled = isFeatureNameDisabled(featureName, settingsState) if (isDisabled) return boolean; emptyMessage: string | null } } = { - 'Autocomplete': { filter: o => getModelCapabilities(o.providerName, o.modelName).supportsFIM, emptyMessage: 'No models support FIM' }, - 'Chat': { filter: o => true, emptyMessage: null }, - 'Ctrl+K': { filter: o => true, emptyMessage: null }, - 'Apply': { filter: o => true, emptyMessage: null }, +export const modelFilterOfFeatureName: { [featureName in FeatureName]: { filter: (o: ModelSelection, opts: { chatMode: ChatMode }) => boolean; emptyMessage: null | { message: string, priority: 'always' | 'fallback' } } } = { + 'Autocomplete': { filter: (o) => getModelCapabilities(o.providerName, o.modelName).supportsFIM, emptyMessage: { message: 'No models support FIM', priority: 'always' } }, + 'Chat': { filter: (o, { chatMode }) => chatMode === 'chat' ? true : !!getModelCapabilities(o.providerName, o.modelName).supportsTools, emptyMessage: { message: 'No models support tool use', priority: 'fallback' } }, + 'Ctrl+K': { filter: o => true, emptyMessage: null, }, + 'Apply': { filter: o => true, emptyMessage: null, }, } -const _validatedState = (state: Omit) => { +const _validatedModelState = (state: Omit) => { let newSettingsOfProvider = state.settingsOfProvider @@ -143,7 +143,8 @@ const _validatedState = (state: Omit) => { for (const featureName of featureNames) { const { filter } = modelFilterOfFeatureName[featureName] - const modelOptionsForThisFeature = newModelOptions.filter((o) => filter(o.selection)) + const filterOpts = { chatMode: state.globalSettings.chatMode } + const modelOptionsForThisFeature = newModelOptions.filter((o) => filter(o.selection, filterOpts)) const modelSelectionAtFeature = newModelSelectionOfFeature[featureName] const selnIdx = modelSelectionAtFeature === null ? -1 : modelOptionsForThisFeature.findIndex(m => modelSelectionsEqual(m.selection, modelSelectionAtFeature)) @@ -218,7 +219,7 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { // the stored data structure might be outdated, so we need to update it here const finalState = readS - this.state = _validatedState(finalState); + this.state = _validatedModelState(finalState); this._resolver(); this._onDidChangeState.fire(); @@ -265,7 +266,7 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { globalSettings: newGlobalSettings, } - this.state = _validatedState(newState) + this.state = _validatedModelState(newState) await this._storeState() this._onDidChangeState.fire() @@ -287,7 +288,7 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { [settingName]: newVal } } - this.state = newState + this.state = _validatedModelState(newState) await this._storeState() this._onDidChangeState.fire() @@ -305,7 +306,7 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { } } - this.state = newState + this.state = _validatedModelState(newState) await this._storeState() this._onDidChangeState.fire() @@ -331,7 +332,7 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { } } } - this.state = newState + this.state = _validatedModelState(newState) await this._storeState() this._onDidChangeState.fire()