From 732d2c58e60221040d49fbe040aac9282831993f Mon Sep 17 00:00:00 2001 From: yucheng Date: Wed, 23 Sep 2026 07:43:48 +0000 Subject: [PATCH] fix(langfuse_otel): type metadata helper and drop null fields so they cannot clobber caller trace metadata Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- litellm/integrations/langfuse/langfuse_otel.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/litellm/integrations/langfuse/langfuse_otel.py b/litellm/integrations/langfuse/langfuse_otel.py index a2cd3b2221a..193cab0cb9f 100644 --- a/litellm/integrations/langfuse/langfuse_otel.py +++ b/litellm/integrations/langfuse/langfuse_otel.py @@ -134,7 +134,7 @@ class LangfuseOtelLogger(OpenTelemetry): safe_set_attribute(span, enum_attr.value, value) @staticmethod - def _set_request_metadata_attributes(span: Span, kwargs: dict) -> None: + def _set_request_metadata_attributes(span: Span, kwargs: dict[str, object]) -> None: from litellm.integrations.arize._utils import safe_set_attribute from litellm.integrations.langfuse.langfuse import log_requester_metadata from litellm.litellm_core_utils.redact_messages import redact_user_api_key_info @@ -146,12 +146,15 @@ class LangfuseOtelLogger(OpenTelemetry): ) if not isinstance(request_metadata, dict): return - observation_metadata: Final = log_requester_metadata(redact_user_api_key_info(metadata=request_metadata)) + observation_metadata: Final = { + key: value + for key, value in log_requester_metadata(redact_user_api_key_info(metadata=request_metadata)).items() + if value is not None + } safe_set_attribute(span, LangfuseSpanAttributes.OBSERVATION_METADATA.value, safe_dumps(observation_metadata)) trace_prefix: Final = LangfuseSpanAttributes.TRACE_METADATA.value for field in _TRACE_IDENTITY_FIELDS: - value = observation_metadata.get(field) - if value is not None: + if (value := observation_metadata.get(field)) is not None: safe_set_attribute(span, f"{trace_prefix}.{field}", value) @staticmethod