From c1a36265741cb1d2945139460ebb23f69e8c6fb7 Mon Sep 17 00:00:00 2001 From: CodeEagle Date: Sun, 24 Aug 2025 09:25:14 +0800 Subject: [PATCH] feat: Add OpenRouter free models fetching --- .../void/common/voidSettingsService.ts | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/void/common/voidSettingsService.ts b/src/vs/workbench/contrib/void/common/voidSettingsService.ts index 3e0c229520c..b9ed41a3d98 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsService.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsService.ts @@ -246,6 +246,7 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { ) { super() + this._fetchOpenRouterFreeModels() // at the start, we haven't read the partial config yet, but we need to set state to something this.state = defaultState() let resolver: () => void = () => { } @@ -289,7 +290,7 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { } // add disableSystemMessage feature if (readS.globalSettings.disableSystemMessage === undefined) readS.globalSettings.disableSystemMessage = false; - + // add autoAcceptLLMChanges feature if (readS.globalSettings.autoAcceptLLMChanges === undefined) readS.globalSettings.autoAcceptLLMChanges = false; } @@ -365,6 +366,28 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { this._storageService.store(VOID_SETTINGS_STORAGE_KEY, encryptedState, StorageScope.APPLICATION, StorageTarget.USER); } + private async _fetchOpenRouterFreeModels() { + const res = await fetch('https://openrouter.ai/api/v1/models'); + + if (res.status !== 200) { + throw new Error(`[${res.status}] Error fetching OpenRouter models: ${res.statusText}`); + } + interface OpenRouterModel { + id: string + name: string + } + const { data: models } = await res.json() as { data: [OpenRouterModel] }; + const freeModels = models.filter(m => m.id.includes(':free')); + const providerName = 'openRouter'; + for (const model of freeModels) { + this.addModel(providerName, model.id); + } + const modelsToDelete = this.state.settingsOfProvider[providerName].models.filter(m => freeModels.some(f => f.id === m.modelName) === false && m.modelName.includes(':free')); + for (const m of modelsToDelete) { + this.deleteModel(providerName, m.modelName); + } + } + setSettingOfProvider: SetSettingOfProviderFn = async (providerName, settingName, newVal) => { const newModelSelectionOfFeature = this.state.modelSelectionOfFeature