Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/api/common/extHostEmbedding.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { CancellationToken } from '../../../base/common/cancellation.js';
7
import { Emitter, Event } from '../../../base/common/event.js';
8
import { IDisposable, toDisposable } from '../../../base/common/lifecycle.js';
9
import { IExtensionDescription } from '../../../platform/extensions/common/extensions.js';
10
import { ExtHostEmbeddingsShape, IMainContext, MainContext, MainThreadEmbeddingsShape } from './extHost.protocol.js';
11
import type * as vscode from 'vscode';
12
13
14
export class ExtHostEmbeddings implements ExtHostEmbeddingsShape {
15
16
private readonly _proxy: MainThreadEmbeddingsShape;
17
private readonly _provider = new Map<number, { id: string; provider: vscode.EmbeddingsProvider }>();
18
19
private readonly _onDidChange = new Emitter<void>();
20
readonly onDidChange: Event<void> = this._onDidChange.event;
21
22
private _allKnownModels = new Set<string>();
23
private _handlePool: number = 0;
24
25
constructor(
26
mainContext: IMainContext
27
) {
28
this._proxy = mainContext.getProxy(MainContext.MainThreadEmbeddings);
29
}
30
31
registerEmbeddingsProvider(_extension: IExtensionDescription, embeddingsModel: string, provider: vscode.EmbeddingsProvider): IDisposable {
32
if (this._allKnownModels.has(embeddingsModel)) {
33
throw new Error('An embeddings provider for this model is already registered');
34
}
35
36
const handle = this._handlePool++;
37
38
this._proxy.$registerEmbeddingProvider(handle, embeddingsModel);
39
this._provider.set(handle, { id: embeddingsModel, provider });
40
41
return toDisposable(() => {
42
this._allKnownModels.delete(embeddingsModel);
43
this._proxy.$unregisterEmbeddingProvider(handle);
44
this._provider.delete(handle);
45
});
46
}
47
48
async computeEmbeddings(embeddingsModel: string, input: string, token?: vscode.CancellationToken): Promise<vscode.Embedding>;
49
async computeEmbeddings(embeddingsModel: string, input: string[], token?: vscode.CancellationToken): Promise<vscode.Embedding[]>;
50
async computeEmbeddings(embeddingsModel: string, input: string | string[], token?: vscode.CancellationToken): Promise<vscode.Embedding[] | vscode.Embedding> {
51
52
token ??= CancellationToken.None;
53
54
let returnSingle = false;
55
if (typeof input === 'string') {
56
input = [input];
57
returnSingle = true;
58
}
59
const result = await this._proxy.$computeEmbeddings(embeddingsModel, input, token);
60
if (result.length !== input.length) {
61
throw new Error();
62
}
63
if (returnSingle) {
64
if (result.length !== 1) {
65
throw new Error();
66
}
67
return result[0];
68
}
69
return result;
70
71
}
72
73
async $provideEmbeddings(handle: number, input: string[], token: CancellationToken): Promise<{ values: number[] }[]> {
74
const data = this._provider.get(handle);
75
if (!data) {
76
return [];
77
}
78
const result = await data.provider.provideEmbeddings(input, token);
79
if (!result) {
80
return [];
81
}
82
return result;
83
}
84
85
get embeddingsModels(): string[] {
86
return Array.from(this._allKnownModels);
87
}
88
89
$acceptEmbeddingModels(models: string[]): void {
90
this._allKnownModels = new Set(models);
91
this._onDidChange.fire();
92
}
93
}
94
95