Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ uv.lock
lmnr_engine/
.vscode
.venv
.idea
7 changes: 4 additions & 3 deletions src/lmnr/sdk/client/asynchronous/resources/evals.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
"""Evals resource for interacting with Laminar evaluations API."""

import uuid
from typing import Optional
from typing import Optional, Union

from lmnr.sdk.client.asynchronous.resources.base import BaseAsyncResource
from lmnr.sdk.types import (
InitEvaluationResponse,
EvaluationResultDatapoint,
PartialEvaluationDatapoint,
)


Expand Down Expand Up @@ -39,14 +40,14 @@ async def init(
async def save_datapoints(
self,
eval_id: uuid.UUID,
datapoints: list[EvaluationResultDatapoint],
datapoints: list[Union[EvaluationResultDatapoint, PartialEvaluationDatapoint]],
group_name: Optional[str] = None,
):
"""Save evaluation datapoints.

Args:
eval_id (uuid.UUID): The evaluation ID.
datapoints (list[EvaluationResultDatapoint]): The datapoints to save.
datapoints (list[Union[EvaluationResultDatapoint, PartialEvaluationDatapoint]]): The datapoints to save.
group_name (Optional[str], optional): Group name for the datapoints. Defaults to None.

Raises:
Expand Down
7 changes: 4 additions & 3 deletions src/lmnr/sdk/client/synchronous/resources/evals.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

import uuid
import urllib.parse
from typing import Optional
from typing import Optional, Union

from lmnr.sdk.client.synchronous.resources.base import BaseResource
from lmnr.sdk.types import (
InitEvaluationResponse,
EvaluationResultDatapoint,
PartialEvaluationDatapoint,
GetDatapointsResponse,
)

Expand Down Expand Up @@ -41,14 +42,14 @@ def init(
def save_datapoints(
self,
eval_id: uuid.UUID,
datapoints: list[EvaluationResultDatapoint],
datapoints: list[Union[EvaluationResultDatapoint, PartialEvaluationDatapoint]],
group_name: Optional[str] = None,
):
"""Save evaluation datapoints.

Args:
eval_id (uuid.UUID): The evaluation ID.
datapoints (list[EvaluationResultDatapoint]): The datapoints to save.
datapoints (list[Union[EvaluationResultDatapoint, PartialEvaluationDatapoint]]): The datapoints to save.
group_name (Optional[str], optional): Group name for the datapoints. Defaults to None.

Raises:
Expand Down
2 changes: 2 additions & 0 deletions src/lmnr/sdk/evaluations.py
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,7 @@ async def _evaluate_datapoint(
index=index,
trace_id=trace_id,
executor_span_id=executor_span_id,
metadata=datapoint.metadata,
)
# First, create datapoint with trace_id so that we can show the dp in the UI
await self.client._evals.save_datapoints(
Expand Down Expand Up @@ -367,6 +368,7 @@ async def _evaluate_datapoint(
human_evaluators=self.human_evaluators,
executor_span_id=executor_span_id,
index=index,
metadata=datapoint.metadata,
)

# Create background upload task without awaiting it
Expand Down
4 changes: 4 additions & 0 deletions src/lmnr/sdk/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ class PartialEvaluationDatapoint(pydantic.BaseModel):
index: int
trace_id: uuid.UUID
executor_span_id: uuid.UUID
metadata: EvaluationDatapointMetadata = pydantic.Field(default=None)

# uuid is not serializable by default, so we need to convert it to a string
def to_dict(self):
Expand All @@ -77,6 +78,7 @@ def to_dict(self):
"index": self.index,
"traceId": str(self.trace_id),
"executorSpanId": str(self.executor_span_id),
"metadata": serialize(self.metadata) if self.metadata is not None else None,
}
except Exception as e:
raise ValueError(f"Error serializing PartialEvaluationDatapoint: {e}")
Expand All @@ -92,6 +94,7 @@ class EvaluationResultDatapoint(pydantic.BaseModel):
human_evaluators: list[HumanEvaluator] = pydantic.Field(default_factory=list)
trace_id: uuid.UUID
executor_span_id: uuid.UUID
metadata: EvaluationDatapointMetadata = pydantic.Field(default=None)

# uuid is not serializable by default, so we need to convert it to a string
def to_dict(self):
Expand All @@ -115,6 +118,7 @@ def to_dict(self):
],
"executorSpanId": str(self.executor_span_id),
"index": self.index,
"metadata": serialize(self.metadata) if self.metadata is not None else None,
}
except Exception as e:
raise ValueError(f"Error serializing EvaluationResultDatapoint: {e}")
Expand Down
Loading