From 137e0068a3679b4705ecb20c73cc37b6eb40ff0b Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Mon, 17 Feb 2025 01:50:28 -0800 Subject: [PATCH] add vllm --- .../contrib/void/browser/editCodeService.ts | 6 ---- .../void/common/refreshModelService.ts | 10 ++++-- .../void/common/voidSettingsService.ts | 6 +++- .../contrib/void/common/voidSettingsTypes.ts | 35 +++++++++++++++---- .../void/electron-main/llmMessage/openai.ts | 6 ++++ .../llmMessage/sendLLMMessage.ts | 3 +- 6 files changed, 48 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/editCodeService.ts b/src/vs/workbench/contrib/void/browser/editCodeService.ts index 0138cfc1..8468a241 100644 --- a/src/vs/workbench/contrib/void/browser/editCodeService.ts +++ b/src/vs/workbench/contrib/void/browser/editCodeService.ts @@ -1177,19 +1177,13 @@ class EditCodeService extends Disposable implements IEditCodeService { private async _initializeSearchAndReplaceStream({ applyStr }: { applyStr: string }) { - - console.log('SEARCHREPLACE') const uri_ = this._getActiveEditorURI() if (!uri_) return const uri = uri_ - console.log('/* AAAA */') // generate search/replace block text const fileContents = await VSReadFile(this._modelService, uri) if (fileContents === null) return - console.log('/* BBB*/') - - // reject all diffZones on this URI, adding to history (there can't possibly be overlap after this) diff --git a/src/vs/workbench/contrib/void/common/refreshModelService.ts b/src/vs/workbench/contrib/void/common/refreshModelService.ts index ff61e8a8..1c95a4ad 100644 --- a/src/vs/workbench/contrib/void/common/refreshModelService.ts +++ b/src/vs/workbench/contrib/void/common/refreshModelService.ts @@ -45,6 +45,7 @@ export type RefreshModelStateOfProvider = Record { this._clearProviderTimeout(providerName) @@ -158,8 +160,9 @@ export class RefreshModelService extends Disposable implements IRefreshModelServ } } const listFn = providerName === 'ollama' ? this.llmMessageService.ollamaList - : providerName === 'openAICompatible' ? this.llmMessageService.openAICompatibleList - : () => { } + : providerName === 'vLLM' ? this.llmMessageService.openAICompatibleList + : providerName === 'openAICompatible' ? this.llmMessageService.openAICompatibleList + : () => { } listFn({ onSuccess: ({ models }) => { @@ -169,6 +172,7 @@ export class RefreshModelService extends Disposable implements IRefreshModelServ providerName, models.map(model => { if (providerName === 'ollama') return (model as OllamaModelResponse).name; + else if (providerName === 'vLLM') return (model as OpenaiCompatibleModelResponse).id; else if (providerName === 'openAICompatible') return (model as OpenaiCompatibleModelResponse).id; else throw new Error('refreshMode fn: unknown provider', providerName); }), diff --git a/src/vs/workbench/contrib/void/common/voidSettingsService.ts b/src/vs/workbench/contrib/void/common/voidSettingsService.ts index 8fd4aa79..7a35c678 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsService.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsService.ts @@ -176,7 +176,11 @@ class VoidSettingsService extends Disposable implements IVoidSettingsService { ...{ mistral: defaultSettingsOfProvider.mistral }, // A HACK BECAUSE WE ADDED XAI (did not exist before, comes before readS) - ...{ mistral: defaultSettingsOfProvider.xAI }, + ...{ xAI: defaultSettingsOfProvider.xAI }, + + // A HACK BECAUSE WE ADDED VLLM (did not exist before, comes before readS) + ...{ vLLM: defaultSettingsOfProvider.vLLM }, + ...readS.settingsOfProvider, diff --git a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts index abef16d8..14371a22 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsTypes.ts @@ -125,6 +125,8 @@ const developerInfoAtProvider: { [providerName in ProviderName]: DeveloperInfoAt }, 'xAI': { }, + 'vLLM': { + }, } export const developerInfoOfProviderName = (providerName: ProviderName): Partial => { return developerInfoAtProvider[providerName] ?? {} @@ -376,6 +378,9 @@ export const defaultProviderSettings = { ollama: { endpoint: 'http://127.0.0.1:11434', }, + vLLM: { + endpoint: 'http://localhost:8000', + }, openRouter: { apiKey: '', }, @@ -394,13 +399,13 @@ export const defaultProviderSettings = { }, xAI: { apiKey: '' - } + }, } as const export type ProviderName = keyof typeof defaultProviderSettings export const providerNames = Object.keys(defaultProviderSettings) as ProviderName[] -export const localProviderNames = ['ollama'] satisfies ProviderName[] // all local names +export const localProviderNames = ['ollama', 'vLLM'] satisfies ProviderName[] // all local names export const nonlocalProviderNames = providerNames.filter((name) => !(localProviderNames as string[]).includes(name)) // all non-local names type CustomSettingName = UnionOfKeys @@ -464,6 +469,11 @@ export const displayInfoOfProviderName = (providerName: ProviderName): DisplayIn title: 'Ollama', } } + else if (providerName === 'vLLM') { + return { + title: 'vLLM', + } + } else if (providerName === 'openAICompatible') { return { title: 'OpenAI-Compatible', @@ -532,12 +542,14 @@ export const displayInfoOfSettingName = (providerName: ProviderName, settingName else if (settingName === 'endpoint') { return { title: providerName === 'ollama' ? 'Endpoint' : - providerName === 'openAICompatible' ? 'baseURL' // (do not include /chat/completions) - : '(never)', + providerName === 'vLLM' ? 'Endpoint' : + providerName === 'openAICompatible' ? 'baseURL' :// (do not include /chat/completions) + '(never)', placeholder: providerName === 'ollama' ? defaultProviderSettings.ollama.endpoint - : providerName === 'openAICompatible' ? 'https://my-website.com/v1' - : '(never)', + : providerName === 'vLLM' ? defaultProviderSettings.vLLM.endpoint + : providerName === 'openAICompatible' ? 'https://my-website.com/v1' + : '(never)', subTextMd: providerName === 'ollama' ? 'If you would like to change this endpoint, please read more about [Endpoints here](https://github.com/ollama/ollama/blob/main/docs/faq.md#how-can-i-expose-ollama-on-my-network).' : undefined, @@ -583,6 +595,9 @@ export const voidInitModelOptions = { ollama: { models: [], }, + vLLM: { + models: [], + }, openRouter: { models: [], // any string }, @@ -601,7 +616,7 @@ export const voidInitModelOptions = { xAI: { models: defaultXAIModels, } -} +} satisfies Record // used when waiting and for a type reference @@ -666,6 +681,12 @@ export const defaultSettingsOfProvider: SettingsOfProvider = { ...voidInitModelOptions.ollama, _didFillInProviderSettings: undefined, }, + vLLM: { // aggregator + ...defaultCustomSettings, + ...defaultProviderSettings.vLLM, + ...voidInitModelOptions.vLLM, + _didFillInProviderSettings: undefined, + }, } diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/openai.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/openai.ts index 4b9ab724..80db8d73 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/openai.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/openai.ts @@ -51,6 +51,12 @@ const newOpenAI = ({ settingsOfProvider, providerName }: NewParams) => { baseURL: `${thisConfig.endpoint}/v1`, apiKey: 'noop', dangerouslyAllowBrowser: true, }) } + else if (providerName === 'vLLM') { + const thisConfig = settingsOfProvider[providerName] + return new OpenAI({ + baseURL: `${thisConfig.endpoint}/v1`, apiKey: 'noop', dangerouslyAllowBrowser: true, + }) + } else if (providerName === 'openRouter') { const thisConfig = settingsOfProvider[providerName] return new OpenAI({ diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.ts index 7d83cff2..8e29bff4 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.ts @@ -101,10 +101,11 @@ export const sendLLMMessage = ({ case 'openAICompatible': case 'mistral': case 'ollama': + case 'vLLM': case 'groq': case 'gemini': case 'xAI': - if (messagesType === 'FIMMessage') onFinalMessage({ fullText: 'TODO - OpenAI FIM', toolCalls: [] }) + if (messagesType === 'FIMMessage') onFinalMessage({ fullText: 'TODO - OpenAI API FIM', toolCalls: [] }) else /* */ sendOpenAIChat({ messages: messages_, onText, onFinalMessage, onError, settingsOfProvider, modelName, _setAborter, providerName, aiInstructions, tools }); break; case 'anthropic':