Skip to content

Commit 0f2c731

Browse files
committed
change generation like and span like
1 parent 2e0b7a8 commit 0f2c731

3 files changed

Lines changed: 105 additions & 60 deletions

File tree

langfuse/_client/attributes.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414
from datetime import datetime
1515
from typing import Any, Dict, List, Literal, Optional, Union
1616

17-
from langfuse._client.constants import ObservationTypeGenerationLike
17+
from langfuse._client.constants import (
18+
ObservationTypeGenerationLike,
19+
ObservationTypeSpanLike,
20+
)
1821

1922
from langfuse._utils.serializer import EventSerializer
2023
from langfuse.model import PromptClient
@@ -95,7 +98,9 @@ def create_span_attributes(
9598
level: Optional[SpanLevel] = None,
9699
status_message: Optional[str] = None,
97100
version: Optional[str] = None,
98-
observation_type: Optional[Literal["span", "guardrail", "event"]] = "span",
101+
observation_type: Optional[
102+
Union[ObservationTypeSpanLike, Literal["event"]]
103+
] = "span",
99104
) -> dict:
100105
attributes = {
101106
LangfuseOtelSpanAttributes.OBSERVATION_TYPE: observation_type,

langfuse/_client/constants.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,22 @@
1212
"""Note: this type is used with .__args__ / get_args in some cases and therefore must remain flat"""
1313
ObservationTypeGenerationLike: TypeAlias = Literal[
1414
"generation",
15+
"embedding",
16+
]
17+
18+
ObservationTypeSpanLike: TypeAlias = Literal[
19+
"span",
1520
"agent",
1621
"tool",
1722
"chain",
1823
"retriever",
1924
"evaluator",
20-
"embedding",
25+
"guardrail",
2126
]
2227

2328
ObservationTypeLiteralNoEvent: TypeAlias = Union[
2429
ObservationTypeGenerationLike,
25-
Literal[
26-
"span",
27-
"guardrail",
28-
],
30+
ObservationTypeSpanLike,
2931
]
3032

3133
ObservationTypeLiteral: TypeAlias = Union[

langfuse/_client/span.py

Lines changed: 91 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@
4747
from langfuse._client.constants import (
4848
ObservationTypeLiteral,
4949
ObservationTypeGenerationLike,
50+
ObservationTypeSpanLike,
5051
ObservationTypeLiteralNoEvent,
52+
get_observation_types_list,
5153
)
5254
from langfuse.logger import langfuse_logger
5355
from langfuse.types import MapValue, ScoreDataType, SpanLevel
@@ -142,7 +144,7 @@ def __init__(
142144

143145
attributes = {}
144146

145-
if as_type in get_args(ObservationTypeGenerationLike):
147+
if as_type in get_observation_types_list(ObservationTypeGenerationLike):
146148
attributes = create_generation_attributes(
147149
input=media_processed_input,
148150
output=media_processed_output,
@@ -157,21 +159,13 @@ def __init__(
157159
cost_details=cost_details,
158160
prompt=prompt,
159161
observation_type=cast(
160-
Literal[
161-
"generation",
162-
"agent",
163-
"tool",
164-
"chain",
165-
"retriever",
166-
"evaluator",
167-
"embedding",
168-
],
162+
ObservationTypeGenerationLike,
169163
as_type,
170164
),
171165
)
172166

173167
else:
174-
# For span-like types: "span", "guardrail", "event"
168+
# For span-like types and events
175169
attributes = create_span_attributes(
176170
input=media_processed_input,
177171
output=media_processed_output,
@@ -180,8 +174,12 @@ def __init__(
180174
level=level,
181175
status_message=status_message,
182176
observation_type=cast(
183-
Optional[Literal["span", "guardrail", "event"]],
184-
as_type if as_type in ["span", "guardrail", "event"] else None,
177+
Optional[Union[ObservationTypeSpanLike, Literal["event"]]],
178+
as_type
179+
if as_type
180+
in get_observation_types_list(ObservationTypeSpanLike)
181+
or as_type == "event"
182+
else None,
185183
),
186184
)
187185

@@ -597,7 +595,9 @@ def update(
597595
if name:
598596
self._otel_span.update_name(name)
599597

600-
if self._observation_type in get_args(ObservationTypeGenerationLike):
598+
if self._observation_type in get_observation_types_list(
599+
ObservationTypeGenerationLike
600+
):
601601
attributes = create_generation_attributes(
602602
input=processed_input,
603603
output=processed_output,
@@ -617,7 +617,7 @@ def update(
617617
prompt=prompt,
618618
)
619619
else:
620-
# For span-like types: "span", "guardrail", "event"
620+
# For span-like types and events
621621
attributes = create_span_attributes(
622622
input=processed_input,
623623
output=processed_output,
@@ -626,9 +626,11 @@ def update(
626626
level=level,
627627
status_message=status_message,
628628
observation_type=cast(
629-
Optional[Literal["span", "guardrail", "event"]],
629+
Optional[Union[ObservationTypeSpanLike, Literal["event"]]],
630630
self._observation_type
631-
if self._observation_type in ["span", "guardrail", "event"]
631+
if self._observation_type
632+
in get_observation_types_list(ObservationTypeSpanLike)
633+
or self._observation_type == "event"
632634
else None,
633635
),
634636
)
@@ -683,12 +685,6 @@ def start_observation(
683685
version: Optional[str] = None,
684686
level: Optional[SpanLevel] = None,
685687
status_message: Optional[str] = None,
686-
completion_start_time: Optional[datetime] = None,
687-
model: Optional[str] = None,
688-
model_parameters: Optional[Dict[str, MapValue]] = None,
689-
usage_details: Optional[Dict[str, int]] = None,
690-
cost_details: Optional[Dict[str, float]] = None,
691-
prompt: Optional[PromptClient] = None,
692688
) -> "LangfuseAgent": ...
693689

694690
@overload
@@ -703,12 +699,6 @@ def start_observation(
703699
version: Optional[str] = None,
704700
level: Optional[SpanLevel] = None,
705701
status_message: Optional[str] = None,
706-
completion_start_time: Optional[datetime] = None,
707-
model: Optional[str] = None,
708-
model_parameters: Optional[Dict[str, MapValue]] = None,
709-
usage_details: Optional[Dict[str, int]] = None,
710-
cost_details: Optional[Dict[str, float]] = None,
711-
prompt: Optional[PromptClient] = None,
712702
) -> "LangfuseTool": ...
713703

714704
@overload
@@ -723,12 +713,6 @@ def start_observation(
723713
version: Optional[str] = None,
724714
level: Optional[SpanLevel] = None,
725715
status_message: Optional[str] = None,
726-
completion_start_time: Optional[datetime] = None,
727-
model: Optional[str] = None,
728-
model_parameters: Optional[Dict[str, MapValue]] = None,
729-
usage_details: Optional[Dict[str, int]] = None,
730-
cost_details: Optional[Dict[str, float]] = None,
731-
prompt: Optional[PromptClient] = None,
732716
) -> "LangfuseChain": ...
733717

734718
@overload
@@ -743,12 +727,6 @@ def start_observation(
743727
version: Optional[str] = None,
744728
level: Optional[SpanLevel] = None,
745729
status_message: Optional[str] = None,
746-
completion_start_time: Optional[datetime] = None,
747-
model: Optional[str] = None,
748-
model_parameters: Optional[Dict[str, MapValue]] = None,
749-
usage_details: Optional[Dict[str, int]] = None,
750-
cost_details: Optional[Dict[str, float]] = None,
751-
prompt: Optional[PromptClient] = None,
752730
) -> "LangfuseRetriever": ...
753731

754732
@overload
@@ -763,12 +741,6 @@ def start_observation(
763741
version: Optional[str] = None,
764742
level: Optional[SpanLevel] = None,
765743
status_message: Optional[str] = None,
766-
completion_start_time: Optional[datetime] = None,
767-
model: Optional[str] = None,
768-
model_parameters: Optional[Dict[str, MapValue]] = None,
769-
usage_details: Optional[Dict[str, int]] = None,
770-
cost_details: Optional[Dict[str, float]] = None,
771-
prompt: Optional[PromptClient] = None,
772744
) -> "LangfuseEvaluator": ...
773745

774746
@overload
@@ -912,7 +884,7 @@ def start_observation(
912884
"status_message": status_message,
913885
}
914886

915-
if as_type in get_args(ObservationTypeGenerationLike):
887+
if as_type in get_observation_types_list(ObservationTypeGenerationLike):
916888
common_args.update(
917889
{
918890
"completion_start_time": completion_start_time,
@@ -960,15 +932,81 @@ def start_as_current_observation(
960932
prompt: Optional[PromptClient] = None,
961933
) -> _AgnosticContextManager[
962934
Union[
963-
"LangfuseAgent",
964-
"LangfuseTool",
965-
"LangfuseChain",
966-
"LangfuseRetriever",
967-
"LangfuseEvaluator",
935+
"LangfuseGeneration",
968936
"LangfuseEmbedding",
969937
]
970938
]: ...
971939

940+
@overload
941+
def start_as_current_observation(
942+
self,
943+
*,
944+
name: str,
945+
as_type: Literal["agent"],
946+
input: Optional[Any] = None,
947+
output: Optional[Any] = None,
948+
metadata: Optional[Any] = None,
949+
version: Optional[str] = None,
950+
level: Optional[SpanLevel] = None,
951+
status_message: Optional[str] = None,
952+
) -> _AgnosticContextManager["LangfuseAgent"]: ...
953+
954+
@overload
955+
def start_as_current_observation(
956+
self,
957+
*,
958+
name: str,
959+
as_type: Literal["tool"],
960+
input: Optional[Any] = None,
961+
output: Optional[Any] = None,
962+
metadata: Optional[Any] = None,
963+
version: Optional[str] = None,
964+
level: Optional[SpanLevel] = None,
965+
status_message: Optional[str] = None,
966+
) -> _AgnosticContextManager["LangfuseTool"]: ...
967+
968+
@overload
969+
def start_as_current_observation(
970+
self,
971+
*,
972+
name: str,
973+
as_type: Literal["chain"],
974+
input: Optional[Any] = None,
975+
output: Optional[Any] = None,
976+
metadata: Optional[Any] = None,
977+
version: Optional[str] = None,
978+
level: Optional[SpanLevel] = None,
979+
status_message: Optional[str] = None,
980+
) -> _AgnosticContextManager["LangfuseChain"]: ...
981+
982+
@overload
983+
def start_as_current_observation(
984+
self,
985+
*,
986+
name: str,
987+
as_type: Literal["retriever"],
988+
input: Optional[Any] = None,
989+
output: Optional[Any] = None,
990+
metadata: Optional[Any] = None,
991+
version: Optional[str] = None,
992+
level: Optional[SpanLevel] = None,
993+
status_message: Optional[str] = None,
994+
) -> _AgnosticContextManager["LangfuseRetriever"]: ...
995+
996+
@overload
997+
def start_as_current_observation(
998+
self,
999+
*,
1000+
name: str,
1001+
as_type: Literal["evaluator"],
1002+
input: Optional[Any] = None,
1003+
output: Optional[Any] = None,
1004+
metadata: Optional[Any] = None,
1005+
version: Optional[str] = None,
1006+
level: Optional[SpanLevel] = None,
1007+
status_message: Optional[str] = None,
1008+
) -> _AgnosticContextManager["LangfuseEvaluator"]: ...
1009+
9721010
@overload
9731011
def start_as_current_observation(
9741012
self,

0 commit comments

Comments
 (0)