arize-phoenix 11.31.0__py3-none-any.whl → 11.32.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of arize-phoenix might be problematic. Click here for more details.
- {arize_phoenix-11.31.0.dist-info → arize_phoenix-11.32.0.dist-info}/METADATA +1 -1
- {arize_phoenix-11.31.0.dist-info → arize_phoenix-11.32.0.dist-info}/RECORD +13 -13
- phoenix/experiments/functions.py +69 -19
- phoenix/server/api/routers/v1/experiment_runs.py +71 -31
- phoenix/server/static/.vite/manifest.json +9 -9
- phoenix/server/static/assets/{components-BjW5gAwL.js → components-Cs9c4Nxp.js} +1 -1
- phoenix/server/static/assets/{index-3OI8VV_W.js → index-D1FDMBMV.js} +1 -1
- phoenix/server/static/assets/{pages-CQfUODtD.js → pages-Cbj9SjBx.js} +487 -463
- phoenix/version.py +1 -1
- {arize_phoenix-11.31.0.dist-info → arize_phoenix-11.32.0.dist-info}/WHEEL +0 -0
- {arize_phoenix-11.31.0.dist-info → arize_phoenix-11.32.0.dist-info}/entry_points.txt +0 -0
- {arize_phoenix-11.31.0.dist-info → arize_phoenix-11.32.0.dist-info}/licenses/IP_NOTICE +0 -0
- {arize_phoenix-11.31.0.dist-info → arize_phoenix-11.32.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -6,7 +6,7 @@ phoenix/exceptions.py,sha256=n2L2KKuecrdflB9MsCdAYCiSEvGJptIsfRkXMoJle7A,169
|
|
|
6
6
|
phoenix/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
7
7
|
phoenix/services.py,sha256=ngkyKGVatX3cO2WJdo2hKdaVKP-xJCMvqthvga6kJss,5196
|
|
8
8
|
phoenix/settings.py,sha256=2kHfT3BNOVd4dAO1bq-syEQbHSG8oX2-7NhOwK2QREk,896
|
|
9
|
-
phoenix/version.py,sha256=
|
|
9
|
+
phoenix/version.py,sha256=wTfhUKXJGuW6Cd3BIdlJ2UX7HyglNmvKt33CteybMx8,24
|
|
10
10
|
phoenix/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
11
|
phoenix/core/embedding_dimension.py,sha256=zKGbcvwOXgLf-yrJBpQyKtd-LEOPRKHnUToyAU8Owis,87
|
|
12
12
|
phoenix/core/model.py,sha256=qBFraOtmwCCnWJltKNP18DDG0mULXigytlFsa6YOz6k,4837
|
|
@@ -58,7 +58,7 @@ phoenix/db/types/model_provider.py,sha256=zKYGcEQqbAxtPwnq5dL0fYPgDC8nrh_ABLBMR9
|
|
|
58
58
|
phoenix/db/types/token_price_customization.py,sha256=LAb8IwyFJGDCje7CvcPcxNp4NOU8si5hSYaf1fyi624,857
|
|
59
59
|
phoenix/db/types/trace_retention.py,sha256=Y97xfqNa4AO2j6RhhUJIbO6duQ1oX7Vu5bC9laydf1g,9899
|
|
60
60
|
phoenix/experiments/__init__.py,sha256=6JGwgUd7xCbGpuHqYZlsmErmYvVgv7N_j43bn3dUqsk,123
|
|
61
|
-
phoenix/experiments/functions.py,sha256=
|
|
61
|
+
phoenix/experiments/functions.py,sha256=7qFTJ2jYXNyXkWvO66RJuCybNVkUdiwxjGtcoPyqhDs,41285
|
|
62
62
|
phoenix/experiments/tracing.py,sha256=X-wlgbWEzP1oHkLmjop3fGjONo6JK5a0kPXc9YYD014,2856
|
|
63
63
|
phoenix/experiments/types.py,sha256=O4vvm9WOp0fevTDobStXEJpFKn3acveXgsRClxlnzCM,23477
|
|
64
64
|
phoenix/experiments/utils.py,sha256=MZ1-OnTcavk_KUtbfGqt55Fk9TGtJpYG_K71WsN-zDk,785
|
|
@@ -262,7 +262,7 @@ phoenix/server/api/routers/v1/datasets.py,sha256=9iPORLmbOrPKgUUcRDMs6ZczSIz7hvc
|
|
|
262
262
|
phoenix/server/api/routers/v1/documents.py,sha256=iA_vYU6_p2-pazh_Rp930kiOsiHYFIPPqsZSSXwPgVI,5733
|
|
263
263
|
phoenix/server/api/routers/v1/evaluations.py,sha256=aBrPO-xCAWyTxydaHq7W2wQFm65k89uVR-H3VWsd6WQ,13062
|
|
264
264
|
phoenix/server/api/routers/v1/experiment_evaluations.py,sha256=DZ3UK9OoYKElpRcEER7559-KiAqWr-1IXpZ27FbfP3k,5249
|
|
265
|
-
phoenix/server/api/routers/v1/experiment_runs.py,sha256=
|
|
265
|
+
phoenix/server/api/routers/v1/experiment_runs.py,sha256=H-WSEFuMSr-pDzP9IMsGktqMHMwMAhen6FSfYYu3ZZg,8372
|
|
266
266
|
phoenix/server/api/routers/v1/experiments.py,sha256=hIBecGACzGZEgl93ap_JV52pUv-Ij03QJMRxQhBlktI,20611
|
|
267
267
|
phoenix/server/api/routers/v1/models.py,sha256=p3gJN-9SWiUYTUTft4bZMsZVCBNTb4nN1Foy68eRZzQ,1997
|
|
268
268
|
phoenix/server/api/routers/v1/projects.py,sha256=XR6uJxHXXtC1q8LNyS9W6iaj440sv1OKCu-OSBfxEys,12824
|
|
@@ -394,10 +394,10 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
|
|
|
394
394
|
phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
|
|
395
395
|
phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
|
|
396
396
|
phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
|
|
397
|
-
phoenix/server/static/.vite/manifest.json,sha256
|
|
398
|
-
phoenix/server/static/assets/components-
|
|
399
|
-
phoenix/server/static/assets/index-
|
|
400
|
-
phoenix/server/static/assets/pages-
|
|
397
|
+
phoenix/server/static/.vite/manifest.json,sha256=SftlYsrBTWT-YgHAEYzi01rPZZ4ICS4LX28rKBTiEAs,2328
|
|
398
|
+
phoenix/server/static/assets/components-Cs9c4Nxp.js,sha256=5e_FqxJ4cxQ2lSztbWI9bXdUd0tbXNZjOK_basUj_2s,664533
|
|
399
|
+
phoenix/server/static/assets/index-D1FDMBMV.js,sha256=sZ5WMvooPARvbjfKW_pMVOlJVuqcBI8tTZ8iVUGU4s8,63396
|
|
400
|
+
phoenix/server/static/assets/pages-Cbj9SjBx.js,sha256=Cc1SZLF_HyhwRlxlK_Zsmxmjsb_jFCZeObBG2E6Luns,1272157
|
|
401
401
|
phoenix/server/static/assets/vendor-CqDb5u4o.css,sha256=zIyFiNJKxMaQk8AvtLgt1rR01oO10d1MFndSDKH9Clw,5517
|
|
402
402
|
phoenix/server/static/assets/vendor-RdRDaQiR.js,sha256=oTxLetZZXJ20yoKNAYExto9V73y8X5zjddWV46K9CWM,2595492
|
|
403
403
|
phoenix/server/static/assets/vendor-arizeai-DsYDNOqt.js,sha256=0HIkPJXbKTh85nqphdAXYeStRzdaim0IQxRXiXxa21U,121514
|
|
@@ -444,9 +444,9 @@ phoenix/utilities/project.py,sha256=auVpARXkDb-JgeX5f2aStyFIkeKvGwN9l7qrFeJMVxI,
|
|
|
444
444
|
phoenix/utilities/re.py,sha256=6YyUWIkv0zc2SigsxfOWIHzdpjKA_TZo2iqKq7zJKvw,2081
|
|
445
445
|
phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
446
446
|
phoenix/utilities/template_formatters.py,sha256=gh9PJD6WEGw7TEYXfSst1UR4pWWwmjxMLrDVQ_CkpkQ,2779
|
|
447
|
-
arize_phoenix-11.
|
|
448
|
-
arize_phoenix-11.
|
|
449
|
-
arize_phoenix-11.
|
|
450
|
-
arize_phoenix-11.
|
|
451
|
-
arize_phoenix-11.
|
|
452
|
-
arize_phoenix-11.
|
|
447
|
+
arize_phoenix-11.32.0.dist-info/METADATA,sha256=l937gONO1AEiuhgulspeCuLVxPdy-gmLrzzd_ZdP0Ms,32877
|
|
448
|
+
arize_phoenix-11.32.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
449
|
+
arize_phoenix-11.32.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
|
|
450
|
+
arize_phoenix-11.32.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
|
|
451
|
+
arize_phoenix-11.32.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
|
|
452
|
+
arize_phoenix-11.32.0.dist-info/RECORD,,
|
phoenix/experiments/functions.py
CHANGED
|
@@ -109,6 +109,64 @@ def _phoenix_clients() -> tuple[httpx.Client, httpx.AsyncClient]:
|
|
|
109
109
|
)
|
|
110
110
|
|
|
111
111
|
|
|
112
|
+
def _get_all_experiment_runs(
|
|
113
|
+
client: httpx.Client,
|
|
114
|
+
experiment_id: str,
|
|
115
|
+
page_size: int = 50,
|
|
116
|
+
) -> list[ExperimentRun]:
|
|
117
|
+
"""
|
|
118
|
+
Fetch all experiment runs using pagination to handle large datasets.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
client: The HTTP client to use for requests.
|
|
122
|
+
experiment_id: The ID of the experiment.
|
|
123
|
+
page_size: Number of runs to fetch per page. Defaults to 50.
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
List of all experiment runs as ExperimentRun objects.
|
|
127
|
+
"""
|
|
128
|
+
all_runs: list[dict[str, Any]] = []
|
|
129
|
+
cursor = None
|
|
130
|
+
|
|
131
|
+
while True:
|
|
132
|
+
params: dict[str, Any] = {"limit": page_size}
|
|
133
|
+
if cursor:
|
|
134
|
+
params["cursor"] = cursor
|
|
135
|
+
|
|
136
|
+
try:
|
|
137
|
+
response = client.get(
|
|
138
|
+
f"v1/experiments/{experiment_id}/runs",
|
|
139
|
+
params=params,
|
|
140
|
+
)
|
|
141
|
+
response.raise_for_status()
|
|
142
|
+
data = response.json()
|
|
143
|
+
|
|
144
|
+
runs = data["data"]
|
|
145
|
+
all_runs.extend(runs)
|
|
146
|
+
|
|
147
|
+
# Check if there are more pages
|
|
148
|
+
cursor = data.get("next_cursor")
|
|
149
|
+
if not cursor:
|
|
150
|
+
break
|
|
151
|
+
|
|
152
|
+
except HTTPStatusError as e:
|
|
153
|
+
if e.response.status_code == 404:
|
|
154
|
+
# Experiment doesn't exist - treat as empty result
|
|
155
|
+
break
|
|
156
|
+
else:
|
|
157
|
+
raise
|
|
158
|
+
|
|
159
|
+
# Convert dicts to ExperimentRun objects
|
|
160
|
+
experiment_runs: list[ExperimentRun] = []
|
|
161
|
+
for run in all_runs:
|
|
162
|
+
# Parse datetime strings
|
|
163
|
+
run["start_time"] = datetime.fromisoformat(run["start_time"])
|
|
164
|
+
run["end_time"] = datetime.fromisoformat(run["end_time"])
|
|
165
|
+
experiment_runs.append(ExperimentRun.from_dict(run))
|
|
166
|
+
|
|
167
|
+
return experiment_runs
|
|
168
|
+
|
|
169
|
+
|
|
112
170
|
Evaluators: TypeAlias = Union[
|
|
113
171
|
ExperimentEvaluator,
|
|
114
172
|
Sequence[ExperimentEvaluator],
|
|
@@ -231,7 +289,7 @@ def run_experiment(
|
|
|
231
289
|
}
|
|
232
290
|
if not dry_run:
|
|
233
291
|
experiment_response = sync_client.post(
|
|
234
|
-
f"
|
|
292
|
+
f"v1/datasets/{normalized_dataset.id}/experiments",
|
|
235
293
|
json=payload,
|
|
236
294
|
)
|
|
237
295
|
experiment_response.raise_for_status()
|
|
@@ -303,7 +361,7 @@ def run_experiment(
|
|
|
303
361
|
try:
|
|
304
362
|
# Try to create the run directly
|
|
305
363
|
resp = sync_client.post(
|
|
306
|
-
f"
|
|
364
|
+
f"v1/experiments/{experiment.id}/runs", json=jsonify(exp_run)
|
|
307
365
|
)
|
|
308
366
|
resp.raise_for_status()
|
|
309
367
|
exp_run = replace(exp_run, id=resp.json()["data"]["id"])
|
|
@@ -381,7 +439,7 @@ def run_experiment(
|
|
|
381
439
|
try:
|
|
382
440
|
# Try to create the run directly
|
|
383
441
|
resp = sync_client.post(
|
|
384
|
-
f"
|
|
442
|
+
f"v1/experiments/{experiment.id}/runs", json=jsonify(exp_run)
|
|
385
443
|
)
|
|
386
444
|
resp.raise_for_status()
|
|
387
445
|
exp_run = replace(exp_run, id=resp.json()["data"]["id"])
|
|
@@ -420,7 +478,7 @@ def run_experiment(
|
|
|
420
478
|
None,
|
|
421
479
|
functools.partial(
|
|
422
480
|
sync_client.post,
|
|
423
|
-
url=f"
|
|
481
|
+
url=f"v1/experiments/{experiment.id}/runs",
|
|
424
482
|
json=jsonify(exp_run),
|
|
425
483
|
),
|
|
426
484
|
)
|
|
@@ -498,7 +556,7 @@ def run_experiment(
|
|
|
498
556
|
None,
|
|
499
557
|
functools.partial(
|
|
500
558
|
sync_client.post,
|
|
501
|
-
url=f"
|
|
559
|
+
url=f"v1/experiments/{experiment.id}/runs",
|
|
502
560
|
json=jsonify(exp_run),
|
|
503
561
|
),
|
|
504
562
|
)
|
|
@@ -548,13 +606,7 @@ def run_experiment(
|
|
|
548
606
|
|
|
549
607
|
# Get the final state of runs from the database
|
|
550
608
|
if not dry_run:
|
|
551
|
-
|
|
552
|
-
task_runs = []
|
|
553
|
-
for run in all_runs:
|
|
554
|
-
# Parse datetime strings
|
|
555
|
-
run["start_time"] = datetime.fromisoformat(run["start_time"])
|
|
556
|
-
run["end_time"] = datetime.fromisoformat(run["end_time"])
|
|
557
|
-
task_runs.append(ExperimentRun.from_dict(run))
|
|
609
|
+
task_runs = _get_all_experiment_runs(sync_client, experiment.id)
|
|
558
610
|
|
|
559
611
|
# Check if we got all expected runs
|
|
560
612
|
expected_runs = len(normalized_dataset.examples) * repetitions
|
|
@@ -613,16 +665,14 @@ def evaluate_experiment(
|
|
|
613
665
|
else:
|
|
614
666
|
dataset = Dataset.from_dict(
|
|
615
667
|
sync_client.get(
|
|
616
|
-
f"
|
|
668
|
+
f"v1/datasets/{dataset_id}/examples",
|
|
617
669
|
params={"version_id": str(dataset_version_id)},
|
|
618
670
|
).json()["data"]
|
|
619
671
|
)
|
|
620
672
|
if not dataset.examples:
|
|
621
673
|
raise ValueError(f"Dataset has no examples: {dataset_id=}, {dataset_version_id=}")
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
for exp_run in sync_client.get(f"/v1/experiments/{experiment.id}/runs").json()["data"]
|
|
625
|
-
}
|
|
674
|
+
all_runs = _get_all_experiment_runs(sync_client, experiment.id)
|
|
675
|
+
experiment_runs = {exp_run.id: exp_run for exp_run in all_runs}
|
|
626
676
|
if not experiment_runs:
|
|
627
677
|
raise ValueError("Experiment has not been run")
|
|
628
678
|
params = ExperimentParameters(n_examples=len(dataset.examples))
|
|
@@ -715,7 +765,7 @@ def evaluate_experiment(
|
|
|
715
765
|
trace_id=_str_trace_id(span.get_span_context().trace_id), # type: ignore[no-untyped-call]
|
|
716
766
|
)
|
|
717
767
|
if not dry_run:
|
|
718
|
-
resp = sync_client.post("
|
|
768
|
+
resp = sync_client.post("v1/experiment_evaluations", json=jsonify(eval_run))
|
|
719
769
|
resp.raise_for_status()
|
|
720
770
|
eval_run = replace(eval_run, id=resp.json()["data"]["id"])
|
|
721
771
|
return eval_run
|
|
@@ -777,7 +827,7 @@ def evaluate_experiment(
|
|
|
777
827
|
None,
|
|
778
828
|
functools.partial(
|
|
779
829
|
sync_client.post,
|
|
780
|
-
url="
|
|
830
|
+
url="v1/experiment_evaluations",
|
|
781
831
|
json=jsonify(eval_run),
|
|
782
832
|
),
|
|
783
833
|
)
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
from datetime import datetime
|
|
2
2
|
from typing import Any, Optional
|
|
3
3
|
|
|
4
|
-
from fastapi import APIRouter, Depends, HTTPException
|
|
4
|
+
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
5
5
|
from pydantic import Field
|
|
6
6
|
from sqlalchemy import select
|
|
7
7
|
from sqlalchemy.exc import IntegrityError as PostgreSQLIntegrityError
|
|
8
8
|
from sqlean.dbapi2 import IntegrityError as SQLiteIntegrityError # type: ignore[import-untyped]
|
|
9
9
|
from starlette.requests import Request
|
|
10
|
-
from starlette.status import HTTP_404_NOT_FOUND, HTTP_409_CONFLICT
|
|
10
|
+
from starlette.status import HTTP_404_NOT_FOUND, HTTP_409_CONFLICT, HTTP_422_UNPROCESSABLE_ENTITY
|
|
11
11
|
from strawberry.relay import GlobalID
|
|
12
12
|
|
|
13
13
|
from phoenix.db import models
|
|
@@ -17,7 +17,7 @@ from phoenix.server.authorization import is_not_locked
|
|
|
17
17
|
from phoenix.server.dml_event import ExperimentRunInsertEvent
|
|
18
18
|
|
|
19
19
|
from .models import V1RoutesBaseModel
|
|
20
|
-
from .utils import ResponseBody, add_errors_to_responses
|
|
20
|
+
from .utils import PaginatedResponseBody, ResponseBody, add_errors_to_responses
|
|
21
21
|
|
|
22
22
|
router = APIRouter(tags=["experiments"], include_in_schema=True)
|
|
23
23
|
|
|
@@ -129,7 +129,7 @@ class ExperimentRunResponse(ExperimentRun):
|
|
|
129
129
|
experiment_id: str = Field(description="The ID of the experiment")
|
|
130
130
|
|
|
131
131
|
|
|
132
|
-
class ListExperimentRunsResponseBody(
|
|
132
|
+
class ListExperimentRunsResponseBody(PaginatedResponseBody[ExperimentRunResponse]):
|
|
133
133
|
pass
|
|
134
134
|
|
|
135
135
|
|
|
@@ -137,13 +137,28 @@ class ListExperimentRunsResponseBody(ResponseBody[list[ExperimentRunResponse]]):
|
|
|
137
137
|
"/experiments/{experiment_id}/runs",
|
|
138
138
|
operation_id="listExperimentRuns",
|
|
139
139
|
summary="List runs for an experiment",
|
|
140
|
+
description="Retrieve a paginated list of runs for an experiment",
|
|
140
141
|
response_description="Experiment runs retrieved successfully",
|
|
141
142
|
responses=add_errors_to_responses(
|
|
142
|
-
[
|
|
143
|
+
[
|
|
144
|
+
{"status_code": HTTP_404_NOT_FOUND, "description": "Experiment not found"},
|
|
145
|
+
{"status_code": HTTP_422_UNPROCESSABLE_ENTITY, "description": "Invalid cursor format"},
|
|
146
|
+
]
|
|
143
147
|
),
|
|
144
148
|
)
|
|
145
149
|
async def list_experiment_runs(
|
|
146
|
-
request: Request,
|
|
150
|
+
request: Request,
|
|
151
|
+
experiment_id: str,
|
|
152
|
+
cursor: Optional[str] = Query(
|
|
153
|
+
default=None,
|
|
154
|
+
description="Cursor for pagination (base64-encoded experiment run ID)",
|
|
155
|
+
),
|
|
156
|
+
limit: Optional[int] = Query(
|
|
157
|
+
default=None,
|
|
158
|
+
description="The max number of experiment runs to return at a time. "
|
|
159
|
+
"If not specified, returns all results.",
|
|
160
|
+
gt=0,
|
|
161
|
+
),
|
|
147
162
|
) -> ListExperimentRunsResponseBody:
|
|
148
163
|
experiment_gid = GlobalID.from_id(experiment_id)
|
|
149
164
|
try:
|
|
@@ -154,30 +169,55 @@ async def list_experiment_runs(
|
|
|
154
169
|
status_code=HTTP_404_NOT_FOUND,
|
|
155
170
|
)
|
|
156
171
|
|
|
172
|
+
stmt = (
|
|
173
|
+
select(models.ExperimentRun)
|
|
174
|
+
.filter_by(experiment_id=experiment_rowid)
|
|
175
|
+
.order_by(models.ExperimentRun.id.desc())
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
if cursor:
|
|
179
|
+
try:
|
|
180
|
+
cursor_id = GlobalID.from_id(cursor).node_id
|
|
181
|
+
stmt = stmt.where(models.ExperimentRun.id <= int(cursor_id))
|
|
182
|
+
except ValueError:
|
|
183
|
+
raise HTTPException(
|
|
184
|
+
detail=f"Invalid cursor format: {cursor}",
|
|
185
|
+
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
# Apply limit only if specified for pagination
|
|
189
|
+
if limit is not None:
|
|
190
|
+
stmt = stmt.limit(limit + 1)
|
|
191
|
+
|
|
157
192
|
async with request.app.state.db() as session:
|
|
158
|
-
experiment_runs = await session.
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
193
|
+
experiment_runs = (await session.scalars(stmt)).all()
|
|
194
|
+
|
|
195
|
+
if not experiment_runs:
|
|
196
|
+
return ListExperimentRunsResponseBody(next_cursor=None, data=[])
|
|
197
|
+
|
|
198
|
+
next_cursor = None
|
|
199
|
+
# Only check for next cursor if limit was specified
|
|
200
|
+
if limit is not None and len(experiment_runs) == limit + 1:
|
|
201
|
+
last_run = experiment_runs[-1]
|
|
202
|
+
next_cursor = str(GlobalID("ExperimentRun", str(last_run.id)))
|
|
203
|
+
experiment_runs = experiment_runs[:-1]
|
|
204
|
+
|
|
205
|
+
runs = []
|
|
206
|
+
for exp_run in experiment_runs:
|
|
207
|
+
run_gid = GlobalID("ExperimentRun", str(exp_run.id))
|
|
208
|
+
experiment_gid = GlobalID("Experiment", str(exp_run.experiment_id))
|
|
209
|
+
example_gid = GlobalID("DatasetExample", str(exp_run.dataset_example_id))
|
|
210
|
+
runs.append(
|
|
211
|
+
ExperimentRunResponse(
|
|
212
|
+
start_time=exp_run.start_time,
|
|
213
|
+
end_time=exp_run.end_time,
|
|
214
|
+
experiment_id=str(experiment_gid),
|
|
215
|
+
dataset_example_id=str(example_gid),
|
|
216
|
+
repetition_number=exp_run.repetition_number,
|
|
217
|
+
output=exp_run.output.get("task_output"),
|
|
218
|
+
error=exp_run.error,
|
|
219
|
+
id=str(run_gid),
|
|
220
|
+
trace_id=exp_run.trace_id,
|
|
182
221
|
)
|
|
183
|
-
|
|
222
|
+
)
|
|
223
|
+
return ListExperimentRunsResponseBody(data=runs, next_cursor=next_cursor)
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_components-
|
|
3
|
-
"file": "assets/components-
|
|
2
|
+
"_components-Cs9c4Nxp.js": {
|
|
3
|
+
"file": "assets/components-Cs9c4Nxp.js",
|
|
4
4
|
"name": "components",
|
|
5
5
|
"imports": [
|
|
6
6
|
"_vendor-RdRDaQiR.js",
|
|
7
|
-
"_pages-
|
|
7
|
+
"_pages-Cbj9SjBx.js",
|
|
8
8
|
"_vendor-arizeai-DsYDNOqt.js",
|
|
9
9
|
"_vendor-codemirror-BzJDUbEx.js",
|
|
10
10
|
"_vendor-three-BLWp5bic.js"
|
|
11
11
|
]
|
|
12
12
|
},
|
|
13
|
-
"_pages-
|
|
14
|
-
"file": "assets/pages-
|
|
13
|
+
"_pages-Cbj9SjBx.js": {
|
|
14
|
+
"file": "assets/pages-Cbj9SjBx.js",
|
|
15
15
|
"name": "pages",
|
|
16
16
|
"imports": [
|
|
17
17
|
"_vendor-RdRDaQiR.js",
|
|
18
18
|
"_vendor-arizeai-DsYDNOqt.js",
|
|
19
|
-
"_components-
|
|
19
|
+
"_components-Cs9c4Nxp.js",
|
|
20
20
|
"_vendor-codemirror-BzJDUbEx.js",
|
|
21
21
|
"_vendor-recharts-BTHn5Y2R.js"
|
|
22
22
|
]
|
|
@@ -75,15 +75,15 @@
|
|
|
75
75
|
"name": "vendor-three"
|
|
76
76
|
},
|
|
77
77
|
"index.tsx": {
|
|
78
|
-
"file": "assets/index-
|
|
78
|
+
"file": "assets/index-D1FDMBMV.js",
|
|
79
79
|
"name": "index",
|
|
80
80
|
"src": "index.tsx",
|
|
81
81
|
"isEntry": true,
|
|
82
82
|
"imports": [
|
|
83
83
|
"_vendor-RdRDaQiR.js",
|
|
84
84
|
"_vendor-arizeai-DsYDNOqt.js",
|
|
85
|
-
"_pages-
|
|
86
|
-
"_components-
|
|
85
|
+
"_pages-Cbj9SjBx.js",
|
|
86
|
+
"_components-Cs9c4Nxp.js",
|
|
87
87
|
"_vendor-three-BLWp5bic.js",
|
|
88
88
|
"_vendor-codemirror-BzJDUbEx.js",
|
|
89
89
|
"_vendor-shiki-BAcocHFl.js",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as p,j as e,u as st,a as rn,e as qn,s as xa,b as Ta,c as zn,d as Za,f as So,g as Xe,h as xo,i as To,k as Ua,l as s,m as bn,p as ca,n as Nn,R as Ge,o as E,q as ct,t as Fn,v as Ao,C as na,w as Io,x as Mo,L as _l,y as Dl,z as Kl,A as Oe,B as tn,D as W,E as zo,F as cn,G as Fo,H as Eo,I as $e,J as an,K as j,M as _o,N as oe,O as yn,P as Dn,Q as Pl,S as xn,T as da,U as m,V as Vl,$ as N,W as Do,X as V,Y as Ol,Z as Rl,_ as Ae,a0 as Ko,a1 as Po,a2 as vn,a3 as Vo,a4 as B,a5 as gn,a6 as P,a7 as G,a8 as ee,a9 as Nl,aa as $l,ab as Oo,ac as Bl,ad as Ro,ae as Hl,af as No,ag as $o,ah as jl,ai as Bo,aj as Ho,ak as jo,al as Zl,am as Zo,an as Uo,ao as Go,ap as Te,aq as Ul,ar as Be,as as Qo,at as Wo,au as Qe,av as Ga,aw as Qa,ax as Wa,ay as U,az as Cn,aA as Ut,aB as Gl,aC as Ql,aD as qo,aE as Xo,aF as Yo,aG as Jo,aH as e1,aI as n1,aJ as Wl,aK as a1,aL as t1,aM as l1,aN as i1,aO as r1,aP as o1,aQ as s1,aR as dt,aS as te,aT as c1,aU as d1,aV as ql,aW as u1,aX as g1,aY as Xl,aZ as Ke,a_ as Yl,a$ as Gt,b0 as m1,b1 as Jl,b2 as pe,b3 as p1,b4 as ut,b5 as h1,b6 as f1,b7 as b1,b8 as y1,b9 as Qt,ba as ei,bb as v1,bc as C1,bd as k1,be as gt,bf as L1,bg as w1,bh as ua,bi as S1,bj as x1,bk as T1,bl as ni,bm as A1,bn as I1,bo as M1,bp as z1,bq as F1,br as E1,bs as _1,bt as Wt,bu as D1,bv as Aa,bw as K1,bx as P1,by as V1,bz as O1,bA as R1,bB as N1,bC as $1,bD as B1,bE as H1,bF as Xn}from"./vendor-RdRDaQiR.js";import{a as qt,R as j1,b as Z1,c as U1,m as G1,T as Q1,A as W1,S as q1,d as X1,e as Y1,f as J1,u as es}from"./pages-
|
|
1
|
+
import{r as p,j as e,u as st,a as rn,e as qn,s as xa,b as Ta,c as zn,d as Za,f as So,g as Xe,h as xo,i as To,k as Ua,l as s,m as bn,p as ca,n as Nn,R as Ge,o as E,q as ct,t as Fn,v as Ao,C as na,w as Io,x as Mo,L as _l,y as Dl,z as Kl,A as Oe,B as tn,D as W,E as zo,F as cn,G as Fo,H as Eo,I as $e,J as an,K as j,M as _o,N as oe,O as yn,P as Dn,Q as Pl,S as xn,T as da,U as m,V as Vl,$ as N,W as Do,X as V,Y as Ol,Z as Rl,_ as Ae,a0 as Ko,a1 as Po,a2 as vn,a3 as Vo,a4 as B,a5 as gn,a6 as P,a7 as G,a8 as ee,a9 as Nl,aa as $l,ab as Oo,ac as Bl,ad as Ro,ae as Hl,af as No,ag as $o,ah as jl,ai as Bo,aj as Ho,ak as jo,al as Zl,am as Zo,an as Uo,ao as Go,ap as Te,aq as Ul,ar as Be,as as Qo,at as Wo,au as Qe,av as Ga,aw as Qa,ax as Wa,ay as U,az as Cn,aA as Ut,aB as Gl,aC as Ql,aD as qo,aE as Xo,aF as Yo,aG as Jo,aH as e1,aI as n1,aJ as Wl,aK as a1,aL as t1,aM as l1,aN as i1,aO as r1,aP as o1,aQ as s1,aR as dt,aS as te,aT as c1,aU as d1,aV as ql,aW as u1,aX as g1,aY as Xl,aZ as Ke,a_ as Yl,a$ as Gt,b0 as m1,b1 as Jl,b2 as pe,b3 as p1,b4 as ut,b5 as h1,b6 as f1,b7 as b1,b8 as y1,b9 as Qt,ba as ei,bb as v1,bc as C1,bd as k1,be as gt,bf as L1,bg as w1,bh as ua,bi as S1,bj as x1,bk as T1,bl as ni,bm as A1,bn as I1,bo as M1,bp as z1,bq as F1,br as E1,bs as _1,bt as Wt,bu as D1,bv as Aa,bw as K1,bx as P1,by as V1,bz as O1,bA as R1,bB as N1,bC as $1,bD as B1,bE as H1,bF as Xn}from"./vendor-RdRDaQiR.js";import{a as qt,R as j1,b as Z1,c as U1,m as G1,T as Q1,A as W1,S as q1,d as X1,e as Y1,f as J1,u as es}from"./pages-Cbj9SjBx.js";import{u as ns,_ as as,a as ts,F as ai,I as ls,b as is,c as rs,d as os,e as ss,f as cs,g as ds,P as us,h as gs,i as ms,j as ps,T as hs,k as fs}from"./vendor-arizeai-DsYDNOqt.js";import{L as ti,a as li,j as ii,E as mt,k as ri,d as oi,l as qa,b as si,h as bs,c as ys,e as vs,f as Cs,g as ks,i as Ls,s as ws,m as $n,n as Bn,R as Hn,p as Ss,o as xs}from"./vendor-codemirror-BzJDUbEx.js";import{V as Ts}from"./vendor-three-BLWp5bic.js";const ci=function(){var n={defaultValue:null,kind:"LocalArgument",name:"clusters"},a={defaultValue:null,kind:"LocalArgument",name:"dataQualityMetricColumnName"},t={defaultValue:null,kind:"LocalArgument",name:"fetchDataQualityMetric"},l={defaultValue:null,kind:"LocalArgument",name:"fetchPerformanceMetric"},i={defaultValue:null,kind:"LocalArgument",name:"performanceMetric"},r=[{alias:null,args:null,kind:"ScalarField",name:"primaryValue",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"referenceValue",storageKey:null}],o=[{alias:null,args:[{kind:"Variable",name:"clusters",variableName:"clusters"}],concreteType:"Cluster",kind:"LinkedField",name:"clusters",plural:!0,selections:[{alias:null,args:null,kind:"ScalarField",name:"id",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"eventIds",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"driftRatio",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"primaryToCorpusRatio",storageKey:null},{condition:"fetchDataQualityMetric",kind:"Condition",passingValue:!0,selections:[{alias:null,args:[{fields:[{kind:"Variable",name:"columnName",variableName:"dataQualityMetricColumnName"},{kind:"Literal",name:"metric",value:"mean"}],kind:"ObjectValue",name:"metric"}],concreteType:"DatasetValues",kind:"LinkedField",name:"dataQualityMetric",plural:!1,selections:r,storageKey:null}]},{condition:"fetchPerformanceMetric",kind:"Condition",passingValue:!0,selections:[{alias:null,args:[{fields:[{kind:"Variable",name:"metric",variableName:"performanceMetric"}],kind:"ObjectValue",name:"metric"}],concreteType:"DatasetValues",kind:"LinkedField",name:"performanceMetric",plural:!1,selections:r,storageKey:null}]}],storageKey:null}];return{fragment:{argumentDefinitions:[n,a,t,l,i],kind:"Fragment",metadata:null,name:"pointCloudStore_clusterMetricsQuery",selections:o,type:"Query",abstractKey:null},kind:"Request",operation:{argumentDefinitions:[n,t,a,l,i],kind:"Operation",name:"pointCloudStore_clusterMetricsQuery",selections:o},params:{cacheID:"86666967012812887ac0a0149d2d2535",id:null,metadata:{},name:"pointCloudStore_clusterMetricsQuery",operationKind:"query",text:`query pointCloudStore_clusterMetricsQuery(
|
|
2
2
|
$clusters: [ClusterInput!]!
|
|
3
3
|
$fetchDataQualityMetric: Boolean!
|
|
4
4
|
$dataQualityMetricColumnName: String
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{U as g,j as o,c_ as f,eD as h,eE as v,eF as y,l as r,cl as x,eG as a,r as z,o as w,eH as P}from"./vendor-RdRDaQiR.js";import{r as k,s as S}from"./vendor-arizeai-DsYDNOqt.js";import{L,g as C,r as R,h as j,i as E,F as I,j as D,P as A,k as F,M as t,l as T,D as G,n as M,E as _,o as O,p as N,q as V,s as q,t as d,v as U,w as W,x as B,y as $,z as H,B as K,C as Y,G as J,H as Q,I as X,J as Z,K as oo,N as ao,O as lo,Q as ro,U as co,V as go,W as m,X as p,Y as eo,Z as bo,_ as no,$ as io,a0 as so,a1 as to,a2 as mo,a3 as po,a4 as uo,a5 as fo,a6 as ho,a7 as vo,a8 as yo,a9 as xo,aa as zo,ab as wo,ac as Po,ad as ko,ae as So,af as Lo,ag as Co,ah as Ro,ai as jo,aj as Eo,ak as Io,al as Do,am as Ao,an as Fo,ao as To,ap as Go,aq as Mo,ar as _o,as as Oo,at as No,au as Vo,av as qo,aw as Uo,ax as Wo,ay as n,az as Bo,aA as $o,aB as Ho,aC as Ko,aD as Yo,aE as Jo}from"./pages-
|
|
1
|
+
import{U as g,j as o,c_ as f,eD as h,eE as v,eF as y,l as r,cl as x,eG as a,r as z,o as w,eH as P}from"./vendor-RdRDaQiR.js";import{r as k,s as S}from"./vendor-arizeai-DsYDNOqt.js";import{L,g as C,r as R,h as j,i as E,F as I,j as D,P as A,k as F,M as t,l as T,D as G,n as M,E as _,o as O,p as N,q as V,s as q,t as d,v as U,w as W,x as B,y as $,z as H,B as K,C as Y,G as J,H as Q,I as X,J as Z,K as oo,N as ao,O as lo,Q as ro,U as co,V as go,W as m,X as p,Y as eo,Z as bo,_ as no,$ as io,a0 as so,a1 as to,a2 as mo,a3 as po,a4 as uo,a5 as fo,a6 as ho,a7 as vo,a8 as yo,a9 as xo,aa as zo,ab as wo,ac as Po,ad as ko,ae as So,af as Lo,ag as Co,ah as Ro,ai as jo,aj as Eo,ak as Io,al as Do,am as Ao,an as Fo,ao as To,ap as Go,aq as Mo,ar as _o,as as Oo,at as No,au as Vo,av as qo,aw as Uo,ax as Wo,ay as n,az as Bo,aA as $o,aB as Ho,aC as Ko,aD as Yo,aE as Jo}from"./pages-Cbj9SjBx.js";import{fR as Qo,cY as Xo,U as Zo,fS as oa,fT as aa,fU as la}from"./components-Cs9c4Nxp.js";import"./vendor-three-BLWp5bic.js";import"./vendor-codemirror-BzJDUbEx.js";import"./vendor-shiki-BAcocHFl.js";import"./vendor-recharts-BTHn5Y2R.js";(function(){const b=document.createElement("link").relList;if(b&&b.supports&&b.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))s(c);new MutationObserver(c=>{for(const e of c)if(e.type==="childList")for(const i of e.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&s(i)}).observe(document,{childList:!0,subtree:!0});function u(c){const e={};return c.integrity&&(e.integrity=c.integrity),c.referrerPolicy&&(e.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?e.credentials="include":c.crossOrigin==="anonymous"?e.credentials="omit":e.credentials="same-origin",e}function s(c){if(c.ep)return;c.ep=!0;const e=u(c);fetch(c.href,e)}})();const ra=g`
|
|
2
2
|
:root,
|
|
3
3
|
.ac-theme {
|
|
4
4
|
--ac-global-dimension-scale-factor: 1;
|