Skip to content

Commit 53a9bff

Browse files
committed
update
1 parent 0d696ea commit 53a9bff

File tree

4 files changed

+62
-47
lines changed

4 files changed

+62
-47
lines changed

langfuse/__init__.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,29 @@
22

33
from ._client import client as _client_module
44
from ._client.attributes import LangfuseOtelSpanAttributes
5+
from ._client.constants import ObservationTypeLiteral
56
from ._client.get_client import get_client
67
from ._client.observe import observe
7-
from ._client.span import LangfuseEvent, LangfuseGeneration, LangfuseSpan, LangfuseAgent, LangfuseTool, LangfuseChain, LangfuseEmbedding, LangfuseRetriever
8+
from ._client.span import (
9+
LangfuseEvent,
10+
LangfuseGeneration,
11+
LangfuseSpan,
12+
LangfuseAgent,
13+
LangfuseTool,
14+
LangfuseChain,
15+
LangfuseEmbedding,
16+
LangfuseEvaluator,
17+
LangfuseRetriever,
18+
LangfuseGuardrail,
19+
)
820

921
Langfuse = _client_module.Langfuse
1022

1123
__all__ = [
1224
"Langfuse",
1325
"get_client",
1426
"observe",
27+
"ObservationTypeLiteral",
1528
"LangfuseSpan",
1629
"LangfuseGeneration",
1730
"LangfuseEvent",
@@ -20,5 +33,7 @@
2033
"LangfuseTool",
2134
"LangfuseChain",
2235
"LangfuseEmbedding",
36+
"LangfuseEvaluator",
2337
"LangfuseRetriever",
38+
"LangfuseGuardrail",
2439
]

langfuse/_client/client.py

