From 4a5ea55d18104314495766c29b265938a20a831e Mon Sep 17 00:00:00 2001 From: Ishaan Jaff Date: Thu, 2 Oct 2025 17:31:01 -0700 Subject: [PATCH] [Fix]: Handle non-serializable objects in Langfuse logging (#15148) * fix: safe_deep_copy * fix: import copy --- litellm/integrations/langfuse/langfuse.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/litellm/integrations/langfuse/langfuse.py b/litellm/integrations/langfuse/langfuse.py index 69943a0fe4d..1a44b4706a0 100644 --- a/litellm/integrations/langfuse/langfuse.py +++ b/litellm/integrations/langfuse/langfuse.py @@ -1,6 +1,5 @@ #### What this does #### # On success, logs events to Langfuse -import copy import os import traceback from datetime import datetime @@ -11,6 +10,7 @@ from packaging.version import Version import litellm from litellm._logging import verbose_logger from litellm.constants import MAX_LANGFUSE_INITIALIZED_CLIENTS +from litellm.litellm_core_utils.core_helpers import safe_deep_copy from litellm.litellm_core_utils.redact_messages import redact_user_api_key_info from litellm.llms.custom_httpx.http_handler import _get_httpx_client from litellm.secret_managers.main import str_to_bool @@ -222,7 +222,7 @@ class LangFuseLogger: litellm_params.get("metadata", {}) or {} ) # if litellm_params['metadata'] == None metadata = self.add_metadata_from_header(litellm_params, metadata) - optional_params = copy.deepcopy(kwargs.get("optional_params", {})) + optional_params = safe_deep_copy(kwargs.get("optional_params", {})) prompt = {"messages": kwargs.get("messages")}