From 5935927d2aa50c86b5c8eda42b4f2311afadcfa8 Mon Sep 17 00:00:00 2001 From: Ivana Dunisijevic Date: Wed, 7 Oct 2026 22:22:21 +0200 Subject: [PATCH 1/2] fix(responses): refresh guardrailed logging input --- .../guardrail_translation/handler.py | 5 +++++ ...test_openai_responses_guardrail_handler.py | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/litellm/llms/openai/responses/guardrail_translation/handler.py b/litellm/llms/openai/responses/guardrail_translation/handler.py index a267b66bb22..7a82ae9b0be 100644 --- a/litellm/llms/openai/responses/guardrail_translation/handler.py +++ b/litellm/llms/openai/responses/guardrail_translation/handler.py @@ -602,6 +602,11 @@ class OpenAIResponsesHandler(BaseTranslation): data["instructions"] = written_back.instructions # rebind-ok: data is an out-param else: await self._apply_guardrailed_texts(data, input_data, extracted, guardrail_to_apply, guardrailed_inputs) + if litellm_logging_obj is not None: + sanitized_input: Final = data.get("input") + litellm_logging_obj.messages = sanitized_input + litellm_logging_obj.model_call_details["messages"] = sanitized_input + litellm_logging_obj.model_call_details["input"] = sanitized_input verbose_proxy_logger.debug("OpenAI Responses API: Processed input messages: %s", data.get("input")) return data diff --git a/tests/unit/llms/openai/responses/test_openai_responses_guardrail_handler.py b/tests/unit/llms/openai/responses/test_openai_responses_guardrail_handler.py index 8bd242308f7..855301758b2 100644 --- a/tests/unit/llms/openai/responses/test_openai_responses_guardrail_handler.py +++ b/tests/unit/llms/openai/responses/test_openai_responses_guardrail_handler.py @@ -209,6 +209,25 @@ class TestOpenAIResponsesHandlerInputProcessing: assert result["input"] == "Hello world [GUARDRAILED]" assert result["model"] == "gpt-4" + @pytest.mark.asyncio + async def test_rewritten_input_replaces_logging_snapshot(self): + handler = OpenAIResponsesHandler() + guardrail = MockGuardrail(guardrail_name="test") + logging_obj = MagicMock() + logging_obj.messages = "sensitive-value" + logging_obj.model_call_details = { + "messages": "sensitive-value", + "input": "sensitive-value", + } + data = {"input": "sensitive-value", "model": "gpt-4"} + + result = await handler.process_input_messages(data, guardrail, logging_obj) + + assert result["input"] == "sensitive-value [GUARDRAILED]" + assert logging_obj.messages == result["input"] + assert logging_obj.model_call_details["messages"] == result["input"] + assert logging_obj.model_call_details["input"] == result["input"] + @pytest.mark.asyncio async def test_process_input_none(self): """Test processing when input is None""" From 03fcf03e13acd1b8dc3247de1106d5f8fb5bfb3f Mon Sep 17 00:00:00 2001 From: Ivana Dunisijevic Date: Thu, 8 Oct 2026 16:10:50 +0200 Subject: [PATCH 2/2] fix(responses): preserve normalized logging messages --- .../responses/guardrail_translation/handler.py | 5 +++-- .../test_openai_responses_guardrail_handler.py | 12 +++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/litellm/llms/openai/responses/guardrail_translation/handler.py b/litellm/llms/openai/responses/guardrail_translation/handler.py index 7a82ae9b0be..16751d0716c 100644 --- a/litellm/llms/openai/responses/guardrail_translation/handler.py +++ b/litellm/llms/openai/responses/guardrail_translation/handler.py @@ -604,8 +604,9 @@ class OpenAIResponsesHandler(BaseTranslation): await self._apply_guardrailed_texts(data, input_data, extracted, guardrail_to_apply, guardrailed_inputs) if litellm_logging_obj is not None: sanitized_input: Final = data.get("input") - litellm_logging_obj.messages = sanitized_input - litellm_logging_obj.model_call_details["messages"] = sanitized_input + sanitized_messages: Final = self.get_structured_messages(data) or [] + litellm_logging_obj.messages = sanitized_messages + litellm_logging_obj.model_call_details["messages"] = sanitized_messages litellm_logging_obj.model_call_details["input"] = sanitized_input verbose_proxy_logger.debug("OpenAI Responses API: Processed input messages: %s", data.get("input")) return data diff --git a/tests/unit/llms/openai/responses/test_openai_responses_guardrail_handler.py b/tests/unit/llms/openai/responses/test_openai_responses_guardrail_handler.py index 855301758b2..7e16dc381c9 100644 --- a/tests/unit/llms/openai/responses/test_openai_responses_guardrail_handler.py +++ b/tests/unit/llms/openai/responses/test_openai_responses_guardrail_handler.py @@ -210,13 +210,14 @@ class TestOpenAIResponsesHandlerInputProcessing: assert result["model"] == "gpt-4" @pytest.mark.asyncio - async def test_rewritten_input_replaces_logging_snapshot(self): + async def test_rewritten_input_refreshes_logging_snapshot(self): handler = OpenAIResponsesHandler() guardrail = MockGuardrail(guardrail_name="test") logging_obj = MagicMock() - logging_obj.messages = "sensitive-value" + original_messages = [{"role": "user", "content": "sensitive-value"}] + logging_obj.messages = original_messages logging_obj.model_call_details = { - "messages": "sensitive-value", + "messages": original_messages, "input": "sensitive-value", } data = {"input": "sensitive-value", "model": "gpt-4"} @@ -224,8 +225,9 @@ class TestOpenAIResponsesHandlerInputProcessing: result = await handler.process_input_messages(data, guardrail, logging_obj) assert result["input"] == "sensitive-value [GUARDRAILED]" - assert logging_obj.messages == result["input"] - assert logging_obj.model_call_details["messages"] == result["input"] + sanitized_messages = [{"role": "user", "content": result["input"]}] + assert logging_obj.messages == sanitized_messages + assert logging_obj.model_call_details["messages"] == sanitized_messages assert logging_obj.model_call_details["input"] == result["input"] @pytest.mark.asyncio