Skip to content

Commit

Permalink
[Py] Handle experiment name conflicts (#940)
Browse files Browse the repository at this point in the history
  • Loading branch information
hinthornw authored Aug 22, 2024
1 parent 41ae8d1 commit ce8ec9e
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 16 deletions.
40 changes: 24 additions & 16 deletions python/langsmith/evaluation/_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
cast,
)

from requests import HTTPError
from typing_extensions import TypedDict

import langsmith
Expand Down Expand Up @@ -958,24 +957,33 @@ def _get_experiment_metadata(self):
}
return project_metadata

def _get_project(self, first_example: schemas.Example) -> schemas.TracerSession:
if self._experiment is None:
def _create_experiment(
self, dataset_id: uuid.UUID, metadata: dict
) -> schemas.TracerSession:
# There is a chance of name collision, so we'll retry
starting_name = self._experiment_name
num_attempts = 10
for _ in range(num_attempts):
try:
project_metadata = self._get_experiment_metadata()
project = self.client.create_project(
self.experiment_name,
return self.client.create_project(
self._experiment_name,
description=self._description,
reference_dataset_id=first_example.dataset_id,
metadata=project_metadata,
)
except (HTTPError, ValueError, ls_utils.LangSmithError) as e:
if "already exists " not in str(e):
raise e
raise ValueError(
# TODO: Better error
f"Experiment {self.experiment_name} already exists."
" Please use a different name."
reference_dataset_id=dataset_id,
metadata=metadata,
)
except ls_utils.LangSmithConflictError:
self._experiment_name = f"{starting_name}-{str(uuid.uuid4().hex[:6])}"
raise ValueError(
f"Could not find a unique experiment name in {num_attempts} attempts."
" Please try again with a different experiment name."
)

def _get_project(self, first_example: schemas.Example) -> schemas.TracerSession:
if self._experiment is None:
project_metadata = self._get_experiment_metadata()
project = self._create_experiment(
first_example.dataset_id, project_metadata
)
else:
project = self._experiment
return project
Expand Down
25 changes: 25 additions & 0 deletions python/tests/integration_tests/test_experiment_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import uuid

from langsmith.client import Client
from langsmith.evaluation._runner import _ExperimentManager


def test_experiment_manager_existing_name():
client = Client()
dataset_name = f"Test Dups: {str(uuid.uuid4())}"
ds = client.create_dataset(dataset_name)
client.create_example(inputs={"un": "important"}, dataset_id=ds.id)
prefix = "Some Test Prefix"
try:
manager = _ExperimentManager(dataset_name, experiment=prefix, client=client)
assert manager is not None
original_name = manager._experiment_name
assert original_name.startswith(prefix)
client.create_project(original_name, reference_dataset_id=ds.id)
manager.start()
new_name = manager._experiment_name
assert new_name.startswith(prefix)
assert new_name != original_name

finally:
client.delete_dataset(dataset_id=ds.id)

0 comments on commit ce8ec9e

Please sign in to comment.