arize-phoenix 11.29.0__py3-none-any.whl → 11.30.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.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arize-phoenix
3
- Version: 11.29.0
3
+ Version: 11.30.0
4
4
  Summary: AI Observability and Evaluation
5
5
  Project-URL: Documentation, https://arize.com/docs/phoenix/
6
6
  Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
@@ -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=dmpBux9ABrJi8fLg-MbszS9TOYZ3loPQG7TMhFmf_iE,24
9
+ phoenix/version.py,sha256=JHzYn5SQjWvqEZWixlgmU5X8oFvAzqJf2SdpbNxVVK4,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
@@ -120,13 +120,13 @@ phoenix/server/api/utils.py,sha256=quCBRcusc6PUq9tJq7M8PgwFZp7nXgVAxtbw8feribY,8
120
120
  phoenix/server/api/dataloaders/__init__.py,sha256=ddiX1BdbyGkPTzMZNo-hkF_2kqIquelBUFvQejnAJYk,6834
121
121
  phoenix/server/api/dataloaders/annotation_configs_by_project.py,sha256=_Nfiug9o01JimU3Z0LpZJ0uaMCjchXomyt_dYAxPFRY,1178
122
122
  phoenix/server/api/dataloaders/annotation_summaries.py,sha256=0b23-bucBKyL25RWb2QzCNJjQzrq403qMmHKUVD5W4M,14377
123
- phoenix/server/api/dataloaders/average_experiment_run_latency.py,sha256=EgRkx_2QIzdOZe4D-0kd3B9HMoAibU9DZDotUh2CWFE,1945
123
+ phoenix/server/api/dataloaders/average_experiment_run_latency.py,sha256=_wEcC47zOtLFMYTfyaFWA93TlAVC3kAPZhMnRO-xB24,1809
124
124
  phoenix/server/api/dataloaders/dataset_example_revisions.py,sha256=xF7M2dg3UmjhdCrscnztCIBBI0cg3RF48IIqvilpc18,4623
125
125
  phoenix/server/api/dataloaders/dataset_example_spans.py,sha256=z_MFquqAcJ9wat7BBp7MVeJ9BYuu2EZEdaog52iWDno,1390
126
126
  phoenix/server/api/dataloaders/document_evaluation_summaries.py,sha256=9fdROnzp-mymggHwNvpRkCk93LUFxxLy55-j3HP_2HY,5565
127
- phoenix/server/api/dataloaders/document_evaluations.py,sha256=KCnCItJ2DQOCHvxFp1KK2AStPN1akGlAGOEzEAu6c6I,1246
127
+ phoenix/server/api/dataloaders/document_evaluations.py,sha256=W1b7TIlmPG61vR7kEcLZ5hAQYfkSKZAgrJOXYkA9-Ko,1246
128
128
  phoenix/server/api/dataloaders/document_retrieval_metrics.py,sha256=37EcAW7oYQuWYHMDHb0wcqbWj9lhSskvzDO7NJbT5Js,4136
129
- phoenix/server/api/dataloaders/experiment_annotation_summaries.py,sha256=Jfurk2bBqt3RTq1ydqZ4B4H_0mTyW6XMeIImShT1aQs,5643
129
+ phoenix/server/api/dataloaders/experiment_annotation_summaries.py,sha256=CFVj7DwFYj330FLU5w3zEr12AGUX1e8ZX0X5buxMuEk,5643
130
130
  phoenix/server/api/dataloaders/experiment_error_rates.py,sha256=06IZF07qt2y167DBM49QkSNdnphPArhcsgYFcunaL-U,1992
131
131
  phoenix/server/api/dataloaders/experiment_run_annotations.py,sha256=uJ--9Ue4tnmZYH9Zy-Cj2Y2t3xzs2xUqN8Y6EGe1MCo,1296
132
132
  phoenix/server/api/dataloaders/experiment_run_counts.py,sha256=j_7229IL705p_TycxIMYylhSgLHsAn91TiGPYXtOuQ8,1617
@@ -255,10 +255,11 @@ phoenix/server/api/routers/auth.py,sha256=PKGwWdw7O015KmjMY1mIxlvXeU7OrmqIPF5TWT
255
255
  phoenix/server/api/routers/embeddings.py,sha256=BpZGJee0pdL0W5Rp1L0b30dEtZTgJeVqXky8LgZ0ZXw,898
