Skip to content

Commit 4c6e3ce

Browse files
authored
feat!: migrate api client to latest fern (#1480)
1 parent 993d993 commit 4c6e3ce

File tree

602 files changed

+44717
-34157
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

602 files changed

+44717
-34157
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ jobs:
7373
- "3.11"
7474
- "3.12"
7575
- "3.13"
76+
- "3.14"
7677

7778
name: Test on Python version ${{ matrix.python-version }}
7879
steps:

langfuse/_client/attributes.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@
1919
ObservationTypeSpanLike,
2020
)
2121
from langfuse._utils.serializer import EventSerializer
22+
from langfuse.api import MapValue
2223
from langfuse.model import PromptClient
23-
from langfuse.types import MapValue, SpanLevel
24+
from langfuse.types import SpanLevel
2425

2526

2627
class LangfuseOtelSpanAttributes:

langfuse/_client/client.py

Lines changed: 39 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,19 @@
7878
from langfuse._utils import _get_timestamp
7979
from langfuse._utils.parse_error import handle_fern_exception
8080
from langfuse._utils.prompt_cache import PromptCache
81-
from langfuse.api.resources.commons.errors.error import Error
82-
from langfuse.api.resources.commons.errors.not_found_error import NotFoundError
83-
from langfuse.api.resources.ingestion.types.score_body import ScoreBody
84-
from langfuse.api.resources.prompts.types import (
85-
CreatePromptRequest_Chat,
86-
CreatePromptRequest_Text,
81+
from langfuse.api import (
82+
CreateChatPromptRequest,
83+
CreateChatPromptType,
84+
CreateTextPromptRequest,
85+
Dataset,
86+
DatasetItem,
87+
DatasetStatus,
88+
Error,
89+
MapValue,
90+
NotFoundError,
8791
Prompt_Chat,
8892
Prompt_Text,
93+
ScoreBody,
8994
)
9095
from langfuse.batch_evaluation import (
9196
BatchEvaluationResult,
@@ -112,13 +117,6 @@
112117
ChatMessageDict,
113118
ChatMessageWithPlaceholdersDict,
114119
ChatPromptClient,
115-
CreateDatasetItemRequest,
116-
CreateDatasetRequest,
117-
CreateDatasetRunItemRequest,
118-
Dataset,
119-
DatasetItem,
120-
DatasetStatus,
121-
MapValue,
122120
PromptClient,
123121
TextPromptClient,
124122
)
@@ -2057,7 +2055,7 @@ def create_score(
20572055
try:
20582056
new_body = ScoreBody(
20592057
id=score_id,
2060-
sessionId=session_id,
2058+
session_id=session_id,
20612059
datasetRunId=dataset_run_id,
20622060
traceId=trace_id,
20632061
observationId=observation_id,
@@ -2818,14 +2816,12 @@ async def _process_experiment_item(
28182816
# creates multiple event loops across different threads
28192817
dataset_run_item = await asyncio.to_thread(
28202818
self.api.dataset_run_items.create,
2821-
request=CreateDatasetRunItemRequest(
2822-
runName=experiment_run_name,
2823-
runDescription=experiment_description,
2824-
metadata=experiment_metadata,
2825-
datasetItemId=item.id, # type: ignore
2826-
traceId=trace_id,
2827-
observationId=span.id,
2828-
),
2819+
run_name=experiment_run_name,
2820+
run_description=experiment_description,
2821+
metadata=experiment_metadata,
2822+
dataset_item_id=item.id, # type: ignore
2823+
trace_id=trace_id,
2824+
observation_id=span.id,
28292825
)
28302826

28312827
dataset_run_id = dataset_run_item.dataset_run_id
@@ -3271,16 +3267,17 @@ def create_dataset(
32713267
Dataset: The created dataset as returned by the Langfuse API.
32723268
"""
32733269
try:
3274-
body = CreateDatasetRequest(
3270+
langfuse_logger.debug(f"Creating datasets {name}")
3271+
3272+
result = self.api.datasets.create(
32753273
name=name,
32763274
description=description,
32773275
metadata=metadata,
3278-
inputSchema=input_schema,
3279-
expectedOutputSchema=expected_output_schema,
3276+
input_schema=input_schema,
3277+
expected_output_schema=expected_output_schema,
32803278
)
3281-
langfuse_logger.debug(f"Creating datasets {body}")
32823279

3283-
return self.api.datasets.create(request=body)
3280+
return cast(Dataset, result)
32843281

32853282
except Error as e:
32863283
handle_fern_exception(e)
@@ -3331,18 +3328,20 @@ def create_dataset_item(
33313328
```
33323329
"""
33333330
try:
3334-
body = CreateDatasetItemRequest(
3335-
datasetName=dataset_name,
3331+
langfuse_logger.debug(f"Creating dataset item for dataset {dataset_name}")
3332+
3333+
result = self.api.dataset_items.create(
3334+
dataset_name=dataset_name,
33363335
input=input,
3337-
expectedOutput=expected_output,
3336+
expected_output=expected_output,
33383337
metadata=metadata,
3339-
sourceTraceId=source_trace_id,
3340-
sourceObservationId=source_observation_id,
3338+
source_trace_id=source_trace_id,
3339+
source_observation_id=source_observation_id,
33413340
status=status,
33423341
id=id,
33433342
)
3344-
langfuse_logger.debug(f"Creating dataset item {body}")
3345-
return self.api.dataset_items.create(request=body)
3343+
3344+
return cast(DatasetItem, result)
33463345
except Error as e:
33473346
handle_fern_exception(e)
33483347
raise e
@@ -3704,15 +3703,15 @@ def create_prompt(
37043703
raise ValueError(
37053704
"For 'chat' type, 'prompt' must be a list of chat messages with role and content attributes."
37063705
)
3707-
request: Union[CreatePromptRequest_Chat, CreatePromptRequest_Text] = (
3708-
CreatePromptRequest_Chat(
3706+
request: Union[CreateChatPromptRequest, CreateTextPromptRequest] = (
3707+
CreateChatPromptRequest(
37093708
name=name,
37103709
prompt=cast(Any, prompt),
37113710
labels=labels,
37123711
tags=tags,
37133712
config=config or {},
3714-
commitMessage=commit_message,
3715-
type="chat",
3713+
commit_message=commit_message,
3714+
type=CreateChatPromptType.CHAT,
37163715
)
37173716
)
37183717
server_prompt = self.api.prompts.create(request=request)
@@ -3725,14 +3724,13 @@ def create_prompt(
37253724
if not isinstance(prompt, str):
37263725
raise ValueError("For 'text' type, 'prompt' must be a string.")
37273726

3728-
request = CreatePromptRequest_Text(
3727+
request = CreateTextPromptRequest(
37293728
name=name,
37303729
prompt=prompt,
37313730
labels=labels,
37323731
tags=tags,
37333732
config=config or {},
3734-
commitMessage=commit_message,
3735-
type="text",
3733+
commit_message=commit_message,
37363734
)
37373735

37383736
server_prompt = self.api.prompts.create(request=request)

langfuse/_client/datasets.py

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,18 @@
44

55
from opentelemetry.util._decorator import _agnosticcontextmanager
66

7+
from langfuse.api import (
8+
Dataset,
9+
DatasetItem,
10+
DatasetStatus,
11+
)
712
from langfuse.batch_evaluation import CompositeEvaluatorFunction
813
from langfuse.experiment import (
914
EvaluatorFunction,
1015
ExperimentResult,
1116
RunEvaluatorFunction,
1217
TaskFunction,
1318
)
14-
from langfuse.model import (
15-
CreateDatasetRunItemRequest,
16-
Dataset,
17-
DatasetItem,
18-
DatasetStatus,
19-
)
2019

2120
from .span import LangfuseSpan
2221

@@ -131,13 +130,11 @@ def run(
131130
)
132131

133132
self.langfuse.api.dataset_run_items.create(
134-
request=CreateDatasetRunItemRequest(
135-
runName=run_name,
136-
datasetItemId=self.id,
137-
traceId=span.trace_id,
138-
metadata=run_metadata,
139-
runDescription=run_description,
140-
)
133+
run_name=run_name,
134+
dataset_item_id=self.id,
135+
trace_id=span.trace_id,
136+
metadata=run_metadata,
137+
run_description=run_description,
141138
)
142139

143140
yield span

langfuse/_client/resource_manager.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
from langfuse._utils.environment import get_common_release_envs
4343
from langfuse._utils.prompt_cache import PromptCache
4444
from langfuse._utils.request import LangfuseClient
45-
from langfuse.api.client import AsyncFernLangfuse, FernLangfuse
45+
from langfuse.api import AsyncLangfuseAPI, LangfuseAPI
4646
from langfuse.logger import langfuse_logger
4747
from langfuse.types import MaskFunction
4848

@@ -213,7 +213,7 @@ def _initialize_instance(
213213
client_headers = additional_headers if additional_headers else {}
214214
self.httpx_client = httpx.Client(timeout=timeout, headers=client_headers)
215215

216-
self.api = FernLangfuse(
216+
self.api = LangfuseAPI(
217217
base_url=base_url,
218218
username=self.public_key,
219219
password=secret_key,
@@ -223,7 +223,7 @@ def _initialize_instance(
223223
httpx_client=self.httpx_client,
224224
timeout=timeout,
225225
)
226-
self.async_api = AsyncFernLangfuse(
226+
self.async_api = AsyncLangfuseAPI(
227227
base_url=base_url,
228228
username=self.public_key,
229229
password=secret_key,

langfuse/_client/span.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@
5151
ObservationTypeSpanLike,
5252
get_observation_types_list,
5353
)
54+
from langfuse.api import MapValue, ScoreDataType
5455
from langfuse.logger import langfuse_logger
55-
from langfuse.types import MapValue, ScoreDataType, SpanLevel
56+
from langfuse.types import SpanLevel
5657

5758
# Factory mapping for observation classes
5859
# Note: "event" is handled separately due to special instantiation logic
@@ -273,7 +274,9 @@ def score(
273274
name: str,
274275
value: float,
275276
score_id: Optional[str] = None,
276-
data_type: Optional[Literal["NUMERIC", "BOOLEAN"]] = None,
277+
data_type: Optional[
278+
Literal[ScoreDataType.NUMERIC, ScoreDataType.BOOLEAN]
279+
] = None,
277280
comment: Optional[str] = None,
278281
config_id: Optional[str] = None,
279282
timestamp: Optional[datetime] = None,
@@ -286,7 +289,9 @@ def score(
286289
name: str,
287290
value: str,
288291
score_id: Optional[str] = None,
289-
data_type: Optional[Literal["CATEGORICAL"]] = "CATEGORICAL",
292+
data_type: Optional[
293+
Literal[ScoreDataType.CATEGORICAL]
294+
] = ScoreDataType.CATEGORICAL,
290295
comment: Optional[str] = None,
291296
config_id: Optional[str] = None,
292297
timestamp: Optional[datetime] = None,
@@ -351,7 +356,9 @@ def score_trace(
351356
name: str,
352357
value: float,
353358
score_id: Optional[str] = None,
354-
data_type: Optional[Literal["NUMERIC", "BOOLEAN"]] = None,
359+
data_type: Optional[
360+
Literal[ScoreDataType.NUMERIC, ScoreDataType.BOOLEAN]
361+
] = None,
355362
comment: Optional[str] = None,
356363
config_id: Optional[str] = None,
357364
timestamp: Optional[datetime] = None,
@@ -364,7 +371,9 @@ def score_trace(
364371
name: str,
365372
value: str,
366373
score_id: Optional[str] = None,
367-
data_type: Optional[Literal["CATEGORICAL"]] = "CATEGORICAL",
374+
data_type: Optional[
375+
Literal[ScoreDataType.CATEGORICAL]
376+
] = ScoreDataType.CATEGORICAL,
368377
comment: Optional[str] = None,
369378
config_id: Optional[str] = None,
370379
timestamp: Optional[datetime] = None,

langfuse/_task_manager/media_manager.py

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@
1010

1111
from langfuse._client.environment_variables import LANGFUSE_MEDIA_UPLOAD_ENABLED
1212
from langfuse._utils import _get_timestamp
13-
from langfuse.api import GetMediaUploadUrlRequest, PatchMediaBody
14-
from langfuse.api.client import FernLangfuse
13+
from langfuse.api import LangfuseAPI, MediaContentType
1514
from langfuse.api.core import ApiError
16-
from langfuse.api.resources.media.types.media_content_type import MediaContentType
1715
from langfuse.media import LangfuseMedia
1816

1917
from .media_upload_queue import UploadMediaJob
@@ -28,7 +26,7 @@ class MediaManager:
2826
def __init__(
2927
self,
3028
*,
31-
api_client: FernLangfuse,
29+
api_client: LangfuseAPI,
3230
media_upload_queue: Queue,
3331
max_retries: Optional[int] = 3,
3432
):
@@ -219,14 +217,12 @@ def _process_upload_media_job(
219217
) -> None:
220218
upload_url_response = self._request_with_backoff(
221219
self._api_client.media.get_upload_url,
222-
request=GetMediaUploadUrlRequest(
223-
contentLength=data["content_length"],
224-
contentType=cast(MediaContentType, data["content_type"]),
225-
sha256Hash=data["content_sha256_hash"],
226-
field=data["field"],
227-
traceId=data["trace_id"],
228-
observationId=data["observation_id"],
229-
),
220+
content_length=data["content_length"],
221+
content_type=cast(MediaContentType, data["content_type"]),
222+
sha256hash=data["content_sha256_hash"],
223+
field=data["field"],
224+
trace_id=data["trace_id"],
225+
observation_id=data["observation_id"],
230226
)
231227

232228
upload_url = upload_url_response.upload_url
@@ -266,12 +262,10 @@ def _process_upload_media_job(
266262
self._request_with_backoff(
267263
self._api_client.media.patch,
268264
media_id=data["media_id"],
269-
request=PatchMediaBody(
270-
uploadedAt=_get_timestamp(),
271-
uploadHttpStatus=upload_response.status_code,
272-
uploadHttpError=upload_response.text,
273-
uploadTimeMs=upload_time_ms,
274-
),
265+
uploaded_at=_get_timestamp(),
266+
upload_http_status=upload_response.status_code,
267+
upload_http_error=upload_response.text,
268+
upload_time_ms=upload_time_ms,
275269
)
276270

277271
self._log.debug(

0 commit comments

Comments
 (0)