1212from contextvars import ContextVar
1313from dataclasses import dataclass
1414from datetime import datetime
15- from typing import Any , Literal , Optional , cast
15+ from typing import Any , Literal , cast
1616
1717from haystack import default_from_dict , default_to_dict , logging
1818from haystack .dataclasses import ChatMessage
4848
4949# Internal span execution hierarchy for our tracer
5050# Manages parent-child relationships and prevents cross-request span interleaving
51- span_stack_var : ContextVar [Optional [ list ["LangfuseSpan" ]] ] = ContextVar ("span_stack" , default = None )
51+ span_stack_var : ContextVar [list ["LangfuseSpan" ] | None ] = ContextVar ("span_stack" , default = None )
5252
5353
5454class LangfuseSpan (Span ):
@@ -150,9 +150,9 @@ class SpanContext:
150150
151151 name : str
152152 operation_name : str
153- component_type : Optional [ str ]
153+ component_type : str | None
154154 tags : dict [str , Any ]
155- parent_span : Optional [ Span ]
155+ parent_span : Span | None
156156 trace_name : str = "Haystack"
157157 public : bool = False
158158
@@ -189,7 +189,7 @@ class SpanHandler(ABC):
189189 """
190190
191191 def __init__ (self ) -> None :
192- self .tracer : Optional [ langfuse .Langfuse ] = None
192+ self .tracer : langfuse .Langfuse | None = None
193193
194194 def init_tracer (self , tracer : langfuse .Langfuse ) -> None :
195195 """
@@ -215,7 +215,7 @@ def create_span(self, context: SpanContext) -> LangfuseSpan:
215215 pass
216216
217217 @abstractmethod
218- def handle (self , span : LangfuseSpan , component_type : Optional [ str ] ) -> None :
218+ def handle (self , span : LangfuseSpan , component_type : str | None ) -> None :
219219 """
220220 Process a span after component execution by attaching metadata and metrics.
221221
@@ -338,7 +338,7 @@ def create_span(self, context: SpanContext) -> LangfuseSpan:
338338 else :
339339 return LangfuseSpan (self .tracer .start_as_current_span (name = context .name ))
340340
341- def handle (self , span : LangfuseSpan , component_type : Optional [ str ] ) -> None :
341+ def handle (self , span : LangfuseSpan , component_type : str | None ) -> None :
342342 # If the span is at the pipeline level, we add input and output keys to the span
343343 at_pipeline_level = span .get_data ().get (_PIPELINE_INPUT_KEY ) is not None
344344 if at_pipeline_level :
@@ -420,7 +420,7 @@ def __init__(
420420 tracer : langfuse .Langfuse ,
421421 name : str = "Haystack" ,
422422 public : bool = False ,
423- span_handler : Optional [ SpanHandler ] = None ,
423+ span_handler : SpanHandler | None = None ,
424424 ) -> None :
425425 """
426426 Initialize a LangfuseTracer instance.
@@ -450,7 +450,7 @@ def __init__(
450450
451451 @contextlib .contextmanager
452452 def trace (
453- self , operation_name : str , tags : Optional [ dict [str , Any ]] = None , parent_span : Optional [ Span ] = None
453+ self , operation_name : str , tags : dict [str , Any ] | None = None , parent_span : Span | None = None
454454 ) -> Iterator [Span ]:
455455 tags = tags or {}
456456 span_name = tags .get (_COMPONENT_NAME_KEY , operation_name )
@@ -541,7 +541,7 @@ def trace(
541541 def flush (self ) -> None :
542542 self ._tracer .flush ()
543543
544- def current_span (self ) -> Optional [ Span ] :
544+ def current_span (self ) -> Span | None :
545545 """
546546 Return the current active span.
547547
0 commit comments