@@ -464,6 +464,109 @@ func TestStreamingCachedTokensUseAnthropicInputSemantics(t *testing.T) {
464464 assert .Equal (t , "message_stop" , events [1 ].Type )
465465}
466466
467+ func TestAnthropicToResponsesResponse_CacheTokensUseResponsesInputSemantics (t * testing.T ) {
468+ resp := & AnthropicResponse {
469+ Usage : AnthropicUsage {
470+ InputTokens : 3318 ,
471+ OutputTokens : 123 ,
472+ CacheReadInputTokens : 50688 ,
473+ CacheCreationInputTokens : 200 ,
474+ },
475+ }
476+
477+ out := AnthropicToResponsesResponse (resp )
478+ require .NotNil (t , out .Usage )
479+ assert .Equal (t , 54206 , out .Usage .InputTokens )
480+ assert .Equal (t , 123 , out .Usage .OutputTokens )
481+ assert .Equal (t , 54329 , out .Usage .TotalTokens )
482+ require .NotNil (t , out .Usage .InputTokensDetails )
483+ assert .Equal (t , 50688 , out .Usage .InputTokensDetails .CachedTokens )
484+ }
485+
486+ func TestAnthropicEventToResponses_CacheTokensFromMessageStart (t * testing.T ) {
487+ state := NewAnthropicEventToResponsesState ()
488+
489+ AnthropicEventToResponsesEvents (& AnthropicStreamEvent {
490+ Type : "message_start" ,
491+ Message : & AnthropicResponse {
492+ ID : "msg_cached_start" ,
493+ Model : "claude-sonnet-4-5-20250929" ,
494+ Usage : AnthropicUsage {
495+ InputTokens : 12 ,
496+ CacheReadInputTokens : 9 ,
497+ CacheCreationInputTokens : 3 ,
498+ },
499+ },
500+ }, state )
501+
502+ AnthropicEventToResponsesEvents (& AnthropicStreamEvent {
503+ Type : "message_delta" ,
504+ Usage : & AnthropicUsage {
505+ OutputTokens : 7 ,
506+ },
507+ }, state )
508+
509+ events := AnthropicEventToResponsesEvents (& AnthropicStreamEvent {Type : "message_stop" }, state )
510+ var completed * ResponsesStreamEvent
511+ for i := range events {
512+ if events [i ].Type == "response.completed" {
513+ completed = & events [i ]
514+ break
515+ }
516+ }
517+
518+ require .NotNil (t , completed )
519+ require .NotNil (t , completed .Response )
520+ require .NotNil (t , completed .Response .Usage )
521+ assert .Equal (t , 24 , completed .Response .Usage .InputTokens )
522+ assert .Equal (t , 7 , completed .Response .Usage .OutputTokens )
523+ assert .Equal (t , 31 , completed .Response .Usage .TotalTokens )
524+ require .NotNil (t , completed .Response .Usage .InputTokensDetails )
525+ assert .Equal (t , 9 , completed .Response .Usage .InputTokensDetails .CachedTokens )
526+ }
527+
528+ func TestAnthropicEventToResponses_CacheTokensFromMessageDelta (t * testing.T ) {
529+ state := NewAnthropicEventToResponsesState ()
530+
531+ AnthropicEventToResponsesEvents (& AnthropicStreamEvent {
532+ Type : "message_start" ,
533+ Message : & AnthropicResponse {
534+ ID : "msg_cached_delta" ,
535+ Model : "claude-sonnet-4-5-20250929" ,
536+ Usage : AnthropicUsage {
537+ InputTokens : 20 ,
538+ },
539+ },
540+ }, state )
541+
542+ AnthropicEventToResponsesEvents (& AnthropicStreamEvent {
543+ Type : "message_delta" ,
544+ Usage : & AnthropicUsage {
545+ OutputTokens : 8 ,
546+ CacheReadInputTokens : 11 ,
547+ CacheCreationInputTokens : 4 ,
548+ },
549+ }, state )
550+
551+ events := AnthropicEventToResponsesEvents (& AnthropicStreamEvent {Type : "message_stop" }, state )
552+ var completed * ResponsesStreamEvent
553+ for i := range events {
554+ if events [i ].Type == "response.completed" {
555+ completed = & events [i ]
556+ break
557+ }
558+ }
559+
560+ require .NotNil (t , completed )
561+ require .NotNil (t , completed .Response )
562+ require .NotNil (t , completed .Response .Usage )
563+ assert .Equal (t , 35 , completed .Response .Usage .InputTokens )
564+ assert .Equal (t , 8 , completed .Response .Usage .OutputTokens )
565+ assert .Equal (t , 43 , completed .Response .Usage .TotalTokens )
566+ require .NotNil (t , completed .Response .Usage .InputTokensDetails )
567+ assert .Equal (t , 11 , completed .Response .Usage .InputTokensDetails .CachedTokens )
568+ }
569+
467570func TestStreamingToolCall (t * testing.T ) {
468571 state := NewResponsesEventToAnthropicState ()
469572
0 commit comments