Path: blob/main/src/vs/workbench/api/browser/mainThreadEmbeddings.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { CancellationToken } from '../../../base/common/cancellation.js';6import { Emitter, Event } from '../../../base/common/event.js';7import { DisposableMap, DisposableStore, IDisposable } from '../../../base/common/lifecycle.js';8import { InstantiationType, registerSingleton } from '../../../platform/instantiation/common/extensions.js';9import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';10import { ExtHostContext, ExtHostEmbeddingsShape, MainContext, MainThreadEmbeddingsShape } from '../common/extHost.protocol.js';11import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers.js';121314interface IEmbeddingsProvider {15provideEmbeddings(input: string[], token: CancellationToken): Promise<{ values: number[] }[]>;16}1718const IEmbeddingsService = createDecorator<IEmbeddingsService>('embeddingsService');1920interface IEmbeddingsService {2122_serviceBrand: undefined;2324readonly onDidChange: Event<void>;2526allProviders: Iterable<string>;2728registerProvider(id: string, provider: IEmbeddingsProvider): IDisposable;2930computeEmbeddings(id: string, input: string[], token: CancellationToken): Promise<{ values: number[] }[]>;31}3233class EmbeddingsService implements IEmbeddingsService {34_serviceBrand: undefined;3536private providers: Map<string, IEmbeddingsProvider>;3738private readonly _onDidChange = new Emitter<void>();39readonly onDidChange: Event<void> = this._onDidChange.event;4041constructor() {42this.providers = new Map<string, IEmbeddingsProvider>();43}4445get allProviders(): Iterable<string> {46return this.providers.keys();47}4849registerProvider(id: string, provider: IEmbeddingsProvider): IDisposable {50this.providers.set(id, provider);51this._onDidChange.fire();52return {53dispose: () => {54this.providers.delete(id);55this._onDidChange.fire();56}57};58}5960computeEmbeddings(id: string, input: string[], token: CancellationToken): Promise<{ values: number[] }[]> {61const provider = this.providers.get(id);62if (provider) {63return provider.provideEmbeddings(input, token);64} else {65return Promise.reject(new Error(`No embeddings provider registered with id: ${id}`));66}67}68}697071registerSingleton(IEmbeddingsService, EmbeddingsService, InstantiationType.Delayed);7273@extHostNamedCustomer(MainContext.MainThreadEmbeddings)74export class MainThreadEmbeddings implements MainThreadEmbeddingsShape {7576private readonly _store = new DisposableStore();77private readonly _providers = this._store.add(new DisposableMap<number>);78private readonly _proxy: ExtHostEmbeddingsShape;7980constructor(81context: IExtHostContext,82@IEmbeddingsService private readonly embeddingsService: IEmbeddingsService83) {84this._proxy = context.getProxy(ExtHostContext.ExtHostEmbeddings);8586this._store.add(embeddingsService.onDidChange((() => {87this._proxy.$acceptEmbeddingModels(Array.from(embeddingsService.allProviders));88})));89}9091dispose(): void {92this._store.dispose();93}9495$registerEmbeddingProvider(handle: number, identifier: string): void {96const registration = this.embeddingsService.registerProvider(identifier, {97provideEmbeddings: (input: string[], token: CancellationToken): Promise<{ values: number[] }[]> => {98return this._proxy.$provideEmbeddings(handle, input, token);99}100});101this._providers.set(handle, registration);102}103104$unregisterEmbeddingProvider(handle: number): void {105this._providers.deleteAndDispose(handle);106}107108$computeEmbeddings(embeddingsModel: string, input: string[], token: CancellationToken): Promise<{ values: number[] }[]> {109return this.embeddingsService.computeEmbeddings(embeddingsModel, input, token);110}111}112113114