arize-phoenix 4.22.0__py3-none-any.whl → 4.22.1__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-4.22.0.dist-info → arize_phoenix-4.22.1.dist-info}/METADATA +1 -1
- {arize_phoenix-4.22.0.dist-info → arize_phoenix-4.22.1.dist-info}/RECORD +20 -23
- phoenix/experiments/functions.py +4 -4
- phoenix/experiments/types.py +3 -3
- phoenix/server/api/context.py +0 -6
- phoenix/server/api/dataloaders/__init__.py +0 -9
- phoenix/server/api/routers/v1/experiment_runs.py +7 -2
- phoenix/server/api/types/Evaluation.py +1 -26
- phoenix/server/api/types/Project.py +1 -60
- phoenix/server/api/types/Span.py +1 -9
- phoenix/server/app.py +0 -11
- phoenix/server/dml_event_handler.py +0 -3
- phoenix/server/static/.vite/manifest.json +9 -9
- phoenix/server/static/assets/{components-Bhx3QVW0.js → components-BC3-LP_a.js} +1 -1
- phoenix/server/static/assets/{index-CZg-95kd.js → index-BjJvafYL.js} +1 -1
- phoenix/server/static/assets/{pages-DG-5zgoV.js → pages--n2933VW.js} +6 -5
- phoenix/version.py +1 -1
- phoenix/server/api/dataloaders/evaluation_summaries.py +0 -149
- phoenix/server/api/dataloaders/span_evaluations.py +0 -35
- phoenix/server/api/dataloaders/trace_evaluations.py +0 -35
- {arize_phoenix-4.22.0.dist-info → arize_phoenix-4.22.1.dist-info}/WHEEL +0 -0
- {arize_phoenix-4.22.0.dist-info → arize_phoenix-4.22.1.dist-info}/licenses/IP_NOTICE +0 -0
- {arize_phoenix-4.22.0.dist-info → arize_phoenix-4.22.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -5,7 +5,7 @@ phoenix/exceptions.py,sha256=n2L2KKuecrdflB9MsCdAYCiSEvGJptIsfRkXMoJle7A,169
|
|
|
5
5
|
phoenix/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
6
6
|
phoenix/services.py,sha256=aTxhcOA1pZHB6U-B3TEcp6fqDF5oT0xCUvEUNMZVTUQ,5175
|
|
7
7
|
phoenix/settings.py,sha256=cO-qgis_S27nHirTobYI9hHPfZH18R--WMmxNdsVUwc,273
|
|
8
|
-
phoenix/version.py,sha256=
|
|
8
|
+
phoenix/version.py,sha256=o6NOndzGr8AzXGIlB0Kpj1jAyiWB77iB92rO-Vlh2y0,23
|
|
9
9
|
phoenix/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
10
|
phoenix/core/embedding_dimension.py,sha256=zKGbcvwOXgLf-yrJBpQyKtd-LEOPRKHnUToyAU8Owis,87
|
|
11
11
|
phoenix/core/model.py,sha256=km_a--PBHOuA337ClRw9xqhOHhrUT6Rl9pz_zV0JYkQ,4843
|
|
@@ -39,9 +39,9 @@ phoenix/db/migrations/versions/10460e46d750_datasets.py,sha256=eZAyz720DmpOd7Rnu
|
|
|
39
39
|
phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py,sha256=x6oKFwn7Zmite4G0trDQPpMCn0I7jejuBcN3-ivEuDg,3938
|
|
40
40
|
phoenix/db/migrations/versions/cf03bd6bae1d_init.py,sha256=09cpofqje8zi4eQFfUn-i21x7VcsUYOfLKKUlrtKrGc,8662
|
|
41
41
|
phoenix/experiments/__init__.py,sha256=6JGwgUd7xCbGpuHqYZlsmErmYvVgv7N_j43bn3dUqsk,123
|
|
42
|
-
phoenix/experiments/functions.py,sha256=
|
|
42
|
+
phoenix/experiments/functions.py,sha256=WnyBaO6UEesQ1P77GXy-brQSSY9NF1EpAULbtbr4mHo,32228
|
|
43
43
|
phoenix/experiments/tracing.py,sha256=wVpt8Ie9WNPoi1djJdcrkwCokHdTO0bicXViLg3O-1Y,2831
|
|
44
|
-
phoenix/experiments/types.py,sha256=
|
|
44
|
+
phoenix/experiments/types.py,sha256=HegeRSLyx2lESlzAc2PXYQJVHBFbCLwqQQmPcDMdUnM,23433
|
|
45
45
|
phoenix/experiments/utils.py,sha256=wLu5Kvt1b4a8rGPRWq5G8RQ9XSiV8fCIVm51zWBI3-g,758
|
|
46
46
|
phoenix/experiments/evaluators/__init__.py,sha256=j63fi3fa3U7-itVPHa82GowhjQRU-wO6yhO34u_lhsA,714
|
|
47
47
|
phoenix/experiments/evaluators/base.py,sha256=jAwJs-V7jCp2UBChL0S3813Xyd9GN4rU4IEhX0nkFGs,5549
|
|
@@ -68,9 +68,9 @@ phoenix/pointcloud/pointcloud.py,sha256=4zAIkKs2xOUbchpj4XDAV-iPMXrfAJ15TG6rlIYG
|
|
|
68
68
|
phoenix/pointcloud/projectors.py,sha256=zO_RrtDYSv2rqVOfIP2_9Cv11Dc8EmcZR94xhFcBYPU,1057
|
|
69
69
|
phoenix/pointcloud/umap_parameters.py,sha256=3UQSjrysVOvq2V4KNpTMqNqNiK0BsTZnPBHWZ4fyJtQ,1708
|
|
70
70
|
phoenix/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
71
|
-
phoenix/server/app.py,sha256=
|
|
71
|
+
phoenix/server/app.py,sha256=fZYS5Jttj70iHnyDMivXs74oZMAx_gQgdWyNUXs59jE,19407
|
|
72
72
|
phoenix/server/dml_event.py,sha256=MpjCFqljxvgb9OB5Cez9vJesb3oHb3XxXictynBfcis,2851
|
|
73
|
-
phoenix/server/dml_event_handler.py,sha256=
|
|
73
|
+
phoenix/server/dml_event_handler.py,sha256=6p-PucctivelVHfO-_9zNxWZYPr_eGjDF3bKjLtc5co,8251
|
|
74
74
|
phoenix/server/grpc_server.py,sha256=jllxDNkpLQxDkvej4RhTokobowbvydF-SU8gSw1MTCc,3378
|
|
75
75
|
phoenix/server/main.py,sha256=dvjv3g8ANpkvSGCUN02S2Yse643Nlwrp_bj4iXBSVTE,11082
|
|
76
76
|
phoenix/server/prometheus.py,sha256=j9DHB2fERuq_ZKmwVaqR-9wx5WcPPuU1Cm5Bhg5241Y,2996
|
|
@@ -78,12 +78,12 @@ phoenix/server/telemetry.py,sha256=T_2OKrxNViAeaANlNspEekg_Y5uZIFWvKAnpz8Aoqvk,2
|
|
|
78
78
|
phoenix/server/thread_server.py,sha256=RwXQGP_QhGD7le6WB7xEygEEuwBl5Ck_Zo8xGIYGi9M,2135
|
|
79
79
|
phoenix/server/types.py,sha256=UCCkwEzUAbRdu-hZpG7A2hdPM09onBezaXNtWX4A7og,3431
|
|
80
80
|
phoenix/server/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
81
|
-
phoenix/server/api/context.py,sha256=
|
|
81
|
+
phoenix/server/api/context.py,sha256=2-kJpoix-OISxyAhoI5FFEnQMt9ad-3HQ3VOFCjdbxU,2799
|
|
82
82
|
phoenix/server/api/interceptor.py,sha256=ykDnoC_apUd-llVli3m1CW18kNSIgjz2qZ6m5JmPDu8,1294
|
|
83
83
|
phoenix/server/api/queries.py,sha256=Nuw74Nh1XhDkLNV8hTO3WPPNeqcSlNhUF76r5HaytGc,20268
|
|
84
84
|
phoenix/server/api/schema.py,sha256=BcxdqO5CSGqpKd-AAJHMjFlzaK9oJA8GJuxmMfcdjn4,434
|
|
85
85
|
phoenix/server/api/utils.py,sha256=Kl47G-1A7QKTDrc75BU2QK6HupsG6MWuXxy351FOfKQ,858
|
|
86
|
-
phoenix/server/api/dataloaders/__init__.py,sha256=
|
|
86
|
+
phoenix/server/api/dataloaders/__init__.py,sha256=TrOGnU_SD_vEIxOE_dm8HrD5C2ScLFQ4xQ7f8r-E76s,3064
|
|
87
87
|
phoenix/server/api/dataloaders/annotation_summaries.py,sha256=Wv8AORZoGd5TJ4Y-em8iqJu87AMpZP7lWOTr-SML-x8,5560
|
|
88
88
|
phoenix/server/api/dataloaders/average_experiment_run_latency.py,sha256=q091UmkXx37OBKh7L-GJ5LXHyRXfX2w4XTk1NMHtPpw,1827
|
|
89
89
|
phoenix/server/api/dataloaders/dataset_example_revisions.py,sha256=i0g8F4akEf3kQOzAvBjO27QwXNsq-kJEM8dtzduxQgY,3720
|
|
@@ -91,7 +91,6 @@ phoenix/server/api/dataloaders/dataset_example_spans.py,sha256=-TjdyyJv2c2JiN1OX
|
|
|
91
91
|
phoenix/server/api/dataloaders/document_evaluation_summaries.py,sha256=5XOom2KRAmCwPmtlraiZOSl3vhfaW-eiiYkmetAEalw,5616
|
|
92
92
|
phoenix/server/api/dataloaders/document_evaluations.py,sha256=V6sE34jON_qFxt7eArJbktykAsty-gnBZHlEkORcj0E,1296
|
|
93
93
|
phoenix/server/api/dataloaders/document_retrieval_metrics.py,sha256=JqDqkUuoeG6WfcmWSrmQptfF6IPX8XgzYzyECXTAjgg,4202
|
|
94
|
-
phoenix/server/api/dataloaders/evaluation_summaries.py,sha256=FEfUMKgk0uqQlJCS5ynmjkBoJVkqW9EVQ8vhgQ2ReKY,5656
|
|
95
94
|
phoenix/server/api/dataloaders/experiment_annotation_summaries.py,sha256=qDEBRo0XKJMYBYlXBgJ-69jwPK-0r4pi9ZhbjC_vx6M,2813
|
|
96
95
|
phoenix/server/api/dataloaders/experiment_error_rates.py,sha256=wWTFOO2UxGIYUu53nnzzLk04-mJxw-BQgJELA9gT5bY,1949
|
|
97
96
|
phoenix/server/api/dataloaders/experiment_run_counts.py,sha256=8VlKRaXwD56-7q_uonRr7L6QlEkyEQubkFKmKx6vuz0,1661
|
|
@@ -103,10 +102,8 @@ phoenix/server/api/dataloaders/record_counts.py,sha256=64OsyiQRDZASlibpQAXtRkzyA
|
|
|
103
102
|
phoenix/server/api/dataloaders/span_annotations.py,sha256=v3vGkLGTn-n4khxXZY2btgvfXitvytWgBahzrrWEz0I,1078
|
|
104
103
|
phoenix/server/api/dataloaders/span_dataset_examples.py,sha256=BtLZp11fyyeaWGGBPZj2StzFM0m5jxt52zB2nFMVybo,1306
|
|
105
104
|
phoenix/server/api/dataloaders/span_descendants.py,sha256=b7jGTn0Hi22gv2yskloLnf3BG3upS9z5hnKLMT9Sxac,2094
|
|
106
|
-
phoenix/server/api/dataloaders/span_evaluations.py,sha256=IfwXW23GQaWti8F49wSJocWf7Tklf2ZJ0F6aB4cSVHs,1248
|
|
107
105
|
phoenix/server/api/dataloaders/span_projects.py,sha256=LbQWiboCFqq4CHS18OzvRUwL9yORqP26fh5p7JbpFdg,1244
|
|
108
106
|
phoenix/server/api/dataloaders/token_counts.py,sha256=6gDVely8BYiCBdmiq1ECO0lMChUYPIlsZbB34rmL1xM,4684
|
|
109
|
-
phoenix/server/api/dataloaders/trace_evaluations.py,sha256=vraPehNsausR4dbdvq-HudRVNARJUbep3T-Ud9jwWYY,1262
|
|
110
107
|
phoenix/server/api/dataloaders/trace_row_ids.py,sha256=RODX4NULlBzMxHMrsq0dp1ij6ZlLH4ZzQBnafGdxOvU,1100
|
|
111
108
|
phoenix/server/api/dataloaders/cache/__init__.py,sha256=SYoOM9n8FJaMdQarma5d1blu-jIg2GB8Shqg5ezSzZ8,106
|
|
112
109
|
phoenix/server/api/dataloaders/cache/two_tier_cache.py,sha256=I38L1RsOis98OQftE7n1Q9QBZfFJO6OW_qIINkuJllo,2295
|
|
@@ -157,7 +154,7 @@ phoenix/server/api/routers/v1/__init__.py,sha256=nb49zcOdAi3DSGuC9gUubN9Yri-o7-W
|
|
|
157
154
|
phoenix/server/api/routers/v1/datasets.py,sha256=pyLtVEGnjwxh1wJySBOUFrsjtawatfpaF8F3WijK8qU,37049
|
|
158
155
|
phoenix/server/api/routers/v1/evaluations.py,sha256=FSfz9MTi8s65F07abDXlb9-y97fDZSYbqsCXpimwO7g,12628
|
|
159
156
|
phoenix/server/api/routers/v1/experiment_evaluations.py,sha256=RTQnjupjmh07xowjq77ajbuAZhzIEfYxA4ZtECvGwOU,4844
|
|
160
|
-
phoenix/server/api/routers/v1/experiment_runs.py,sha256=
|
|
157
|
+
phoenix/server/api/routers/v1/experiment_runs.py,sha256=0G7GgGcZv9dzK47tsPp-p4k5O7W4F_aNRrsNuJN7mho,6393
|
|
161
158
|
phoenix/server/api/routers/v1/experiments.py,sha256=GeT3Rya4bdaCr6sCf2Vx6fQ_gfMX5XyFHmODCSJiCfU,9951
|
|
162
159
|
phoenix/server/api/routers/v1/pydantic_compat.py,sha256=FeK8oe2brqu-djsoqRxiKL4tw5cHmi89OHVfCFxYsAo,2890
|
|
163
160
|
phoenix/server/api/routers/v1/spans.py,sha256=Hd63VHQUqSy0VHsYQ5DPLf5WwKALMXZOIh_ig_5MStc,8780
|
|
@@ -183,7 +180,7 @@ phoenix/server/api/types/DocumentEvaluationSummary.py,sha256=EpgKn0uiH2Vbpyltc1M
|
|
|
183
180
|
phoenix/server/api/types/DocumentRetrievalMetrics.py,sha256=amkpC3H5IU5-9GvO0telpbq00m6lIcv_2v446OpwFwc,1822
|
|
184
181
|
phoenix/server/api/types/EmbeddingDimension.py,sha256=2OTVzAcfY-2xnJLl7122EAaqJyp0sob1v9-ryaNWknw,18961
|
|
185
182
|
phoenix/server/api/types/EmbeddingMetadata.py,sha256=fJvNNYCbkf3SJalArLy9rcBq9Uj1SNac60zjqe1PFnM,461
|
|
186
|
-
phoenix/server/api/types/Evaluation.py,sha256=
|
|
183
|
+
phoenix/server/api/types/Evaluation.py,sha256=rLJptUSRUPPx9sdUyc4UPWxzkr9gcKtkpAS5Zi_EyFQ,2406
|
|
187
184
|
phoenix/server/api/types/EvaluationSummary.py,sha256=N1DhPXGhBbOOQakF43OGuZ5fl4vye7Uc-HnW5M262F8,1518
|
|
188
185
|
phoenix/server/api/types/Event.py,sha256=XdYgaIxcVIW-YFViCkxj5l9OaVNepyIrCtm5Iqg2le8,3989
|
|
189
186
|
phoenix/server/api/types/EventMetadata.py,sha256=-J0tYF9eZTHwCjwxQHY7Gckr2_MNW5OoWT1mydweZNM,635
|
|
@@ -202,13 +199,13 @@ phoenix/server/api/types/MimeType.py,sha256=Zpi6zCalkSFgsvhzvOs-O1gYA04usAi9H__Q
|
|
|
202
199
|
phoenix/server/api/types/Model.py,sha256=BRIzH5xSGiDrAUYvhwDpwxT6--ddS3Xr3vCvP8_vzdo,8051
|
|
203
200
|
phoenix/server/api/types/NumericRange.py,sha256=afEjgF97Go_OvmjMggbPBt-zGM8IONewAyEiKEHRds0,192
|
|
204
201
|
phoenix/server/api/types/PerformanceMetric.py,sha256=W92B7OghEOgzFvmY0LCqpgavHaQggTGshdgfD0yqHX4,350
|
|
205
|
-
phoenix/server/api/types/Project.py,sha256=
|
|
202
|
+
phoenix/server/api/types/Project.py,sha256=CZ5Hl9fNeHiW8MfSbzXGBYP3A7jw0GubWqtHmzW-bUM,13299
|
|
206
203
|
phoenix/server/api/types/PromptResponse.py,sha256=Q8HKtpp8GpUOcxPCzZpkkokidDd6u0aZOv_SuPZZd5Q,630
|
|
207
204
|
phoenix/server/api/types/Retrieval.py,sha256=OhMK2ncjoyp5h1yjKhjlKpoTbQrMHuxmgSFw-AO1rWw,285
|
|
208
205
|
phoenix/server/api/types/ScalarDriftMetricEnum.py,sha256=IUAcRPpgL41WdoIgK6cNk2Te38SspXGyEs-S1fY23_A,232
|
|
209
206
|
phoenix/server/api/types/Segments.py,sha256=m2yoegrxA1Tn7ZAy1rMjjD1isc752MaAXMoffkBlvrM,2921
|
|
210
207
|
phoenix/server/api/types/SortDir.py,sha256=OUpXhlCzCxPoXSDkJJygEs9Rw9pMymfaZUG5zPTrw4Y,152
|
|
211
|
-
phoenix/server/api/types/Span.py,sha256=
|
|
208
|
+
phoenix/server/api/types/Span.py,sha256=ypzCF70a22QH7e7N8UQbO3FPtsPnAUxqqnq7UlcdGV4,14373
|
|
212
209
|
phoenix/server/api/types/SpanAnnotation.py,sha256=6b5G-b_OoRvDL2ayWk7MkbqarLK-F-pQMx21CpUuNGY,1168
|
|
213
210
|
phoenix/server/api/types/TimeSeries.py,sha256=wjzuxHFqCey0O7Ys25qiXyuqXK8an-osyNWUE8A_8G4,5227
|
|
214
211
|
phoenix/server/api/types/Trace.py,sha256=-nh3A-S_BlQK1VSSOTWqM85l-WwJsRHifxeDi0sFWZE,3246
|
|
@@ -230,10 +227,10 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
|
|
|
230
227
|
phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
|
|
231
228
|
phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
|
|
232
229
|
phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
|
|
233
|
-
phoenix/server/static/.vite/manifest.json,sha256=
|
|
234
|
-
phoenix/server/static/assets/components-
|
|
235
|
-
phoenix/server/static/assets/index-
|
|
236
|
-
phoenix/server/static/assets/pages
|
|
230
|
+
phoenix/server/static/.vite/manifest.json,sha256=D9OZ5VZQ3XozxyFU4FF1fd4MmUGkyB_xa67tlUi1NWI,1929
|
|
231
|
+
phoenix/server/static/assets/components-BC3-LP_a.js,sha256=LnC6sDg6caKtsMyIno5Dw7Ure5BGAReRrsn5XBCcP50,187118
|
|
232
|
+
phoenix/server/static/assets/index-BjJvafYL.js,sha256=dz-kVZPp63OEi2l0SYVU5PeimOsUgW3VQQdYdnoZLQE,7362
|
|
233
|
+
phoenix/server/static/assets/pages--n2933VW.js,sha256=WJZ6L_bWgzgJc3EAcbwbzuGADKEcZfMBwSVjDHhKslQ,452799
|
|
237
234
|
phoenix/server/static/assets/vendor-BMWfu6zp.js,sha256=AAVTM5SjGUI_CmAWFUFmhpp5VDhvCD-MrEoh-pXXADY,1355423
|
|
238
235
|
phoenix/server/static/assets/vendor-DxkFTwjz.css,sha256=nZrkr0u6NNElFGvpWHk9GTHeGoibCXCli1bE7mXZGZg,1816
|
|
239
236
|
phoenix/server/static/assets/vendor-arizeai-Sj74jm5V.js,sha256=9lD4YeMt5WtyfrqIApcH9WFQxyJJUtth0syWabkzX-I,304008
|
|
@@ -284,8 +281,8 @@ phoenix/utilities/logging.py,sha256=lDXd6EGaamBNcQxL4vP1au9-i_SXe0OraUDiJOcszSw,
|
|
|
284
281
|
phoenix/utilities/project.py,sha256=8IJuMM4yUMoooPi37sictGj8Etu9rGmq6RFtc9848cQ,436
|
|
285
282
|
phoenix/utilities/re.py,sha256=PDve_OLjRTM8yQQJHC8-n3HdIONi7aNils3ZKRZ5uBM,2045
|
|
286
283
|
phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
287
|
-
arize_phoenix-4.22.
|
|
288
|
-
arize_phoenix-4.22.
|
|
289
|
-
arize_phoenix-4.22.
|
|
290
|
-
arize_phoenix-4.22.
|
|
291
|
-
arize_phoenix-4.22.
|
|
284
|
+
arize_phoenix-4.22.1.dist-info/METADATA,sha256=aMe9GmDUEAXZE2A5wixJeuulWvcq7dA7U4FGnGVVCf8,11902
|
|
285
|
+
arize_phoenix-4.22.1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
|
286
|
+
arize_phoenix-4.22.1.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
|
|
287
|
+
arize_phoenix-4.22.1.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
|
|
288
|
+
arize_phoenix-4.22.1.dist-info/RECORD,,
|
phoenix/experiments/functions.py
CHANGED
|
@@ -447,14 +447,14 @@ def evaluate_experiment(
|
|
|
447
447
|
)
|
|
448
448
|
if not dataset.examples:
|
|
449
449
|
raise ValueError(f"Dataset has no examples: {dataset_id=}, {dataset_version_id=}")
|
|
450
|
-
experiment_runs =
|
|
451
|
-
ExperimentRun.from_dict(exp_run)
|
|
450
|
+
experiment_runs = {
|
|
451
|
+
exp_run["id"]: ExperimentRun.from_dict(exp_run)
|
|
452
452
|
for exp_run in sync_client.get(f"/v1/experiments/{experiment.id}/runs").json()["data"]
|
|
453
|
-
|
|
453
|
+
}
|
|
454
454
|
if not experiment_runs:
|
|
455
455
|
raise ValueError("Experiment has not been run")
|
|
456
456
|
params = ExperimentParameters(n_examples=len(dataset.examples))
|
|
457
|
-
task_summary = TaskSummary.from_task_runs(params, experiment_runs)
|
|
457
|
+
task_summary = TaskSummary.from_task_runs(params, experiment_runs.values())
|
|
458
458
|
ran_experiment = object.__new__(RanExperiment)
|
|
459
459
|
ran_experiment.__init__( # type: ignore[misc]
|
|
460
460
|
dataset=dataset,
|
phoenix/experiments/types.py
CHANGED
|
@@ -167,7 +167,7 @@ class Dataset:
|
|
|
167
167
|
def from_dict(cls, obj: Mapping[str, Any]) -> Dataset:
|
|
168
168
|
examples = tuple(map(Example.from_dict, obj.get("examples") or ()))
|
|
169
169
|
return cls(
|
|
170
|
-
id=obj["
|
|
170
|
+
id=obj["dataset_id"],
|
|
171
171
|
version_id=obj["version_id"],
|
|
172
172
|
examples={ex.id: ex for ex in examples},
|
|
173
173
|
)
|
|
@@ -225,7 +225,7 @@ class ExperimentRun:
|
|
|
225
225
|
)
|
|
226
226
|
|
|
227
227
|
def __post_init__(self) -> None:
|
|
228
|
-
if
|
|
228
|
+
if self.output is None and self.error is None:
|
|
229
229
|
raise ValueError("Must specify exactly one of experiment_run_output or error")
|
|
230
230
|
|
|
231
231
|
|
|
@@ -284,7 +284,7 @@ class ExperimentEvaluationRun:
|
|
|
284
284
|
)
|
|
285
285
|
|
|
286
286
|
def __post_init__(self) -> None:
|
|
287
|
-
if
|
|
287
|
+
if self.result is None and self.error is None:
|
|
288
288
|
raise ValueError("Must specify either result or error")
|
|
289
289
|
|
|
290
290
|
|
phoenix/server/api/context.py
CHANGED
|
@@ -14,7 +14,6 @@ from phoenix.server.api.dataloaders import (
|
|
|
14
14
|
DocumentEvaluationsDataLoader,
|
|
15
15
|
DocumentEvaluationSummaryDataLoader,
|
|
16
16
|
DocumentRetrievalMetricsDataLoader,
|
|
17
|
-
EvaluationSummaryDataLoader,
|
|
18
17
|
ExperimentAnnotationSummaryDataLoader,
|
|
19
18
|
ExperimentErrorRatesDataLoader,
|
|
20
19
|
ExperimentRunCountsDataLoader,
|
|
@@ -26,10 +25,8 @@ from phoenix.server.api.dataloaders import (
|
|
|
26
25
|
SpanAnnotationsDataLoader,
|
|
27
26
|
SpanDatasetExamplesDataLoader,
|
|
28
27
|
SpanDescendantsDataLoader,
|
|
29
|
-
SpanEvaluationsDataLoader,
|
|
30
28
|
SpanProjectsDataLoader,
|
|
31
29
|
TokenCountDataLoader,
|
|
32
|
-
TraceEvaluationsDataLoader,
|
|
33
30
|
TraceRowIdsDataLoader,
|
|
34
31
|
)
|
|
35
32
|
from phoenix.server.dml_event import DmlEvent
|
|
@@ -45,7 +42,6 @@ class DataLoaders:
|
|
|
45
42
|
document_evaluations: DocumentEvaluationsDataLoader
|
|
46
43
|
document_retrieval_metrics: DocumentRetrievalMetricsDataLoader
|
|
47
44
|
annotation_summaries: AnnotationSummaryDataLoader
|
|
48
|
-
evaluation_summaries: EvaluationSummaryDataLoader
|
|
49
45
|
experiment_annotation_summaries: ExperimentAnnotationSummaryDataLoader
|
|
50
46
|
experiment_error_rates: ExperimentErrorRatesDataLoader
|
|
51
47
|
experiment_run_counts: ExperimentRunCountsDataLoader
|
|
@@ -56,10 +52,8 @@ class DataLoaders:
|
|
|
56
52
|
span_annotations: SpanAnnotationsDataLoader
|
|
57
53
|
span_dataset_examples: SpanDatasetExamplesDataLoader
|
|
58
54
|
span_descendants: SpanDescendantsDataLoader
|
|
59
|
-
span_evaluations: SpanEvaluationsDataLoader
|
|
60
55
|
span_projects: SpanProjectsDataLoader
|
|
61
56
|
token_counts: TokenCountDataLoader
|
|
62
|
-
trace_evaluations: TraceEvaluationsDataLoader
|
|
63
57
|
trace_row_ids: TraceRowIdsDataLoader
|
|
64
58
|
project_by_name: ProjectByNameDataLoader
|
|
65
59
|
|
|
@@ -10,7 +10,6 @@ from .document_evaluation_summaries import (
|
|
|
10
10
|
)
|
|
11
11
|
from .document_evaluations import DocumentEvaluationsDataLoader
|
|
12
12
|
from .document_retrieval_metrics import DocumentRetrievalMetricsDataLoader
|
|
13
|
-
from .evaluation_summaries import EvaluationSummaryCache, EvaluationSummaryDataLoader
|
|
14
13
|
from .experiment_annotation_summaries import ExperimentAnnotationSummaryDataLoader
|
|
15
14
|
from .experiment_error_rates import ExperimentErrorRatesDataLoader
|
|
16
15
|
from .experiment_run_counts import ExperimentRunCountsDataLoader
|
|
@@ -22,10 +21,8 @@ from .record_counts import RecordCountCache, RecordCountDataLoader
|
|
|
22
21
|
from .span_annotations import SpanAnnotationsDataLoader
|
|
23
22
|
from .span_dataset_examples import SpanDatasetExamplesDataLoader
|
|
24
23
|
from .span_descendants import SpanDescendantsDataLoader
|
|
25
|
-
from .span_evaluations import SpanEvaluationsDataLoader
|
|
26
24
|
from .span_projects import SpanProjectsDataLoader
|
|
27
25
|
from .token_counts import TokenCountCache, TokenCountDataLoader
|
|
28
|
-
from .trace_evaluations import TraceEvaluationsDataLoader
|
|
29
26
|
from .trace_row_ids import TraceRowIdsDataLoader
|
|
30
27
|
|
|
31
28
|
__all__ = [
|
|
@@ -37,7 +34,6 @@ __all__ = [
|
|
|
37
34
|
"DocumentEvaluationsDataLoader",
|
|
38
35
|
"DocumentRetrievalMetricsDataLoader",
|
|
39
36
|
"AnnotationSummaryDataLoader",
|
|
40
|
-
"EvaluationSummaryDataLoader",
|
|
41
37
|
"ExperimentAnnotationSummaryDataLoader",
|
|
42
38
|
"ExperimentErrorRatesDataLoader",
|
|
43
39
|
"ExperimentRunCountsDataLoader",
|
|
@@ -47,10 +43,8 @@ __all__ = [
|
|
|
47
43
|
"RecordCountDataLoader",
|
|
48
44
|
"SpanDatasetExamplesDataLoader",
|
|
49
45
|
"SpanDescendantsDataLoader",
|
|
50
|
-
"SpanEvaluationsDataLoader",
|
|
51
46
|
"SpanProjectsDataLoader",
|
|
52
47
|
"TokenCountDataLoader",
|
|
53
|
-
"TraceEvaluationsDataLoader",
|
|
54
48
|
"TraceRowIdsDataLoader",
|
|
55
49
|
"ProjectByNameDataLoader",
|
|
56
50
|
"SpanAnnotationsDataLoader",
|
|
@@ -65,9 +59,6 @@ class CacheForDataLoaders:
|
|
|
65
59
|
annotation_summary: AnnotationSummaryCache = field(
|
|
66
60
|
default_factory=AnnotationSummaryCache,
|
|
67
61
|
)
|
|
68
|
-
evaluation_summary: EvaluationSummaryCache = field(
|
|
69
|
-
default_factory=EvaluationSummaryCache,
|
|
70
|
-
)
|
|
71
62
|
latency_ms_quantile: LatencyMsQuantileCache = field(
|
|
72
63
|
default_factory=LatencyMsQuantileCache,
|
|
73
64
|
)
|
|
@@ -108,7 +108,12 @@ async def create_experiment_run(
|
|
|
108
108
|
return CreateExperimentResponseBody(data=CreateExperimentRunResponseBodyData(id=str(run_gid)))
|
|
109
109
|
|
|
110
110
|
|
|
111
|
-
class
|
|
111
|
+
class ExperimentRunResponse(ExperimentRun):
|
|
112
|
+
id: str = Field(description="The ID of the experiment run")
|
|
113
|
+
experiment_id: str = Field(description="The ID of the experiment")
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class ListExperimentRunsResponseBody(ResponseBody[List[ExperimentRunResponse]]):
|
|
112
117
|
pass
|
|
113
118
|
|
|
114
119
|
|
|
@@ -147,7 +152,7 @@ async def list_experiment_runs(
|
|
|
147
152
|
experiment_gid = GlobalID("Experiment", str(exp_run.experiment_id))
|
|
148
153
|
example_gid = GlobalID("DatasetExample", str(exp_run.dataset_example_id))
|
|
149
154
|
runs.append(
|
|
150
|
-
|
|
155
|
+
ExperimentRunResponse(
|
|
151
156
|
start_time=exp_run.start_time,
|
|
152
157
|
end_time=exp_run.end_time,
|
|
153
158
|
experiment_id=str(experiment_gid),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import strawberry
|
|
2
2
|
|
|
3
3
|
import phoenix.trace.v1 as pb
|
|
4
|
-
from phoenix.db.models import DocumentAnnotation,
|
|
4
|
+
from phoenix.db.models import DocumentAnnotation, TraceAnnotation
|
|
5
5
|
|
|
6
6
|
from .Annotation import Annotation
|
|
7
7
|
|
|
@@ -31,31 +31,6 @@ class TraceEvaluation(Annotation):
|
|
|
31
31
|
)
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
@strawberry.type
|
|
35
|
-
class SpanEvaluation(Annotation):
|
|
36
|
-
@staticmethod
|
|
37
|
-
def from_pb_evaluation(evaluation: pb.Evaluation) -> "SpanEvaluation":
|
|
38
|
-
result = evaluation.result
|
|
39
|
-
score = result.score.value if result.HasField("score") else None
|
|
40
|
-
label = result.label.value if result.HasField("label") else None
|
|
41
|
-
explanation = result.explanation.value if result.HasField("explanation") else None
|
|
42
|
-
return SpanEvaluation(
|
|
43
|
-
name=evaluation.name,
|
|
44
|
-
score=score,
|
|
45
|
-
label=label,
|
|
46
|
-
explanation=explanation,
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
@staticmethod
|
|
50
|
-
def from_sql_span_annotation(annotation: SpanAnnotation) -> "SpanEvaluation":
|
|
51
|
-
return SpanEvaluation(
|
|
52
|
-
name=annotation.name,
|
|
53
|
-
score=annotation.score,
|
|
54
|
-
label=annotation.label,
|
|
55
|
-
explanation=annotation.explanation,
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
|
|
59
34
|
@strawberry.type
|
|
60
35
|
class DocumentEvaluation(Annotation):
|
|
61
36
|
document_position: int = strawberry.field(
|
|
@@ -24,7 +24,6 @@ from phoenix.server.api.input_types.SpanSort import SpanSort, SpanSortConfig
|
|
|
24
24
|
from phoenix.server.api.input_types.TimeRange import TimeRange
|
|
25
25
|
from phoenix.server.api.types.AnnotationSummary import AnnotationSummary
|
|
26
26
|
from phoenix.server.api.types.DocumentEvaluationSummary import DocumentEvaluationSummary
|
|
27
|
-
from phoenix.server.api.types.EvaluationSummary import EvaluationSummary
|
|
28
27
|
from phoenix.server.api.types.pagination import (
|
|
29
28
|
Cursor,
|
|
30
29
|
CursorSortColumn,
|
|
@@ -249,23 +248,6 @@ class Project(Node):
|
|
|
249
248
|
has_next_page=has_next_page,
|
|
250
249
|
)
|
|
251
250
|
|
|
252
|
-
@strawberry.field(
|
|
253
|
-
description="Names of all available evaluations for traces. "
|
|
254
|
-
"(The list contains no duplicates.)"
|
|
255
|
-
) # type: ignore
|
|
256
|
-
async def trace_evaluation_names(
|
|
257
|
-
self,
|
|
258
|
-
info: Info[Context, None],
|
|
259
|
-
) -> List[str]:
|
|
260
|
-
stmt = (
|
|
261
|
-
select(distinct(models.TraceAnnotation.name))
|
|
262
|
-
.join(models.Trace)
|
|
263
|
-
.where(models.Trace.project_rowid == self.id_attr)
|
|
264
|
-
.where(models.TraceAnnotation.annotator_kind == "LLM")
|
|
265
|
-
)
|
|
266
|
-
async with info.context.db() as session:
|
|
267
|
-
return list(await session.scalars(stmt))
|
|
268
|
-
|
|
269
251
|
@strawberry.field(
|
|
270
252
|
description="Names of all available annotations for traces. "
|
|
271
253
|
"(The list contains no duplicates.)"
|
|
@@ -282,24 +264,6 @@ class Project(Node):
|
|
|
282
264
|
async with info.context.db() as session:
|
|
283
265
|
return list(await session.scalars(stmt))
|
|
284
266
|
|
|
285
|
-
@strawberry.field(
|
|
286
|
-
description="Names of all available evaluations for spans. "
|
|
287
|
-
"(The list contains no duplicates.)"
|
|
288
|
-
) # type: ignore
|
|
289
|
-
async def span_evaluation_names(
|
|
290
|
-
self,
|
|
291
|
-
info: Info[Context, None],
|
|
292
|
-
) -> List[str]:
|
|
293
|
-
stmt = (
|
|
294
|
-
select(distinct(models.SpanAnnotation.name))
|
|
295
|
-
.join(models.Span)
|
|
296
|
-
.join(models.Trace, models.Span.trace_rowid == models.Trace.id)
|
|
297
|
-
.where(models.Trace.project_rowid == self.id_attr)
|
|
298
|
-
.where(models.SpanAnnotation.annotator_kind == "LLM")
|
|
299
|
-
)
|
|
300
|
-
async with info.context.db() as session:
|
|
301
|
-
return list(await session.scalars(stmt))
|
|
302
|
-
|
|
303
267
|
@strawberry.field(
|
|
304
268
|
description="Names of all available annotations for spans. "
|
|
305
269
|
"(The list contains no duplicates.)"
|
|
@@ -337,29 +301,6 @@ class Project(Node):
|
|
|
337
301
|
async with info.context.db() as session:
|
|
338
302
|
return list(await session.scalars(stmt))
|
|
339
303
|
|
|
340
|
-
@strawberry.field
|
|
341
|
-
async def trace_evaluation_summary(
|
|
342
|
-
self,
|
|
343
|
-
info: Info[Context, None],
|
|
344
|
-
evaluation_name: str,
|
|
345
|
-
time_range: Optional[TimeRange] = UNSET,
|
|
346
|
-
) -> Optional[EvaluationSummary]:
|
|
347
|
-
return await info.context.data_loaders.evaluation_summaries.load(
|
|
348
|
-
("trace", self.id_attr, time_range, None, evaluation_name),
|
|
349
|
-
)
|
|
350
|
-
|
|
351
|
-
@strawberry.field
|
|
352
|
-
async def span_evaluation_summary(
|
|
353
|
-
self,
|
|
354
|
-
info: Info[Context, None],
|
|
355
|
-
evaluation_name: str,
|
|
356
|
-
time_range: Optional[TimeRange] = UNSET,
|
|
357
|
-
filter_condition: Optional[str] = UNSET,
|
|
358
|
-
) -> Optional[EvaluationSummary]:
|
|
359
|
-
return await info.context.data_loaders.evaluation_summaries.load(
|
|
360
|
-
("span", self.id_attr, time_range, filter_condition, evaluation_name),
|
|
361
|
-
)
|
|
362
|
-
|
|
363
304
|
@strawberry.field
|
|
364
305
|
async def trace_annotation_summary(
|
|
365
306
|
self,
|
|
@@ -405,7 +346,7 @@ class Project(Node):
|
|
|
405
346
|
@strawberry.field
|
|
406
347
|
async def validate_span_filter_condition(self, condition: str) -> ValidationResult:
|
|
407
348
|
# This query is too expensive to run on every validation
|
|
408
|
-
# valid_eval_names = await self.
|
|
349
|
+
# valid_eval_names = await self.span_annotation_names()
|
|
409
350
|
try:
|
|
410
351
|
SpanFilter(
|
|
411
352
|
condition=condition,
|
phoenix/server/api/types/Span.py
CHANGED
|
@@ -28,7 +28,7 @@ from phoenix.server.api.types.SpanAnnotation import to_gql_span_annotation
|
|
|
28
28
|
from phoenix.trace.attributes import get_attribute_value
|
|
29
29
|
|
|
30
30
|
from .DocumentRetrievalMetrics import DocumentRetrievalMetrics
|
|
31
|
-
from .Evaluation import DocumentEvaluation
|
|
31
|
+
from .Evaluation import DocumentEvaluation
|
|
32
32
|
from .ExampleRevisionInterface import ExampleRevision
|
|
33
33
|
from .MimeType import MimeType
|
|
34
34
|
from .SpanAnnotation import SpanAnnotation
|
|
@@ -170,14 +170,6 @@ class Span(Node):
|
|
|
170
170
|
"codes from descendant spans (children, grandchildren, etc.)",
|
|
171
171
|
)
|
|
172
172
|
|
|
173
|
-
@strawberry.field(
|
|
174
|
-
description="Evaluations associated with the span, e.g. if the span is "
|
|
175
|
-
"an LLM, an evaluation may assess the helpfulness of its response with "
|
|
176
|
-
"respect to its input."
|
|
177
|
-
) # type: ignore
|
|
178
|
-
async def span_evaluations(self, info: Info[Context, None]) -> List[SpanEvaluation]:
|
|
179
|
-
return await info.context.data_loaders.span_evaluations.load(self.id_attr)
|
|
180
|
-
|
|
181
173
|
@strawberry.field(
|
|
182
174
|
description=(
|
|
183
175
|
"Annotations associated with the span. This encompasses both "
|
phoenix/server/app.py
CHANGED
|
@@ -65,7 +65,6 @@ from phoenix.server.api.dataloaders import (
|
|
|
65
65
|
DocumentEvaluationsDataLoader,
|
|
66
66
|
DocumentEvaluationSummaryDataLoader,
|
|
67
67
|
DocumentRetrievalMetricsDataLoader,
|
|
68
|
-
EvaluationSummaryDataLoader,
|
|
69
68
|
ExperimentAnnotationSummaryDataLoader,
|
|
70
69
|
ExperimentErrorRatesDataLoader,
|
|
71
70
|
ExperimentRunCountsDataLoader,
|
|
@@ -77,10 +76,8 @@ from phoenix.server.api.dataloaders import (
|
|
|
77
76
|
SpanAnnotationsDataLoader,
|
|
78
77
|
SpanDatasetExamplesDataLoader,
|
|
79
78
|
SpanDescendantsDataLoader,
|
|
80
|
-
SpanEvaluationsDataLoader,
|
|
81
79
|
SpanProjectsDataLoader,
|
|
82
80
|
TokenCountDataLoader,
|
|
83
|
-
TraceEvaluationsDataLoader,
|
|
84
81
|
TraceRowIdsDataLoader,
|
|
85
82
|
)
|
|
86
83
|
from phoenix.server.api.routers.v1 import REST_API_VERSION
|
|
@@ -303,12 +300,6 @@ def create_graphql_router(
|
|
|
303
300
|
if cache_for_dataloaders
|
|
304
301
|
else None,
|
|
305
302
|
),
|
|
306
|
-
evaluation_summaries=EvaluationSummaryDataLoader(
|
|
307
|
-
db,
|
|
308
|
-
cache_map=cache_for_dataloaders.evaluation_summary
|
|
309
|
-
if cache_for_dataloaders
|
|
310
|
-
else None,
|
|
311
|
-
),
|
|
312
303
|
experiment_annotation_summaries=ExperimentAnnotationSummaryDataLoader(db),
|
|
313
304
|
experiment_error_rates=ExperimentErrorRatesDataLoader(db),
|
|
314
305
|
experiment_run_counts=ExperimentRunCountsDataLoader(db),
|
|
@@ -332,13 +323,11 @@ def create_graphql_router(
|
|
|
332
323
|
span_annotations=SpanAnnotationsDataLoader(db),
|
|
333
324
|
span_dataset_examples=SpanDatasetExamplesDataLoader(db),
|
|
334
325
|
span_descendants=SpanDescendantsDataLoader(db),
|
|
335
|
-
span_evaluations=SpanEvaluationsDataLoader(db),
|
|
336
326
|
span_projects=SpanProjectsDataLoader(db),
|
|
337
327
|
token_counts=TokenCountDataLoader(
|
|
338
328
|
db,
|
|
339
329
|
cache_map=cache_for_dataloaders.token_count if cache_for_dataloaders else None,
|
|
340
330
|
),
|
|
341
|
-
trace_evaluations=TraceEvaluationsDataLoader(db),
|
|
342
331
|
trace_row_ids=TraceRowIdsDataLoader(db),
|
|
343
332
|
project_by_name=ProjectByNameDataLoader(db),
|
|
344
333
|
),
|
|
@@ -142,7 +142,6 @@ class _SpanDeleteEventHandler(_SpanDmlEventHandler):
|
|
|
142
142
|
@staticmethod
|
|
143
143
|
def _clear(cache: CacheForDataLoaders, project_id: int) -> None:
|
|
144
144
|
cache.annotation_summary.invalidate_project(project_id)
|
|
145
|
-
cache.evaluation_summary.invalidate_project(project_id)
|
|
146
145
|
cache.document_evaluation_summary.invalidate_project(project_id)
|
|
147
146
|
|
|
148
147
|
|
|
@@ -201,7 +200,6 @@ class _SpanAnnotationDmlEventHandler(_AnnotationDmlEventHandler[SpanAnnotationDm
|
|
|
201
200
|
@staticmethod
|
|
202
201
|
def _clear(cache: CacheForDataLoaders, project_id: int, name: str) -> None:
|
|
203
202
|
cache.annotation_summary.invalidate((project_id, name, "span"))
|
|
204
|
-
cache.evaluation_summary.invalidate((project_id, name, "span"))
|
|
205
203
|
|
|
206
204
|
|
|
207
205
|
class _TraceAnnotationDmlEventHandler(_AnnotationDmlEventHandler[TraceAnnotationDmlEvent]):
|
|
@@ -214,7 +212,6 @@ class _TraceAnnotationDmlEventHandler(_AnnotationDmlEventHandler[TraceAnnotation
|
|
|
214
212
|
@staticmethod
|
|
215
213
|
def _clear(cache: CacheForDataLoaders, project_id: int, name: str) -> None:
|
|
216
214
|
cache.annotation_summary.invalidate((project_id, name, "trace"))
|
|
217
|
-
cache.evaluation_summary.invalidate((project_id, name, "trace"))
|
|
218
215
|
|
|
219
216
|
|
|
220
217
|
class _DocumentAnnotationDmlEventHandler(_AnnotationDmlEventHandler[DocumentAnnotationDmlEvent]):
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_components-
|
|
3
|
-
"file": "assets/components-
|
|
2
|
+
"_components-BC3-LP_a.js": {
|
|
3
|
+
"file": "assets/components-BC3-LP_a.js",
|
|
4
4
|
"name": "components",
|
|
5
5
|
"imports": [
|
|
6
6
|
"_vendor-BMWfu6zp.js",
|
|
7
7
|
"_vendor-arizeai-Sj74jm5V.js",
|
|
8
|
-
"_pages
|
|
8
|
+
"_pages--n2933VW.js",
|
|
9
9
|
"_vendor-three-DwGkEfCM.js",
|
|
10
10
|
"_vendor-codemirror-DO3VqEcD.js"
|
|
11
11
|
]
|
|
12
12
|
},
|
|
13
|
-
"_pages
|
|
14
|
-
"file": "assets/pages
|
|
13
|
+
"_pages--n2933VW.js": {
|
|
14
|
+
"file": "assets/pages--n2933VW.js",
|
|
15
15
|
"name": "pages",
|
|
16
16
|
"imports": [
|
|
17
17
|
"_vendor-BMWfu6zp.js",
|
|
18
|
-
"_components-
|
|
18
|
+
"_components-BC3-LP_a.js",
|
|
19
19
|
"_vendor-arizeai-Sj74jm5V.js",
|
|
20
20
|
"_vendor-recharts-BGN0SxgJ.js",
|
|
21
21
|
"_vendor-codemirror-DO3VqEcD.js"
|
|
@@ -61,15 +61,15 @@
|
|
|
61
61
|
"name": "vendor-three"
|
|
62
62
|
},
|
|
63
63
|
"index.tsx": {
|
|
64
|
-
"file": "assets/index-
|
|
64
|
+
"file": "assets/index-BjJvafYL.js",
|
|
65
65
|
"name": "index",
|
|
66
66
|
"src": "index.tsx",
|
|
67
67
|
"isEntry": true,
|
|
68
68
|
"imports": [
|
|
69
69
|
"_vendor-BMWfu6zp.js",
|
|
70
70
|
"_vendor-arizeai-Sj74jm5V.js",
|
|
71
|
-
"_components-
|
|
72
|
-
"_pages
|
|
71
|
+
"_components-BC3-LP_a.js",
|
|
72
|
+
"_pages--n2933VW.js",
|
|
73
73
|
"_vendor-three-DwGkEfCM.js",
|
|
74
74
|
"_vendor-codemirror-DO3VqEcD.js",
|
|
75
75
|
"_vendor-recharts-BGN0SxgJ.js"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as je,p as Dt,d as qe,r as p,j as n,R as W,n as Fn,a as we,C as De,b as U,s as Et,e as Ft,f as ie,g as Se,h as Ke,i as Te,k as Le,l as _t,m as Pt,o as ae,q as Vt,t as Nt,u as Rt,v as s,w as m,x as Fe,$ as V,L as _n,y as Ot,z as Kt,A as At,B as zt,D as cn,F as _e,E as se,G as $t,H as Gt,I as Pn,S as Bt,J as Qt,Q as dn,K as Ht,M as Ut,N as Zt,P as Ae,O as Vn,T as jt,U as qt,V as Wt,W as Jt,X as Xt,Y as Yt,Z as ea,_ as na,a0 as ta,a1 as We,a2 as Q,a3 as Nn,a4 as aa,a5 as ra,a6 as ia,a7 as la,a8 as oa}from"./vendor-BMWfu6zp.js";import{u as sa,_ as q,a as Pe,b as $,c as N,T as R,F as Rn,d as Z,I,e as w,f as G,A as ca,g as On,h as C,i as D,j as z,k as da,l as ua,P as ma,R as H,m as Ve,n as pa,o as ga,L as Je,p as J,q as X,r as Ne,s as ha,t as Kn,E as An,v as fa,w as La,x as ya,y as va,z as ba,B as Ca}from"./vendor-arizeai-Sj74jm5V.js";import{u as ka}from"./pages
|
|
1
|
+
import{c as je,p as Dt,d as qe,r as p,j as n,R as W,n as Fn,a as we,C as De,b as U,s as Et,e as Ft,f as ie,g as Se,h as Ke,i as Te,k as Le,l as _t,m as Pt,o as ae,q as Vt,t as Nt,u as Rt,v as s,w as m,x as Fe,$ as V,L as _n,y as Ot,z as Kt,A as At,B as zt,D as cn,F as _e,E as se,G as $t,H as Gt,I as Pn,S as Bt,J as Qt,Q as dn,K as Ht,M as Ut,N as Zt,P as Ae,O as Vn,T as jt,U as qt,V as Wt,W as Jt,X as Xt,Y as Yt,Z as ea,_ as na,a0 as ta,a1 as We,a2 as Q,a3 as Nn,a4 as aa,a5 as ra,a6 as ia,a7 as la,a8 as oa}from"./vendor-BMWfu6zp.js";import{u as sa,_ as q,a as Pe,b as $,c as N,T as R,F as Rn,d as Z,I,e as w,f as G,A as ca,g as On,h as C,i as D,j as z,k as da,l as ua,P as ma,R as H,m as Ve,n as pa,o as ga,L as Je,p as J,q as X,r as Ne,s as ha,t as Kn,E as An,v as fa,w as La,x as ya,y as va,z as ba,B as Ca}from"./vendor-arizeai-Sj74jm5V.js";import{u as ka}from"./pages--n2933VW.js";import{V as xa}from"./vendor-three-DwGkEfCM.js";import{j as zn,E as $n,l as Gn,a as Bn,R as Xe,n as Ye,p as wa}from"./vendor-codemirror-DO3VqEcD.js";const Sa=e=>{const t=a=>({markdownDisplayMode:"text",setMarkdownDisplayMode:r=>{a({markdownDisplayMode:r})},traceStreamingEnabled:!0,setTraceStreamingEnabled:r=>{a({traceStreamingEnabled:r})},showSpanAside:!0,setShowSpanAside:r=>{a({showSpanAside:r})},showMetricsInTraceTree:!0,setShowMetricsInTraceTree:r=>{a({showMetricsInTraceTree:r})},...e});return je()(Dt(qe(t),{name:"arize-phoenix-preferences"}))},Qn=p.createContext(null);function Rl({children:e,...t}){const a=p.useRef();return a.current||(a.current=Sa(t)),n(Qn.Provider,{value:a.current,children:e})}function be(e,t){const a=W.useContext(Qn);if(!a)throw new Error("Missing PreferencesContext.Provider in the tree");return Fn(a,e,t)}var A=(e=>(e.primary="primary",e.reference="reference",e.corpus="corpus",e))(A||{});function _(e){throw new Error("Unreachable")}function en(e){return typeof e=="number"||e===null}function Ma(e){return typeof e=="string"||e===null}function Ol(e){return Array.isArray(e)?e.every(t=>typeof t=="string"):!1}function Ta(e){return typeof e=="object"&&e!==null}const nn=p.createContext(null);function Re(){const e=W.useContext(nn);if(e===null)throw new Error("useInferences must be used within a InferencesProvider");return e}function Kl(e){return n(nn.Provider,{value:{primaryInferences:e.primaryInferences,referenceInferences:e.referenceInferences,corpusInferences:e.corpusInferences,getInferencesNameByRole:t=>{var a,r;switch(t){case A.primary:return e.primaryInferences.name;case A.reference:return((a=e.referenceInferences)==null?void 0:a.name)??"reference";case A.corpus:return((r=e.corpusInferences)==null?void 0:r.name)??"corpus";default:_()}}},children:e.children})}const Hn=function(){var e={defaultValue:null,kind:"LocalArgument",name:"clusters"},t={defaultValue:null,kind:"LocalArgument",name:"dataQualityMetricColumnName"},a={defaultValue:null,kind:"LocalArgument",name:"fetchDataQualityMetric"},r={defaultValue:null,kind:"LocalArgument",name:"fetchPerformanceMetric"},i={defaultValue:null,kind:"LocalArgument",name:"performanceMetric"},l=[{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:l,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:l,storageKey:null}]}],storageKey:null}];return{fragment:{argumentDefinitions:[e,t,a,r,i],kind:"Fragment",metadata:null,name:"pointCloudStore_clusterMetricsQuery",selections:o,type:"Query",abstractKey:null},kind:"Request",operation:{argumentDefinitions:[e,a,t,r,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{r as d,j as e,d2 as F,v as s,F as P,R as v,w as E,aN as L,d3 as R,d4 as S,d5 as a,d6 as w,d7 as z,b as A,d8 as j}from"./vendor-BMWfu6zp.js";import{S as C,j as k,Z as $,U as _,t as I,a4 as O}from"./vendor-arizeai-Sj74jm5V.js";import{b2 as T,d as D,R as N,b3 as G,b4 as M}from"./components-
|
|
1
|
+
import{r as d,j as e,d2 as F,v as s,F as P,R as v,w as E,aN as L,d3 as R,d4 as S,d5 as a,d6 as w,d7 as z,b as A,d8 as j}from"./vendor-BMWfu6zp.js";import{S as C,j as k,Z as $,U as _,t as I,a4 as O}from"./vendor-arizeai-Sj74jm5V.js";import{b2 as T,d as D,R as N,b3 as G,b4 as M}from"./components-BC3-LP_a.js";import{L as U,E as B,h as q,M as J,a as m,D as K,d as W,b as H,e as V,P as Y,c as Z,T as Q,p as X,f as u,g as ee,i as re,j as g,k as ae,l as h,m as x,n as oe,o as te,q as ne,r as se,s as le,A as ie}from"./pages--n2933VW.js";import"./vendor-three-DwGkEfCM.js";import"./vendor-codemirror-DO3VqEcD.js";import"./vendor-recharts-BGN0SxgJ.js";(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))c(o);new MutationObserver(o=>{for(const t of o)if(t.type==="childList")for(const l of t.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&c(l)}).observe(document,{childList:!0,subtree:!0});function i(o){const t={};return o.integrity&&(t.integrity=o.integrity),o.referrerPolicy&&(t.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?t.credentials="include":o.crossOrigin==="anonymous"?t.credentials="omit":t.credentials="same-origin",t}function c(o){if(o.ep)return;o.ep=!0;const t=i(o);fetch(o.href,t)}})();const b="arize-phoenix-feature-flags",p={__CLEAR__:!0};function ce(){const r=localStorage.getItem(b);if(!r)return p;try{const n=JSON.parse(r);return Object.assign({},p,n)}catch{return p}}const f=d.createContext(null);function de(){const r=v.useContext(f);if(r===null)throw new Error("useFeatureFlags must be used within a FeatureFlagsProvider");return r}function pe(r){const[n,i]=d.useState(ce()),c=o=>{localStorage.setItem(b,JSON.stringify(o)),i(o)};return e(f.Provider,{value:{featureFlags:n,setFeatureFlags:c},children:e(me,{children:r.children})})}function me(r){const{children:n}=r,{featureFlags:i,setFeatureFlags:c}=de(),[o,t]=d.useState(!1);return F("ctrl+shift+f",()=>t(!0)),s(P,{children:[n,e(_,{type:"modal",isDismissable:!0,onDismiss:()=>t(!1),children:o&&e(C,{title:"Feature Flags",children:e(k,{height:"size-1000",padding:"size-100",children:Object.keys(i).map(l=>e($,{isSelected:i[l],onChange:y=>c({...i,[l]:y}),children:l},l))})})})]})}function ue(){return e(L,{styles:r=>E`
|
|
2
2
|
body {
|
|
3
3
|
background-color: var(--ac-global-color-grey-75);
|
|
4
4
|
color: var(--ac-global-text-color-900);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{b as E,a9 as Xn,v as s,j as e,w as F,aa as Ke,r as u,ab as Oe,$ as W,ac as Zn,y as he,z as ke,D as J,F as H,B as Vn,R as De,o as ll,ad as nn,ae as oe,af as an,ag as ir,E as Da,ah as zn,a7 as ae,a1 as Sn,a2 as U,ai as ue,aj as dn,ak as rr,al as ga,am as pa,an as ya,ao as En,ap as Se,aq as tl,n as il,a as sr,ar as or,as as dr,at as cr,au as ur,av as mr,c as gr,d as pr,aw as yr}from"./vendor-BMWfu6zp.js";import{R as Ce,u as Ie,a as Pe,T as Ca,P as rl,b as sl,M as za,c as Qa,d as Qn,D as fr,e as hr,f as z,g as ol,h as ge,i as la,j as vn,k as dl,l as Fn,m as Kn,n as cl,o as Me,p as Ae,C as ie,q as ta,r as je,s as Ia,t as On,E as ul,v as kr,w as br,L as ce,x as Sr,y as vr,F as Fr,z as Kr,A as ln,B as ve,S as xr,G as Tr,H as ml,I as Dr,J as Cr,K as Oa,N as Ir,O as Lr,Q as _r,U as Er,V as Rr,W as Ar,X as gl,Y as xn,Z as wr,_ as Pr,$ as Mr,a0 as Nr,a1 as $r,a2 as tn,a3 as La,a4 as pl,a5 as yn,a6 as xa,a7 as gn,a8 as Le,a9 as Vr,aa as zr,ab as be,ac as yl,ad as ia,ae as xe,af as _a,ag as sn,ah as Y,ai as jn,aj as Qr,ak as Ea,al as Ee,am as Re,an as na,ao as Ra,ap as fl,aq as Or,ar as jr,as as ye,at as we,au as qn,av as qr,aw as Bn,ax as ra,ay as hl,az as kl,aA as Br,aB as Hn,aC as Tn,aD as Ne,aE as Dn,aF as Cn,aG as Hr,aH as ja,aI as bl,aJ as Gr,aK as Wr,aL as Ur,aM as Yn,aN as Jr,aO as Xr,aP as Zr,aQ as Yr,aR as es,aS as ns,aT as as,aU as ls,aV as fn,aW as Xe,aX as ts,aY as Ze,aZ as is,a_ as sa,a$ as rs,b0 as Aa,b1 as ss}from"./components-
|
|
1
|
+
import{b as E,a9 as Xn,v as s,j as e,w as F,aa as Ke,r as u,ab as Oe,$ as W,ac as Zn,y as he,z as ke,D as J,F as H,B as Vn,R as De,o as ll,ad as nn,ae as oe,af as an,ag as ir,E as Da,ah as zn,a7 as ae,a1 as Sn,a2 as U,ai as ue,aj as dn,ak as rr,al as ga,am as pa,an as ya,ao as En,ap as Se,aq as tl,n as il,a as sr,ar as or,as as dr,at as cr,au as ur,av as mr,c as gr,d as pr,aw as yr}from"./vendor-BMWfu6zp.js";import{R as Ce,u as Ie,a as Pe,T as Ca,P as rl,b as sl,M as za,c as Qa,d as Qn,D as fr,e as hr,f as z,g as ol,h as ge,i as la,j as vn,k as dl,l as Fn,m as Kn,n as cl,o as Me,p as Ae,C as ie,q as ta,r as je,s as Ia,t as On,E as ul,v as kr,w as br,L as ce,x as Sr,y as vr,F as Fr,z as Kr,A as ln,B as ve,S as xr,G as Tr,H as ml,I as Dr,J as Cr,K as Oa,N as Ir,O as Lr,Q as _r,U as Er,V as Rr,W as Ar,X as gl,Y as xn,Z as wr,_ as Pr,$ as Mr,a0 as Nr,a1 as $r,a2 as tn,a3 as La,a4 as pl,a5 as yn,a6 as xa,a7 as gn,a8 as Le,a9 as Vr,aa as zr,ab as be,ac as yl,ad as ia,ae as xe,af as _a,ag as sn,ah as Y,ai as jn,aj as Qr,ak as Ea,al as Ee,am as Re,an as na,ao as Ra,ap as fl,aq as Or,ar as jr,as as ye,at as we,au as qn,av as qr,aw as Bn,ax as ra,ay as hl,az as kl,aA as Br,aB as Hn,aC as Tn,aD as Ne,aE as Dn,aF as Cn,aG as Hr,aH as ja,aI as bl,aJ as Gr,aK as Wr,aL as Ur,aM as Yn,aN as Jr,aO as Xr,aP as Zr,aQ as Yr,aR as es,aS as ns,aT as as,aU as ls,aV as fn,aW as Xe,aX as ts,aY as Ze,aZ as is,a_ as sa,a$ as rs,b0 as Aa,b1 as ss}from"./components-BC3-LP_a.js";import{C as Sl,D as fe,G as j,H as Ye,J as de,K as os,l as wa,M as Gn,P as on,I as w,e as A,N as qe,a as vl,c as le,p as In,q as Ln,t as te,h as x,n as Fl,O as $e,j as T,i as k,L as Pn,Q as Kl,f as V,S as B,s as ne,U as X,V as xl,W as Tl,X as ds,Y as cs,Z as Pa,_ as hn,v as Wn,T as Fe,d as pe,z as oa,r as kn,$ as Q,a0 as Dl,E as da,b as Mn,a1 as Ma,a2 as us,y as ca,u as ms,a3 as gs}from"./vendor-arizeai-Sj74jm5V.js";import{R as Be,C as Un,X as He,Y as Te,a as Ge,T as We,B as bn,A as Nn,b as Cl,c as Na,L as Il,d as ps,P as ys,e as fs,f as hs}from"./vendor-recharts-BGN0SxgJ.js";import{p as $a,R as ua,n as ma,j as ks,E as bs,k as Ss,b as vs}from"./vendor-codemirror-DO3VqEcD.js";const Ll=function(){var n=[{alias:null,args:null,concreteType:"Functionality",kind:"LinkedField",name:"functionality",plural:!1,selections:[{alias:null,args:null,kind:"ScalarField",name:"modelInferences",storageKey:null}],storageKey:null},{alias:null,args:null,concreteType:"ProjectConnection",kind:"LinkedField",name:"projects",plural:!1,selections:[{alias:null,args:null,concreteType:"ProjectEdge",kind:"LinkedField",name:"edges",plural:!0,selections:[{alias:"project",args:null,concreteType:"Project",kind:"LinkedField",name:"node",plural:!1,selections:[{alias:null,args:null,kind:"ScalarField",name:"id",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"endTime",storageKey:null}],storageKey:null}],storageKey:null}],storageKey:null}];return{fragment:{argumentDefinitions:[],kind:"Fragment",metadata:null,name:"homeLoaderQuery",selections:n,type:"Query",abstractKey:null},kind:"Request",operation:{argumentDefinitions:[],kind:"Operation",name:"homeLoaderQuery",selections:n},params:{cacheID:"6926e4e720b443f7b7252b60271944e6",id:null,metadata:{},name:"homeLoaderQuery",operationKind:"query",text:`query homeLoaderQuery {
|
|
2
2
|
functionality {
|
|
3
3
|
modelInferences
|
|
4
4
|
}
|
|
@@ -934,7 +934,7 @@ fragment DimensionSegmentsBarChart_dimension_3E0ZE6 on Dimension {
|
|
|
934
934
|
id
|
|
935
935
|
}
|
|
936
936
|
}
|
|
937
|
-
`}}}();ct.hash="5a662d77e69d2e9bb4eb2af4cad6b722";async function Iu(n){const{dimensionId:a}=n.params;return E.fetchQuery(Ce,ct,{id:a}).toPromise()}const ut=function(){var n={defaultValue:null,kind:"LocalArgument",name:"id"},a={defaultValue:null,kind:"LocalArgument",name:"traceId"},l=[{kind:"Variable",name:"id",variableName:"id"}],t={alias:null,args:null,kind:"ScalarField",name:"id",storageKey:null},i={alias:null,args:null,kind:"ScalarField",name:"name",storageKey:null},r={kind:"InlineFragment",selections:[{alias:null,args:[{kind:"Variable",name:"traceId",variableName:"traceId"}],concreteType:"Trace",kind:"LinkedField",name:"trace",plural:!1,selections:[{alias:null,args:[{kind:"Literal",name:"first",value:1e3}],concreteType:"SpanConnection",kind:"LinkedField",name:"spans",plural:!1,selections:[{alias:null,args:null,concreteType:"SpanEdge",kind:"LinkedField",name:"edges",plural:!0,selections:[{alias:"span",args:null,concreteType:"Span",kind:"LinkedField",name:"node",plural:!1,selections:[t,{alias:null,args:null,concreteType:"SpanContext",kind:"LinkedField",name:"context",plural:!1,selections:[{alias:null,args:null,kind:"ScalarField",name:"spanId",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"traceId",storageKey:null}],storageKey:null},i,{alias:null,args:null,kind:"ScalarField",name:"spanKind",storageKey:null},{alias:"statusCode",args:null,kind:"ScalarField",name:"propagatedStatusCode",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"startTime",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"parentId",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"latencyMs",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"tokenCountTotal",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"tokenCountPrompt",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"tokenCountCompletion",storageKey:null},{alias:null,args:null,concreteType:"
|
|
937
|
+
`}}}();ct.hash="5a662d77e69d2e9bb4eb2af4cad6b722";async function Iu(n){const{dimensionId:a}=n.params;return E.fetchQuery(Ce,ct,{id:a}).toPromise()}const ut=function(){var n={defaultValue:null,kind:"LocalArgument",name:"id"},a={defaultValue:null,kind:"LocalArgument",name:"traceId"},l=[{kind:"Variable",name:"id",variableName:"id"}],t={alias:null,args:null,kind:"ScalarField",name:"id",storageKey:null},i={alias:null,args:null,kind:"ScalarField",name:"name",storageKey:null},r={kind:"InlineFragment",selections:[{alias:null,args:[{kind:"Variable",name:"traceId",variableName:"traceId"}],concreteType:"Trace",kind:"LinkedField",name:"trace",plural:!1,selections:[{alias:null,args:[{kind:"Literal",name:"first",value:1e3}],concreteType:"SpanConnection",kind:"LinkedField",name:"spans",plural:!1,selections:[{alias:null,args:null,concreteType:"SpanEdge",kind:"LinkedField",name:"edges",plural:!0,selections:[{alias:"span",args:null,concreteType:"Span",kind:"LinkedField",name:"node",plural:!1,selections:[t,{alias:null,args:null,concreteType:"SpanContext",kind:"LinkedField",name:"context",plural:!1,selections:[{alias:null,args:null,kind:"ScalarField",name:"spanId",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"traceId",storageKey:null}],storageKey:null},i,{alias:null,args:null,kind:"ScalarField",name:"spanKind",storageKey:null},{alias:"statusCode",args:null,kind:"ScalarField",name:"propagatedStatusCode",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"startTime",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"parentId",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"latencyMs",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"tokenCountTotal",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"tokenCountPrompt",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"tokenCountCompletion",storageKey:null},{alias:null,args:null,concreteType:"SpanAnnotation",kind:"LinkedField",name:"spanAnnotations",plural:!0,selections:[i,{alias:null,args:null,kind:"ScalarField",name:"label",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"score",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"annotatorKind",storageKey:null}],storageKey:null}],storageKey:null}],storageKey:null}],storageKey:"spans(first:1000)"}],storageKey:null}],type:"Project",abstractKey:null};return{fragment:{argumentDefinitions:[n,a],kind:"Fragment",metadata:null,name:"TraceDetailsQuery",selections:[{alias:"project",args:l,concreteType:null,kind:"LinkedField",name:"node",plural:!1,selections:[r],storageKey:null}],type:"Query",abstractKey:null},kind:"Request",operation:{argumentDefinitions:[a,n],kind:"Operation",name:"TraceDetailsQuery",selections:[{alias:"project",args:l,concreteType:null,kind:"LinkedField",name:"node",plural:!1,selections:[{alias:null,args:null,kind:"ScalarField",name:"__typename",storageKey:null},r,{kind:"TypeDiscriminator",abstractKey:"__isNode"},t],storageKey:null}]},params:{cacheID:"22103e9bb1f983529081ca93d60e76ef",id:null,metadata:{},name:"TraceDetailsQuery",operationKind:"query",text:`query TraceDetailsQuery(
|
|
938
938
|
$traceId: ID!
|
|
939
939
|
$id: GlobalID!
|
|
940
940
|
) {
|
|
@@ -959,10 +959,11 @@ fragment DimensionSegmentsBarChart_dimension_3E0ZE6 on Dimension {
|
|
|
959
959
|
tokenCountTotal
|
|
960
960
|
tokenCountPrompt
|
|
961
961
|
tokenCountCompletion
|
|
962
|
-
|
|
962
|
+
spanAnnotations {
|
|
963
963
|
name
|
|
964
964
|
label
|
|
965
965
|
score
|
|
966
|
+
annotatorKind
|
|
966
967
|
}
|
|
967
968
|
}
|
|
968
969
|
}
|
|
@@ -973,7 +974,7 @@ fragment DimensionSegmentsBarChart_dimension_3E0ZE6 on Dimension {
|
|
|
973
974
|
id
|
|
974
975
|
}
|
|
975
976
|
}
|
|
976
|
-
`}}}();ut.hash="
|
|
977
|
+
`}}}();ut.hash="8b568616f23f7d349cac5a31807463fb";const mt=function(){var n=[{defaultValue:null,kind:"LocalArgument",name:"spanId"}],a=[{kind:"Variable",name:"id",variableName:"spanId"}],l={alias:null,args:null,kind:"ScalarField",name:"__typename",storageKey:null},t={alias:null,args:null,kind:"ScalarField",name:"id",storageKey:null},i={alias:null,args:null,concreteType:"SpanContext",kind:"LinkedField",name:"context",plural:!1,selections:[{alias:null,args:null,kind:"ScalarField",name:"spanId",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"traceId",storageKey:null}],storageKey:null},r={alias:null,args:null,kind:"ScalarField",name:"name",storageKey:null},o={alias:null,args:null,kind:"ScalarField",name:"spanKind",storageKey:null},c={alias:"statusCode",args:null,kind:"ScalarField",name:"propagatedStatusCode",storageKey:null},d={alias:null,args:null,kind:"ScalarField",name:"statusMessage",storageKey:null},m={alias:null,args:null,kind:"ScalarField",name:"startTime",storageKey:null},p={alias:null,args:null,kind:"ScalarField",name:"parentId",storageKey:null},g={alias:null,args:null,kind:"ScalarField",name:"latencyMs",storageKey:null},f={alias:null,args:null,kind:"ScalarField",name:"tokenCountTotal",storageKey:null},y={alias:null,args:null,kind:"ScalarField",name:"tokenCountPrompt",storageKey:null},b={alias:null,args:null,kind:"ScalarField",name:"tokenCountCompletion",storageKey:null},S=[{alias:null,args:null,kind:"ScalarField",name:"value",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"mimeType",storageKey:null}],h={alias:null,args:null,concreteType:"SpanIOValue",kind:"LinkedField",name:"input",plural:!1,selections:S,storageKey:null},v={alias:null,args:null,concreteType:"SpanIOValue",kind:"LinkedField",name:"output",plural:!1,selections:S,storageKey:null},L={alias:null,args:null,kind:"ScalarField",name:"attributes",storageKey:null},I={alias:null,args:null,concreteType:"SpanEvent",kind:"LinkedField",name:"events",plural:!0,selections:[r,{alias:null,args:null,kind:"ScalarField",name:"message",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"timestamp",storageKey:null}],storageKey:null},C={alias:null,args:null,concreteType:"DocumentRetrievalMetrics",kind:"LinkedField",name:"documentRetrievalMetrics",plural:!0,selections:[{alias:null,args:null,kind:"ScalarField",name:"evaluationName",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"ndcg",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"precision",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"hit",storageKey:null}],storageKey:null},K={alias:null,args:null,kind:"ScalarField",name:"label",storageKey:null},D={alias:null,args:null,kind:"ScalarField",name:"score",storageKey:null},M={alias:null,args:null,kind:"ScalarField",name:"explanation",storageKey:null},R={alias:null,args:null,concreteType:"DocumentEvaluation",kind:"LinkedField",name:"documentEvaluations",plural:!0,selections:[{alias:null,args:null,kind:"ScalarField",name:"documentPosition",storageKey:null},r,K,D,M],storageKey:null};return{fragment:{argumentDefinitions:n,kind:"Fragment",metadata:null,name:"SpanDetailsQuery",selections:[{alias:"span",args:a,concreteType:null,kind:"LinkedField",name:"node",plural:!1,selections:[l,{kind:"InlineFragment",selections:[t,i,r,o,c,d,m,p,g,f,y,b,h,v,L,{kind:"RequiredField",field:I,action:"THROW",path:"span.events"},C,R,{alias:null,args:null,concreteType:"SpanAnnotation",kind:"LinkedField",name:"spanAnnotations",plural:!0,selections:[r],storageKey:null},{args:null,kind:"FragmentSpread",name:"SpanFeedback_annotations"},{args:null,kind:"FragmentSpread",name:"SpanAside_span"}],type:"Span",abstractKey:null}],storageKey:null}],type:"Query",abstractKey:null},kind:"Request",operation:{argumentDefinitions:n,kind:"Operation",name:"SpanDetailsQuery",selections:[{alias:"span",args:a,concreteType:null,kind:"LinkedField",name:"node",plural:!1,selections:[l,{kind:"TypeDiscriminator",abstractKey:"__isNode"},t,{kind:"InlineFragment",selections:[i,r,o,c,d,m,p,g,f,y,b,h,v,L,I,C,R,{alias:null,args:null,concreteType:"SpanAnnotation",kind:"LinkedField",name:"spanAnnotations",plural:!0,selections:[r,K,D,M,{alias:null,args:null,kind:"ScalarField",name:"annotatorKind",storageKey:null},t],storageKey:null},{alias:"code",args:null,kind:"ScalarField",name:"statusCode",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"endTime",storageKey:null}],type:"Span",abstractKey:null}],storageKey:null}]},params:{cacheID:"b1a80a0108c40baebf6e64b811ca0202",id:null,metadata:{},name:"SpanDetailsQuery",operationKind:"query",text:`query SpanDetailsQuery(
|
|
977
978
|
$spanId: GlobalID!
|
|
978
979
|
) {
|
|
979
980
|
span: node(id: $spanId) {
|
|
@@ -1456,7 +1457,7 @@ fragment DatasetPicker__datasets on Query {
|
|
|
1456
1457
|
`,children:[e(Id,{rootSpan:m}),s(nn,{direction:"horizontal",autoSaveId:"trace-panel-group",css:F`
|
|
1457
1458
|
flex: 1 1 auto;
|
|
1458
1459
|
overflow: hidden;
|
|
1459
|
-
`,children:[e(oe,{defaultSize:30,minSize:10,maxSize:70,children:e(_d,{children:e(qr,{spans:o,selectedSpanNodeId:d,onSpanClick:p=>{i(g=>(g.set(Ua,p.id),g),{replace:!0})}})})}),e(an,{css:xn}),e(oe,{children:e(Ld,{children:d?e(u.Suspense,{fallback:e(ce,{}),children:e(sd,{spanNodeId:d,projectId:l})}):null})})]})]})}function Id({rootSpan:n}){const{latencyMs:a,statusCode:l,
|
|
1460
|
+
`,children:[e(oe,{defaultSize:30,minSize:10,maxSize:70,children:e(_d,{children:e(qr,{spans:o,selectedSpanNodeId:d,onSpanClick:p=>{i(g=>(g.set(Ua,p.id),g),{replace:!0})}})})}),e(an,{css:xn}),e(oe,{children:e(Ld,{children:d?e(u.Suspense,{fallback:e(ce,{}),children:e(sd,{spanNodeId:d,projectId:l})}):null})})]})]})}function Id({rootSpan:n}){const{latencyMs:a,statusCode:l,spanAnnotations:t}=n??{latencyMs:null,statusCode:"UNSET",spanAnnotations:[]},i=t.length>0,r=yl(l);return e(T,{padding:"size-200",borderBottomWidth:"thin",borderBottomColor:"dark",children:s(k,{direction:"row",gap:"size-400",children:[s(k,{direction:"column",children:[e(x,{elementType:"h3",textSize:"medium",color:"text-700",children:"Trace Status"}),e(x,{textSize:"xlarge",children:s(k,{direction:"row",gap:"size-50",alignItems:"center",children:[e(ia,{statusCode:l}),e(x,{textSize:"xlarge",color:r,children:l})]})})]}),s(k,{direction:"column",children:[e(x,{elementType:"h3",textSize:"medium",color:"text-700",children:"Latency"}),e(x,{textSize:"xlarge",children:typeof a=="number"?e(xe,{latencyMs:a,textSize:"xlarge"}):"--"})]}),i?s(k,{direction:"column",gap:"size-50",children:[e(x,{elementType:"h3",textSize:"medium",color:"text-700",children:"Feedback"}),e(k,{direction:"row",gap:"size-50",children:t.map(o=>e(Bn,{annotation:o,children:e(sn,{annotation:o,annotationDisplayPreference:"label"})},o.name))})]}):null]})})}function Ld({children:n}){return e("div",{"data-testid":"scrolling-tabs-wrapper",css:F`
|
|
1460
1461
|
height: 100%;
|
|
1461
1462
|
overflow: hidden;
|
|
1462
1463
|
.ac-tabs {
|
phoenix/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "4.22.
|
|
1
|
+
__version__ = "4.22.1"
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
from collections import defaultdict
|
|
2
|
-
from datetime import datetime
|
|
3
|
-
from typing import (
|
|
4
|
-
Any,
|
|
5
|
-
DefaultDict,
|
|
6
|
-
List,
|
|
7
|
-
Literal,
|
|
8
|
-
Optional,
|
|
9
|
-
Tuple,
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
import pandas as pd
|
|
13
|
-
from aioitertools.itertools import groupby
|
|
14
|
-
from cachetools import LFUCache, TTLCache
|
|
15
|
-
from sqlalchemy import Select, func, or_, select
|
|
16
|
-
from strawberry.dataloader import AbstractCache, DataLoader
|
|
17
|
-
from typing_extensions import TypeAlias, assert_never
|
|
18
|
-
|
|
19
|
-
from phoenix.db import models
|
|
20
|
-
from phoenix.server.api.dataloaders.cache import TwoTierCache
|
|
21
|
-
from phoenix.server.api.input_types.TimeRange import TimeRange
|
|
22
|
-
from phoenix.server.api.types.EvaluationSummary import EvaluationSummary
|
|
23
|
-
from phoenix.server.types import DbSessionFactory
|
|
24
|
-
from phoenix.trace.dsl import SpanFilter
|
|
25
|
-
|
|
26
|
-
Kind: TypeAlias = Literal["span", "trace"]
|
|
27
|
-
ProjectRowId: TypeAlias = int
|
|
28
|
-
TimeInterval: TypeAlias = Tuple[Optional[datetime], Optional[datetime]]
|
|
29
|
-
FilterCondition: TypeAlias = Optional[str]
|
|
30
|
-
EvalName: TypeAlias = str
|
|
31
|
-
|
|
32
|
-
Segment: TypeAlias = Tuple[Kind, ProjectRowId, TimeInterval, FilterCondition]
|
|
33
|
-
Param: TypeAlias = EvalName
|
|
34
|
-
|
|
35
|
-
Key: TypeAlias = Tuple[Kind, ProjectRowId, Optional[TimeRange], FilterCondition, EvalName]
|
|
36
|
-
Result: TypeAlias = Optional[EvaluationSummary]
|
|
37
|
-
ResultPosition: TypeAlias = int
|
|
38
|
-
DEFAULT_VALUE: Result = None
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
def _cache_key_fn(key: Key) -> Tuple[Segment, Param]:
|
|
42
|
-
kind, project_rowid, time_range, filter_condition, eval_name = key
|
|
43
|
-
interval = (
|
|
44
|
-
(time_range.start, time_range.end) if isinstance(time_range, TimeRange) else (None, None)
|
|
45
|
-
)
|
|
46
|
-
return (kind, project_rowid, interval, filter_condition), eval_name
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
_Section: TypeAlias = Tuple[ProjectRowId, EvalName, Kind]
|
|
50
|
-
_SubKey: TypeAlias = Tuple[TimeInterval, FilterCondition]
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
class EvaluationSummaryCache(
|
|
54
|
-
TwoTierCache[Key, Result, _Section, _SubKey],
|
|
55
|
-
):
|
|
56
|
-
def __init__(self) -> None:
|
|
57
|
-
super().__init__(
|
|
58
|
-
# TTL=3600 (1-hour) because time intervals are always moving forward, but
|
|
59
|
-
# interval endpoints are rounded down to the hour by the UI, so anything
|
|
60
|
-
# older than an hour most likely won't be a cache-hit anyway.
|
|
61
|
-
main_cache=TTLCache(maxsize=64 * 32 * 2, ttl=3600),
|
|
62
|
-
sub_cache_factory=lambda: LFUCache(maxsize=2 * 2),
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
def invalidate_project(self, project_rowid: ProjectRowId) -> None:
|
|
66
|
-
for section in self._cache.keys():
|
|
67
|
-
if section[0] == project_rowid:
|
|
68
|
-
del self._cache[section]
|
|
69
|
-
|
|
70
|
-
def _cache_key(self, key: Key) -> Tuple[_Section, _SubKey]:
|
|
71
|
-
(kind, project_rowid, interval, filter_condition), eval_name = _cache_key_fn(key)
|
|
72
|
-
return (project_rowid, eval_name, kind), (interval, filter_condition)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
class EvaluationSummaryDataLoader(DataLoader[Key, Result]):
|
|
76
|
-
def __init__(
|
|
77
|
-
self,
|
|
78
|
-
db: DbSessionFactory,
|
|
79
|
-
cache_map: Optional[AbstractCache[Key, Result]] = None,
|
|
80
|
-
) -> None:
|
|
81
|
-
super().__init__(
|
|
82
|
-
load_fn=self._load_fn,
|
|
83
|
-
cache_key_fn=_cache_key_fn,
|
|
84
|
-
cache_map=cache_map,
|
|
85
|
-
)
|
|
86
|
-
self._db = db
|
|
87
|
-
|
|
88
|
-
async def _load_fn(self, keys: List[Key]) -> List[Result]:
|
|
89
|
-
results: List[Result] = [DEFAULT_VALUE] * len(keys)
|
|
90
|
-
arguments: DefaultDict[
|
|
91
|
-
Segment,
|
|
92
|
-
DefaultDict[Param, List[ResultPosition]],
|
|
93
|
-
] = defaultdict(lambda: defaultdict(list))
|
|
94
|
-
for position, key in enumerate(keys):
|
|
95
|
-
segment, param = _cache_key_fn(key)
|
|
96
|
-
arguments[segment][param].append(position)
|
|
97
|
-
for segment, params in arguments.items():
|
|
98
|
-
stmt = _get_stmt(segment, *params.keys())
|
|
99
|
-
async with self._db() as session:
|
|
100
|
-
data = await session.stream(stmt)
|
|
101
|
-
async for eval_name, group in groupby(data, lambda row: row.name):
|
|
102
|
-
summary = EvaluationSummary(pd.DataFrame(group))
|
|
103
|
-
for position in params[eval_name]:
|
|
104
|
-
results[position] = summary
|
|
105
|
-
return results
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
def _get_stmt(
|
|
109
|
-
segment: Segment,
|
|
110
|
-
*eval_names: Param,
|
|
111
|
-
) -> Select[Any]:
|
|
112
|
-
kind, project_rowid, (start_time, end_time), filter_condition = segment
|
|
113
|
-
stmt = select()
|
|
114
|
-
if kind == "span":
|
|
115
|
-
msa = models.SpanAnnotation
|
|
116
|
-
name_column, label_column, score_column = msa.name, msa.label, msa.score
|
|
117
|
-
annotator_kind_column = msa.annotator_kind
|
|
118
|
-
time_column = models.Span.start_time
|
|
119
|
-
stmt = stmt.join(models.Span).join_from(models.Span, models.Trace)
|
|
120
|
-
if filter_condition:
|
|
121
|
-
sf = SpanFilter(filter_condition)
|
|
122
|
-
stmt = sf(stmt)
|
|
123
|
-
elif kind == "trace":
|
|
124
|
-
mta = models.TraceAnnotation
|
|
125
|
-
name_column, label_column, score_column = mta.name, mta.label, mta.score
|
|
126
|
-
annotator_kind_column = mta.annotator_kind
|
|
127
|
-
time_column = models.Trace.start_time
|
|
128
|
-
stmt = stmt.join(models.Trace)
|
|
129
|
-
else:
|
|
130
|
-
assert_never(kind)
|
|
131
|
-
stmt = stmt.add_columns(
|
|
132
|
-
name_column,
|
|
133
|
-
label_column,
|
|
134
|
-
func.count().label("record_count"),
|
|
135
|
-
func.count(label_column).label("label_count"),
|
|
136
|
-
func.count(score_column).label("score_count"),
|
|
137
|
-
func.sum(score_column).label("score_sum"),
|
|
138
|
-
)
|
|
139
|
-
stmt = stmt.group_by(name_column, label_column)
|
|
140
|
-
stmt = stmt.order_by(name_column, label_column)
|
|
141
|
-
stmt = stmt.where(models.Trace.project_rowid == project_rowid)
|
|
142
|
-
stmt = stmt.where(annotator_kind_column == "LLM")
|
|
143
|
-
stmt = stmt.where(or_(score_column.is_not(None), label_column.is_not(None)))
|
|
144
|
-
stmt = stmt.where(name_column.in_(eval_names))
|
|
145
|
-
if start_time:
|
|
146
|
-
stmt = stmt.where(start_time <= time_column)
|
|
147
|
-
if end_time:
|
|
148
|
-
stmt = stmt.where(time_column < end_time)
|
|
149
|
-
return stmt
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
from collections import defaultdict
|
|
2
|
-
from typing import (
|
|
3
|
-
DefaultDict,
|
|
4
|
-
List,
|
|
5
|
-
)
|
|
6
|
-
|
|
7
|
-
from sqlalchemy import select
|
|
8
|
-
from strawberry.dataloader import DataLoader
|
|
9
|
-
from typing_extensions import TypeAlias
|
|
10
|
-
|
|
11
|
-
from phoenix.db import models
|
|
12
|
-
from phoenix.server.api.types.Evaluation import SpanEvaluation
|
|
13
|
-
from phoenix.server.types import DbSessionFactory
|
|
14
|
-
|
|
15
|
-
Key: TypeAlias = int
|
|
16
|
-
Result: TypeAlias = List[SpanEvaluation]
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class SpanEvaluationsDataLoader(DataLoader[Key, Result]):
|
|
20
|
-
def __init__(self, db: DbSessionFactory) -> None:
|
|
21
|
-
super().__init__(load_fn=self._load_fn)
|
|
22
|
-
self._db = db
|
|
23
|
-
|
|
24
|
-
async def _load_fn(self, keys: List[Key]) -> List[Result]:
|
|
25
|
-
span_evaluations_by_id: DefaultDict[Key, Result] = defaultdict(list)
|
|
26
|
-
msa = models.SpanAnnotation
|
|
27
|
-
async with self._db() as session:
|
|
28
|
-
data = await session.stream_scalars(
|
|
29
|
-
select(msa).where(msa.span_rowid.in_(keys)).where(msa.annotator_kind == "LLM")
|
|
30
|
-
)
|
|
31
|
-
async for span_evaluation in data:
|
|
32
|
-
span_evaluations_by_id[span_evaluation.span_rowid].append(
|
|
33
|
-
SpanEvaluation.from_sql_span_annotation(span_evaluation)
|
|
34
|
-
)
|
|
35
|
-
return [span_evaluations_by_id[key] for key in keys]
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
from collections import defaultdict
|
|
2
|
-
from typing import (
|
|
3
|
-
DefaultDict,
|
|
4
|
-
List,
|
|
5
|
-
)
|
|
6
|
-
|
|
7
|
-
from sqlalchemy import select
|
|
8
|
-
from strawberry.dataloader import DataLoader
|
|
9
|
-
from typing_extensions import TypeAlias
|
|
10
|
-
|
|
11
|
-
from phoenix.db import models
|
|
12
|
-
from phoenix.server.api.types.Evaluation import TraceEvaluation
|
|
13
|
-
from phoenix.server.types import DbSessionFactory
|
|
14
|
-
|
|
15
|
-
Key: TypeAlias = int
|
|
16
|
-
Result: TypeAlias = List[TraceEvaluation]
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class TraceEvaluationsDataLoader(DataLoader[Key, Result]):
|
|
20
|
-
def __init__(self, db: DbSessionFactory) -> None:
|
|
21
|
-
super().__init__(load_fn=self._load_fn)
|
|
22
|
-
self._db = db
|
|
23
|
-
|
|
24
|
-
async def _load_fn(self, keys: List[Key]) -> List[Result]:
|
|
25
|
-
trace_evaluations_by_id: DefaultDict[Key, Result] = defaultdict(list)
|
|
26
|
-
mta = models.TraceAnnotation
|
|
27
|
-
async with self._db() as session:
|
|
28
|
-
data = await session.stream_scalars(
|
|
29
|
-
select(mta).where(mta.trace_rowid.in_(keys)).where(mta.annotator_kind == "LLM")
|
|
30
|
-
)
|
|
31
|
-
async for trace_evaluation in data:
|
|
32
|
-
trace_evaluations_by_id[trace_evaluation.trace_rowid].append(
|
|
33
|
-
TraceEvaluation.from_sql_trace_annotation(trace_evaluation)
|
|
34
|
-
)
|
|
35
|
-
return [trace_evaluations_by_id[key] for key in keys]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|