256
256
  phoenix/server/api/routers/oauth2.py,sha256=rPcKFvfijzBYLjfwbCNzCn0ihn4wGWh4xh6BRqg9Ay4,24524
257
257
  phoenix/server/api/routers/utils.py,sha256=M41BoH-fl37izhRuN2aX7lWm7jOC20A_3uClv9TVUUY,583
258
- phoenix/server/api/routers/v1/__init__.py,sha256=ngLMPjC7lgZxgKy_Is33KxTRnMzSqy25qTTChCVx_Mo,2696
258
+ phoenix/server/api/routers/v1/__init__.py,sha256=_CxVCs26dPuC2KygV3VzYqmoAECeFwiSTava9mxIJTE,2790
259
259
  phoenix/server/api/routers/v1/annotation_configs.py,sha256=xp5lJmKYlRsINCUrRD9-lTAElw2v4hdFndS5BWrxICA,16048
260
260
  phoenix/server/api/routers/v1/annotations.py,sha256=fVl2qeh_ZbWXGvFBTZgeL7aGkkINIScdjuyxnOoSzNM,6817
261
261
  phoenix/server/api/routers/v1/datasets.py,sha256=9iPORLmbOrPKgUUcRDMs6ZczSIz7hvc6bngJy3IbdR0,38331
262
+ phoenix/server/api/routers/v1/documents.py,sha256=D8Pg6lEBHzSuPEDVts__X0ArIKBdQs_3gtIgoZXk_eU,6930
262
263
  phoenix/server/api/routers/v1/evaluations.py,sha256=aBrPO-xCAWyTxydaHq7W2wQFm65k89uVR-H3VWsd6WQ,13062
263
264
  phoenix/server/api/routers/v1/experiment_evaluations.py,sha256=DZ3UK9OoYKElpRcEER7559-KiAqWr-1IXpZ27FbfP3k,5249
264
265
  phoenix/server/api/routers/v1/experiment_runs.py,sha256=LZeCQWQIEOZ9jK5Gp_C4JbiYY6AmnnWe85cVcvdkCLE,7107
@@ -266,8 +267,8 @@ phoenix/server/api/routers/v1/experiments.py,sha256=hIBecGACzGZEgl93ap_JV52pUv-I
266
267
  phoenix/server/api/routers/v1/models.py,sha256=p3gJN-9SWiUYTUTft4bZMsZVCBNTb4nN1Foy68eRZzQ,1997
267
268
  phoenix/server/api/routers/v1/projects.py,sha256=XR6uJxHXXtC1q8LNyS9W6iaj440sv1OKCu-OSBfxEys,12824
268
269
  phoenix/server/api/routers/v1/prompts.py,sha256=chRYcLkOYDJdJfVZVukVTUyIRnLPvsJCg41CuPxOIU8,26695
269
- phoenix/server/api/routers/v1/spans.py,sha256=roDDE0RDBGSCircPgzwYWhwwyK33IaW7YliWN-lwxWw,49385
270
- phoenix/server/api/routers/v1/traces.py,sha256=ho6SXJ0R3g1ROxgtd7hNPo8QSZnA85oG0dgWDokHM2w,11365
270
+ phoenix/server/api/routers/v1/spans.py,sha256=6wu8nUQNp9ma_k5XGvcVx3fq5xPuaN5sbv15ouBWcVc,49438
271
+ phoenix/server/api/routers/v1/traces.py,sha256=ur4qVh8NDHDfwXKUNlAQoZhe4xAWe1Dv2ODixR5qroE,11418
271
272
  phoenix/server/api/routers/v1/users.py,sha256=eO8zMtGU33Td2_G1l9D7Z0a4CG1CwBUCj_Z9z2uk7wg,12089
272
273
  phoenix/server/api/routers/v1/utils.py,sha256=oXIOGPzPTkE0ZWUTRCoRIQQ7wTzoSwtWFaUSjlGBqts,4960
273
274
  phoenix/server/api/types/Annotation.py,sha256=gsl8CwjIbDUbZRj4d9USwZ_w_Tkz4i7zuZh9ftV80jA,1132
