From c2b47e2f31274d34322310658bcf7fcff397562e Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 8 Jul 2026 15:50:06 +0000 Subject: [PATCH] test(logging): cover object-response path in streaming responses assembly --- .../test_litellm_logging.py | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/tests/test_litellm/litellm_core_utils/test_litellm_logging.py b/tests/test_litellm/litellm_core_utils/test_litellm_logging.py index 75ab6ba157d..71ecdc2433c 100644 --- a/tests/test_litellm/litellm_core_utils/test_litellm_logging.py +++ b/tests/test_litellm/litellm_core_utils/test_litellm_logging.py @@ -3747,3 +3747,46 @@ def test_get_assembled_streaming_response_handles_dict_response(logging_obj): assert assembled["usage"]["prompt_tokens"] == 11 assert assembled["usage"]["completion_tokens"] == 7 assert assembled["usage"]["total_tokens"] == 18 + + +def test_get_assembled_streaming_response_handles_object_response(logging_obj): + """ + Companion to the dict-response regression: when ResponseCompletedEvent.response + is a proper ResponsesAPIResponse object carrying a ResponseAPIUsage, the + assembly helper must still transform usage into chat-completion shape. + """ + from datetime import datetime + + from litellm.types.llms.openai import ( + ResponseAPIUsage, + ResponseCompletedEvent, + ResponsesAPIResponse, + ResponsesAPIStreamEvents, + ) + + response = ResponsesAPIResponse( + id="resp_obj", + created_at=0, + output=[], + usage=ResponseAPIUsage(input_tokens=3, output_tokens=4, total_tokens=7), + ) + event = ResponseCompletedEvent( + type=ResponsesAPIStreamEvents.RESPONSE_COMPLETED, + response=response, + ) + assert isinstance(event.response, ResponsesAPIResponse) + + assembled = logging_obj._get_assembled_streaming_response( + result=event, + start_time=datetime.now(), + end_time=datetime.now(), + is_async=True, + streaming_chunks=[], + ) + + assert isinstance(assembled, ResponsesAPIResponse) + usage = assembled.usage + usage_dict = usage if isinstance(usage, dict) else usage.model_dump() + assert usage_dict["prompt_tokens"] == 3 + assert usage_dict["completion_tokens"] == 4 + assert usage_dict["total_tokens"] == 7