Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/api/browser/mainThreadEmbeddings.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 { DisposableMap, DisposableStore, IDisposable } from '../../../base/common/lifecycle.js';
9
import { InstantiationType, registerSingleton } from '../../../platform/instantiation/common/extensions.js';
10
import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';
11
import { ExtHostContext, ExtHostEmbeddingsShape, MainContext, MainThreadEmbeddingsShape } from '../common/extHost.protocol.js';
12
import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers.js';
13
14
15
interface IEmbeddingsProvider {
16
provideEmbeddings(input: string[], token: CancellationToken): Promise<{ values: number[] }[]>;
17
}
18
19
const IEmbeddingsService = createDecorator<IEmbeddingsService>('embeddingsService');
20
21
interface IEmbeddingsService {
22
23
_serviceBrand: undefined;
24
25
readonly onDidChange: Event<void>;
26
27
allProviders: Iterable<string>;
28
29
registerProvider(id: string, provider: IEmbeddingsProvider): IDisposable;
30
31
computeEmbeddings(id: string, input: string[], token: CancellationToken): Promise<{ values: number[] }[]>;
32
}
33
34
class EmbeddingsService implements IEmbeddingsService {
35
_serviceBrand: undefined;
36
37
private providers: Map<string, IEmbeddingsProvider>;
38
39
private readonly _onDidChange = new Emitter<void>();
40
readonly onDidChange: Event<void> = this._onDidChange.event;
41
42
constructor() {
43
this.providers = new Map<string, IEmbeddingsProvider>();
44
}
45
46
get allProviders(): Iterable<string> {
47
return this.providers.keys();
48
}
49
50
registerProvider(id: string, provider: IEmbeddingsProvider): IDisposable {
51
this.providers.set(id, provider);
52
this._onDidChange.fire();
53
return {
54
dispose: () => {
55
this.providers.delete(id);
56
this._onDidChange.fire();
57
}
58
};
59
}
60
61
computeEmbeddings(id: string, input: string[], token: CancellationToken): Promise<{ values: number[] }[]> {
62
const provider = this.providers.get(id);
63
if (provider) {
64
return provider.provideEmbeddings(input, token);
65
} else {
66
return Promise.reject(new Error(`No embeddings provider registered with id: ${id}`));
67
}
68
}
69
}
70
71
72
registerSingleton(IEmbeddingsService, EmbeddingsService, InstantiationType.Delayed);
73
74
@extHostNamedCustomer(MainContext.MainThreadEmbeddings)
75
export class MainThreadEmbeddings implements MainThreadEmbeddingsShape {
76
77
private readonly _store = new DisposableStore();
78
private readonly _providers = this._store.add(new DisposableMap<number>);
79
private readonly _proxy: ExtHostEmbeddingsShape;
80
81
constructor(
82
context: IExtHostContext,
83
@IEmbeddingsService private readonly embeddingsService: IEmbeddingsService
84
) {
85
this._proxy = context.getProxy(ExtHostContext.ExtHostEmbeddings);
86
87
this._store.add(embeddingsService.onDidChange((() => {
88
this._proxy.$acceptEmbeddingModels(Array.from(embeddingsService.allProviders));
89
})));
90
}
91
92
dispose(): void {
93
this._store.dispose();
94
}
95
96
$registerEmbeddingProvider(handle: number, identifier: string): void {
97
const registration = this.embeddingsService.registerProvider(identifier, {
98
provideEmbeddings: (input: string[], token: CancellationToken): Promise<{ values: number[] }[]> => {
99
return this._proxy.$provideEmbeddings(handle, input, token);
100
}
101
});
102
this._providers.set(handle, registration);
103
}
104
105
$unregisterEmbeddingProvider(handle: number): void {
106
this._providers.deleteAndDispose(handle);
107
}
108
109
$computeEmbeddings(embeddingsModel: string, input: string[], token: CancellationToken): Promise<{ values: number[] }[]> {
110
return this.embeddingsService.computeEmbeddings(embeddingsModel, input, token);
111
}
112
}
113
114