@@ -298,12 +299,12 @@ phoenix/server/api/types/DocumentEvaluationSummary.py,sha256=dx4Btlfw9_XsfmibjfW
298
299
  phoenix/server/api/types/DocumentRetrievalMetrics.py,sha256=amkpC3H5IU5-9GvO0telpbq00m6lIcv_2v446OpwFwc,1822
299
300
  phoenix/server/api/types/EmbeddingDimension.py,sha256=AYvpZ1nWINAgN4BAZsA_xI_2TNFK6h5jmqzvkPs651M,19428
300
301
  phoenix/server/api/types/EmbeddingMetadata.py,sha256=fJvNNYCbkf3SJalArLy9rcBq9Uj1SNac60zjqe1PFnM,461
301
- phoenix/server/api/types/Evaluation.py,sha256=jPUH4fUFTpQHmiHA4zS4o3zigYp2LNX7VhlT580HJ_I,1301
302
+ phoenix/server/api/types/Evaluation.py,sha256=qkMmq5G9pgwUNOPSTRwR-nNAoqLT3LlXrq7O8cAgXQ8,1356
302
303
  phoenix/server/api/types/EvaluationSummary.py,sha256=vILYejnfPvMwWEXOwhQZsANvYe3AdO2OkMR2rcgp1H4,1512
303
304
  phoenix/server/api/types/Event.py,sha256=iYt_Jx1Roioo0vZ0iPeJTHcTu6NSm4ilVMJ-IMUHAKk,3970
304
305
  phoenix/server/api/types/EventMetadata.py,sha256=-J0tYF9eZTHwCjwxQHY7Gckr2_MNW5OoWT1mydweZNM,635
305
306
  phoenix/server/api/types/ExampleRevisionInterface.py,sha256=gV3Gt9-3Oi5wjaVtepC6nOt3FzTzZFD1KebNnqiw56E,294
306
- phoenix/server/api/types/Experiment.py,sha256=eN0NhUVdcjJyMbyAGoltv30mhunatWS6i2gG97xu5TU,7758
307
+ phoenix/server/api/types/Experiment.py,sha256=ifymI5SGqotIo01yAx-AsUONLzvFvjAKEU8gKi2WOzA,7700
307
308
  phoenix/server/api/types/ExperimentAnnotationSummary.py,sha256=Uk3JtxIrsMoZT5tqc4nJdUOM3XegVzjUyoV3pkjNotE,256
308
309
  phoenix/server/api/types/ExperimentComparison.py,sha256=PXFcB0e8aaJ391yRsuRJr9_dvTZI1RAzF93oC_-HtxU,461
309
310
  phoenix/server/api/types/ExperimentRun.py,sha256=_fcwDLuURV0yviOlkjWAgJJwcCPdz-xGR6VX3UKf73s,6541
@@ -337,7 +338,7 @@ phoenix/server/api/types/ScalarDriftMetricEnum.py,sha256=IUAcRPpgL41WdoIgK6cNk2T
337
338
  phoenix/server/api/types/Segments.py,sha256=vT2v0efoa5cuBKxLtxTnsUP5YJJCZfTloM71Spu0tMI,2915
338
339
  phoenix/server/api/types/ServerStatus.py,sha256=t92OHuVhK9DXDk2vsBuHceQNKqYGpHwUp8DNGKz2wOk,88
339
340
  phoenix/server/api/types/SortDir.py,sha256=OUpXhlCzCxPoXSDkJJygEs9Rw9pMymfaZUG5zPTrw4Y,152
340
- phoenix/server/api/types/Span.py,sha256=6vurLa8yoBs7GH7Jpj5niPAX7JxKPKVUp2qEJbaZxCI,32000
341
+ phoenix/server/api/types/Span.py,sha256=ag5qWOEbWDCNUAkSUd0K3biE_PuGT2oweL4gVKElNis,32000
341
342
  phoenix/server/api/types/SpanAnnotation.py,sha256=uPWu7Z8rmpfKhaaxbged4_o00pPCR3nkn7Gji9vB8jY,1959
342
343
  phoenix/server/api/types/SpanCostDetailSummaryEntry.py,sha256=RXAdOC6MFyR9mwaoj8lMMdI3_9r3z6mR2izJvlsj12U,252
