@@ -295,10 +295,12 @@ export class HaAssistChat extends LitElement {
295
295
this . _addMessage ( userMessage ) ;
296
296
this . requestUpdate ( "_audioRecorder" ) ;
297
297
298
- const hassMessage : AssistMessage = {
298
+ let hassMessage = {
299
299
who : "hass" ,
300
300
text : "…" ,
301
+ error : false ,
301
302
} ;
303
+ let currentDeltaRole = "" ;
302
304
// To make sure the answer is placed at the right user text, we add it before we process it
303
305
try {
304
306
const unsub = await runAssistPipeline (
@@ -328,6 +330,43 @@ export class HaAssistChat extends LitElement {
328
330
this . _addMessage ( hassMessage ) ;
329
331
}
330
332
333
+ if ( event . type === "intent-progress" ) {
334
+ const delta = event . data . chat_log_delta ;
335
+
336
+ // new message
337
+ if ( delta . role ) {
338
+ // If currentDeltaRole exists, it means we're receiving our
339
+ // second or later message. Let's add it to the chat.
340
+ if ( currentDeltaRole && delta . role && hassMessage . text !== "…" ) {
341
+ // Remove progress indicator of previous message
342
+ hassMessage . text = hassMessage . text . substring (
343
+ 0 ,
344
+ hassMessage . text . length - 1
345
+ ) ;
346
+
347
+ hassMessage = {
348
+ who : "hass" ,
349
+ text : "…" ,
350
+ error : false ,
351
+ } ;
352
+ this . _addMessage ( hassMessage ) ;
353
+ }
354
+ currentDeltaRole = delta . role ;
355
+ }
356
+
357
+ if (
358
+ currentDeltaRole === "assistant" &&
359
+ "content" in delta &&
360
+ delta . content
361
+ ) {
362
+ hassMessage . text =
363
+ hassMessage . text . substring ( 0 , hassMessage . text . length - 1 ) +
364
+ delta . content +
365
+ "…" ;
366
+ this . requestUpdate ( "_conversation" ) ;
367
+ }
368
+ }
369
+
331
370
if ( event . type === "intent-end" ) {
332
371
this . _conversationId = event . data . intent_output . conversation_id ;
333
372
const plain = event . data . intent_output . response . speech ?. plain ;
@@ -435,28 +474,71 @@ export class HaAssistChat extends LitElement {
435
474
this . _processing = true ;
436
475
this . _audio ?. pause ( ) ;
437
476
this . _addMessage ( { who : "user" , text } ) ;
438
- const message : AssistMessage = {
477
+ let hassMessage = {
439
478
who : "hass" ,
440
479
text : "…" ,
480
+ error : false ,
441
481
} ;
482
+ let currentDeltaRole = "" ;
442
483
// To make sure the answer is placed at the right user text, we add it before we process it
443
- this . _addMessage ( message ) ;
484
+ this . _addMessage ( hassMessage ) ;
444
485
try {
445
486
const unsub = await runAssistPipeline (
446
487
this . hass ,
447
488
( event ) => {
489
+ if ( event . type === "intent-progress" ) {
490
+ const delta = event . data . chat_log_delta ;
491
+
492
+ // new message and previous message has content
493
+ if ( delta . role ) {
494
+ // If currentDeltaRole exists, it means we're receiving our
495
+ // second or later message. Let's add it to the chat.
496
+ if (
497
+ currentDeltaRole &&
498
+ delta . role === "assistant" &&
499
+ hassMessage . text !== "…"
500
+ ) {
501
+ // Remove progress indicator of previous message
502
+ hassMessage . text = hassMessage . text . substring (
503
+ 0 ,
504
+ hassMessage . text . length - 1
505
+ ) ;
506
+
507
+ hassMessage = {
508
+ who : "hass" ,
509
+ text : "…" ,
510
+ error : false ,
511
+ } ;
512
+ this . _addMessage ( hassMessage ) ;
513
+ }
514
+ currentDeltaRole = delta . role ;
515
+ }
516
+
517
+ if (
518
+ currentDeltaRole === "assistant" &&
519
+ "content" in delta &&
520
+ delta . content
521
+ ) {
522
+ hassMessage . text =
523
+ hassMessage . text . substring ( 0 , hassMessage . text . length - 1 ) +
524
+ delta . content +
525
+ "…" ;
526
+ this . requestUpdate ( "_conversation" ) ;
527
+ }
528
+ }
529
+
448
530
if ( event . type === "intent-end" ) {
449
531
this . _conversationId = event . data . intent_output . conversation_id ;
450
532
const plain = event . data . intent_output . response . speech ?. plain ;
451
533
if ( plain ) {
452
- message . text = plain . speech ;
534
+ hassMessage . text = plain . speech ;
453
535
}
454
536
this . requestUpdate ( "_conversation" ) ;
455
537
unsub ( ) ;
456
538
}
457
539
if ( event . type === "error" ) {
458
- message . text = event . data . message ;
459
- message . error = true ;
540
+ hassMessage . text = event . data . message ;
541
+ hassMessage . error = true ;
460
542
this . requestUpdate ( "_conversation" ) ;
461
543
unsub ( ) ;
462
544
}
@@ -470,8 +552,8 @@ export class HaAssistChat extends LitElement {
470
552
}
471
553
) ;
472
554
} catch {
473
- message . text = this . hass . localize ( "ui.dialogs.voice_command.error" ) ;
474
- message . error = true ;
555
+ hassMessage . text = this . hass . localize ( "ui.dialogs.voice_command.error" ) ;
556
+ hassMessage . error = true ;
475
557
this . requestUpdate ( "_conversation" ) ;
476
558
} finally {
477
559
this . _processing = false ;
0 commit comments