@@ -362,42 +362,47 @@ func (a *KiroAdapter) handleStreamResponse(ctx context.Context, w http.ResponseW
362362
363363 if err := streamCtx .sendInitialEvents (); err != nil {
364364 inTok , outTok := streamCtx .GetTokenCounts ()
365- a .sendFinalEvents (ctx , sseBuffer .String (), inTok , outTok , requestModel )
365+ a .sendFinalEvents (ctx , sseBuffer .String (), inTok , outTok , requestModel , streamCtx . GetFirstTokenTimeMs () )
366366 return domain .NewProxyErrorWithMessage (err , false , "failed to send initial events" )
367367 }
368368
369369 err = streamCtx .processEventStream (ctx , resp .Body )
370370 if err != nil {
371371 if ctx .Err () != nil {
372372 inTok , outTok := streamCtx .GetTokenCounts ()
373- a .sendFinalEvents (ctx , sseBuffer .String (), inTok , outTok , requestModel )
373+ a .sendFinalEvents (ctx , sseBuffer .String (), inTok , outTok , requestModel , streamCtx . GetFirstTokenTimeMs () )
374374 return domain .NewProxyErrorWithMessage (ctx .Err (), false , "client disconnected" )
375375 }
376376
377377 _ = streamCtx .sendFinalEvents ()
378378 inTok , outTok := streamCtx .GetTokenCounts ()
379- a .sendFinalEvents (ctx , sseBuffer .String (), inTok , outTok , requestModel )
379+ a .sendFinalEvents (ctx , sseBuffer .String (), inTok , outTok , requestModel , streamCtx . GetFirstTokenTimeMs () )
380380 return nil
381381 }
382382
383383 if err := streamCtx .sendFinalEvents (); err != nil {
384384 inTok , outTok := streamCtx .GetTokenCounts ()
385- a .sendFinalEvents (ctx , sseBuffer .String (), inTok , outTok , requestModel )
385+ a .sendFinalEvents (ctx , sseBuffer .String (), inTok , outTok , requestModel , streamCtx . GetFirstTokenTimeMs () )
386386 return domain .NewProxyErrorWithMessage (err , false , "failed to send final events" )
387387 }
388388
389389 inTok , outTok := streamCtx .GetTokenCounts ()
390- a .sendFinalEvents (ctx , sseBuffer .String (), inTok , outTok , requestModel )
390+ a .sendFinalEvents (ctx , sseBuffer .String (), inTok , outTok , requestModel , streamCtx . GetFirstTokenTimeMs () )
391391 return nil
392392}
393393
394394// sendFinalEvents sends final events via EventChannel
395- func (a * KiroAdapter ) sendFinalEvents (ctx context.Context , body string , inputTokens , outputTokens int , requestModel string ) {
395+ func (a * KiroAdapter ) sendFinalEvents (ctx context.Context , body string , inputTokens , outputTokens int , requestModel string , firstTokenTimeMs int64 ) {
396396 eventChan := ctxutil .GetEventChan (ctx )
397397 if eventChan == nil {
398398 return
399399 }
400400
401+ // Send first token time if available (for TTFT tracking)
402+ if firstTokenTimeMs > 0 {
403+ eventChan .SendFirstToken (firstTokenTimeMs )
404+ }
405+
401406 // Send response info with body
402407 eventChan .SendResponseInfo (& domain.ResponseInfo {
403408 Status : 200 , // streaming always returns 200 at this point
0 commit comments