343
344
  phoenix/server/api/types/SpanCostSummary.py,sha256=wo03FCMcFzB5m4P5kvA5jzi9ACLbht38ozQbDJUh94g,357
@@ -392,10 +393,10 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
392
393
  phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
393
394
  phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
394
395
  phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
395
- phoenix/server/static/.vite/manifest.json,sha256=-rNvMLAChq7_eDpTSPXWf7ujX9-KJZOw6I_ONqi1eBY,2328
396
- phoenix/server/static/assets/components-dCdVienD.js,sha256=a8fwhvVLGgLiQmj6R7zuXEdvLLpormuCrJePqF8ss5k,664533
397
- phoenix/server/static/assets/index-Bp44T8N2.js,sha256=kaA9zlqpA50LK3xdjN2K3tPAjq6roX3cy6OyCyBS49k,63396
398
- phoenix/server/static/assets/pages-CA4bKhm9.js,sha256=plhzt6_SL9xsAOva_dTqDk-0yWfre4t_nvg_VJcQeX0,1268001
396
+ phoenix/server/static/.vite/manifest.json,sha256=podIkdilPnaQGOQjbnF7zpOylgP4MXrSImpB5UGvNBc,2328
397
+ phoenix/server/static/assets/components-BBwXqJXQ.js,sha256=U8GMAX0TEjXRzhmqCMXjnVaQ9trJDICWTq9IcjqcNhE,664533
398
+ phoenix/server/static/assets/index-C_gU3x10.js,sha256=ouZyJslt5vOJGBHCHiO0ziM9Y5lTwAdB86lGFUbr-Ec,63396
399
+ phoenix/server/static/assets/pages-YmQb55Uo.js,sha256=tPGWJ9VTxJJSVoyQj_7VutaInS_SuhuXSal0nuJQTKQ,1269456
399
400
  phoenix/server/static/assets/vendor-CqDb5u4o.css,sha256=zIyFiNJKxMaQk8AvtLgt1rR01oO10d1MFndSDKH9Clw,5517
400
401
  phoenix/server/static/assets/vendor-RdRDaQiR.js,sha256=oTxLetZZXJ20yoKNAYExto9V73y8X5zjddWV46K9CWM,2595492
401
402
  phoenix/server/static/assets/vendor-arizeai-DsYDNOqt.js,sha256=0HIkPJXbKTh85nqphdAXYeStRzdaim0IQxRXiXxa21U,121514
@@ -442,9 +443,9 @@ phoenix/utilities/project.py,sha256=auVpARXkDb-JgeX5f2aStyFIkeKvGwN9l7qrFeJMVxI,
442
443
  phoenix/utilities/re.py,sha256=6YyUWIkv0zc2SigsxfOWIHzdpjKA_TZo2iqKq7zJKvw,2081
443
444
  phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
444
445
  phoenix/utilities/template_formatters.py,sha256=gh9PJD6WEGw7TEYXfSst1UR4pWWwmjxMLrDVQ_CkpkQ,2779
