add ollama model fetcher, but proxy ignores its functions

This commit is contained in:
Andrew Pareles 2024-12-12 17:51:50 -08:00
parent abc7151cd6
commit 696abc39fd
10 changed files with 131 additions and 17 deletions

View file

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

View file

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

View file

@ -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<IOllamaListService>(mainProcessService.getChannel('void-channel-ollama-list'));
}
list: IOllamaListService['list'] = (...params) => {
this.ollamaListService.list(...params);
}
}
registerSingleton(IOllamaListService, OllamaListService, InstantiationType.Eager);

View file

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

View file

@ -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<IOllamaListService>('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;
}

View file

@ -28,8 +28,8 @@ type SetModelSelectionOfFeature = <K extends FeatureName>(
type VoidConfigState = {
settingsOfProvider: SettingsOfProvider; // optionsOfProvider
modelSelectionOfFeature: ModelSelectionOfFeature; // stateOfFeature
readonly settingsOfProvider: SettingsOfProvider; // optionsOfProvider
readonly modelSelectionOfFeature: ModelSelectionOfFeature; // stateOfFeature
}
export interface IVoidConfigStateService {

View file

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

View file

@ -1,4 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Glass Devtools, Inc. All rights reserved.
* Void Editor additions licensed under the AGPL 3.0 License.
*--------------------------------------------------------------------------------------------*/

View file

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

View file

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