Skip to content

Commit c5fb512

Browse files
committed
Add experiment create wip
1 parent 9910748 commit c5fb512

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

ddtrace/llmobs/_experiment.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def __init__(
4545
evaluators: List[Callable[[NonNoneJSONType, JSONType, JSONType], JSONType]],
4646
project_name: str,
4747
description: str = "",
48+
tags: Optional[List[str]] = None,
4849
config: Optional[Dict[str, Any]] = None,
4950
_llmobs_instance: Optional["LLMObs"] = None,
5051
) -> None:
@@ -53,6 +54,7 @@ def __init__(
5354
self._dataset = dataset
5455
self._evaluators = evaluators
5556
self._description = description
57+
self._tags = tags or []
5658
self._config: Dict[str, Any] = config or {}
5759
self._llmobs_instance = _llmobs_instance
5860

@@ -67,6 +69,15 @@ def __init__(
6769
self._id: Optional[str] = None
6870

6971
def run(self, jobs: int = 1, raise_errors: bool = False, sample_size: Optional[int] = None) -> None:
72+
experiment_id = self._llmobs_instance._create_experiment(
73+
name=self.name,
74+
dataset_id=self._dataset._id,
75+
project_name=self._project_name,
76+
exp_config=self._config,
77+
tags=self._tags,
78+
description=self._description,
79+
)
80+
self._id = experiment_id
7081
task_results = self._run_task(jobs, raise_errors, sample_size)
7182
self._run_evaluators(task_results, raise_errors=raise_errors)
7283
return

ddtrace/llmobs/_llmobs.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,24 @@ def create_dataset(cls, name: str, description: str) -> Dataset:
581581
def _delete_dataset(cls, dataset_id: str) -> None:
582582
return cls._instance._dne_client.dataset_delete(dataset_id)
583583

584+
def _create_experiment(
585+
self,
586+
name: str,
587+
dataset_id: str,
588+
project_name: str,
589+
dataset_version: int = 1,
590+
exp_config: Optional[Dict[str, JSONType]] = None,
591+
tags: Optional[List[str]] = None,
592+
description: Optional[str] = None,
593+
) -> Tuple[str, str]:
594+
project_id = self._dne_client.project_get(project_name)
595+
if not project_id:
596+
project_id = self._dne_client.project_create(project_name)
597+
experiment_id, experiment_name = self._dne_client.experiment_create(
598+
name, dataset_id, project_id, dataset_version, exp_config, tags, description
599+
)
600+
return experiment_id, experiment_name
601+
584602
@classmethod
585603
def experiment(
586604
cls,

ddtrace/llmobs/_writer.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
from typing import Dict
55
from typing import List
66
from typing import Optional
7+
from typing import Tuple
78
from typing import Union
9+
from typing import cast
810
from urllib.parse import quote
911

1012

@@ -386,6 +388,43 @@ def project_get(self, name: str) -> str:
386388
raise ValueError(f"Project {name} not found")
387389
return data[0]["id"]
388390

391+
def experiment_create(
392+
self,
393+
name: str,
394+
dataset_id: str,
395+
project_id: str,
396+
dataset_version: int = 1,
397+
exp_config: Optional[Dict[str, JSONType]] = None,
398+
tags: Optional[List[str]] = None,
399+
description: Optional[str] = None,
400+
) -> Tuple[str, str]:
401+
path = "/api/unstable/llm-obs/v1/experiments"
402+
resp = self.request(
403+
"POST",
404+
path,
405+
body={
406+
"data": {
407+
"type": "experiments",
408+
"attributes": {
409+
"name": name,
410+
"description": description or "",
411+
"dataset_id": dataset_id,
412+
"project_id": project_id,
413+
"dataset_version": dataset_version,
414+
"config": exp_config or {},
415+
"metadata": {"tags": cast(JSONType, tags or [])},
416+
"ensure_unique": True,
417+
},
418+
}
419+
},
420+
)
421+
if resp.status != 200:
422+
raise ValueError(f"Failed to create experiment {name}: {resp.status} {resp.get_json()}")
423+
response_data = resp.get_json()
424+
experiment_id = response_data["data"]["id"]
425+
experiment_name = response_data["data"]["attributes"]["name"] # API may rename the experiment
426+
return experiment_id, experiment_name
427+
389428

390429
class LLMObsSpanWriter(BaseLLMObsWriter):
391430
"""Writes span events to the LLMObs Span Endpoint."""

0 commit comments

Comments
 (0)