445
- arize_phoenix-11.29.0.dist-info/METADATA,sha256=N5M1wqlrq9TDt1tg8K9INOEqK1VBdOtVqyGPmR28e34,31733
446
- arize_phoenix-11.29.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
447
- arize_phoenix-11.29.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
448
- arize_phoenix-11.29.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
449
- arize_phoenix-11.29.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
450
- arize_phoenix-11.29.0.dist-info/RECORD,,
446
+ arize_phoenix-11.30.0.dist-info/METADATA,sha256=p2LDUgcsaZ4l5qRVqP5FVFjrpVpZTvzTN60j913wTtM,31733
447
+ arize_phoenix-11.30.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
448
+ arize_phoenix-11.30.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
449
+ arize_phoenix-11.30.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
450
+ arize_phoenix-11.30.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
451
+ arize_phoenix-11.30.0.dist-info/RECORD,,
@@ -26,10 +26,7 @@ class AverageExperimentRunLatencyDataLoader(DataLoader[Key, Result]):
26
26
  average_repetition_latency_ms = (
27
27
  select(
28
28
  models.ExperimentRun.experiment_id.label("experiment_id"),
29
- func.avg(
30
- func.extract("epoch", models.ExperimentRun.end_time)
31
- - func.extract("epoch", models.ExperimentRun.start_time)
32
- ).label("average_repetition_latency_ms"),
29
+ func.avg(models.ExperimentRun.latency_ms).label("average_repetition_latency_ms"),
33
30
  )
34
31
  .select_from(models.ExperimentRun)
35
32
  .where(models.ExperimentRun.experiment_id.in_(experiment_ids))
@@ -5,11 +5,11 @@ from strawberry.dataloader import DataLoader
5
5
  from typing_extensions import TypeAlias
6
6
 
7
7
  from phoenix.db import models
8
- from phoenix.server.api.types.Evaluation import DocumentEvaluation
8
+ from phoenix.server.api.types.Evaluation import DocumentAnnotation
9
9
  from phoenix.server.types import DbSessionFactory
10
10
 
11
11
  Key: TypeAlias = int
12
- Result: TypeAlias = list[DocumentEvaluation]
12
+ Result: TypeAlias = list[DocumentAnnotation]
13
13
 
14
14
 
15
15
  class DocumentEvaluationsDataLoader(DataLoader[Key, Result]):
@@ -26,6 +26,6 @@ class DocumentEvaluationsDataLoader(DataLoader[Key, Result]):
26
26
  )
27
27
  async for document_evaluation in data:
28
28
  document_evaluations_by_id[document_evaluation.span_rowid].append(
29
- DocumentEvaluation.from_sql_document_annotation(document_evaluation)
29
+ DocumentAnnotation.from_sql_document_annotation(document_evaluation)
30
30
  )
31
31
  return [document_evaluations_by_id[key] for key in keys]
@@ -50,8 +50,8 @@ class ExperimentAnnotationSummaryDataLoader(DataLoader[Key, Result]):
50
50
  )
51
51
  .where(models.ExperimentRun.experiment_id.in_(experiment_ids))
52
52
  .group_by(
53
- models.ExperimentRun.dataset_example_id,
54
53
  models.ExperimentRun.experiment_id,
54
+ models.ExperimentRun.dataset_example_id,
55
55
  models.ExperimentRunAnnotation.name,
56
56
  )
57
57
  .subquery()
@@ -7,6 +7,7 @@ from phoenix.server.bearer_auth import is_authenticated
7
7
  from .annotation_configs import router as annotation_configs_router
8
8
  from .annotations import router as annotations_router
9
9
  from .datasets import router as datasets_router
10
+ from .documents import router as documents_router
10
11
  from .evaluations import router as evaluations_router
11
12
  from .experiment_evaluations import router as experiment_evaluations_router
12
13
  from .experiment_runs import router as experiment_runs_router
@@ -70,5 +71,6 @@ def create_v1_router(authentication_enabled: bool) -> APIRouter:
70
71
  router.include_router(evaluations_router)
71
72
  router.include_router(prompts_router)
72
73
  router.include_router(projects_router)
74
+ router.include_router(documents_router)
73
75
  router.include_router(users_router)
74
76
  return router
