@@ -16,8 +16,7 @@ import { ExtensionIdentifier } from '../../../platform/extensions/common/extensi
16
16
import { ILogService } from '../../../platform/log/common/log.js' ;
17
17
import { resizeImage } from '../../contrib/chat/browser/imageUtils.js' ;
18
18
import { ILanguageModelIgnoredFilesService } from '../../contrib/chat/common/ignoredFiles.js' ;
19
- import { ILanguageModelStatsService } from '../../contrib/chat/common/languageModelStats.js' ;
20
- import { IChatMessage , IChatResponseFragment , ILanguageModelChatMetadata , ILanguageModelChatResponse , ILanguageModelChatSelector , ILanguageModelsService } from '../../contrib/chat/common/languageModels.js' ;
19
+ import { IChatMessage , IChatResponseFragment , ILanguageModelChatResponse , ILanguageModelChatSelector , ILanguageModelsService } from '../../contrib/chat/common/languageModels.js' ;
21
20
import { IAuthenticationAccessService } from '../../services/authentication/browser/authenticationAccessService.js' ;
22
21
import { AuthenticationSession , AuthenticationSessionsChangeEvent , IAuthenticationProvider , IAuthenticationService , INTERNAL_AUTH_PROVIDER_PREFIX } from '../../services/authentication/common/authentication.js' ;
23
22
import { IExtHostContext , extHostNamedCustomer } from '../../services/extensions/common/extHostCustomers.js' ;
@@ -31,36 +30,44 @@ export class MainThreadLanguageModels implements MainThreadLanguageModelsShape {
31
30
32
31
private readonly _proxy : ExtHostLanguageModelsShape ;
33
32
private readonly _store = new DisposableStore ( ) ;
34
- private readonly _providerRegistrations = new DisposableMap < number > ( ) ;
33
+ private readonly _providerRegistrations = new DisposableMap < string > ( ) ;
34
+ private readonly _lmProviderChange = new Emitter < { vendor : string } > ( ) ;
35
35
private readonly _pendingProgress = new Map < number , { defer : DeferredPromise < any > ; stream : AsyncIterableSource < IChatResponseFragment | IChatResponseFragment [ ] > } > ( ) ;
36
36
private readonly _ignoredFileProviderRegistrations = new DisposableMap < number > ( ) ;
37
37
38
38
constructor (
39
39
extHostContext : IExtHostContext ,
40
40
@ILanguageModelsService private readonly _chatProviderService : ILanguageModelsService ,
41
- @ILanguageModelStatsService private readonly _languageModelStatsService : ILanguageModelStatsService ,
42
41
@ILogService private readonly _logService : ILogService ,
43
42
@IAuthenticationService private readonly _authenticationService : IAuthenticationService ,
44
43
@IAuthenticationAccessService private readonly _authenticationAccessService : IAuthenticationAccessService ,
45
44
@IExtensionService private readonly _extensionService : IExtensionService ,
46
45
@ILanguageModelIgnoredFilesService private readonly _ignoredFilesService : ILanguageModelIgnoredFilesService ,
47
46
) {
48
47
this . _proxy = extHostContext . getProxy ( ExtHostContext . ExtHostChatProvider ) ;
49
- this . _proxy . $acceptChatModelMetadata ( { added : _chatProviderService . getLanguageModelIds ( ) . map ( id => ( { identifier : id , metadata : _chatProviderService . lookupLanguageModel ( id ) ! } ) ) } ) ;
50
- this . _store . add ( _chatProviderService . onDidChangeLanguageModels ( this . _proxy . $acceptChatModelMetadata , this . _proxy ) ) ;
51
48
}
52
49
53
50
dispose ( ) : void {
51
+ this . _lmProviderChange . dispose ( ) ;
54
52
this . _providerRegistrations . dispose ( ) ;
55
53
this . _ignoredFileProviderRegistrations . dispose ( ) ;
56
54
this . _store . dispose ( ) ;
57
55
}
58
56
59
- $registerLanguageModelProvider ( handle : number , identifier : string , metadata : ILanguageModelChatMetadata ) : void {
57
+ $registerLanguageModelProvider ( vendor : string ) : void {
60
58
const dipsosables = new DisposableStore ( ) ;
61
- dipsosables . add ( this . _chatProviderService . registerLanguageModelChat ( identifier , {
62
- metadata,
63
- sendChatRequest : async ( messages , from , options , token ) => {
59
+ dipsosables . add ( this . _chatProviderService . registerLanguageModelProvider ( vendor , {
60
+ onDidChange : Event . filter ( this . _lmProviderChange . event , e => e . vendor === vendor , dipsosables ) as unknown as Event < void > ,
61
+ prepareLanguageModelChat : async ( options , token ) => {
62
+ const modelsAndIdentifiers = await this . _proxy . $prepareLanguageModelProvider ( vendor , options , token ) ;
63
+ modelsAndIdentifiers . forEach ( m => {
64
+ if ( m . metadata . auth ) {
65
+ dipsosables . add ( this . _registerAuthenticationProvider ( m . metadata . extension , m . metadata . auth ) ) ;
66
+ }
67
+ } ) ;
68
+ return modelsAndIdentifiers ;
69
+ } ,
70
+ sendChatRequest : async ( modelId , messages , from , options , token ) => {
64
71
const requestId = ( Math . random ( ) * 1e6 ) | 0 ;
65
72
const defer = new DeferredPromise < any > ( ) ;
66
73
const stream = new AsyncIterableSource < IChatResponseFragment | IChatResponseFragment [ ] > ( ) ;
@@ -74,7 +81,7 @@ export class MainThreadLanguageModels implements MainThreadLanguageModelsShape {
74
81
part . value . data = VSBuffer . wrap ( await resizeImage ( part . value . data . buffer ) ) ;
75
82
} )
76
83
) ;
77
- await this . _proxy . $startChatRequest ( handle , requestId , from , new SerializableObjectWithBuffers ( messages ) , options , token ) ;
84
+ await this . _proxy . $startChatRequest ( modelId , requestId , from , new SerializableObjectWithBuffers ( messages ) , options , token ) ;
78
85
} catch ( err ) {
79
86
this . _pendingProgress . delete ( requestId ) ;
80
87
throw err ;
@@ -85,14 +92,15 @@ export class MainThreadLanguageModels implements MainThreadLanguageModelsShape {
85
92
stream : stream . asyncIterable
86
93
} satisfies ILanguageModelChatResponse ;
87
94
} ,
88
- provideTokenCount : ( str , token ) => {
89
- return this . _proxy . $provideTokenLength ( handle , str , token ) ;
95
+ provideTokenCount : ( modelId , str , token ) => {
96
+ return this . _proxy . $provideTokenLength ( modelId , str , token ) ;
90
97
} ,
91
98
} ) ) ;
92
- if ( metadata . auth ) {
93
- dipsosables . add ( this . _registerAuthenticationProvider ( metadata . extension , metadata . auth ) ) ;
94
- }
95
- this . _providerRegistrations . set ( handle , dipsosables ) ;
99
+ this . _providerRegistrations . set ( vendor , dipsosables ) ;
100
+ }
101
+
102
+ $onLMProviderChange ( vendor : string ) : void {
103
+ this . _lmProviderChange . fire ( { vendor } ) ;
96
104
}
97
105
98
106
async $reportResponsePart ( requestId : number , chunk : IChatResponseFragment | IChatResponseFragment [ ] ) : Promise < void > {
@@ -119,24 +127,20 @@ export class MainThreadLanguageModels implements MainThreadLanguageModelsShape {
119
127
}
120
128
}
121
129
122
- $unregisterProvider ( handle : number ) : void {
123
- this . _providerRegistrations . deleteAndDispose ( handle ) ;
130
+ $unregisterProvider ( vendor : string ) : void {
131
+ this . _providerRegistrations . deleteAndDispose ( vendor ) ;
124
132
}
125
133
126
134
$selectChatModels ( selector : ILanguageModelChatSelector ) : Promise < string [ ] > {
127
135
return this . _chatProviderService . selectLanguageModels ( selector ) ;
128
136
}
129
137
130
- $whenLanguageModelChatRequestMade ( identifier : string , extensionId : ExtensionIdentifier , participant ?: string | undefined , tokenCount ?: number | undefined ) : void {
131
- this . _languageModelStatsService . update ( identifier , extensionId , participant , tokenCount ) ;
132
- }
133
-
134
- async $tryStartChatRequest ( extension : ExtensionIdentifier , providerId : string , requestId : number , messages : SerializableObjectWithBuffers < IChatMessage [ ] > , options : { } , token : CancellationToken ) : Promise < any > {
138
+ async $tryStartChatRequest ( extension : ExtensionIdentifier , modelIdentifier : string , requestId : number , messages : SerializableObjectWithBuffers < IChatMessage [ ] > , options : { } , token : CancellationToken ) : Promise < any > {
135
139
this . _logService . trace ( '[CHAT] request STARTED' , extension . value , requestId ) ;
136
140
137
141
let response : ILanguageModelChatResponse ;
138
142
try {
139
- response = await this . _chatProviderService . sendChatRequest ( providerId , extension , messages . value , options , token ) ;
143
+ response = await this . _chatProviderService . sendChatRequest ( modelIdentifier , extension , messages . value , options , token ) ;
140
144
} catch ( err ) {
141
145
this . _logService . error ( '[CHAT] request FAILED' , extension . value , requestId , err ) ;
142
146
throw err ;
@@ -170,8 +174,8 @@ export class MainThreadLanguageModels implements MainThreadLanguageModelsShape {
170
174
}
171
175
172
176
173
- $countTokens ( provider : string , value : string | IChatMessage , token : CancellationToken ) : Promise < number > {
174
- return this . _chatProviderService . computeTokenLength ( provider , value , token ) ;
177
+ $countTokens ( modelId : string , value : string | IChatMessage , token : CancellationToken ) : Promise < number > {
178
+ return this . _chatProviderService . computeTokenLength ( modelId , value , token ) ;
175
179
}
176
180
177
181
private _registerAuthenticationProvider ( extension : ExtensionIdentifier , auth : { providerLabel : string ; accountLabel ?: string | undefined } ) : IDisposable {
0 commit comments