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.

Files changed (28) hide show
  1. {arize_phoenix-4.10.1.dist-info → arize_phoenix-4.10.2rc1.dist-info}/METADATA +4 -3
  2. {arize_phoenix-4.10.1.dist-info → arize_phoenix-4.10.2rc1.dist-info}/RECORD +27 -25
  3. phoenix/server/api/context.py +5 -7
  4. phoenix/server/api/dataloaders/__init__.py +2 -0
  5. phoenix/server/api/dataloaders/span_annotations.py +35 -0
  6. phoenix/server/api/openapi/main.py +18 -2
  7. phoenix/server/api/openapi/schema.py +12 -12
  8. phoenix/server/api/routers/v1/__init__.py +36 -83
  9. phoenix/server/api/routers/v1/dataset_examples.py +102 -123
  10. phoenix/server/api/routers/v1/datasets.py +389 -507
  11. phoenix/server/api/routers/v1/evaluations.py +74 -64
  12. phoenix/server/api/routers/v1/experiment_evaluations.py +67 -91
  13. phoenix/server/api/routers/v1/experiment_runs.py +97 -155
  14. phoenix/server/api/routers/v1/experiments.py +131 -181
  15. phoenix/server/api/routers/v1/spans.py +141 -173
  16. phoenix/server/api/routers/v1/traces.py +113 -128
  17. phoenix/server/api/routers/v1/utils.py +94 -0
  18. phoenix/server/api/types/Annotation.py +21 -0
  19. phoenix/server/api/types/Evaluation.py +4 -22
  20. phoenix/server/api/types/Span.py +15 -4
  21. phoenix/server/api/types/SpanAnnotation.py +4 -6
  22. phoenix/server/app.py +149 -174
  23. phoenix/server/thread_server.py +2 -2
  24. phoenix/version.py +1 -1
  25. phoenix/server/openapi/docs.py +0 -221
  26. {arize_phoenix-4.10.1.dist-info → arize_phoenix-4.10.2rc1.dist-info}/WHEEL +0 -0
  27. {arize_phoenix-4.10.1.dist-info → arize_phoenix-4.10.2rc1.dist-info}/licenses/IP_NOTICE +0 -0
  28. {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.1
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=ogZ1wJ10Itlh9CdbwovCzGjxyYPJlQvG3lxFz6oBJ-c,23
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=Ld9NvW7sBT4aJn8CXAB_PIw4c5wlkxCcjT_hzjtn7dM,18478
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=dP6cm6Cf08jNhDA1TRlVZpziu1YgtPDmaeIJMm725eI,2154
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=4jcy203Gtx38399FP21iU3HmFsq-50EKFJlX4IW2Los,2878
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=qehXL37vGdw7v5PFs3kbZVIuhuzrVNVeZACDQjYpwyo,4847
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=WY0pj3B7siQyyYqKyhqnzWC7P8MtEtiukOBUjGwLXfw,153
137
- phoenix/server/api/openapi/schema.py,sha256=uuSYe1Ecu72aXRgTNjyMu-9ZPE13DAHJPKtedS-MsSs,451
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=D1EFRWG4PcsTubeF3A3ENlNatCRq26AA52FxW11BGjM,3048
141
- phoenix/server/api/routers/v1/dataset_examples.py,sha256=XfqOvDKF1oxb0pkeYfBycwwGt3LnSyyGdMLKC5VKoGQ,6690
142
- phoenix/server/api/routers/v1/datasets.py,sha256=r0WcNxF8SKVa3-4rrTIg4Andwr4NmRmW1ybpKuxR9qw,33639
143
- phoenix/server/api/routers/v1/evaluations.py,sha256=8g6P_e2BweV3RDU0esFmpkb0L5fCwonQPXiJ0y6HLwg,9126
144
- phoenix/server/api/routers/v1/experiment_evaluations.py,sha256=TE1GMSOLN_96uAaJpnRpIH2u9x6_ebtkECgZRHvqt-w,5098
145
- phoenix/server/api/routers/v1/experiment_runs.py,sha256=jy4SynmzdtQMoUzlowmG6wsVU14SsLAzfcW4JOhXjeQ,8154
146
- phoenix/server/api/routers/v1/experiments.py,sha256=uVdmhyJgYI-UqOiRSJ-8OcVpL8a6Z02B5H2Rt_7yboY,11829
147
- phoenix/server/api/routers/v1/spans.py,sha256=tryWFoJVFRLALzt6dfPmBBhKMS0s3hhlYdTathxVEU4,9638
148
- phoenix/server/api/routers/v1/traces.py,sha256=PBIrpdJHVJ9gyiukCy1Ck1w0xts0VEHtRKaF7Noa248,8434
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=pSoaJH8-WzPvmZKn5fButzkXSN3Rvuq9GJ7g9H1aaaU,3997
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=W4Rsg85bgqbDhgYwpjgOTrIQKbkwpFQPpL6nqMyzhCs,13865
192
- phoenix/server/api/types/SpanAnnotation.py,sha256=n9pehpY-NqJD9KvK03UJYlHLKdies7mxrqdr9i1c5oE,1241
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.1.dist-info/METADATA,sha256=0m2W26GT35O9_Mm0_WUpcvE7Vr9oOq-p2DtR2v6dmkI,11452
260
- arize_phoenix-4.10.1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
261
- arize_phoenix-4.10.1.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
262
- arize_phoenix-4.10.1.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
263
- arize_phoenix-4.10.1.dist-info/RECORD,,
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,,
@@ -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, Union
4
+ from typing import AsyncContextManager, Callable, Optional
5
5
 
6
6
  from sqlalchemy.ext.asyncio import AsyncSession
7
- from starlette.requests import Request
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
- import yaml # type: ignore
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
- print(yaml.dump(get_openapi_schema(), indent=2))
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 starlette.schemas import SchemaGenerator
3
+ from fastapi.openapi.utils import get_openapi
4
4
 
5
- from phoenix.server.api.routers.v1 import V1_ROUTES
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
- def get_openapi_schema() -> Any:
13
- """
14
- Exports an OpenAPI schema for the Phoenix REST API as a JSON object.
15
- """
16
- return OPENAPI_SCHEMA_GENERATOR.get_schema(V1_ROUTES) # type: ignore
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 typing import Any, Awaitable, Callable, Mapping, Tuple
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
- datasets,
11
- evaluations,
12
- experiment_evaluations,
13
- experiment_runs,
14
- experiments,
15
- spans,
16
- traces,
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
- @wrapt.decorator # type: ignore
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
- class Route(routing.Route):
35
- def __init__(self, path: str, endpoint: Callable[..., Any], **kwargs: Any) -> None:
36
- super().__init__(path, forbid_if_readonly(endpoint), **kwargs)
37
-
38
-
39
- V1_ROUTES = [
40
- Route("/v1/evaluations", evaluations.post_evaluations, methods=["POST"]),
41
- Route("/v1/evaluations", evaluations.get_evaluations, methods=["GET"]),
42
- Route("/v1/traces", traces.post_traces, methods=["POST"]),
43
- Route("/v1/trace_annotations", traces.annotate_traces, methods=["POST"]),
44
- Route("/v1/spans", spans.query_spans_handler, methods=["POST"]),
45
- Route("/v1/spans", spans.get_spans_handler, methods=["GET"]),
46
- Route("/v1/span_annotations", spans.annotate_spans, methods=["POST"]),
47
- Route("/v1/datasets/upload", datasets.post_datasets_upload, methods=["POST"]),
48
- Route("/v1/datasets", datasets.list_datasets, methods=["GET"]),
49
- Route("/v1/datasets/{id:str}", datasets.delete_dataset_by_id, methods=["DELETE"]),
50
- Route("/v1/datasets/{id:str}", datasets.get_dataset_by_id, methods=["GET"]),
51
- Route("/v1/datasets/{id:str}/csv", datasets.get_dataset_csv, methods=["GET"]),
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)