@@ -0,0 +1,175 @@
1
+ from datetime import datetime, timezone
2
+ from typing import Any, Literal, Optional
3
+
4
+ from fastapi import APIRouter, Depends, HTTPException, Query
5
+ from pydantic import Field
6
+ from sqlalchemy import select
7
+ from starlette.requests import Request
8
+ from starlette.status import HTTP_404_NOT_FOUND
9
+ from strawberry.relay import GlobalID
10
+
11
+ from phoenix.db import models
12
+ from phoenix.db.helpers import SupportedSQLDialect
13
+ from phoenix.db.insertion.helpers import as_kv, insert_on_conflict
14
+ from phoenix.db.insertion.types import Precursors
15
+ from phoenix.server.api.types.Evaluation import DocumentAnnotation
16
+ from phoenix.server.authorization import is_not_locked
17
+ from phoenix.server.bearer_auth import PhoenixUser
18
+ from phoenix.server.dml_event import DocumentAnnotationInsertEvent
19
+
20
+ from .models import V1RoutesBaseModel
21
+ from .spans import SpanAnnotationResult
22
+ from .utils import RequestBody, ResponseBody, add_errors_to_responses
23
+
24
+ # Since the document annotations are spans related, we place it under spans
25
+ router = APIRouter(tags=["spans"])
26
+
27
+
28
+ class SpanDocumentAnnotationData(V1RoutesBaseModel):
29
+ span_id: str = Field(description="OpenTelemetry Span ID (hex format w/o 0x prefix)")
30
+ name: str = Field(description="The name of the document annotation. E.x. relevance")
31
+ annotator_kind: Literal["LLM", "CODE", "HUMAN"] = Field(
32
+ description="The kind of annotator. E.g. llm judge, a heuristic piece of code, or a human"
33
+ )
34
+ document_position: int = Field(
35
+ description="A 0 based index of the document. E.x. the first document during retrieval is 0"
36
+ )
37
+ result: Optional[SpanAnnotationResult] = Field(
38
+ default=None, description="The score and or label of the annotation"
39
+ )
40
+ metadata: Optional[dict[str, Any]] = Field(
41
+ default=None, description="Metadata for custom values of the annotation"
42
+ )
43
+ identifier: str = Field(
44
+ default="",
45
+ description=(
46
+ "An custom ID for the annotation. "
47
+ "If provided, the annotation will be updated if it already exists."
48
+ ),
49
+ )
50
+
51
+ # Precursor here means a value to add to a queue for processing async
52
+ def as_precursor(self, *, user_id: Optional[int] = None) -> Precursors.DocumentAnnotation:
53
+ return Precursors.DocumentAnnotation(
54
+ datetime.now(timezone.utc),
55
+ self.span_id,
56
+ self.document_position,
57
+ models.DocumentAnnotation(
58
+ name=self.name,
59
+ annotator_kind=self.annotator_kind,
60
+ document_position=self.document_position,
61
+ score=self.result.score if self.result else None,
62
+ label=self.result.label if self.result else None,
63
+ explanation=self.result.explanation if self.result else None,
64
+ metadata_=self.metadata or {},
65
+ identifier=self.identifier,
66
+ source="API",
67
+ user_id=user_id,
68
+ ),
69
+ )
70
+
71
+
72
+ class AnnotateSpanDocumentsRequestBody(RequestBody[list[SpanDocumentAnnotationData]]):
73
+ pass
74
+
75
+
76
+ class InsertedSpanDocumentAnnotation(V1RoutesBaseModel):
77
+ id: str = Field(description="The ID of the inserted span document annotation")
78
+
79
+
80
+ class AnnotateSpanDocumentsResponseBody(ResponseBody[list[InsertedSpanDocumentAnnotation]]):
81
+ pass
82
+
83
+
84
+ @router.post(
85
+ "/document_annotations",
86
+ dependencies=[Depends(is_not_locked)],
87
+ operation_id="annotateSpanDocuments",
88
+ responses=add_errors_to_responses(
89
+ [
90
+ {
91
+ "status_code": HTTP_404_NOT_FOUND,
92
+ "description": "Span not found",
93
+ }
94
+ ]
95
+ ),
96
+ response_description="Span document annotation inserted successfully",
97
+ include_in_schema=True,
98
+ )
99
+ async def annotate_span_documents(
100
+ request: Request,
101
+ request_body: AnnotateSpanDocumentsRequestBody,
102
+ sync: bool = Query(
103
+ default=False, description="If set to true, the annotations are inserted synchronously."
104
+ ),
105
+ ) -> AnnotateSpanDocumentsResponseBody:
106
+ if not request_body.data:
107
+ return AnnotateSpanDocumentsResponseBody(data=[])
108
+
109
+ user_id: Optional[int] = None
110
+ if request.app.state.authentication_enabled and isinstance(request.user, PhoenixUser):
111
+ user_id = int(request.user.identity)
112
+
113
+ span_document_annotations = request_body.data
114
+
115
+ precursors = [
116
+ annotation.as_precursor(user_id=user_id) for annotation in span_document_annotations
117
+ ]
118
+ if not sync:
119
+ await request.state.enqueue(*precursors)
120
+
121
+ span_ids = {p.span_id for p in precursors}
122
+ # Account for the fact that the spans could arrive after the annotation
123
+ async with request.app.state.db() as session:
124
+ existing_spans = {
125
+ span_id: (id_, num_docs)
126
+ async for span_id, id_, num_docs in await session.stream(
127
+ select(models.Span.span_id, models.Span.id, models.Span.num_documents).filter(
128
+ models.Span.span_id.in_(span_ids)
129
+ )
130
+ )
131
+ }
132
+
133
+ missing_span_ids = span_ids - set(existing_spans.keys())
134
+ # We prefer to fail the entire operation if there are missing spans in sync mode
135
+ if missing_span_ids:
136
+ raise HTTPException(
137
+ detail=f"Spans with IDs {', '.join(missing_span_ids)} do not exist.",
138
+ status_code=HTTP_404_NOT_FOUND,
139
+ )
140
+
141
+ # Validate that document positions are within bounds
142
+ for annotation in span_document_annotations:
143
+ _, num_docs = existing_spans[annotation.span_id]
144
+ if annotation.document_position not in range(num_docs):
145
+ raise HTTPException(
146
+ detail=f"Document position {annotation.document_position} is out of bounds for "
147
+ f"span {annotation.span_id} (max: {num_docs - 1})",
148
+ status_code=422, # Unprocessable Entity
149
+ )
150
+
151
+ inserted_document_annotation_ids = []
152
+ dialect = SupportedSQLDialect(session.bind.dialect.name)
153
+ for anno in precursors:
154
+ span_rowid, _ = existing_spans[anno.span_id]
155
+ values = dict(as_kv(anno.as_insertable(span_rowid).row))
156
+ span_document_annotation_id = await session.scalar(
157
+ insert_on_conflict(
158
+ values,
159
+ dialect=dialect,
160
+ table=models.DocumentAnnotation,
161
+ unique_by=("name", "span_rowid", "identifier", "document_position"),
162
+ ).returning(models.DocumentAnnotation.id)
163
+ )
164
+ inserted_document_annotation_ids.append(span_document_annotation_id)
165
+
166
+ # We queue an event to let the application know that annotations have changed
167
+ request.state.event_queue.put(
168
+ DocumentAnnotationInsertEvent(tuple(inserted_document_annotation_ids))
169
+ )
170
+ return AnnotateSpanDocumentsResponseBody(
171
+ data=[
172
+ InsertedSpanDocumentAnnotation(id=str(GlobalID(DocumentAnnotation.__name__, str(id_))))
173
+ for id_ in inserted_document_annotation_ids
174
+ ]
175
+ )
@@ -949,9 +949,11 @@ async def annotate_spans(
949
949
  span_ids = {p.span_id for p in precursors}
950
950
  async with request.app.state.db() as session:
951
951
  existing_spans = {
952
- span.span_id: span.id
953
- async for span in await session.stream_scalars(
954
- select(models.Span).filter(models.Span.span_id.in_(span_ids))
952
+ span_id: id_
953
+ async for span_id, id_ in await session.stream(
954
+ select(models.Span.span_id, models.Span.id).filter(
955
+ models.Span.span_id.in_(span_ids)
956
+ )
955
957
  )
956
958
  }
957
959
 
@@ -193,9 +193,11 @@ async def annotate_traces(
193
193
  trace_ids = {p.trace_id for p in precursors}
194
194
  async with request.app.state.db() as session:
195
195
  existing_traces = {
196
- trace.trace_id: trace.id
197
- async for trace in await session.stream_scalars(
198
- select(models.Trace).filter(models.Trace.trace_id.in_(trace_ids))
196
+ trace_id: id_
197
+ async for trace_id, id_ in await session.stream(
198
+ select(models.Trace.trace_id, models.Trace.id).filter(
199
+ models.Trace.trace_id.in_(trace_ids)
200
+ )
199
201
  )
200
202
  }
201
203
 
@@ -1,6 +1,7 @@
1
1
  import strawberry
2
2
 
3
- from phoenix.db.models import DocumentAnnotation, TraceAnnotation
3
+ from phoenix.db.models import DocumentAnnotation as DBDocumentAnnotation
4
+ from phoenix.db.models import TraceAnnotation
4
5
 
5
6
  from .Annotation import Annotation
6
7
 
@@ -20,15 +21,15 @@ class TraceEvaluation(Annotation):
20
21
 
21
22
 
22
23
  @strawberry.type
23
- class DocumentEvaluation(Annotation):
24
+ class DocumentAnnotation(Annotation):
24
25
  document_position: int = strawberry.field(
25
26
  description="The zero-based index among retrieved documents, which "
26
27
  "is collected as a list (even when ordering is not inherently meaningful)."
27
28
  )
28
29
 
29
30
  @staticmethod
30
- def from_sql_document_annotation(annotation: DocumentAnnotation) -> "DocumentEvaluation":
31
- return DocumentEvaluation(
31
+ def from_sql_document_annotation(annotation: DBDocumentAnnotation) -> "DocumentAnnotation":
32
+ return DocumentAnnotation(
32
33
  name=annotation.name,
33
34
  score=annotation.score,
34
35
  label=annotation.label,
@@ -109,10 +109,10 @@ class Experiment(Node):
109
109
 
110
110
  @strawberry.field
111
111
  async def average_run_latency_ms(self, info: Info[Context, None]) -> Optional[float]:
112
- latency_seconds = await info.context.data_loaders.average_experiment_run_latency.load(
112
+ latency_ms = await info.context.data_loaders.average_experiment_run_latency.load(
113
113
  self.id_attr
114
114
  )
115
- return latency_seconds * 1000 if latency_seconds is not None else None
115
+ return latency_ms
116
116
 
117
117
  @strawberry.field
118
118
  async def project(self, info: Info[Context, None]) -> Optional[Project]:
@@ -35,7 +35,7 @@ from phoenix.server.api.input_types.SpanAnnotationSort import (
35
35
  from phoenix.server.api.types.AnnotationSummary import AnnotationSummary
36
36
  from phoenix.server.api.types.CostBreakdown import CostBreakdown
37
37
  from phoenix.server.api.types.DocumentRetrievalMetrics import DocumentRetrievalMetrics
38
- from phoenix.server.api.types.Evaluation import DocumentEvaluation
38
+ from phoenix.server.api.types.Evaluation import DocumentAnnotation
39
39
  from phoenix.server.api.types.ExampleRevisionInterface import ExampleRevision
40
40
  from phoenix.server.api.types.GenerativeProvider import GenerativeProvider
41
41
  from phoenix.server.api.types.MimeType import MimeType
@@ -638,7 +638,7 @@ class Span(Node):
638
638
  async def document_evaluations(
639
639
  self,
640
640
  info: Info[Context, None],
641
- ) -> list[DocumentEvaluation]:
641
+ ) -> list[DocumentAnnotation]:
642
642
  return await info.context.data_loaders.document_evaluations.load(self.span_rowid)
643
643
 
644
644
  @strawberry.field(
@@ -1,22 +1,22 @@
1
1
  {
2
- "_components-dCdVienD.js": {
3
- "file": "assets/components-dCdVienD.js",
2
+ "_components-BBwXqJXQ.js": {
3
+ "file": "assets/components-BBwXqJXQ.js",
4
4
  "name": "components",
5
5
  "imports": [
6
6
  "_vendor-RdRDaQiR.js",
7
- "_pages-CA4bKhm9.js",
7
+ "_pages-YmQb55Uo.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-CA4bKhm9.js": {
14
- "file": "assets/pages-CA4bKhm9.js",
13
+ "_pages-YmQb55Uo.js": {
14
+ "file": "assets/pages-YmQb55Uo.js",
15
15
  "name": "pages",
16
16
  "imports": [
17
17
  "_vendor-RdRDaQiR.js",
18
18
  "_vendor-arizeai-DsYDNOqt.js",
19
- "_components-dCdVienD.js",
19
+ "_components-BBwXqJXQ.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-Bp44T8N2.js",
78
+ "file": "assets/index-C_gU3x10.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-CA4bKhm9.js",
86
- "_components-dCdVienD.js",
85
+ "_pages-YmQb55Uo.js",
86
+ "_components-BBwXqJXQ.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-CA4bKhm9.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(
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-YmQb55Uo.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-CA4bKhm9.js";import{fR as Qo,cY as Xo,U as Zo,fS as oa,fT as aa,fU as la}from"./components-dCdVienD.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`
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-YmQb55Uo.js";import{fR as Qo,cY as Xo,U as Zo,fS as oa,fT as aa,fU as la}from"./components-BBwXqJXQ.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;