This commit is contained in:
Andrew Pareles 2025-02-17 01:50:28 -08:00
parent 366dbf0b52
commit 137e0068a3
6 changed files with 48 additions and 18 deletions

View file

@ -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)

View file

@ -45,6 +45,7 @@ export type RefreshModelStateOfProvider = Record<RefreshableProviderName, Refres
const refreshBasedOn: { [k in RefreshableProviderName]: (keyof SettingsOfProvider[k])[] } = {
ollama: ['_didFillInProviderSettings', 'endpoint'],
vLLM: ['_didFillInProviderSettings', 'endpoint'],
// openAICompatible: ['_didFillInProviderSettings', 'endpoint', 'apiKey'],
}
const REFRESH_INTERVAL = 5_000
@ -140,10 +141,11 @@ export class RefreshModelService extends Disposable implements IRefreshModelServ
state: RefreshModelStateOfProvider = {
ollama: { state: 'init', timeoutId: null },
vLLM: { state: 'init', timeoutId: null },
}
// start listening for models (and don't stop until success)
// start listening for models (and don't stop)
startRefreshingModels: IRefreshModelService['startRefreshingModels'] = (providerName, options) => {
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);
}),

View file

@ -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,

View file

@ -125,6 +125,8 @@ const developerInfoAtProvider: { [providerName in ProviderName]: DeveloperInfoAt
},
'xAI': {
},
'vLLM': {
},
}
export const developerInfoOfProviderName = (providerName: ProviderName): Partial<DeveloperInfoAtProvider> => {
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<typeof defaultProviderSettings[ProviderName]>
@ -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<ProviderName, any>
// 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,
},
}

View file

@ -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({

View file

@ -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':