6868class PropagatedExperimentAttributes (TypedDict ):
6969 experiment_id : str
7070 experiment_name : str
71- experiment_metadata : Optional [str ]
71+ experiment_metadata : Optional [Dict [ str , str ] ]
7272 experiment_dataset_id : Optional [str ]
7373 experiment_item_id : str
74- experiment_item_metadata : Optional [str ]
74+ experiment_item_metadata : Optional [Dict [ str , str ] ]
7575 experiment_item_root_observation_id : str
7676
7777
@@ -247,9 +247,20 @@ def _propagate_attributes(
247247 "trace_name" : trace_name ,
248248 }
249249
250- propagated_string_attributes = propagated_string_attributes | (
251- cast (Dict [str , Union [str , List [str ], None ]], experiment ) or {}
252- )
250+ propagated_metadata_attributes : Dict [str , Optional [Dict [str , str ]]] = {
251+ "metadata" : metadata ,
252+ }
253+
254+ if experiment :
255+ for key , value in experiment .items ():
256+ if key in ("experiment_metadata" , "experiment_item_metadata" ):
257+ propagated_metadata_attributes [key ] = cast (
258+ Optional [Dict [str , str ]], value
259+ )
260+ else :
261+ propagated_string_attributes [key ] = cast (
262+ Optional [Union [str , List [str ]]], value
263+ )
253264
254265 # Filter out None values
255266 propagated_string_attributes = {
@@ -268,16 +279,19 @@ def _propagate_attributes(
268279 as_baggage = as_baggage ,
269280 )
270281
271- if metadata is not None :
282+ for metadata_key , metadata_value in propagated_metadata_attributes .items ():
283+ if metadata_value is None :
284+ continue
285+
272286 validated_metadata : Dict [str , str ] = {}
273287
274- for key , value in metadata .items ():
275- if _validate_string_value (value = value , key = f"metadata .{ key } " ):
288+ for key , value in metadata_value .items ():
289+ if _validate_string_value (value = value , key = f"{ metadata_key } .{ key } " ):
276290 validated_metadata [key ] = value
277291
278292 if validated_metadata :
279293 context = _set_propagated_attribute (
280- key = "metadata" ,
294+ key = metadata_key ,
281295 value = validated_metadata ,
282296 context = context ,
283297 span = current_span ,
@@ -322,9 +336,10 @@ def _get_propagated_attributes_from_context(
322336
323337 if isinstance (value , dict ):
324338 # Handle metadata
339+ span_key = _get_propagated_span_key (key )
340+
325341 for k , v in value .items ():
326- span_key = f"{ LangfuseOtelSpanAttributes .TRACE_METADATA } .{ k } "
327- propagated_attributes [span_key ] = v
342+ propagated_attributes [f"{ span_key } .{ k } " ] = v
328343
329344 else :
330345 span_key = _get_propagated_span_key (key )
@@ -387,7 +402,7 @@ def _set_propagated_attribute(
387402 # Handle metadata
388403 for k , v in value .items ():
389404 span .set_attribute (
390- key = f"{ LangfuseOtelSpanAttributes . TRACE_METADATA } .{ k } " ,
405+ key = f"{ span_key } .{ k } " ,
391406 value = v ,
392407 )
393408
@@ -469,10 +484,14 @@ def _get_span_key_from_baggage_key(key: str) -> Optional[str]:
469484 # Remove prefix to get the actual key name
470485 suffix = key [len (LANGFUSE_BAGGAGE_PREFIX ) :]
471486
472- if suffix . startswith ( "metadata_ " ):
473- metadata_key = suffix [ len ( "metadata_" ) :]
487+ for metadata_key in ( "metadata" , "experiment_metadata" , "experiment_item_metadata " ):
488+ baggage_metadata_prefix = f" { metadata_key } _"
474489
475- return _get_propagated_span_key (metadata_key )
490+ if suffix .startswith (baggage_metadata_prefix ):
491+ return (
492+ f"{ _get_propagated_span_key (metadata_key )} ."
493+ f"{ suffix [len (baggage_metadata_prefix ) :]} "
494+ )
476495
477496 return _get_propagated_span_key (suffix )
478497
@@ -484,6 +503,7 @@ def _get_propagated_span_key(key: str) -> str:
484503 "version" : LangfuseOtelSpanAttributes .VERSION ,
485504 "tags" : LangfuseOtelSpanAttributes .TRACE_TAGS ,
486505 "trace_name" : LangfuseOtelSpanAttributes .TRACE_NAME ,
506+ "metadata" : LangfuseOtelSpanAttributes .TRACE_METADATA ,
487507 "experiment_id" : LangfuseOtelSpanAttributes .EXPERIMENT_ID ,
488508 "experiment_name" : LangfuseOtelSpanAttributes .EXPERIMENT_NAME ,
489509 "experiment_metadata" : LangfuseOtelSpanAttributes .EXPERIMENT_METADATA ,
0 commit comments