diff --git a/litellm/llms/openai/responses/guardrail_translation/handler.py b/litellm/llms/openai/responses/guardrail_translation/handler.py index 84ff790ae48..804d667a788 100644 --- a/litellm/llms/openai/responses/guardrail_translation/handler.py +++ b/litellm/llms/openai/responses/guardrail_translation/handler.py @@ -662,6 +662,12 @@ 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") + 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 bf871210074..25d4200e531 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 @@ -265,6 +265,27 @@ class TestOpenAIResponsesHandlerInputProcessing: assert result["input"] == "Hello world [GUARDRAILED]" assert result["model"] == "gpt-4" + @pytest.mark.asyncio + async def test_rewritten_input_refreshes_logging_snapshot(self): + handler = OpenAIResponsesHandler() + guardrail = MockGuardrail(guardrail_name="test") + logging_obj = MagicMock() + original_messages = [{"role": "user", "content": "sensitive-value"}] + logging_obj.messages = original_messages + logging_obj.model_call_details = { + "messages": original_messages, + "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]" + 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 async def test_process_input_none(self): """Test processing when input is None"""