From 696abc39fd257ca435c58dcdf6358d29d07499ea Mon Sep 17 00:00:00 2001 From: Andrew Pareles Date: Thu, 12 Dec 2024 17:51:50 -0800 Subject: [PATCH] add ollama model fetcher, but proxy ignores its functions --- VOID_USEFUL_LINKS.md | 2 +- src/vs/code/electron-main/app.ts | 5 ++ .../void/browser/ollamaListService.ts | 30 ++++++++++++ .../void/browser/void.contribution.ts | 6 +++ .../platform/void/common/ollamaListService.ts | 48 +++++++++++++++++++ .../platform/void/common/voidConfigService.ts | 4 +- .../void/electron-main/llmMessage/ollama.ts | 13 ++--- .../llmMessage/sendOllamaMessage.ts | 4 -- .../electron-main/ollamaListMainService.ts | 24 ++++++++++ .../contrib/void/browser/registerSidebar.ts | 12 +++++ 10 files changed, 131 insertions(+), 17 deletions(-) create mode 100644 src/vs/platform/void/browser/ollamaListService.ts create mode 100644 src/vs/platform/void/common/ollamaListService.ts delete mode 100644 src/vs/platform/void/electron-main/llmMessage/sendOllamaMessage.ts create mode 100644 src/vs/platform/void/electron-main/ollamaListMainService.ts diff --git a/VOID_USEFUL_LINKS.md b/VOID_USEFUL_LINKS.md index 2897507b..b3ba5a30 100644 --- a/VOID_USEFUL_LINKS.md +++ b/VOID_USEFUL_LINKS.md @@ -6,7 +6,7 @@ The Void team put together this list of links to get up and running with VSCode' - [How VSCode's sourcecode is organized](https://github.com/microsoft/vscode/wiki/Source-Code-Organization) - this explains where the entry point files are, what `browser/` and `common/` mean, etc. This is the most important read on this whole list! We recommend reading the whole thing. -- [Built-in VSCode Styles](https://code.visualstudio.com/api/references/theme-color) - CSS variables that are built into VSCode. Use `var(--vscode-{theme but replacing . with -})`. You can also see the [Webview Theming Guide](https://code.visualstudio.com/api/extension-guides/webview#theming-webview-content). +- [Built-in VSCode styles](https://code.visualstudio.com/api/references/theme-color) - CSS variables that are built into VSCode. Use `var(--vscode-{theme but replacing . with -})`. You can also see their [Webview theming guide](https://code.visualstudio.com/api/extension-guides/webview#theming-webview-content). ## Beginners / Getting started diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index afb593cc..2e348c96 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -124,6 +124,8 @@ import { ExtensionSignatureVerificationService, IExtensionSignatureVerificationS import { LLMMessageChannel } from '../../platform/void/electron-main/llmMessageChannel.js'; import { IMetricsService } from '../../platform/void/common/metricsService.js'; import { MetricsMainService } from '../../platform/void/electron-main/metricsMainService.js'; +import { OllamaListMainService } from '../../platform/void/electron-main/ollamaListMainService.js'; +import { IOllamaListService } from '../../platform/void/common/ollamaListService.js'; /** * The main VS Code application. There will only ever be one instance, @@ -1107,6 +1109,7 @@ export class CodeApplication extends Disposable { // Void main process services (required for services with a channel for comm between browser and electron-main (node)) services.set(IMetricsService, new SyncDescriptor(MetricsMainService, undefined, false)); + services.set(IOllamaListService, new SyncDescriptor(OllamaListMainService, undefined, false)); // Default Extensions Profile Init services.set(IExtensionsProfileScannerService, new SyncDescriptor(ExtensionsProfileScannerService, undefined, true)); @@ -1245,6 +1248,8 @@ export class CodeApplication extends Disposable { // Void const metricsChannel = ProxyChannel.fromService(accessor.get(IMetricsService), disposables); mainProcessElectronServer.registerChannel('void-channel-metrics', metricsChannel); + const ollamaListChannel = ProxyChannel.fromService(accessor.get(IOllamaListService), disposables); + mainProcessElectronServer.registerChannel('void-channel-ollama-list', ollamaListChannel); const sendLLMMessageChannel = new LLMMessageChannel(accessor.get(IMetricsService)); mainProcessElectronServer.registerChannel('void-channel-sendLLMMessage', sendLLMMessageChannel); diff --git a/src/vs/platform/void/browser/ollamaListService.ts b/src/vs/platform/void/browser/ollamaListService.ts new file mode 100644 index 00000000..0b0d05f6 --- /dev/null +++ b/src/vs/platform/void/browser/ollamaListService.ts @@ -0,0 +1,30 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Glass Devtools, Inc. All rights reserved. + * Void Editor additions licensed under the AGPL 3.0 License. + *--------------------------------------------------------------------------------------------*/ + +import { ProxyChannel } from '../../../base/parts/ipc/common/ipc.js'; +import { IMainProcessService } from '../../ipc/common/mainProcessService.js'; +import { InstantiationType, registerSingleton } from '../../instantiation/common/extensions.js'; +import { IOllamaListService } from '../common/ollamaListService.js'; + +// BROWSER IMPLEMENTATION, calls channel + +export class OllamaListService implements IOllamaListService { + + readonly _serviceBrand: undefined; + private readonly ollamaListService: IOllamaListService; + + constructor( + @IMainProcessService mainProcessService: IMainProcessService // (only usable on client side) + ) { + this.ollamaListService = ProxyChannel.toService(mainProcessService.getChannel('void-channel-ollama-list')); + } + + list: IOllamaListService['list'] = (...params) => { + this.ollamaListService.list(...params); + } +} + +registerSingleton(IOllamaListService, OllamaListService, InstantiationType.Eager); + diff --git a/src/vs/platform/void/browser/void.contribution.ts b/src/vs/platform/void/browser/void.contribution.ts index 05b6c3c1..70194eed 100644 --- a/src/vs/platform/void/browser/void.contribution.ts +++ b/src/vs/platform/void/browser/void.contribution.ts @@ -1,9 +1,15 @@ +// --- browser --- // metrics import '../browser/metricsService.js' +// ollamaList +import '../browser/ollamaListService.js' + +// --- common --- // llmMessage import '../browser/llmMessageService.js' // voidConfig import '../common/voidConfigService.js' + diff --git a/src/vs/platform/void/common/ollamaListService.ts b/src/vs/platform/void/common/ollamaListService.ts new file mode 100644 index 00000000..3a9513de --- /dev/null +++ b/src/vs/platform/void/common/ollamaListService.ts @@ -0,0 +1,48 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Glass Devtools, Inc. All rights reserved. + * Void Editor additions licensed under the AGPL 3.0 License. + *--------------------------------------------------------------------------------------------*/ + +import { createDecorator } from '../../instantiation/common/instantiation.js'; +import { SettingsOfProvider } from './voidConfigTypes.js'; + + +export type OllamaListFnParams = { + settingsOfProvider: SettingsOfProvider; + onSuccess: (param: { models: ModelResponse[] }) => void; + onError: (param: { error: any }) => void; +} + + +export interface IOllamaListService { + readonly _serviceBrand: undefined; + list(params: OllamaListFnParams): void; +} + +export const IOllamaListService = createDecorator('ollamaListService'); + + + + + + +// These are from 'ollama' SDK +interface ModelDetails { + parent_model: string; + format: string; + family: string; + families: string[]; + parameter_size: string; + quantization_level: string; +} + +type ModelResponse = { + name: string; + modified_at: Date; + size: number; + digest: string; + details: ModelDetails; + expires_at: Date; + size_vram: number; +} + diff --git a/src/vs/platform/void/common/voidConfigService.ts b/src/vs/platform/void/common/voidConfigService.ts index 26d135b8..0c5f1291 100644 --- a/src/vs/platform/void/common/voidConfigService.ts +++ b/src/vs/platform/void/common/voidConfigService.ts @@ -28,8 +28,8 @@ type SetModelSelectionOfFeature = ( type VoidConfigState = { - settingsOfProvider: SettingsOfProvider; // optionsOfProvider - modelSelectionOfFeature: ModelSelectionOfFeature; // stateOfFeature + readonly settingsOfProvider: SettingsOfProvider; // optionsOfProvider + readonly modelSelectionOfFeature: ModelSelectionOfFeature; // stateOfFeature } export interface IVoidConfigStateService { diff --git a/src/vs/platform/void/electron-main/llmMessage/ollama.ts b/src/vs/platform/void/electron-main/llmMessage/ollama.ts index d2684062..415adb19 100644 --- a/src/vs/platform/void/electron-main/llmMessage/ollama.ts +++ b/src/vs/platform/void/electron-main/llmMessage/ollama.ts @@ -3,19 +3,12 @@ * Void Editor additions licensed under the AGPL 3.0 License. *--------------------------------------------------------------------------------------------*/ -import { ModelResponse, Ollama } from 'ollama'; +import { Ollama } from 'ollama'; import { SendLLMMessageFnTypeInternal } from '../../common/llmMessageTypes.js'; import { parseMaxTokensStr } from './util.js'; -import { SettingsOfProvider } from '../../common/voidConfigTypes.js'; +import { OllamaListFnParams } from '../../common/ollamaListService.js'; - -type GetOllamaModelsFnType = (args: { - settingsOfProvider: SettingsOfProvider; - onSuccess: (param: { models: ModelResponse[] }) => void; - onError: (param: { error: any }) => void; -}) => void - -export const getDefaultOllamaModels: GetOllamaModelsFnType = async ({ onSuccess, onError, settingsOfProvider }) => { +export const getDefaultOllamaModels = async ({ onSuccess, onError, settingsOfProvider }: OllamaListFnParams) => { const thisConfig = settingsOfProvider.ollama const ollama = new Ollama({ host: thisConfig.endpoint }) ollama.list() diff --git a/src/vs/platform/void/electron-main/llmMessage/sendOllamaMessage.ts b/src/vs/platform/void/electron-main/llmMessage/sendOllamaMessage.ts deleted file mode 100644 index 7af2a1a8..00000000 --- a/src/vs/platform/void/electron-main/llmMessage/sendOllamaMessage.ts +++ /dev/null @@ -1,4 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Glass Devtools, Inc. All rights reserved. - * Void Editor additions licensed under the AGPL 3.0 License. - *--------------------------------------------------------------------------------------------*/ diff --git a/src/vs/platform/void/electron-main/ollamaListMainService.ts b/src/vs/platform/void/electron-main/ollamaListMainService.ts new file mode 100644 index 00000000..cb09fd6d --- /dev/null +++ b/src/vs/platform/void/electron-main/ollamaListMainService.ts @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Glass Devtools, Inc. All rights reserved. + * Void Editor additions licensed under the AGPL 3.0 License. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable } from '../../../base/common/lifecycle.js'; + +import { IOllamaListService } from '../common/ollamaListService.js'; +import { getDefaultOllamaModels } from './llmMessage/ollama.js'; + + +export class OllamaListMainService extends Disposable implements IOllamaListService { + _serviceBrand: undefined; + + constructor() { + super() + } + + list: IOllamaListService['list'] = (...params) => { + return getDefaultOllamaModels(...params) + } +} + + diff --git a/src/vs/workbench/contrib/void/browser/registerSidebar.ts b/src/vs/workbench/contrib/void/browser/registerSidebar.ts index 3fd8ecc9..15dd232d 100644 --- a/src/vs/workbench/contrib/void/browser/registerSidebar.ts +++ b/src/vs/workbench/contrib/void/browser/registerSidebar.ts @@ -46,6 +46,7 @@ import { ISendLLMMessageService } from '../../../../platform/void/browser/llmMes import { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js'; import { IViewsService } from '../../../services/views/common/viewsService.js'; import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js'; +import { IOllamaListService } from '../../../../platform/void/common/ollamaListService.js'; // compare against search.contribution.ts and debug.contribution.ts, scm.contribution.ts (source control) @@ -88,9 +89,20 @@ class VoidSidebarViewPane extends ViewPane { @IOpenerService openerService: IOpenerService, @ITelemetryService telemetryService: ITelemetryService, @IHoverService hoverService: IHoverService, + @IVoidConfigStateService configStateService: IVoidConfigStateService, + @IOllamaListService ollamaListService: IOllamaListService, ) { super(options, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService, hoverService) + console.log('calling Ollama list!!!') + ollamaListService.list({ + onSuccess: ({ models }) => { + console.log('ollama models:', models) + }, onError: ({ error }) => { + console.error('ollama error:', error) + }, + settingsOfProvider: configStateService.state.settingsOfProvider, + }) }