@@ -287,13 +287,8 @@ export class ChatService extends Disposable implements IChatService {
287
287
private _startSession ( providerId : string , someSessionHistory : ISerializableChatData | undefined , token : CancellationToken ) : ChatModel {
288
288
const model = this . instantiationService . createInstance ( ChatModel , providerId , someSessionHistory ) ;
289
289
this . _sessionModels . set ( model . sessionId , model ) ;
290
- const modelInitPromise = this . initializeSession ( model , someSessionHistory , token ) ;
291
- modelInitPromise . then ( resolvedModel => {
292
- if ( ! resolvedModel ) {
293
- model . dispose ( ) ;
294
- this . _sessionModels . delete ( model . sessionId ) ;
295
- }
296
- } ) . catch ( err => {
290
+ const modelInitPromise = this . initializeSession ( model , token ) ;
291
+ modelInitPromise . catch ( err => {
297
292
this . trace ( 'startSession' , `initializeSession failed: ${ err } ` ) ;
298
293
model . setInitializationError ( err ) ;
299
294
model . dispose ( ) ;
@@ -303,7 +298,22 @@ export class ChatService extends Disposable implements IChatService {
303
298
return model ;
304
299
}
305
300
306
- private async initializeSession ( model : ChatModel , sessionHistory : ISerializableChatData | undefined , token : CancellationToken ) : Promise < ChatModel | undefined > {
301
+ private reinitializeModel ( model : ChatModel ) : void {
302
+ model . startReinitialize ( ) ;
303
+ this . startSessionInit ( model , CancellationToken . None ) ;
304
+ }
305
+
306
+ private startSessionInit ( model : ChatModel , token : CancellationToken ) : void {
307
+ const modelInitPromise = this . initializeSession ( model , token ) ;
308
+ modelInitPromise . catch ( err => {
309
+ this . trace ( 'startSession' , `initializeSession failed: ${ err } ` ) ;
310
+ model . setInitializationError ( err ) ;
311
+ model . dispose ( ) ;
312
+ this . _sessionModels . delete ( model . sessionId ) ;
313
+ } ) ;
314
+ }
315
+
316
+ private async initializeSession ( model : ChatModel , token : CancellationToken ) : Promise < void > {
307
317
await this . extensionService . activateByEvent ( `onInteractiveSession:${ model . providerId } ` ) ;
308
318
309
319
const provider = this . _providers . get ( model . providerId ) ;
@@ -319,18 +329,16 @@ export class ChatService extends Disposable implements IChatService {
319
329
}
320
330
321
331
if ( ! session ) {
322
- this . trace ( 'startSession' , 'Provider returned no session' ) ;
323
- return undefined ;
332
+ throw new Error ( 'Provider returned no session' ) ;
324
333
}
325
334
326
335
this . trace ( 'startSession' , `Provider returned session` ) ;
327
336
328
- const welcomeMessage = sessionHistory ? undefined : withNullAsUndefined ( await provider . provideWelcomeMessage ?.( token ) ) ;
337
+ const welcomeMessage = model . welcomeMessage ? undefined : withNullAsUndefined ( await provider . provideWelcomeMessage ?.( token ) ) ;
329
338
const welcomeModel = welcomeMessage && new ChatWelcomeMessageModel (
330
339
welcomeMessage . map ( item => typeof item === 'string' ? new MarkdownString ( item ) : item as IChatReplyFollowup [ ] ) , session . responderUsername , session . responderAvatarIconUri ) ;
331
340
332
341
model . initialize ( session , welcomeModel ) ;
333
- return model ;
334
342
}
335
343
336
344
getSession ( sessionId : string ) : IChatModel | undefined {
@@ -618,6 +626,10 @@ export class ChatService extends Disposable implements IChatService {
618
626
this . _providers . set ( provider . id , provider ) ;
619
627
this . _hasProvider . set ( true ) ;
620
628
629
+ Array . from ( this . _sessionModels . values ( ) )
630
+ . filter ( model => model . providerId === provider . id )
631
+ . forEach ( model => this . reinitializeModel ( model ) ) ;
632
+
621
633
return toDisposable ( ( ) => {
622
634
this . trace ( 'registerProvider' , `Disposing chat provider` ) ;
623
635
this . _providers . delete ( provider . id ) ;
0 commit comments