Path: blob/main/src/vs/workbench/api/common/extHostEmbedding.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 { IDisposable, toDisposable } from '../../../base/common/lifecycle.js';8import { IExtensionDescription } from '../../../platform/extensions/common/extensions.js';9import { ExtHostEmbeddingsShape, IMainContext, MainContext, MainThreadEmbeddingsShape } from './extHost.protocol.js';10import type * as vscode from 'vscode';111213export class ExtHostEmbeddings implements ExtHostEmbeddingsShape {1415private readonly _proxy: MainThreadEmbeddingsShape;16private readonly _provider = new Map<number, { id: string; provider: vscode.EmbeddingsProvider }>();1718private readonly _onDidChange = new Emitter<void>();19readonly onDidChange: Event<void> = this._onDidChange.event;2021private _allKnownModels = new Set<string>();22private _handlePool: number = 0;2324constructor(25mainContext: IMainContext26) {27this._proxy = mainContext.getProxy(MainContext.MainThreadEmbeddings);28}2930registerEmbeddingsProvider(_extension: IExtensionDescription, embeddingsModel: string, provider: vscode.EmbeddingsProvider): IDisposable {31if (this._allKnownModels.has(embeddingsModel)) {32throw new Error('An embeddings provider for this model is already registered');33}3435const handle = this._handlePool++;3637this._proxy.$registerEmbeddingProvider(handle, embeddingsModel);38this._provider.set(handle, { id: embeddingsModel, provider });3940return toDisposable(() => {41this._allKnownModels.delete(embeddingsModel);42this._proxy.$unregisterEmbeddingProvider(handle);43this._provider.delete(handle);44});45}4647async computeEmbeddings(embeddingsModel: string, input: string, token?: vscode.CancellationToken): Promise<vscode.Embedding>;48async computeEmbeddings(embeddingsModel: string, input: string[], token?: vscode.CancellationToken): Promise<vscode.Embedding[]>;49async computeEmbeddings(embeddingsModel: string, input: string | string[], token?: vscode.CancellationToken): Promise<vscode.Embedding[] | vscode.Embedding> {5051token ??= CancellationToken.None;5253let returnSingle = false;54if (typeof input === 'string') {55input = [input];56returnSingle = true;57}58const result = await this._proxy.$computeEmbeddings(embeddingsModel, input, token);59if (result.length !== input.length) {60throw new Error();61}62if (returnSingle) {63if (result.length !== 1) {64throw new Error();65}66return result[0];67}68return result;6970}7172async $provideEmbeddings(handle: number, input: string[], token: CancellationToken): Promise<{ values: number[] }[]> {73const data = this._provider.get(handle);74if (!data) {75return [];76}77const result = await data.provider.provideEmbeddings(input, token);78if (!result) {79return [];80}81return result;82}8384get embeddingsModels(): string[] {85return Array.from(this._allKnownModels);86}8788$acceptEmbeddingModels(models: string[]): void {89this._allKnownModels = new Set(models);90this._onDidChange.fire();91}92}939495