55
66import type * as vscode from 'vscode' ;
77import { AsyncIterableObject , AsyncIterableSource , RunOnceScheduler } from '../../../base/common/async.js' ;
8+ import { VSBuffer } from '../../../base/common/buffer.js' ;
89import { CancellationToken } from '../../../base/common/cancellation.js' ;
910import { SerializedError , transformErrorForSerialization , transformErrorFromSerialization } from '../../../base/common/errors.js' ;
1011import { Emitter , Event } from '../../../base/common/event.js' ;
@@ -16,17 +17,16 @@ import { ExtensionIdentifier, ExtensionIdentifierMap, ExtensionIdentifierSet, IE
1617import { createDecorator } from '../../../platform/instantiation/common/instantiation.js' ;
1718import { ILogService } from '../../../platform/log/common/log.js' ;
1819import { Progress } from '../../../platform/progress/common/progress.js' ;
19- import { ChatImageMimeType , IChatMessage , IChatResponseFragment , IChatResponsePart , ILanguageModelChatMetadata , ILanguageModelChatMetadataAndIdentifier } from '../../contrib/chat/common/languageModels.js' ;
20+ import { IChatMessage , IChatResponseFragment , IChatResponsePart , ILanguageModelChatMetadata , ILanguageModelChatMetadataAndIdentifier } from '../../contrib/chat/common/languageModels.js' ;
21+ import { DEFAULT_MODEL_PICKER_CATEGORY } from '../../contrib/chat/common/modelPicker/modelPickerWidget.js' ;
2022import { INTERNAL_AUTH_PROVIDER_PREFIX } from '../../services/authentication/common/authentication.js' ;
2123import { checkProposedApiEnabled } from '../../services/extensions/common/extensions.js' ;
24+ import { SerializableObjectWithBuffers } from '../../services/extensions/common/proxyIdentifier.js' ;
2225import { ExtHostLanguageModelsShape , MainContext , MainThreadLanguageModelsShape } from './extHost.protocol.js' ;
2326import { IExtHostAuthentication } from './extHostAuthentication.js' ;
2427import { IExtHostRpcService } from './extHostRpcService.js' ;
2528import * as typeConvert from './extHostTypeConverters.js' ;
2629import * as extHostTypes from './extHostTypes.js' ;
27- import { SerializableObjectWithBuffers } from '../../services/extensions/common/proxyIdentifier.js' ;
28- import { VSBuffer } from '../../../base/common/buffer.js' ;
29- import { DEFAULT_MODEL_PICKER_CATEGORY } from '../../contrib/chat/common/modelPicker/modelPickerWidget.js' ;
3030
3131export interface IExtHostLanguageModels extends ExtHostLanguageModels { }
3232
@@ -38,15 +38,17 @@ type LanguageModelProviderData = {
3838 readonly provider : vscode . LanguageModelChatProvider2 ;
3939} ;
4040
41+ type LMResponsePart = vscode . LanguageModelTextPart | vscode . LanguageModelToolCallPart | vscode . LanguageModelDataPart ;
42+
4143class LanguageModelResponseStream {
4244
43- readonly stream = new AsyncIterableSource < vscode . LanguageModelTextPart | vscode . LanguageModelToolCallPart > ( ) ;
45+ readonly stream = new AsyncIterableSource < LMResponsePart > ( ) ;
4446
4547 constructor (
4648 readonly option : number ,
47- stream ?: AsyncIterableSource < vscode . LanguageModelTextPart | vscode . LanguageModelToolCallPart >
49+ stream ?: AsyncIterableSource < LMResponsePart >
4850 ) {
49- this . stream = stream ?? new AsyncIterableSource < vscode . LanguageModelTextPart | vscode . LanguageModelToolCallPart > ( ) ;
51+ this . stream = stream ?? new AsyncIterableSource < LMResponsePart > ( ) ;
5052 }
5153}
5254
@@ -55,7 +57,7 @@ class LanguageModelResponse {
5557 readonly apiObject : vscode . LanguageModelChatResponse ;
5658
5759 private readonly _responseStreams = new Map < number , LanguageModelResponseStream > ( ) ;
58- private readonly _defaultStream = new AsyncIterableSource < vscode . LanguageModelTextPart | vscode . LanguageModelToolCallPart > ( ) ;
60+ private readonly _defaultStream = new AsyncIterableSource < LMResponsePart > ( ) ;
5961 private _isDone : boolean = false ;
6062
6163 constructor ( ) {
@@ -93,15 +95,15 @@ class LanguageModelResponse {
9395 return ;
9496 }
9597
96- const partsByIndex = new Map < number , ( vscode . LanguageModelTextPart | vscode . LanguageModelToolCallPart ) [ ] > ( ) ;
98+ const partsByIndex = new Map < number , LMResponsePart [ ] > ( ) ;
9799
98100 for ( const fragment of Iterable . wrap ( fragments ) ) {
99101
100- let out : vscode . LanguageModelTextPart | vscode . LanguageModelToolCallPart ;
102+ let out : LMResponsePart ;
101103 if ( fragment . part . type === 'text' ) {
102104 out = new extHostTypes . LanguageModelTextPart ( fragment . part . value , fragment . part . audience ) ;
103105 } else if ( fragment . part . type === 'data' ) {
104- out = new extHostTypes . LanguageModelTextPart ( '' ) ;
106+ out = new extHostTypes . LanguageModelDataPart ( fragment . part . data . buffer , fragment . part . mimeType , fragment . part . audience ) ;
105107 } else {
106108 out = new extHostTypes . LanguageModelToolCallPart ( fragment . part . toolCallId , fragment . part . name , fragment . part . parameters ) ;
107109 }
@@ -270,7 +272,7 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape {
270272 const queue : IChatResponseFragment [ ] = [ ] ;
271273 const sendNow = ( ) => {
272274 if ( queue . length > 0 ) {
273- this . _proxy . $reportResponsePart ( requestId , queue ) ;
275+ this . _proxy . $reportResponsePart ( requestId , new SerializableObjectWithBuffers ( queue ) ) ;
274276 queue . length = 0 ;
275277 }
276278 } ;
@@ -298,7 +300,7 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape {
298300 } else if ( fragment . part instanceof extHostTypes . LanguageModelTextPart ) {
299301 part = { type : 'text' , value : fragment . part . value , audience : fragment . part . audience } ;
300302 } else if ( fragment . part instanceof extHostTypes . LanguageModelDataPart ) {
301- part = { type : 'data' , value : { mimeType : fragment . part . mimeType as ChatImageMimeType , data : VSBuffer . wrap ( fragment . part . data ) } , audience : fragment . part . audience } ;
303+ part = { type : 'data' , mimeType : fragment . part . mimeType , data : VSBuffer . wrap ( fragment . part . data ) , audience : fragment . part . audience } ;
302304 }
303305
304306 if ( ! part ) {
@@ -482,10 +484,10 @@ export class ExtHostLanguageModels implements ExtHostLanguageModelsShape {
482484 return internalMessages ;
483485 }
484486
485- async $acceptResponsePart ( requestId : number , chunk : IChatResponseFragment | IChatResponseFragment [ ] ) : Promise < void > {
487+ async $acceptResponsePart ( requestId : number , chunk : SerializableObjectWithBuffers < IChatResponseFragment | IChatResponseFragment [ ] > ) : Promise < void > {
486488 const data = this . _pendingRequest . get ( requestId ) ;
487489 if ( data ) {
488- data . res . handleFragment ( chunk ) ;
490+ data . res . handleFragment ( chunk . value ) ;
489491 }
490492 }
491493
0 commit comments