diff --git a/litellm/responses/utils.py b/litellm/responses/utils.py index ee0f1c6338f..a35aaac6b3c 100644 --- a/litellm/responses/utils.py +++ b/litellm/responses/utils.py @@ -958,13 +958,23 @@ class ResponseAPILoggingUtils: response_api_usage, "output_tokens_details", None ) if output_tokens_details: - completion_tokens_details = CompletionTokensDetailsWrapper( - reasoning_tokens=getattr( - output_tokens_details, "reasoning_tokens", None - ), - image_tokens=getattr(output_tokens_details, "image_tokens", None), - text_tokens=getattr(output_tokens_details, "text_tokens", None), - ) + if isinstance(output_tokens_details, dict): + completion_tokens_details = CompletionTokensDetailsWrapper( + **output_tokens_details + ) + else: + completion_tokens_details = CompletionTokensDetailsWrapper( + reasoning_tokens=getattr( + output_tokens_details, "reasoning_tokens", None + ), + image_tokens=getattr( + output_tokens_details, "image_tokens", None + ), + text_tokens=getattr(output_tokens_details, "text_tokens", None), + audio_tokens=getattr( + output_tokens_details, "audio_tokens", None + ), + ) chat_usage = Usage( prompt_tokens=prompt_tokens, diff --git a/tests/test_litellm/responses/test_responses_utils.py b/tests/test_litellm/responses/test_responses_utils.py index 2b3e601b134..bd441321507 100644 --- a/tests/test_litellm/responses/test_responses_utils.py +++ b/tests/test_litellm/responses/test_responses_utils.py @@ -327,7 +327,8 @@ class TestResponseAPILoggingUtils: "output_tokens_details": { "reasoning_tokens": 30, "image_tokens": 100, - "text_tokens": 70, + "text_tokens": 50, + "audio_tokens": 20, }, } @@ -346,7 +347,8 @@ class TestResponseAPILoggingUtils: assert result.completion_tokens_details is not None assert result.completion_tokens_details.reasoning_tokens == 30 assert result.completion_tokens_details.image_tokens == 100 - assert result.completion_tokens_details.text_tokens == 70 + assert result.completion_tokens_details.text_tokens == 50 + assert result.completion_tokens_details.audio_tokens == 20 def test_transform_response_api_usage_with_realtime_keys(self): """Realtime input_token_details / output_token_details normalize for Usage.""" @@ -375,6 +377,7 @@ class TestResponseAPILoggingUtils: assert result.completion_tokens_details is not None assert result.completion_tokens_details.text_tokens == 12 + assert result.completion_tokens_details.audio_tokens == 8 def test_transform_response_api_usage_tokens_details_keep_values(self): """Keeps input_tokens_details / output_tokens_details when singular keys are also present."""