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 ?
+
+ :
}
>
}