fix(logging): satisfy callback redaction type gates

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
yucheng 2026-09-14 19:45:39 +00:00
parent 566a323e47
commit 6d251a6cc0
3 changed files with 16 additions and 14 deletions

View file

@ -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": "",
}

View file

@ -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 {}

View file

@ -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 {}
),