Lines changed: 27 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
LANGFUSE_TRACING_ENABLED,
3737
LANGFUSE_TRACING_ENVIRONMENT,
3838
)
39+
from langfuse._client.constants import ObservationTypeLiteral, ObservationTypeLiteralNoEvent
3940
from langfuse._client.resource_manager import LangfuseResourceManager
4041
from langfuse._client.span import (
4142
LangfuseEvent,
@@ -45,7 +46,9 @@
4546
LangfuseTool,
4647
LangfuseChain,
4748
LangfuseRetriever,
49+
LangfuseEvaluator,
4850
LangfuseEmbedding,
51+
LangfuseGuardrail,
4952
)
5053
from langfuse._utils import _get_timestamp
5154
from langfuse._utils.parse_error import handle_fern_exception
@@ -355,18 +358,6 @@ def start_as_current_span(
355358
level: Optional[SpanLevel] = None,
356359
status_message: Optional[str] = None,
357360
end_on_exit: Optional[bool] = None,
358-
as_type: Optional[
359-
Literal[
360-
"generation",
361-
"span",
362-
"event",
363-
"agent",
364-
"tool",
365-
"chain",
366-
"retriever",
367-
"embedding",
368-
]
369-
] = None,
370361
) -> _AgnosticContextManager[LangfuseSpan]:
371362
"""Create a new span and set it as the current span in a context manager.
372363
@@ -685,33 +676,33 @@ def start_as_current_generation(
685676

686677
def _get_span_class(
687678
self,
688-
as_type: Literal[
689-
"span",
690-
"generation",
691-
"event",
692-
"agent",
693-
"tool",
694-
"chain",
695-
"retriever",
696-
"embedding",
697-
],
679+
as_type: ObservationTypeLiteral,
698680
) -> type:
699681
"""Get the appropriate span class based on as_type."""
700-
if as_type == "agent":
682+
normalized_type = as_type.upper()
683+
684+
if normalized_type == "AGENT":
701685
return LangfuseAgent
702-
elif as_type == "tool":
686+
elif normalized_type == "TOOL":
703687
return LangfuseTool
704-
elif as_type == "chain":
688+
elif normalized_type == "CHAIN":
705689
return LangfuseChain
706-
elif as_type == "retriever":
690+
elif normalized_type == "RETRIEVER":
707691
return LangfuseRetriever
708-
elif as_type == "embedding":
692+
elif normalized_type == "EVALUATOR":
693+
return LangfuseEvaluator
694+
elif normalized_type == "EMBEDDING":
709695
return LangfuseEmbedding
710-
elif as_type == "generation":
696+
elif normalized_type == "GUARDRAIL":
697+
return LangfuseGuardrail
698+
elif normalized_type == "GENERATION":
711699
return LangfuseGeneration
712-
elif as_type == "event":
700+
elif normalized_type == "EVENT":
713701
return LangfuseEvent
714-
elif as_type == "span":
702+
elif normalized_type == "SPAN":
703+
return LangfuseSpan
704+
else:
705+
# Default to LangfuseSpan for unrecognized types
715706
return LangfuseSpan
716707

717708
@_agnosticcontextmanager
@@ -721,7 +712,7 @@ def _create_span_with_parent_context(
721712
name: str,
722713
parent: Optional[otel_trace_api.Span] = None,
723714
remote_parent_span: Optional[otel_trace_api.Span] = None,
724-
as_type: Literal["generation", "span", "agent", "tool", "chain", "retriever"],
715+
as_type: ObservationTypeLiteralNoEvent,
725716
end_on_exit: Optional[bool] = None,
726717
input: Optional[Any] = None,
727718
output: Optional[Any] = None,
@@ -768,18 +759,7 @@ def _start_as_current_otel_span_with_processed_media(
768759
self,
769760
*,
770761
name: str,
771-
as_type: Optional[
772-
Literal[
773-
"generation",
774-
"span",
775-
"event",
776-
"agent",
777-
"tool",
778-
"chain",
779-
"retriever",
780-
"embedding",
781-
]
782-
] = None,
762+
as_type: Optional[ObservationTypeLiteralNoEvent] = None,
783763
end_on_exit: Optional[bool] = None,
784764
input: Optional[Any] = None,
785765
output: Optional[Any] = None,
@@ -798,7 +778,7 @@ def _start_as_current_otel_span_with_processed_media(
798778
name=name,
799779
end_on_exit=end_on_exit if end_on_exit is not None else True,
800780
) as otel_span:
801-
span_class = self._get_span_class(as_type or "generation")
781+
span_class = self._get_span_class(as_type or "generation") # default was "generation"
802782
common_args = {
803783
"otel_span": otel_span,
804784
"langfuse_client": self,
@@ -822,13 +802,16 @@ def _start_as_current_otel_span_with_processed_media(
822802
"prompt": prompt,
823803
}
824804
)
805+
# TODO: for some, create generation-like classes with those props.
825806
elif span_class in [
826807
LangfuseSpan,
827808
LangfuseAgent,
828809
LangfuseTool,
829810
LangfuseChain,
830811
LangfuseRetriever,
812+
LangfuseEvaluator,
831813
LangfuseEmbedding,
814+
LangfuseGuardrail,
832815
]:
833816
# set their type internally in the class
834817
pass

langfuse/_client/constants.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,3 @@ class ObservationType(str, enum.Enum):
5555
]
5656

5757
ObservationTypeLiteral: TypeAlias = ObservationTypeLiteralNoEvent | Literal["event"]
58-
]

langfuse/_client/span.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1374,5 +1374,23 @@ class LangfuseEmbedding(LangfuseGraphObservation):
13741374

13751375
def __init__(self, **kwargs: Any) -> None:
13761376
"""Initialize a new LangfuseEmbedding span."""
1377-
kwargs["observation_type"] = "embedding"
1377+
kwargs["observation_type"] = "EMBEDDING"
1378+
super().__init__(**kwargs)
1379+
1380+
1381+
class LangfuseEvaluator(LangfuseGraphObservation):
1382+
"""Specialized span for evaluator observations in agentic workflows."""
1383+
1384+
def __init__(self, **kwargs: Any) -> None:
1385+
"""Initialize a new LangfuseEvaluator span."""
1386+
kwargs["observation_type"] = "EVALUATOR"
1387+
super().__init__(**kwargs)
1388+
1389+
1390+
class LangfuseGuardrail(LangfuseGraphObservation):
1391+
"""Specialized span for guardrail observations in agentic workflows."""
1392+
1393+
def __init__(self, **kwargs: Any) -> None:
1394+
"""Initialize a new LangfuseGuardrail span."""
1395+
kwargs["observation_type"] = "GUARDRAIL"
13781396
super().__init__(**kwargs)

0 commit comments

Comments
 (0)