@@ -410,6 +410,9 @@ export class OpenRouterChatLanguageModel implements LanguageModelV2 {
410410 // Track provider-specific usage information
411411 const openrouterUsage : Partial < OpenRouterUsageAccounting > = { } ;
412412
413+ let textStarted = false ;
414+ let reasoningStarted = false ;
415+
413416 return {
414417 stream : response . pipeThrough (
415418 new TransformStream <
@@ -496,57 +499,56 @@ export class OpenRouterChatLanguageModel implements LanguageModelV2 {
496499 const delta = choice . delta ;
497500
498501 if ( delta . content != null ) {
502+ if ( ! textStarted ) {
503+ controller . enqueue ( {
504+ type : 'text-start' ,
505+ id : generateId ( ) ,
506+ } ) ;
507+ textStarted = true ;
508+ }
499509 controller . enqueue ( {
500510 type : 'text-delta' ,
501511 delta : delta . content ,
502512 id : generateId ( ) ,
503513 } ) ;
504514 }
505515
506- if ( delta . reasoning != null ) {
516+ const emitReasoningChunk = ( chunkText : string ) => {
517+ if ( ! reasoningStarted ) {
518+ controller . enqueue ( {
519+ type : 'reasoning-start' ,
520+ id : generateId ( ) ,
521+ } ) ;
522+ reasoningStarted = true ;
523+ }
507524 controller . enqueue ( {
508525 type : 'reasoning-delta' ,
509- delta : delta . reasoning ,
526+ delta : chunkText ,
510527 id : generateId ( ) ,
511528 } ) ;
512- }
529+ } ;
513530
531+ if ( delta . reasoning != null ) {
532+ emitReasoningChunk ( delta . reasoning ) ;
533+ }
514534 if ( delta . reasoning_details && delta . reasoning_details . length > 0 ) {
515535 for ( const detail of delta . reasoning_details ) {
516536 switch ( detail . type ) {
517537 case ReasoningDetailType . Text : {
518538 if ( detail . text ) {
519- controller . enqueue ( {
520- type : 'reasoning-delta' ,
521- delta : detail . text ,
522- id : generateId ( ) ,
523- } ) ;
524- }
525- if ( detail . signature ) {
526- controller . enqueue ( {
527- type : 'reasoning-end' ,
528- id : generateId ( ) ,
529- } ) ;
539+ emitReasoningChunk ( detail . text ) ;
530540 }
531541 break ;
532542 }
533543 case ReasoningDetailType . Encrypted : {
534544 if ( detail . data ) {
535- controller . enqueue ( {
536- type : 'reasoning-delta' ,
537- delta : '[REDACTED]' ,
538- id : generateId ( ) ,
539- } ) ;
545+ emitReasoningChunk ( '[REDACTED]' ) ;
540546 }
541547 break ;
542548 }
543549 case ReasoningDetailType . Summary : {
544550 if ( detail . summary ) {
545- controller . enqueue ( {
546- type : 'reasoning-delta' ,
547- delta : detail . summary ,
548- id : generateId ( ) ,
549- } ) ;
551+ emitReasoningChunk ( detail . summary ) ;
550552 }
551553 break ;
552554 }
@@ -704,6 +706,13 @@ export class OpenRouterChatLanguageModel implements LanguageModelV2 {
704706 }
705707 }
706708
709+ if ( textStarted ) {
710+ controller . enqueue ( { type : 'text-end' , id : generateId ( ) } ) ;
711+ }
712+ if ( reasoningStarted ) {
713+ controller . enqueue ( { type : 'reasoning-end' , id : generateId ( ) } ) ;
714+ }
715+
707716 controller . enqueue ( {
708717 type : 'finish' ,
709718 finishReason,
0 commit comments