arize-phoenix 4.10.1__py3-none-any.whl → 4.10.2rc1__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.10.1.dist-info → arize_phoenix-4.10.2rc1.dist-info}/METADATA +4 -3
- {arize_phoenix-4.10.1.dist-info → arize_phoenix-4.10.2rc1.dist-info}/RECORD +27 -25
- phoenix/server/api/context.py +5 -7
- phoenix/server/api/dataloaders/__init__.py +2 -0
- phoenix/server/api/dataloaders/span_annotations.py +35 -0
- phoenix/server/api/openapi/main.py +18 -2
- phoenix/server/api/openapi/schema.py +12 -12
- phoenix/server/api/routers/v1/__init__.py +36 -83
- phoenix/server/api/routers/v1/dataset_examples.py +102 -123
- phoenix/server/api/routers/v1/datasets.py +389 -507
- phoenix/server/api/routers/v1/evaluations.py +74 -64
- phoenix/server/api/routers/v1/experiment_evaluations.py +67 -91
- phoenix/server/api/routers/v1/experiment_runs.py +97 -155
- phoenix/server/api/routers/v1/experiments.py +131 -181
- phoenix/server/api/routers/v1/spans.py +141 -173
- phoenix/server/api/routers/v1/traces.py +113 -128
- phoenix/server/api/routers/v1/utils.py +94 -0
- phoenix/server/api/types/Annotation.py +21 -0
- phoenix/server/api/types/Evaluation.py +4 -22
- phoenix/server/api/types/Span.py +15 -4
- phoenix/server/api/types/SpanAnnotation.py +4 -6
- phoenix/server/app.py +149 -174
- phoenix/server/thread_server.py +2 -2
- phoenix/version.py +1 -1
- phoenix/server/openapi/docs.py +0 -221
- {arize_phoenix-4.10.1.dist-info → arize_phoenix-4.10.2rc1.dist-info}/WHEEL +0 -0
- {arize_phoenix-4.10.1.dist-info → arize_phoenix-4.10.2rc1.dist-info}/licenses/IP_NOTICE +0 -0
- {arize_phoenix-4.10.1.dist-info → arize_phoenix-4.10.2rc1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: arize-phoenix
|
|
3
|
-
Version: 4.10.
|
|
3
|
+
Version: 4.10.2rc1
|
|
4
4
|
Summary: AI Observability and Evaluation
|
|
5
5
|
Project-URL: Documentation, https://docs.arize.com/phoenix/
|
|
6
6
|
Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
|
|
@@ -22,6 +22,7 @@ Requires-Dist: aiosqlite
|
|
|
22
22
|
Requires-Dist: alembic<2,>=1.3.0
|
|
23
23
|
Requires-Dist: arize-phoenix-evals>=0.13.1
|
|
24
24
|
Requires-Dist: cachetools
|
|
25
|
+
Requires-Dist: fastapi
|
|
25
26
|
Requires-Dist: grpcio
|
|
26
27
|
Requires-Dist: hdbscan>=0.8.33
|
|
27
28
|
Requires-Dist: httpx
|
|
@@ -40,8 +41,8 @@ Requires-Dist: pandas>=1.0
|
|
|
40
41
|
Requires-Dist: protobuf<6.0,>=3.20
|
|
41
42
|
Requires-Dist: psutil
|
|
42
43
|
Requires-Dist: pyarrow
|
|
44
|
+
Requires-Dist: pydantic<3,>=1.0
|
|
43
45
|
Requires-Dist: python-multipart
|
|
44
|
-
Requires-Dist: pyyaml
|
|
45
46
|
Requires-Dist: scikit-learn
|
|
46
47
|
Requires-Dist: scipy
|
|
47
48
|
Requires-Dist: sqlalchemy[asyncio]<3,>=2.0.4
|
|
@@ -56,9 +57,9 @@ Requires-Dist: uvicorn
|
|
|
56
57
|
Requires-Dist: wrapt
|
|
57
58
|
Provides-Extra: container
|
|
58
59
|
Requires-Dist: opentelemetry-exporter-otlp; extra == 'container'
|
|
60
|
+
Requires-Dist: opentelemetry-instrumentation-fastapi; extra == 'container'
|
|
59
61
|
Requires-Dist: opentelemetry-instrumentation-grpc; extra == 'container'
|
|
60
62
|
Requires-Dist: opentelemetry-instrumentation-sqlalchemy; extra == 'container'
|
|
61
|
-
Requires-Dist: opentelemetry-instrumentation-starlette; extra == 'container'
|
|
62
63
|
Requires-Dist: opentelemetry-proto>=1.12.0; extra == 'container'
|
|
63
64
|
Requires-Dist: opentelemetry-sdk; extra == 'container'
|
|
64
65
|
Requires-Dist: opentelemetry-semantic-conventions; extra == 'container'
|
|
@@ -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=Zr3eSPGuwbAWbpKhNj_q-3yeFI5ZZ6HVj7RbDS_7Y14,26
|
|
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
|
|
@@ -60,19 +60,19 @@ phoenix/pointcloud/pointcloud.py,sha256=4zAIkKs2xOUbchpj4XDAV-iPMXrfAJ15TG6rlIYG
|
|
|
60
60
|
phoenix/pointcloud/projectors.py,sha256=zO_RrtDYSv2rqVOfIP2_9Cv11Dc8EmcZR94xhFcBYPU,1057
|
|
61
61
|
phoenix/pointcloud/umap_parameters.py,sha256=3UQSjrysVOvq2V4KNpTMqNqNiK0BsTZnPBHWZ4fyJtQ,1708
|
|
62
62
|
phoenix/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
63
|
-
phoenix/server/app.py,sha256=
|
|
63
|
+
phoenix/server/app.py,sha256=2-zGgV1zyeWtnkLLmgqgIU0o7QQ7eHqGTb2bv1ydLXY,17555
|
|
64
64
|
phoenix/server/grpc_server.py,sha256=faktLxEtWGlCB1bPR4QwwTsRoQloahKMx0hAWqRGI5s,3379
|
|
65
65
|
phoenix/server/main.py,sha256=GpjmstVb4o-xjg0u7t4z1WXRmdxWMOw_XhQ7tPc7Fd8,11113
|
|
66
66
|
phoenix/server/prometheus.py,sha256=j9DHB2fERuq_ZKmwVaqR-9wx5WcPPuU1Cm5Bhg5241Y,2996
|
|
67
67
|
phoenix/server/telemetry.py,sha256=T_2OKrxNViAeaANlNspEekg_Y5uZIFWvKAnpz8Aoqvk,2762
|
|
68
|
-
phoenix/server/thread_server.py,sha256=
|
|
68
|
+
phoenix/server/thread_server.py,sha256=RwXQGP_QhGD7le6WB7xEygEEuwBl5Ck_Zo8xGIYGi9M,2135
|
|
69
69
|
phoenix/server/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
70
|
-
phoenix/server/api/context.py,sha256=
|
|
70
|
+
phoenix/server/api/context.py,sha256=G9bmB3h-a4Top6wGAu91ymS-YE6D1DYQyWtPIlZnbgc,2811
|
|
71
71
|
phoenix/server/api/interceptor.py,sha256=ykDnoC_apUd-llVli3m1CW18kNSIgjz2qZ6m5JmPDu8,1294
|
|
72
72
|
phoenix/server/api/queries.py,sha256=eq2xHaQF-x4k6AGSY6b6mU2pie9bj-AJML6P2Mr0_DM,19886
|
|
73
73
|
phoenix/server/api/schema.py,sha256=BcxdqO5CSGqpKd-AAJHMjFlzaK9oJA8GJuxmMfcdjn4,434
|
|
74
74
|
phoenix/server/api/utils.py,sha256=Y1lGu8J8r8BSBX9OzffgewI8QMziovbG-ePDvZrrwGI,949
|
|
75
|
-
phoenix/server/api/dataloaders/__init__.py,sha256=
|
|
75
|
+
phoenix/server/api/dataloaders/__init__.py,sha256=F6-8dwb-aQ_T8LeRYg3LPR7T94__8Xe4ysM0VGQeQUQ,4936
|
|
76
76
|
phoenix/server/api/dataloaders/average_experiment_run_latency.py,sha256=RiO0AKC6Y5byafsV0zTJEIOt8Nudjte73f1T78cBe1k,1817
|
|
77
77
|
phoenix/server/api/dataloaders/dataset_example_revisions.py,sha256=Vpr5IEKSR4QnAVxE5NM7u92fPNgeHQV2ieYc6JakCj0,3788
|
|
78
78
|
phoenix/server/api/dataloaders/dataset_example_spans.py,sha256=_jLlo0KdUS65d4PNTtE9aXVyG_NZWgA7VcpNC9udQ8U,1484
|
|
@@ -88,6 +88,7 @@ phoenix/server/api/dataloaders/latency_ms_quantile.py,sha256=pEc7QjB2iiNOQm_Fmo9
|
|
|
88
88
|
phoenix/server/api/dataloaders/min_start_or_max_end_times.py,sha256=IoFX5PtSpvQdMk_7-oB8TpIse3Q4PMxep4qKggkHpzo,2902
|
|
89
89
|
phoenix/server/api/dataloaders/project_by_name.py,sha256=W4q-ddeVnja2DNwgg5l8mV2GNADNJf1CTXNcJaBWdfE,1165
|
|
90
90
|
phoenix/server/api/dataloaders/record_counts.py,sha256=mp3KlhwFw-Iy7o6bFxtJKC6B5kGinPIh5PxxNkrxf8o,4283
|
|
91
|
+
phoenix/server/api/dataloaders/span_annotations.py,sha256=pJQHF92b-CgBJFfZOf0siLsa-jHzr9ByfLiNGpb5oic,1262
|
|
91
92
|
phoenix/server/api/dataloaders/span_descendants.py,sha256=djqXXwupWaXkFdscoy-iILYijuxlqr8hJcv6JawsV6s,2162
|
|
92
93
|
phoenix/server/api/dataloaders/span_evaluations.py,sha256=quXGyj_OYvHrcWfzXlYIv7C1OCZiL1K7cWU-YEAlsNA,1316
|
|
93
94
|
phoenix/server/api/dataloaders/span_projects.py,sha256=KV--NTLpdXyFUGYN69KHeVVHDBJR2oupo1cgLvqK6Ko,1304
|
|
@@ -133,19 +134,21 @@ phoenix/server/api/mutations/project_mutations.py,sha256=d_xtYkYfZ5flpVgEkGknKB8
|
|
|
133
134
|
phoenix/server/api/mutations/span_annotations_mutations.py,sha256=Pfaq4y-FGskPit4z_9GvsyWeBwK1g3CDi2UhGKxyjFE,4973
|
|
134
135
|
phoenix/server/api/mutations/trace_annotations_mutations.py,sha256=4xm-zg8PEjwjfVRsWzBD_iiOS94JI6UYtK3fV2dtA4M,5013
|
|
135
136
|
phoenix/server/api/openapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
136
|
-
phoenix/server/api/openapi/main.py,sha256=
|
|
137
|
-
phoenix/server/api/openapi/schema.py,sha256=
|
|
137
|
+
phoenix/server/api/openapi/main.py,sha256=KNutA_7AvV_WlGX8cOkvvDujcJKQ7AD1HT6rTpCpR8A,616
|
|
138
|
+
phoenix/server/api/openapi/schema.py,sha256=oVZoflWMfzOrLKMIrjr3iLnJ13rmN-t_DOe9g6KoN5s,471
|
|
138
139
|
phoenix/server/api/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
139
140
|
phoenix/server/api/routers/utils.py,sha256=M41BoH-fl37izhRuN2aX7lWm7jOC20A_3uClv9TVUUY,583
|
|
140
|
-
phoenix/server/api/routers/v1/__init__.py,sha256=
|
|
141
|
-
phoenix/server/api/routers/v1/dataset_examples.py,sha256=
|
|
142
|
-
phoenix/server/api/routers/v1/datasets.py,sha256=
|
|
143
|
-
phoenix/server/api/routers/v1/evaluations.py,sha256=
|
|
144
|
-
phoenix/server/api/routers/v1/experiment_evaluations.py,sha256=
|
|
145
|
-
phoenix/server/api/routers/v1/experiment_runs.py,sha256=
|
|
146
|
-
phoenix/server/api/routers/v1/experiments.py,sha256=
|
|
147
|
-
phoenix/server/api/routers/v1/spans.py,sha256=
|
|
148
|
-
phoenix/server/api/routers/v1/traces.py,sha256=
|
|
141
|
+
phoenix/server/api/routers/v1/__init__.py,sha256=nb49zcOdAi3DSGuC9gUubN9Yri-o7-WFdlGak4jGuFw,1462
|
|
142
|
+
phoenix/server/api/routers/v1/dataset_examples.py,sha256=HSPc4PTnGRqyHSXP7qAZtZ39OG3SVk7btU0HmJyrL14,5595
|
|
143
|
+
phoenix/server/api/routers/v1/datasets.py,sha256=B2k8IiIkmXEPTdBruGlOUZQmgjj2_G2Bet0_h-X-yZY,32189
|
|
144
|
+
phoenix/server/api/routers/v1/evaluations.py,sha256=M1PKCNL_5xB9EXY4EOnrOu9uDoeJan6V1tRkSbRJEgA,9673
|
|
145
|
+
phoenix/server/api/routers/v1/experiment_evaluations.py,sha256=Wk6YnjvA3zSh8N0lRxS8V5uf17tLsNzB12LrNDry1I0,4622
|
|
146
|
+
phoenix/server/api/routers/v1/experiment_runs.py,sha256=CJtTWSJni0xucDUQ-ouifcAfQFTD2xf-y7B_Xy7S6dA,6007
|
|
147
|
+
phoenix/server/api/routers/v1/experiments.py,sha256=oEPCoH_OKnIn04iBYYQcyx9N1LXnZGF0BEHwdO7XbOw,9760
|
|
148
|
+
phoenix/server/api/routers/v1/spans.py,sha256=ZGZ67Q5pmKTr2cPqc2Lf5fONmbp-Nr_A-pxLswATk_M,8724
|
|
149
|
+
phoenix/server/api/routers/v1/traces.py,sha256=Wm6bVm-MpubOxZwLwS9Xsn93RvDlSwlNYSprXnoIVQo,7921
|
|
150
|
+
phoenix/server/api/routers/v1/utils.py,sha256=R2WxEpTyi4Z94K8tyt-a4dMYGh4jP0a_lbJ33FG_dKc,3045
|
|
151
|
+
phoenix/server/api/types/Annotation.py,sha256=7Ym7iuVcbwHlw2yIRylz4nATAF_Cm-Z17qcjiooj1cc,751
|
|
149
152
|
phoenix/server/api/types/AnnotatorKind.py,sha256=rPgGdbN1Gvc109sGQ_ZH-gfJbp93V9wlarzTEJNtUwI,236
|
|
150
153
|
phoenix/server/api/types/Cluster.py,sha256=ac4YfT1OH3xLVmex7EUmB6b9IpULnhLTt554LR0jglE,5689
|
|
151
154
|
phoenix/server/api/types/CreateDatasetPayload.py,sha256=R-6zCmuD0f76RU9Giu78xwTHlASQs6Aq8yzvX1Kxc3g,140
|
|
@@ -164,7 +167,7 @@ phoenix/server/api/types/DocumentEvaluationSummary.py,sha256=EpgKn0uiH2Vbpyltc1M
|
|
|
164
167
|
phoenix/server/api/types/DocumentRetrievalMetrics.py,sha256=amkpC3H5IU5-9GvO0telpbq00m6lIcv_2v446OpwFwc,1822
|
|
165
168
|
phoenix/server/api/types/EmbeddingDimension.py,sha256=2OTVzAcfY-2xnJLl7122EAaqJyp0sob1v9-ryaNWknw,18961
|
|
166
169
|
phoenix/server/api/types/EmbeddingMetadata.py,sha256=fJvNNYCbkf3SJalArLy9rcBq9Uj1SNac60zjqe1PFnM,461
|
|
167
|
-
phoenix/server/api/types/Evaluation.py,sha256=
|
|
170
|
+
phoenix/server/api/types/Evaluation.py,sha256=oW9UfUCs6Td60kb5s6_sJNvUkxk5TQXjG0pmQ0-gT4M,3298
|
|
168
171
|
phoenix/server/api/types/EvaluationSummary.py,sha256=EFucuzAhcxR9sdEn6WNAtmAGJk-QR_3j3y7Mn2A9_bU,1528
|
|
169
172
|
phoenix/server/api/types/Event.py,sha256=XdYgaIxcVIW-YFViCkxj5l9OaVNepyIrCtm5Iqg2le8,3989
|
|
170
173
|
phoenix/server/api/types/EventMetadata.py,sha256=-J0tYF9eZTHwCjwxQHY7Gckr2_MNW5OoWT1mydweZNM,635
|
|
@@ -188,8 +191,8 @@ phoenix/server/api/types/Retrieval.py,sha256=OhMK2ncjoyp5h1yjKhjlKpoTbQrMHuxmgSF
|
|
|
188
191
|
phoenix/server/api/types/ScalarDriftMetricEnum.py,sha256=IUAcRPpgL41WdoIgK6cNk2Te38SspXGyEs-S1fY23_A,232
|
|
189
192
|
phoenix/server/api/types/Segments.py,sha256=m2yoegrxA1Tn7ZAy1rMjjD1isc752MaAXMoffkBlvrM,2921
|
|
190
193
|
phoenix/server/api/types/SortDir.py,sha256=OUpXhlCzCxPoXSDkJJygEs9Rw9pMymfaZUG5zPTrw4Y,152
|
|
191
|
-
phoenix/server/api/types/Span.py,sha256=
|
|
192
|
-
phoenix/server/api/types/SpanAnnotation.py,sha256=
|
|
194
|
+
phoenix/server/api/types/Span.py,sha256=VjFC5VXe3Incf9AhEvctYhRpUixhF82oN2iepxjU50Q,14180
|
|
195
|
+
phoenix/server/api/types/SpanAnnotation.py,sha256=6b5G-b_OoRvDL2ayWk7MkbqarLK-F-pQMx21CpUuNGY,1168
|
|
193
196
|
phoenix/server/api/types/TimeSeries.py,sha256=wjzuxHFqCey0O7Ys25qiXyuqXK8an-osyNWUE8A_8G4,5227
|
|
194
197
|
phoenix/server/api/types/Trace.py,sha256=ep-mPexub1ijxAnBvc2KrGsNVXO2SfDR1WxqER2wcD8,2376
|
|
195
198
|
phoenix/server/api/types/TraceAnnotation.py,sha256=OW6A2zr1gomOuG0XQe55dk15XXX2DSM0DzatRbHWH5A,1256
|
|
@@ -200,7 +203,6 @@ phoenix/server/api/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
|
|
|
200
203
|
phoenix/server/api/types/node.py,sha256=V0Xh9U4cGkz3iMg-vzEXtcs6cumU29JFPiU-JuGzjWI,848
|
|
201
204
|
phoenix/server/api/types/pagination.py,sha256=PcaJ0s4exsTKgCZC4aFm1cgZNrGpHSdo6PbkWzPcweg,9077
|
|
202
205
|
phoenix/server/openapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
203
|
-
phoenix/server/openapi/docs.py,sha256=fTb9q2oOSKC5bLVQy2Dsg3Bs0mGkCOKX1ypX7731sE0,7044
|
|
204
206
|
phoenix/server/static/apple-touch-icon-114x114.png,sha256=xtFVXAYQnJkpUApg2D1hltSTuyO4Is4sD4A0ZkikiVU,9486
|
|
205
207
|
phoenix/server/static/apple-touch-icon-120x120.png,sha256=iqZVAk634BbjJMozA8aHYyw15JjhIlIrG41FA2DFFaE,9957
|
|
206
208
|
phoenix/server/static/apple-touch-icon-144x144.png,sha256=VgARtkHKoU8zikb3_G83h_cb02kpPcoJqO78yRh1AfU,10047
|
|
@@ -256,8 +258,8 @@ phoenix/utilities/logging.py,sha256=lDXd6EGaamBNcQxL4vP1au9-i_SXe0OraUDiJOcszSw,
|
|
|
256
258
|
phoenix/utilities/project.py,sha256=qWsvKnG1oKhOFUowXf9qiOL2ia7jaFe_ijFFHEt8GJo,431
|
|
257
259
|
phoenix/utilities/re.py,sha256=PDve_OLjRTM8yQQJHC8-n3HdIONi7aNils3ZKRZ5uBM,2045
|
|
258
260
|
phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
259
|
-
arize_phoenix-4.10.
|
|
260
|
-
arize_phoenix-4.10.
|
|
261
|
-
arize_phoenix-4.10.
|
|
262
|
-
arize_phoenix-4.10.
|
|
263
|
-
arize_phoenix-4.10.
|
|
261
|
+
arize_phoenix-4.10.2rc1.dist-info/METADATA,sha256=kvMhdHvg67eriHuvnz3zfwCN-P9ISpjC_3LrYshITeY,11486
|
|
262
|
+
arize_phoenix-4.10.2rc1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
|
263
|
+
arize_phoenix-4.10.2rc1.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
|
|
264
|
+
arize_phoenix-4.10.2rc1.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
|
|
265
|
+
arize_phoenix-4.10.2rc1.dist-info/RECORD,,
|
phoenix/server/api/context.py
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
2
|
from datetime import datetime
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from typing import AsyncContextManager, Callable, Optional
|
|
4
|
+
from typing import AsyncContextManager, Callable, Optional
|
|
5
5
|
|
|
6
6
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
7
|
-
from
|
|
8
|
-
from starlette.responses import Response
|
|
9
|
-
from starlette.websockets import WebSocket
|
|
7
|
+
from strawberry.fastapi import BaseContext
|
|
10
8
|
from typing_extensions import TypeAlias
|
|
11
9
|
|
|
12
10
|
from phoenix.core.model_schema import Model
|
|
@@ -27,6 +25,7 @@ from phoenix.server.api.dataloaders import (
|
|
|
27
25
|
MinStartOrMaxEndTimeDataLoader,
|
|
28
26
|
ProjectByNameDataLoader,
|
|
29
27
|
RecordCountDataLoader,
|
|
28
|
+
SpanAnnotationsDataLoader,
|
|
30
29
|
SpanDescendantsDataLoader,
|
|
31
30
|
SpanEvaluationsDataLoader,
|
|
32
31
|
SpanProjectsDataLoader,
|
|
@@ -59,15 +58,14 @@ class DataLoaders:
|
|
|
59
58
|
trace_evaluations: TraceEvaluationsDataLoader
|
|
60
59
|
trace_row_ids: TraceRowIdsDataLoader
|
|
61
60
|
project_by_name: ProjectByNameDataLoader
|
|
61
|
+
span_annotations: SpanAnnotationsDataLoader
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
ProjectRowId: TypeAlias = int
|
|
65
65
|
|
|
66
66
|
|
|
67
67
|
@dataclass
|
|
68
|
-
class Context:
|
|
69
|
-
request: Union[Request, WebSocket]
|
|
70
|
-
response: Optional[Response]
|
|
68
|
+
class Context(BaseContext):
|
|
71
69
|
db: Callable[[], AsyncContextManager[AsyncSession]]
|
|
72
70
|
data_loaders: DataLoaders
|
|
73
71
|
cache_for_dataloaders: Optional[CacheForDataLoaders]
|
|
@@ -26,6 +26,7 @@ from .latency_ms_quantile import LatencyMsQuantileCache, LatencyMsQuantileDataLo
|
|
|
26
26
|
from .min_start_or_max_end_times import MinStartOrMaxEndTimeCache, MinStartOrMaxEndTimeDataLoader
|
|
27
27
|
from .project_by_name import ProjectByNameDataLoader
|
|
28
28
|
from .record_counts import RecordCountCache, RecordCountDataLoader
|
|
29
|
+
from .span_annotations import SpanAnnotationsDataLoader
|
|
29
30
|
from .span_descendants import SpanDescendantsDataLoader
|
|
30
31
|
from .span_evaluations import SpanEvaluationsDataLoader
|
|
31
32
|
from .span_projects import SpanProjectsDataLoader
|
|
@@ -56,6 +57,7 @@ __all__ = [
|
|
|
56
57
|
"TraceEvaluationsDataLoader",
|
|
57
58
|
"TraceRowIdsDataLoader",
|
|
58
59
|
"ProjectByNameDataLoader",
|
|
60
|
+
"SpanAnnotationsDataLoader",
|
|
59
61
|
]
|
|
60
62
|
|
|
61
63
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from collections import defaultdict
|
|
2
|
+
from typing import (
|
|
3
|
+
AsyncContextManager,
|
|
4
|
+
Callable,
|
|
5
|
+
DefaultDict,
|
|
6
|
+
List,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
from sqlalchemy import select
|
|
10
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
11
|
+
from strawberry.dataloader import DataLoader
|
|
12
|
+
from typing_extensions import TypeAlias
|
|
13
|
+
|
|
14
|
+
from phoenix.db import models
|
|
15
|
+
from phoenix.server.api.types.SpanAnnotation import SpanAnnotation, to_gql_span_annotation
|
|
16
|
+
|
|
17
|
+
Key: TypeAlias = int
|
|
18
|
+
Result: TypeAlias = List[SpanAnnotation]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class SpanAnnotationsDataLoader(DataLoader[Key, Result]):
|
|
22
|
+
def __init__(self, db: Callable[[], AsyncContextManager[AsyncSession]]) -> None:
|
|
23
|
+
super().__init__(load_fn=self._load_fn)
|
|
24
|
+
self._db = db
|
|
25
|
+
|
|
26
|
+
async def _load_fn(self, keys: List[Key]) -> List[Result]:
|
|
27
|
+
span_annotations_by_id: DefaultDict[Key, Result] = defaultdict(list)
|
|
28
|
+
msa = models.SpanAnnotation
|
|
29
|
+
async with self._db() as session:
|
|
30
|
+
data = await session.stream_scalars(select(msa).where(msa.span_rowid.in_(keys)))
|
|
31
|
+
async for span_annotation in data:
|
|
32
|
+
span_annotations_by_id[span_annotation.span_rowid].append(
|
|
33
|
+
to_gql_span_annotation(span_annotation)
|
|
34
|
+
)
|
|
35
|
+
return [span_annotations_by_id[key] for key in keys]
|
|
@@ -1,6 +1,22 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from argparse import ArgumentParser
|
|
3
|
+
from typing import Optional, Tuple
|
|
4
|
+
|
|
1
5
|
from .schema import get_openapi_schema
|
|
2
6
|
|
|
3
7
|
if __name__ == "__main__":
|
|
4
|
-
|
|
8
|
+
parser = ArgumentParser()
|
|
9
|
+
parser.add_argument(
|
|
10
|
+
"--compress",
|
|
11
|
+
action="store_true",
|
|
12
|
+
help="Whether to output a compressed version of the OpenAPI schema",
|
|
13
|
+
)
|
|
14
|
+
args = parser.parse_args()
|
|
5
15
|
|
|
6
|
-
|
|
16
|
+
indent: Optional[int] = None
|
|
17
|
+
separator: Optional[Tuple[str, str]] = None
|
|
18
|
+
if args.compress:
|
|
19
|
+
separator = (",", ":")
|
|
20
|
+
else:
|
|
21
|
+
indent = 2
|
|
22
|
+
print(json.dumps(get_openapi_schema(), indent=indent, separators=separator))
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
from typing import Any
|
|
1
|
+
from typing import Any, Dict
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from fastapi.openapi.utils import get_openapi
|
|
4
4
|
|
|
5
|
-
from phoenix.server.api.routers.v1 import
|
|
5
|
+
from phoenix.server.api.routers.v1 import REST_API_VERSION
|
|
6
|
+
from phoenix.server.api.routers.v1 import router as v1_router
|
|
6
7
|
|
|
7
|
-
OPENAPI_SCHEMA_GENERATOR = SchemaGenerator(
|
|
8
|
-
{"openapi": "3.0.0", "info": {"title": "Arize-Phoenix API", "version": "1.0"}}
|
|
9
|
-
)
|
|
10
8
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
9
|
+
def get_openapi_schema() -> Dict[str, Any]:
|
|
10
|
+
return get_openapi(
|
|
11
|
+
title="Arize-Phoenix REST API",
|
|
12
|
+
version=REST_API_VERSION,
|
|
13
|
+
openapi_version="3.1.0",
|
|
14
|
+
description="Schema for Arize-Phoenix REST API",
|
|
15
|
+
routes=v1_router.routes,
|
|
16
|
+
)
|
|
@@ -1,89 +1,42 @@
|
|
|
1
|
-
from
|
|
2
|
-
|
|
3
|
-
import wrapt
|
|
4
|
-
from starlette import routing
|
|
5
|
-
from starlette.requests import Request
|
|
6
|
-
from starlette.responses import Response
|
|
1
|
+
from fastapi import APIRouter, Depends, HTTPException, Request
|
|
7
2
|
from starlette.status import HTTP_403_FORBIDDEN
|
|
8
3
|
|
|
9
|
-
from . import
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
)
|
|
18
|
-
from .dataset_examples import list_dataset_examples
|
|
19
|
-
|
|
4
|
+
from .datasets import router as datasets_router
|
|
5
|
+
from .evaluations import router as evaluations_router
|
|
6
|
+
from .experiment_evaluations import router as experiment_evaluations_router
|
|
7
|
+
from .experiment_runs import router as experiment_runs_router
|
|
8
|
+
from .experiments import router as experiments_router
|
|
9
|
+
from .spans import router as spans_router
|
|
10
|
+
from .traces import router as traces_router
|
|
11
|
+
from .utils import add_errors_to_responses
|
|
20
12
|
|
|
21
|
-
|
|
22
|
-
async def forbid_if_readonly(
|
|
23
|
-
wrapped: Callable[[Request], Awaitable[Response]],
|
|
24
|
-
_: Any,
|
|
25
|
-
args: Tuple[Request],
|
|
26
|
-
kwargs: Mapping[str, Any],
|
|
27
|
-
) -> Response:
|
|
28
|
-
request, *_ = args
|
|
29
|
-
if request.app.state.read_only:
|
|
30
|
-
return Response(status_code=HTTP_403_FORBIDDEN)
|
|
31
|
-
return await wrapped(*args, **kwargs)
|
|
13
|
+
REST_API_VERSION = "1.0"
|
|
32
14
|
|
|
33
15
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
Route(
|
|
53
|
-
"/v1/datasets/{id:str}/jsonl/openai_ft",
|
|
54
|
-
datasets.get_dataset_jsonl_openai_ft,
|
|
55
|
-
methods=["GET"],
|
|
56
|
-
),
|
|
57
|
-
Route(
|
|
58
|
-
"/v1/datasets/{id:str}/jsonl/openai_evals",
|
|
59
|
-
datasets.get_dataset_jsonl_openai_evals,
|
|
60
|
-
methods=["GET"],
|
|
61
|
-
),
|
|
62
|
-
Route("/v1/datasets/{id:str}/examples", list_dataset_examples, methods=["GET"]),
|
|
63
|
-
Route("/v1/datasets/{id:str}/versions", datasets.get_dataset_versions, methods=["GET"]),
|
|
64
|
-
Route(
|
|
65
|
-
"/v1/datasets/{dataset_id:str}/experiments",
|
|
66
|
-
experiments.create_experiment,
|
|
67
|
-
methods=["POST"],
|
|
68
|
-
),
|
|
69
|
-
Route(
|
|
70
|
-
"/v1/experiments/{experiment_id:str}",
|
|
71
|
-
experiments.read_experiment,
|
|
72
|
-
methods=["GET"],
|
|
73
|
-
),
|
|
74
|
-
Route(
|
|
75
|
-
"/v1/experiments/{experiment_id:str}/runs",
|
|
76
|
-
experiment_runs.create_experiment_run,
|
|
77
|
-
methods=["POST"],
|
|
78
|
-
),
|
|
79
|
-
Route(
|
|
80
|
-
"/v1/experiments/{experiment_id:str}/runs",
|
|
81
|
-
experiment_runs.list_experiment_runs,
|
|
82
|
-
methods=["GET"],
|
|
83
|
-
),
|
|
84
|
-
Route(
|
|
85
|
-
"/v1/experiment_evaluations",
|
|
86
|
-
experiment_evaluations.upsert_experiment_evaluation,
|
|
87
|
-
methods=["POST"],
|
|
16
|
+
async def prevent_access_in_read_only_mode(request: Request) -> None:
|
|
17
|
+
"""
|
|
18
|
+
Prevents access to the REST API in read-only mode.
|
|
19
|
+
"""
|
|
20
|
+
if request.app.state.read_only:
|
|
21
|
+
raise HTTPException(
|
|
22
|
+
detail="The Phoenix REST API is disabled in read-only mode.",
|
|
23
|
+
status_code=HTTP_403_FORBIDDEN,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
router = APIRouter(
|
|
28
|
+
prefix="/v1",
|
|
29
|
+
dependencies=[Depends(prevent_access_in_read_only_mode)],
|
|
30
|
+
responses=add_errors_to_responses(
|
|
31
|
+
[
|
|
32
|
+
HTTP_403_FORBIDDEN # adds a 403 response to each route in the generated OpenAPI schema
|
|
33
|
+
]
|
|
88
34
|
),
|
|
89
|
-
|
|
35
|
+
)
|
|
36
|
+
router.include_router(datasets_router)
|
|
37
|
+
router.include_router(experiments_router)
|
|
38
|
+
router.include_router(experiment_runs_router)
|
|
39
|
+
router.include_router(experiment_evaluations_router)
|
|
40
|
+
router.include_router(traces_router)
|
|
41
|
+
router.include_router(spans_router)
|
|
42
|
+
router.include_router(evaluations_router)
|