diff --git a/litellm/integrations/custom_logger.py b/litellm/integrations/custom_logger.py index 22e2e34c586..900685f556a 100644 --- a/litellm/integrations/custom_logger.py +++ b/litellm/integrations/custom_logger.py @@ -914,9 +914,9 @@ class CustomLogger: # https://docs.litellm.ai/docs/observability/custom_callbac return model_call_details redacted_model_call_details: Final = ( - { + { # mutable-ok: callback payload copy **model_call_details, - "messages": [{"role": "user", "content": REDACTED_BY_LITELLM}], + "messages": [{"role": "user", "content": REDACTED_BY_LITELLM}], # mutable-ok: callback payload copy "prompt": "", "input": "", } diff --git a/litellm/litellm_core_utils/litellm_logging.py b/litellm/litellm_core_utils/litellm_logging.py index da805ce77e1..c9dc1d49a36 100644 --- a/litellm/litellm_core_utils/litellm_logging.py +++ b/litellm/litellm_core_utils/litellm_logging.py @@ -3194,18 +3194,18 @@ class Logging(LiteLLMLoggingBaseClass): ) if isinstance(callback, CustomLogger): # custom logger class - callback_model_call_details: Final[dict] = self.model_call_details + callback_model_call_details: Final[dict] = self.model_call_details # mutable-ok: callback payload API ################################## # call redaction hook for custom logger - standard_redacted_model_call_details: Final[dict] = ( + standard_redacted_model_call_details: Final[dict] = ( # mutable-ok: callback payload API callback.redact_standard_logging_payload_from_model_call_details( model_call_details=callback_model_call_details ) ) - streaming_redacted_model_call_details: Final[dict] = redact_streaming_responses_for_custom_logger( + streaming_redacted_model_call_details: Final[dict] = redact_streaming_responses_for_custom_logger( # mutable-ok: callback payload API model_call_details=standard_redacted_model_call_details, custom_logger=callback ) - redacted_model_call_details: Final[dict] = redact_model_call_details_for_custom_logger( + redacted_model_call_details: Final[dict] = redact_model_call_details_for_custom_logger( # mutable-ok: callback payload API model_call_details=streaming_redacted_model_call_details, custom_logger=callback ) ################################## @@ -4291,7 +4291,7 @@ def _construct_custom_logger_compatible_class( logging_integration: _custom_logger_compatible_callbacks_literal, internal_usage_cache: DualCache | None, llm_router: Any | None, # expect litellm.Router, but typing errors due to circular import - custom_logger_init_args: dict | None = None, + custom_logger_init_args: dict | None = None, # mutable-ok: callback constructor API ) -> CustomLogger | None: try: custom_logger_init_args = custom_logger_init_args or {} diff --git a/litellm/litellm_core_utils/redact_messages.py b/litellm/litellm_core_utils/redact_messages.py index e2bdeb2cb17..fa216c53faa 100644 --- a/litellm/litellm_core_utils/redact_messages.py +++ b/litellm/litellm_core_utils/redact_messages.py @@ -75,7 +75,9 @@ def redact_response_for_custom_logger(result: object, custom_logger: CustomLogge ) if not opted_out or custom_logger.redacts_messages_itself(): return result - return perform_redaction(model_call_details={}, result=result, redact_streaming_responses=False) + return perform_redaction( # mutable-ok: redaction scratch payload + model_call_details={}, result=result, redact_streaming_responses=False + ) def redact_model_call_details_for_custom_logger( @@ -93,11 +95,11 @@ def redact_model_call_details_for_custom_logger( raw_request_typed_dict.get("raw_request_body") if isinstance(raw_request_typed_dict, dict) else None ) redacted_raw_request_typed_dict: Final = ( - { + { # mutable-ok: callback payload copy **raw_request_typed_dict, "raw_request_body": { - **raw_request_body, - "messages": [{"role": "user", "content": REDACTED_BY_LITELLM}], + **raw_request_body, # mutable-ok: callback payload copy + "messages": [{"role": "user", "content": REDACTED_BY_LITELLM}], # mutable-ok: callback payload copy "input": "", "prompt": "", }, @@ -105,15 +107,15 @@ def redact_model_call_details_for_custom_logger( if isinstance(raw_request_typed_dict, dict) and isinstance(raw_request_body, dict) else raw_request_typed_dict ) - return { + return { # mutable-ok: callback payload copy **model_call_details, - **{ + **{ # mutable-ok: callback payload copy key: redact_response_for_custom_logger(result=model_call_details[key], custom_logger=custom_logger) for key in response_keys if model_call_details.get(key) is not None }, **( - {"raw_request_typed_dict": redacted_raw_request_typed_dict} + {"raw_request_typed_dict": redacted_raw_request_typed_dict} # mutable-ok: callback payload copy if redacted_raw_request_typed_dict is not raw_request_typed_dict else {} ),