diff --git a/litellm/litellm_core_utils/redact_messages.py b/litellm/litellm_core_utils/redact_messages.py index 9da0e35bdda..6ed38f86eee 100644 --- a/litellm/litellm_core_utils/redact_messages.py +++ b/litellm/litellm_core_utils/redact_messages.py @@ -300,6 +300,8 @@ def _drop_field_when_present(item: object, field: str) -> None: def _redact_responses_api_output(output_items): """Helper to redact ResponsesAPIResponse output items.""" + if not output_items: + return for output_item in output_items: output_type = stream_item_field(output_item, "type") if getattr(output_item, "text", None) is not None: @@ -376,7 +378,9 @@ def _redacted_responses_api_output_item(item: object, redacted_str: str) -> obje } -def _redact_responses_api_output_dict(output_items: Sequence[object], redacted_str: str) -> Sequence[object]: +def _redact_responses_api_output_dict(output_items: Sequence[object] | None, redacted_str: str) -> Sequence[object]: + if not output_items: + return [] return [_redacted_responses_api_output_item(item, redacted_str) for item in output_items] diff --git a/tests/unit/litellm_core_utils/test_redact_messages.py b/tests/unit/litellm_core_utils/test_redact_messages.py index 2fd3f16ab17..3844d163833 100644 --- a/tests/unit/litellm_core_utils/test_redact_messages.py +++ b/tests/unit/litellm_core_utils/test_redact_messages.py @@ -1033,6 +1033,26 @@ class TestPerformRedaction: assert none_dict == {"type": "output_text", "text": None, "content": [{"text": None}]} assert real_dict == {"type": "output_text", "text": "real answer", "content": [{"text": "real part"}]} + def test_redact_responses_api_output_handles_none(self): + from litellm.litellm_core_utils.redact_messages import ( + _redact_responses_api_output, + _redact_responses_api_output_dict, + _redact_streaming_response, + ) + + _redact_responses_api_output(None) + assert _redact_responses_api_output_dict(None, "redacted-by-litellm") == [] + + # Test dictionary output: None + result_dict = {"output": None} + redacted_dict = perform_redaction({}, result_dict) + assert redacted_dict["output"] is None + + # Test object/streaming response output: None + streaming_obj = SimpleNamespace(output=None) + _redact_streaming_response(streaming_obj) + assert streaming_obj.output is None + def test_skips_non_dict_response_output_items(self): result = { "output": [