From 528b8a6b9b80ba1da210e8bbfc1a54e3a0601827 Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Tue, 28 Jan 2025 16:22:32 -0800 Subject: [PATCH] better model onboard --- .gitignore | 1 + src/vs/platform/void/common/llmMessageService.ts | 10 ++++++++++ src/vs/platform/void/common/voidSettingsTypes.ts | 7 +++++++ .../react/src/void-settings-tsx/ModelDropdown.tsx | 14 ++++++++------ 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index fcdb9b6f..17d12e30 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,5 @@ product.overrides.json *.snap.actual .vscode-test .tmp/ +.tmp2/ .tool-versions diff --git a/src/vs/platform/void/common/llmMessageService.ts b/src/vs/platform/void/common/llmMessageService.ts index fcec27f9..2096209a 100644 --- a/src/vs/platform/void/common/llmMessageService.ts +++ b/src/vs/platform/void/common/llmMessageService.ts @@ -12,6 +12,7 @@ import { createDecorator } from '../../instantiation/common/instantiation.js'; import { Event } from '../../../base/common/event.js'; import { Disposable } from '../../../base/common/lifecycle.js'; import { IVoidSettingsService } from './voidSettingsService.js'; +import { getProvidersWithoutModels } from './voidSettingsTypes.js'; // import { INotificationService } from '../../notification/common/notification.js'; // calls channel to implement features @@ -92,6 +93,15 @@ export class LLMMessageService extends Disposable implements ILLMMessageService // end early if no provider const modelSelection = this.voidSettingsService.state.modelSelectionOfFeature[featureName] + + // throw an error for providers without models + const providersWithoutModels = getProvidersWithoutModels(this.voidSettingsService.state.settingsOfProvider) + if (providersWithoutModels.length !== 0) { + onError({ message: `You haven't added any models for ${providersWithoutModels.join(', ')}.`, fullError: null }) + return null + } + + // throw an error if no models if (modelSelection === null) { onError({ message: 'Please add a Provider in Settings!', fullError: null }) return null diff --git a/src/vs/platform/void/common/voidSettingsTypes.ts b/src/vs/platform/void/common/voidSettingsTypes.ts index 43a29f5b..8caec0be 100644 --- a/src/vs/platform/void/common/voidSettingsTypes.ts +++ b/src/vs/platform/void/common/voidSettingsTypes.ts @@ -185,6 +185,13 @@ export const customSettingNamesOfProvider = (providerName: ProviderName) => { return Object.keys(defaultProviderSettings[providerName]) as CustomSettingName[] } +export const getProvidersWithoutModels = (settingsOfProvider: SettingsOfProvider) => { + return Object.entries(settingsOfProvider) + .filter(([name, provider]) => provider._enabled && provider.models.length === 0) + .map(([name]) => name) +} + + type CommonProviderSettings = { _enabled: boolean | undefined, // undefined initially, computed when user types in all fields 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 bbc6d9d1..6b05201f 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 @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------*/ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import { FeatureName, featureNames, ModelSelection, modelSelectionsEqual, ProviderName, providerNames } from '../../../../../../../platform/void/common/voidSettingsTypes.js' +import { FeatureName, featureNames, getProvidersWithoutModels, ModelSelection, modelSelectionsEqual, ProviderName, providerNames, SettingsOfProvider } from '../../../../../../../platform/void/common/voidSettingsTypes.js' import { useSettingsState, useRefreshModelState, useAccessor } from '../util/services.js' import { _VoidSelectBox, VoidCustomSelectBox } from '../util/inputs.js' import { SelectBox } from '../../../../../../../base/browser/ui/selectBox/selectBox.js' @@ -12,8 +12,6 @@ import { IconWarning } from '../sidebar-tsx/SidebarChat.js' import { VOID_OPEN_SETTINGS_ACTION_ID, VOID_TOGGLE_SETTINGS_ACTION_ID } from '../../../voidSettingsPane.js' import { ModelOption } from '../../../../../../../platform/void/common/voidSettingsService.js' - - const optionsEqual = (m1: ModelOption[], m2: ModelOption[]) => { if (m1.length !== m2.length) return false for (let i = 0; i < m1.length; i++) { @@ -119,15 +117,19 @@ export const WarningBox = ({ text, onClick, className }: { text: string; onClick export const ModelDropdown = ({ featureName }: { featureName: FeatureName }) => { const settingsState = useSettingsState() + const providersWithMissingModels = getProvidersWithoutModels(settingsState.settingsOfProvider) + const accessor = useAccessor() const commandService = accessor.get('ICommandService') const openSettings = () => { commandService.executeCommand(VOID_OPEN_SETTINGS_ACTION_ID); }; return <> - {settingsState._modelOptions.length === 0 ? - - : + {providersWithMissingModels.length !== 0 ? + + : settingsState._modelOptions.length === 0 ? + + : } }