Merge pull request #19528 from BerriAI/litellm_fix_langfuse_trace_id

[fix] Send litellm_trace_id to Langfuse
This commit is contained in:
YutaSaito 2026-01-22 07:08:10 +09:00 committed by GitHub
commit 3a49e4362f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 5 additions and 27 deletions

View file

@ -593,30 +593,10 @@ class LangFuseLogger:
trace_id = clean_metadata.pop("trace_id", None)
# Use standard_logging_object.trace_id if available (when trace_id from metadata is None)
# This allows standard trace_id to be used when provided in standard_logging_object
# However, we skip standard_logging_object.trace_id if it's a UUID (from litellm_trace_id default),
# as we want to fall back to litellm_call_id instead for better traceability.
# Note: Users can still explicitly set a UUID trace_id via metadata["trace_id"] (highest priority)
if trace_id is None and standard_logging_object is not None:
standard_trace_id = cast(
trace_id = cast(
Optional[str], standard_logging_object.get("trace_id")
)
# Only use standard_logging_object.trace_id if it's not a UUID
# UUIDs are 36 characters with hyphens in format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# We check for this specific pattern to avoid rejecting valid trace_ids that happen to have hyphens
# This primarily filters out default litellm_trace_id UUIDs, while still allowing user-provided
# trace_ids via metadata["trace_id"] (which is checked first and not affected by this logic)
if standard_trace_id is not None:
# Check if it's a UUID: 36 chars, 4 hyphens, specific pattern
is_uuid = (
len(standard_trace_id) == 36
and standard_trace_id.count("-") == 4
and standard_trace_id[8] == "-"
and standard_trace_id[13] == "-"
and standard_trace_id[18] == "-"
and standard_trace_id[23] == "-"
)
if not is_uuid:
trace_id = standard_trace_id
# Fallback to litellm_call_id if no trace_id found
if trace_id is None:
trace_id = litellm_call_id

View file

@ -973,11 +973,11 @@ def test_logging_trace_id(langfuse_trace_id, langfuse_existing_trace_id):
litellm_logging_obj._get_trace_id(service_name="langfuse")
== langfuse_trace_id
)
## if existing_trace_id exists
## if no trace_id or existing_trace_id is provided, use litellm_trace_id
else:
assert (
litellm_logging_obj._get_trace_id(service_name="langfuse")
== litellm_call_id
== litellm_logging_obj.litellm_trace_id
)

View file

@ -866,11 +866,9 @@ async def test_langfuse_trace_id():
assert trace_url is not None
returned_trace_id = int(trace_url.split("/")[-1])
returned_trace_id = trace_url.split("/")[-1]
assert returned_trace_id == int(
litellm_logging_obj._get_trace_id(service_name="langfuse")
)
assert returned_trace_id == litellm_logging_obj._get_trace_id(service_name="langfuse")
@pytest.mark.asyncio