arize-phoenix 4.16.1__py3-none-any.whl → 4.18.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of arize-phoenix might be problematic. Click here for more details.

Files changed (25) hide show
  1. {arize_phoenix-4.16.1.dist-info → arize_phoenix-4.18.0.dist-info}/METADATA +5 -5
  2. {arize_phoenix-4.16.1.dist-info → arize_phoenix-4.18.0.dist-info}/RECORD +24 -21
  3. phoenix/server/api/context.py +2 -0
  4. phoenix/server/api/dataloaders/__init__.py +8 -0
  5. phoenix/server/api/dataloaders/annotation_summaries.py +146 -0
  6. phoenix/server/api/mutations/span_annotations_mutations.py +1 -0
  7. phoenix/server/api/types/AnnotationSummary.py +55 -0
  8. phoenix/server/api/types/EvaluationSummary.py +1 -6
  9. phoenix/server/api/types/LabelFraction.py +7 -0
  10. phoenix/server/api/types/Project.py +24 -0
  11. phoenix/server/app.py +7 -0
  12. phoenix/server/static/.vite/manifest.json +31 -31
  13. phoenix/server/static/assets/{components-Ci5kMOk5.js → components-B2sHrnz0.js} +153 -122
  14. phoenix/server/static/assets/index-BIFmgnip.js +100 -0
  15. phoenix/server/static/assets/{pages-BrevprVW.js → pages-BTHjBGHq.js} +260 -220
  16. phoenix/server/static/assets/{vendor-CP0b0YG0.js → vendor-BMWfu6zp.js} +1 -1
  17. phoenix/server/static/assets/{vendor-arizeai-DTbiPGp6.js → vendor-arizeai-CkyzG9Wl.js} +2 -2
  18. phoenix/server/static/assets/{vendor-codemirror-DtdPDzrv.js → vendor-codemirror-DO3VqEcD.js} +1 -1
  19. phoenix/server/static/assets/{vendor-recharts-A0DA1O99.js → vendor-recharts-BGN0SxgJ.js} +1 -1
  20. phoenix/session/session.py +11 -8
  21. phoenix/version.py +1 -1
  22. phoenix/server/static/assets/index-BQG5WVX7.js +0 -100
  23. {arize_phoenix-4.16.1.dist-info → arize_phoenix-4.18.0.dist-info}/WHEEL +0 -0
  24. {arize_phoenix-4.16.1.dist-info → arize_phoenix-4.18.0.dist-info}/licenses/IP_NOTICE +0 -0
  25. {arize_phoenix-4.16.1.dist-info → arize_phoenix-4.18.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arize-phoenix
3
- Version: 4.16.1
3
+ Version: 4.18.0
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
@@ -28,10 +28,10 @@ Requires-Dist: hdbscan>=0.8.33
28
28
  Requires-Dist: httpx
29
29
  Requires-Dist: jinja2
30
30
  Requires-Dist: numpy<2
31
- Requires-Dist: openinference-instrumentation
32
- Requires-Dist: openinference-instrumentation-langchain>=0.1.12
33
- Requires-Dist: openinference-instrumentation-llama-index>=1.2.0
34
- Requires-Dist: openinference-instrumentation-openai>=0.1.4
31
+ Requires-Dist: openinference-instrumentation-langchain>=0.1.26
32
+ Requires-Dist: openinference-instrumentation-llama-index>=2.2.1
33
+ Requires-Dist: openinference-instrumentation-openai>=0.1.11
34
+ Requires-Dist: openinference-instrumentation>=0.1.12
35
35
  Requires-Dist: openinference-semantic-conventions>=0.1.9
36
36
  Requires-Dist: opentelemetry-exporter-otlp
37
37
  Requires-Dist: opentelemetry-proto>=1.12.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=JsY9dR1EpUWL0aoebyfhTna4xxHCsYTHWzp8Gm8fUa8,23
8
+ phoenix/version.py,sha256=g7MWtE7e6MvbE-FD9TSDyMr8ejjsU5QFtDnHc8sT424,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
@@ -65,7 +65,7 @@ phoenix/pointcloud/pointcloud.py,sha256=4zAIkKs2xOUbchpj4XDAV-iPMXrfAJ15TG6rlIYG
65
65
  phoenix/pointcloud/projectors.py,sha256=zO_RrtDYSv2rqVOfIP2_9Cv11Dc8EmcZR94xhFcBYPU,1057
66
66
  phoenix/pointcloud/umap_parameters.py,sha256=3UQSjrysVOvq2V4KNpTMqNqNiK0BsTZnPBHWZ4fyJtQ,1708
67
67
  phoenix/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
- phoenix/server/app.py,sha256=gAmGzOAhGO05IBEnBNfOc8Suw15_0_h0OCp-9RP0udQ,19098
68
+ phoenix/server/app.py,sha256=FqsV0CqFwzyPDmVeTSf3uwBC6DkyZXbiikSJkhS0Og8,19387
69
69
  phoenix/server/grpc_server.py,sha256=jllxDNkpLQxDkvej4RhTokobowbvydF-SU8gSw1MTCc,3378
70
70
  phoenix/server/main.py,sha256=dvjv3g8ANpkvSGCUN02S2Yse643Nlwrp_bj4iXBSVTE,11082
71
71
  phoenix/server/prometheus.py,sha256=j9DHB2fERuq_ZKmwVaqR-9wx5WcPPuU1Cm5Bhg5241Y,2996
@@ -73,12 +73,13 @@ phoenix/server/telemetry.py,sha256=T_2OKrxNViAeaANlNspEekg_Y5uZIFWvKAnpz8Aoqvk,2
73
73
  phoenix/server/thread_server.py,sha256=RwXQGP_QhGD7le6WB7xEygEEuwBl5Ck_Zo8xGIYGi9M,2135
74
74
  phoenix/server/types.py,sha256=o3uwy8NvfLO-j86v2Dl3irko6er0hvB_x4Df3S1DveM,460
75
75
  phoenix/server/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
- phoenix/server/api/context.py,sha256=IZNZB8VMOL_mKzTkvyS5RyIcZcI0gwUt2qZ6jppBDWc,2853
76
+ phoenix/server/api/context.py,sha256=70fJ9_O2yD-JEiCUM6WuKr6Byw9Sq00z_q0gBFW0Acg,2940
77
77
  phoenix/server/api/interceptor.py,sha256=ykDnoC_apUd-llVli3m1CW18kNSIgjz2qZ6m5JmPDu8,1294
78
78
  phoenix/server/api/queries.py,sha256=eq2xHaQF-x4k6AGSY6b6mU2pie9bj-AJML6P2Mr0_DM,19886
79
79
  phoenix/server/api/schema.py,sha256=BcxdqO5CSGqpKd-AAJHMjFlzaK9oJA8GJuxmMfcdjn4,434
80
80
  phoenix/server/api/utils.py,sha256=Kl47G-1A7QKTDrc75BU2QK6HupsG6MWuXxy351FOfKQ,858
81
- phoenix/server/api/dataloaders/__init__.py,sha256=C48-E6wkXSfAweypgH3BE_m0bAOLBVbIVzJxkva6t4g,5038
81
+ phoenix/server/api/dataloaders/__init__.py,sha256=aWL1--L5fOh6ouBS8VeJRJBtJogKTtRHySPpkr_AUGk,5506
82
+ phoenix/server/api/dataloaders/annotation_summaries.py,sha256=HO5PWAmFr_hmN6vYbui5jbAV3s6YPfOx6I94wr0_pgw,5500
82
83
  phoenix/server/api/dataloaders/average_experiment_run_latency.py,sha256=q091UmkXx37OBKh7L-GJ5LXHyRXfX2w4XTk1NMHtPpw,1827
83
84
  phoenix/server/api/dataloaders/dataset_example_revisions.py,sha256=i0g8F4akEf3kQOzAvBjO27QwXNsq-kJEM8dtzduxQgY,3720
84
85
  phoenix/server/api/dataloaders/dataset_example_spans.py,sha256=-TjdyyJv2c2JiN1OXu6MMmQ-BEKlHXucEDcuObeRVsU,1416
@@ -140,7 +141,7 @@ phoenix/server/api/mutations/dataset_mutations.py,sha256=CuKhxsYfvwVcdN_9EXhKxB6
140
141
  phoenix/server/api/mutations/experiment_mutations.py,sha256=vV2lbJ7ccXZqe-LY7nXx6QxWqhKQE4UNZAFcML-KQ8I,3011
141
142
  phoenix/server/api/mutations/export_events_mutations.py,sha256=t_wYBxaqvBJYRoHslh3Bmoxmwlzoy0u8SsBKWIKN5hE,4028
142
143
  phoenix/server/api/mutations/project_mutations.py,sha256=d_xtYkYfZ5flpVgEkGknKB8rsEux-zZraczzqAs4e8A,2255
143
- phoenix/server/api/mutations/span_annotations_mutations.py,sha256=DJ1wLlvx7zZJZclw9cFHzrBFtSf98a7grHBb0rd-Hyc,5339
144
+ phoenix/server/api/mutations/span_annotations_mutations.py,sha256=C6sBOe0EbClj6pYSODBsmJ_mrrYtMFaMZkPO0Be-5I0,5410
144
145
  phoenix/server/api/mutations/trace_annotations_mutations.py,sha256=GtI_kDpzLDBFjh0CkYjCgVfdBCog7aKHlIVsEM2x92k,5379
145
146
  phoenix/server/api/openapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
147
  phoenix/server/api/openapi/main.py,sha256=KNutA_7AvV_WlGX8cOkvvDujcJKQ7AD1HT6rTpCpR8A,616
@@ -158,6 +159,7 @@ phoenix/server/api/routers/v1/spans.py,sha256=-nDcr0AjynS-0U6A2nxEQiUTLoNyfzE-3N
158
159
  phoenix/server/api/routers/v1/traces.py,sha256=4k_57UICPfRcyQsdPBK-Xo_n6oZ1p41XUwXhZEQpXwE,7568
159
160
  phoenix/server/api/routers/v1/utils.py,sha256=xvl2v-BKUkqmFVMmgmmWGFKuRBTrUdoiAeT3mCYEE68,3086
160
161
  phoenix/server/api/types/Annotation.py,sha256=7Ym7iuVcbwHlw2yIRylz4nATAF_Cm-Z17qcjiooj1cc,751
162
+ phoenix/server/api/types/AnnotationSummary.py,sha256=8B2LIROqcrPOi8hvYygsblKvSEBfSrysnKOV7F36hgA,1518
161
163
  phoenix/server/api/types/AnnotatorKind.py,sha256=rPgGdbN1Gvc109sGQ_ZH-gfJbp93V9wlarzTEJNtUwI,236
162
164
  phoenix/server/api/types/Cluster.py,sha256=ac4YfT1OH3xLVmex7EUmB6b9IpULnhLTt554LR0jglE,5689
163
165
  phoenix/server/api/types/CreateDatasetPayload.py,sha256=R-6zCmuD0f76RU9Giu78xwTHlASQs6Aq8yzvX1Kxc3g,140
@@ -177,7 +179,7 @@ phoenix/server/api/types/DocumentRetrievalMetrics.py,sha256=amkpC3H5IU5-9GvO0tel
177
179
  phoenix/server/api/types/EmbeddingDimension.py,sha256=2OTVzAcfY-2xnJLl7122EAaqJyp0sob1v9-ryaNWknw,18961
178
180
  phoenix/server/api/types/EmbeddingMetadata.py,sha256=fJvNNYCbkf3SJalArLy9rcBq9Uj1SNac60zjqe1PFnM,461
179
181
  phoenix/server/api/types/Evaluation.py,sha256=oW9UfUCs6Td60kb5s6_sJNvUkxk5TQXjG0pmQ0-gT4M,3298
180
- phoenix/server/api/types/EvaluationSummary.py,sha256=EFucuzAhcxR9sdEn6WNAtmAGJk-QR_3j3y7Mn2A9_bU,1528
182
+ phoenix/server/api/types/EvaluationSummary.py,sha256=N1DhPXGhBbOOQakF43OGuZ5fl4vye7Uc-HnW5M262F8,1518
181
183
  phoenix/server/api/types/Event.py,sha256=XdYgaIxcVIW-YFViCkxj5l9OaVNepyIrCtm5Iqg2le8,3989
182
184
  phoenix/server/api/types/EventMetadata.py,sha256=-J0tYF9eZTHwCjwxQHY7Gckr2_MNW5OoWT1mydweZNM,635
183
185
  phoenix/server/api/types/ExampleRevisionInterface.py,sha256=gV3Gt9-3Oi5wjaVtepC6nOt3FzTzZFD1KebNnqiw56E,294
@@ -190,11 +192,12 @@ phoenix/server/api/types/ExportedFile.py,sha256=e3GTn7B5LgsTbqiwjhMCQH7VsiqXitrB
190
192
  phoenix/server/api/types/Functionality.py,sha256=tzV9xdhB8zqfsjWxP66NDC7EZsplYkYO7jRbLWJIeeg,382
191
193
  phoenix/server/api/types/Inferences.py,sha256=BOMlOSsRtUV9XQxpnjmZxdBcJ1w-t9PiFfVOSTS160E,3367
192
194
  phoenix/server/api/types/InferencesRole.py,sha256=Kj9aiXOpGhpeg9PHd9MDU7aXVIT28EjJxr4P6xybfzc,601
195
+ phoenix/server/api/types/LabelFraction.py,sha256=zsDxdFALrNiGA1eNykeP8o65gbA0HOhRp54MPH_iRAM,93
193
196
  phoenix/server/api/types/MimeType.py,sha256=Zpi6zCalkSFgsvhzvOs-O1gYA04usAi9H__QZUmFlO0,365
194
197
  phoenix/server/api/types/Model.py,sha256=BRIzH5xSGiDrAUYvhwDpwxT6--ddS3Xr3vCvP8_vzdo,8051
195
198
  phoenix/server/api/types/NumericRange.py,sha256=afEjgF97Go_OvmjMggbPBt-zGM8IONewAyEiKEHRds0,192
196
199
  phoenix/server/api/types/PerformanceMetric.py,sha256=W92B7OghEOgzFvmY0LCqpgavHaQggTGshdgfD0yqHX4,350
197
- phoenix/server/api/types/Project.py,sha256=R2_nart3H4m8QYRbBe-SRnYvIjH4BCipcj_tKe6GaC8,14516
200
+ phoenix/server/api/types/Project.py,sha256=5Tlz06QSGth9atu2gs0l0GrdoLYrH-lWR4sI-RmLoM8,15418
198
201
  phoenix/server/api/types/PromptResponse.py,sha256=Q8HKtpp8GpUOcxPCzZpkkokidDd6u0aZOv_SuPZZd5Q,630
199
202
  phoenix/server/api/types/Retrieval.py,sha256=OhMK2ncjoyp5h1yjKhjlKpoTbQrMHuxmgSFw-AO1rWw,285
200
203
  phoenix/server/api/types/ScalarDriftMetricEnum.py,sha256=IUAcRPpgL41WdoIgK6cNk2Te38SspXGyEs-S1fY23_A,232
@@ -222,15 +225,15 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
222
225
  phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
223
226
  phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
224
227
  phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
225
- phoenix/server/static/.vite/manifest.json,sha256=Y5Vxm1VUdmt2c5ANmtD1Z0r2Q1mnApb-UhzLnyJxtU0,1929
226
- phoenix/server/static/assets/components-Ci5kMOk5.js,sha256=WxnZ4voqivS6S9USAF9zhC5Q2AdvhaJTGFbkTwDLiUI,165385
227
- phoenix/server/static/assets/index-BQG5WVX7.js,sha256=7RjUXpSAeTK-Q_mLrs4cWscpGyhtSIMI0RhsNn6SwMg,6347
228
- phoenix/server/static/assets/pages-BrevprVW.js,sha256=GZiR--twaLN-wYV1jvIM-pJiuPbae-HReCjkXNZ5O_U,441239
229
- phoenix/server/static/assets/vendor-CP0b0YG0.js,sha256=hoxXvVgcHofQrVahK5Q4hAMDaQiH6GygbQvdiXlhQAo,1355423
228
+ phoenix/server/static/.vite/manifest.json,sha256=CeeRBcW2EJ5cdrH84djoZC1WUuNz0fALYFQ384p20Ws,1929
229
+ phoenix/server/static/assets/components-B2sHrnz0.js,sha256=oOzJsP1Fj37O6lXH-hUAnGFWczNcggn7PXzfiyyBPnk,184229
230
+ phoenix/server/static/assets/index-BIFmgnip.js,sha256=GkgpPIvpXXzWVE-1nCSfOovlCRA1EGdKv0pUs-6-AYA,7362
231
+ phoenix/server/static/assets/pages-BTHjBGHq.js,sha256=l0r6E3vq2RzZ__rtPdJ6Edoq3hKHQYXRcy1_M3eCQzc,445413
232
+ phoenix/server/static/assets/vendor-BMWfu6zp.js,sha256=AAVTM5SjGUI_CmAWFUFmhpp5VDhvCD-MrEoh-pXXADY,1355423
230
233
  phoenix/server/static/assets/vendor-DxkFTwjz.css,sha256=nZrkr0u6NNElFGvpWHk9GTHeGoibCXCli1bE7mXZGZg,1816
231
- phoenix/server/static/assets/vendor-arizeai-DTbiPGp6.js,sha256=-o-2f0ByoAbbFXyNrOogVNfdqmXKVMsuxhnuwTJqVLc,296355
232
- phoenix/server/static/assets/vendor-codemirror-DtdPDzrv.js,sha256=ngcX7xxWUANIvplBuEqkDowqRkknIoX3gXUeQk-jtMQ,503031
233
- phoenix/server/static/assets/vendor-recharts-A0DA1O99.js,sha256=Zp6oIbsFZPDN-M7VNovxGfJkg9XUISg1fM7eRMtHCaw,282859
234
+ phoenix/server/static/assets/vendor-arizeai-CkyzG9Wl.js,sha256=m1xvoung59IMplKeV-0XmsSPRwu1AJDRxwHbq6BN-oc,296355
235
+ phoenix/server/static/assets/vendor-codemirror-DO3VqEcD.js,sha256=M7t6xd6WpgKes25OOeGyxT1MU1dDrEKdmUBHgy5zslw,503031
236
+ phoenix/server/static/assets/vendor-recharts-BGN0SxgJ.js,sha256=L9LAYSjuf0GHh1_PQh9bF4l9euWCDVQcnQN1RgMDMBw,282859
234
237
  phoenix/server/static/assets/vendor-three-DwGkEfCM.js,sha256=0D12ZgKzfKCTSdSTKJBFR2RZO_xxeMXrqDp0AszZqHY,620972
235
238
  phoenix/server/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
236
239
  phoenix/server/templates/index.html,sha256=gVpjB8pCMiubdMh2DA9mTCtV5AVTXJH_9u5PmG2t7Vk,4238
@@ -238,7 +241,7 @@ phoenix/session/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
238
241
  phoenix/session/client.py,sha256=RSaEALbFu-En5oJLv7K4BmwdkrsIC5ZbjMX7Mlny8_Y,32665
239
242
  phoenix/session/data_extractor.py,sha256=gkEM3WWZAlWGMfRgQopAQlid4cSi6GNco-sdrGir0qc,2788
240
243
  phoenix/session/evaluation.py,sha256=aKeV8UVOyq3b7CYOwt3cWuLz0xzvMjX7vlEPILJ_fcs,5311
241
- phoenix/session/session.py,sha256=RstuZpkdZcuyZXhWdY59YOr46wjGsRJObIC5Rr5QRO0,26733
244
+ phoenix/session/session.py,sha256=l10fiotlO1b-SFehcm8N3aVupdFUYYLiLSBrOCJO9as,26911
242
245
  phoenix/trace/__init__.py,sha256=ujk_uYjM8gmm-YqnyXxF-kekfwid0bcaPMTtNNcaw6U,407
243
246
  phoenix/trace/attributes.py,sha256=B_OrzVaxZwFkrAFXZyicYoIti1UdUysURsvUS2GyW1U,12488
244
247
  phoenix/trace/errors.py,sha256=wB1z8qdPckngdfU-TORToekvg3344oNFAA83_hC2yFY,180
@@ -276,8 +279,8 @@ phoenix/utilities/logging.py,sha256=lDXd6EGaamBNcQxL4vP1au9-i_SXe0OraUDiJOcszSw,
276
279
  phoenix/utilities/project.py,sha256=8IJuMM4yUMoooPi37sictGj8Etu9rGmq6RFtc9848cQ,436
277
280
  phoenix/utilities/re.py,sha256=PDve_OLjRTM8yQQJHC8-n3HdIONi7aNils3ZKRZ5uBM,2045
278
281
  phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
279
- arize_phoenix-4.16.1.dist-info/METADATA,sha256=4Qd29PvWIh7HEa1xcYXQO_nFiXhuXOPe3f1LZ0qkJiM,11820
280
- arize_phoenix-4.16.1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
281
- arize_phoenix-4.16.1.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
282
- arize_phoenix-4.16.1.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
283
- arize_phoenix-4.16.1.dist-info/RECORD,,
282
+ arize_phoenix-4.18.0.dist-info/METADATA,sha256=lFZ7DWyKpcAieBqYPFhQ9wmXTGgXajU_pEHvo7msrGc,11829
283
+ arize_phoenix-4.18.0.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
284
+ arize_phoenix-4.18.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
285
+ arize_phoenix-4.18.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
286
+ arize_phoenix-4.18.0.dist-info/RECORD,,
@@ -8,6 +8,7 @@ from typing_extensions import TypeAlias
8
8
 
9
9
  from phoenix.core.model_schema import Model
10
10
  from phoenix.server.api.dataloaders import (
11
+ AnnotationSummaryDataLoader,
11
12
  AverageExperimentRunLatencyDataLoader,
12
13
  CacheForDataLoaders,
13
14
  DatasetExampleRevisionsDataLoader,
@@ -44,6 +45,7 @@ class DataLoaders:
44
45
  document_evaluation_summaries: DocumentEvaluationSummaryDataLoader
45
46
  document_evaluations: DocumentEvaluationsDataLoader
46
47
  document_retrieval_metrics: DocumentRetrievalMetricsDataLoader
48
+ annotation_summaries: AnnotationSummaryDataLoader
47
49
  evaluation_summaries: EvaluationSummaryDataLoader
48
50
  experiment_annotation_summaries: ExperimentAnnotationSummaryDataLoader
49
51
  experiment_error_rates: ExperimentErrorRatesDataLoader
@@ -8,6 +8,7 @@ from phoenix.db.insertion.evaluation import (
8
8
  )
9
9
  from phoenix.db.insertion.span import ClearProjectSpansEvent, SpanInsertionEvent
10
10
 
11
+ from .annotation_summaries import AnnotationSummaryCache, AnnotationSummaryDataLoader
11
12
  from .average_experiment_run_latency import AverageExperimentRunLatencyDataLoader
12
13
  from .dataset_example_revisions import DatasetExampleRevisionsDataLoader
13
14
  from .dataset_example_spans import DatasetExampleSpansDataLoader
@@ -43,6 +44,7 @@ __all__ = [
43
44
  "DocumentEvaluationSummaryDataLoader",
44
45
  "DocumentEvaluationsDataLoader",
45
46
  "DocumentRetrievalMetricsDataLoader",
47
+ "AnnotationSummaryDataLoader",
46
48
  "EvaluationSummaryDataLoader",
47
49
  "ExperimentAnnotationSummaryDataLoader",
48
50
  "ExperimentErrorRatesDataLoader",
@@ -68,6 +70,9 @@ class CacheForDataLoaders:
68
70
  document_evaluation_summary: DocumentEvaluationSummaryCache = field(
69
71
  default_factory=DocumentEvaluationSummaryCache,
70
72
  )
73
+ annotation_summary: AnnotationSummaryCache = field(
74
+ default_factory=AnnotationSummaryCache,
75
+ )
71
76
  evaluation_summary: EvaluationSummaryCache = field(
72
77
  default_factory=EvaluationSummaryCache,
73
78
  )
@@ -92,6 +97,7 @@ class CacheForDataLoaders:
92
97
 
93
98
  def _clear_spans(self, project_rowid: int) -> None:
94
99
  self._update_spans(project_rowid)
100
+ self.annotation_summary.invalidate_project(project_rowid)
95
101
  self.evaluation_summary.invalidate_project(project_rowid)
96
102
  self.document_evaluation_summary.invalidate_project(project_rowid)
97
103
 
@@ -113,9 +119,11 @@ class CacheForDataLoaders:
113
119
  @invalidate.register
114
120
  def _(self, event: SpanEvaluationInsertionEvent) -> None:
115
121
  project_rowid, evaluation_name = event
122
+ self.annotation_summary.invalidate((project_rowid, evaluation_name, "span"))
116
123
  self.evaluation_summary.invalidate((project_rowid, evaluation_name, "span"))
117
124
 
118
125
  @invalidate.register
119
126
  def _(self, event: TraceEvaluationInsertionEvent) -> None:
120
127
  project_rowid, evaluation_name = event
128
+ self.annotation_summary.invalidate((project_rowid, evaluation_name, "trace"))
121
129
  self.evaluation_summary.invalidate((project_rowid, evaluation_name, "trace"))
@@ -0,0 +1,146 @@
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.AnnotationSummary import AnnotationSummary
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[AnnotationSummary]
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 AnnotationSummaryCache(
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 AnnotationSummaryDataLoader(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 = AnnotationSummary(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
+ time_column = models.Span.start_time
118
+ stmt = stmt.join(models.Span).join_from(models.Span, models.Trace)
119
+ if filter_condition:
120
+ sf = SpanFilter(filter_condition)
121
+ stmt = sf(stmt)
122
+ elif kind == "trace":
123
+ mta = models.TraceAnnotation
124
+ name_column, label_column, score_column = mta.name, mta.label, mta.score
125
+ time_column = models.Trace.start_time
126
+ stmt = stmt.join(models.Trace)
127
+ else:
128
+ assert_never(kind)
129
+ stmt = stmt.add_columns(
130
+ name_column,
131
+ label_column,
132
+ func.count().label("record_count"),
133
+ func.count(label_column).label("label_count"),
134
+ func.count(score_column).label("score_count"),
135
+ func.sum(score_column).label("score_sum"),
136
+ )
137
+ stmt = stmt.group_by(name_column, label_column)
138
+ stmt = stmt.order_by(name_column, label_column)
139
+ stmt = stmt.where(models.Trace.project_rowid == project_rowid)
140
+ stmt = stmt.where(or_(score_column.is_not(None), label_column.is_not(None)))
141
+ stmt = stmt.where(name_column.in_(eval_names))
142
+ if start_time:
143
+ stmt = stmt.where(start_time <= time_column)
144
+ if end_time:
145
+ stmt = stmt.where(time_column < end_time)
146
+ return stmt
@@ -73,6 +73,7 @@ class SpanAnnotationMutationMixin:
73
73
  models.SpanAnnotation.annotator_kind,
74
74
  annotation.annotator_kind.value
75
75
  if annotation.annotator_kind is not None
76
+ and annotation.annotator_kind is not UNSET
76
77
  else None,
77
78
  False,
78
79
  ),
@@ -0,0 +1,55 @@
1
+ from typing import List, Optional, Union, cast
2
+
3
+ import pandas as pd
4
+ import strawberry
5
+ from strawberry import Private
6
+
7
+ from phoenix.db import models
8
+ from phoenix.server.api.types.LabelFraction import LabelFraction
9
+
10
+ AnnotationType = Union[models.SpanAnnotation, models.TraceAnnotation]
11
+
12
+
13
+ @strawberry.type
14
+ class AnnotationSummary:
15
+ df: Private[pd.DataFrame]
16
+
17
+ def __init__(self, dataframe: pd.DataFrame) -> None:
18
+ self.df = dataframe
19
+
20
+ @strawberry.field
21
+ def count(self) -> int:
22
+ return cast(int, self.df.record_count.sum())
23
+
24
+ @strawberry.field
25
+ def labels(self) -> List[str]:
26
+ return self.df.label.dropna().tolist()
27
+
28
+ @strawberry.field
29
+ def label_fractions(self) -> List[LabelFraction]:
30
+ if not (n := self.df.label_count.sum()):
31
+ return []
32
+ return [
33
+ LabelFraction(
34
+ label=cast(str, row.label),
35
+ fraction=row.label_count / n,
36
+ )
37
+ for row in self.df.loc[
38
+ self.df.label.notna(),
39
+ ["label", "label_count"],
40
+ ].itertuples()
41
+ ]
42
+
43
+ @strawberry.field
44
+ def mean_score(self) -> Optional[float]:
45
+ if not (n := self.df.score_count.sum()):
46
+ return None
47
+ return cast(float, self.df.score_sum.sum() / n)
48
+
49
+ @strawberry.field
50
+ def score_count(self) -> int:
51
+ return cast(int, self.df.score_count.sum())
52
+
53
+ @strawberry.field
54
+ def label_count(self) -> int:
55
+ return cast(int, self.df.label_count.sum())
@@ -5,16 +5,11 @@ import strawberry
5
5
  from strawberry import Private
6
6
 
7
7
  from phoenix.db import models
8
+ from phoenix.server.api.types.LabelFraction import LabelFraction
8
9
 
9
10
  AnnotationType = Union[models.SpanAnnotation, models.TraceAnnotation]
10
11
 
11
12
 
12
- @strawberry.type
13
- class LabelFraction:
14
- label: str
15
- fraction: float
16
-
17
-
18
13
  @strawberry.type
19
14
  class EvaluationSummary:
20
15
  df: Private[pd.DataFrame]
@@ -0,0 +1,7 @@
1
+ import strawberry
2
+
3
+
4
+ @strawberry.type
5
+ class LabelFraction:
6
+ label: str
7
+ fraction: float
@@ -20,6 +20,7 @@ from phoenix.db import models
20
20
  from phoenix.server.api.context import Context
21
21
  from phoenix.server.api.input_types.SpanSort import SpanSort, SpanSortConfig
22
22
  from phoenix.server.api.input_types.TimeRange import TimeRange
23
+ from phoenix.server.api.types.AnnotationSummary import AnnotationSummary
23
24
  from phoenix.server.api.types.DocumentEvaluationSummary import DocumentEvaluationSummary
24
25
  from phoenix.server.api.types.EvaluationSummary import EvaluationSummary
25
26
  from phoenix.server.api.types.pagination import (
@@ -356,6 +357,29 @@ class Project(Node):
356
357
  ("span", self.id_attr, time_range, filter_condition, evaluation_name),
357
358
  )
358
359
 
360
+ @strawberry.field
361
+ async def trace_annotation_summary(
362
+ self,
363
+ info: Info[Context, None],
364
+ evaluation_name: str,
365
+ time_range: Optional[TimeRange] = UNSET,
366
+ ) -> Optional[AnnotationSummary]:
367
+ return await info.context.data_loaders.annotation_summaries.load(
368
+ ("trace", self.id_attr, time_range, None, evaluation_name),
369
+ )
370
+
371
+ @strawberry.field
372
+ async def span_annotation_summary(
373
+ self,
374
+ info: Info[Context, None],
375
+ evaluation_name: str,
376
+ time_range: Optional[TimeRange] = UNSET,
377
+ filter_condition: Optional[str] = UNSET,
378
+ ) -> Optional[AnnotationSummary]:
379
+ return await info.context.data_loaders.annotation_summaries.load(
380
+ ("span", self.id_attr, time_range, filter_condition, evaluation_name),
381
+ )
382
+
359
383
  @strawberry.field
360
384
  async def document_evaluation_summary(
361
385
  self,
phoenix/server/app.py CHANGED
@@ -58,6 +58,7 @@ from phoenix.exceptions import PhoenixMigrationError
58
58
  from phoenix.pointcloud.umap_parameters import UMAPParameters
59
59
  from phoenix.server.api.context import Context, DataLoaders
60
60
  from phoenix.server.api.dataloaders import (
61
+ AnnotationSummaryDataLoader,
61
62
  AverageExperimentRunLatencyDataLoader,
62
63
  CacheForDataLoaders,
63
64
  DatasetExampleRevisionsDataLoader,
@@ -286,6 +287,12 @@ def create_graphql_router(
286
287
  ),
287
288
  document_evaluations=DocumentEvaluationsDataLoader(db),
288
289
  document_retrieval_metrics=DocumentRetrievalMetricsDataLoader(db),
290
+ annotation_summaries=AnnotationSummaryDataLoader(
291
+ db,
292
+ cache_map=cache_for_dataloaders.annotation_summary
293
+ if cache_for_dataloaders
294
+ else None,
295
+ ),
289
296
  evaluation_summaries=EvaluationSummaryDataLoader(
290
297
  db,
291
298
  cache_map=cache_for_dataloaders.evaluation_summary
@@ -1,32 +1,32 @@
1
1
  {
2
- "_components-Ci5kMOk5.js": {
3
- "file": "assets/components-Ci5kMOk5.js",
2
+ "_components-B2sHrnz0.js": {
3
+ "file": "assets/components-B2sHrnz0.js",
4
4
  "name": "components",
5
5
  "imports": [
6
- "_vendor-CP0b0YG0.js",
7
- "_vendor-arizeai-DTbiPGp6.js",
8
- "_pages-BrevprVW.js",
6
+ "_vendor-BMWfu6zp.js",
7
+ "_vendor-arizeai-CkyzG9Wl.js",
8
+ "_pages-BTHjBGHq.js",
9
9
  "_vendor-three-DwGkEfCM.js",
10
- "_vendor-codemirror-DtdPDzrv.js"
10
+ "_vendor-codemirror-DO3VqEcD.js"
11
11
  ]
12
12
  },
13
- "_pages-BrevprVW.js": {
14
- "file": "assets/pages-BrevprVW.js",
13
+ "_pages-BTHjBGHq.js": {
14
+ "file": "assets/pages-BTHjBGHq.js",
15
15
  "name": "pages",
16
16
  "imports": [
17
- "_vendor-CP0b0YG0.js",
18
- "_components-Ci5kMOk5.js",
19
- "_vendor-arizeai-DTbiPGp6.js",
20
- "_vendor-recharts-A0DA1O99.js",
21
- "_vendor-codemirror-DtdPDzrv.js"
17
+ "_vendor-BMWfu6zp.js",
18
+ "_components-B2sHrnz0.js",
19
+ "_vendor-arizeai-CkyzG9Wl.js",
20
+ "_vendor-recharts-BGN0SxgJ.js",
21
+ "_vendor-codemirror-DO3VqEcD.js"
22
22
  ]
23
23
  },
24
24
  "_vendor-!~{003}~.js": {
25
25
  "file": "assets/vendor-DxkFTwjz.css",
26
26
  "src": "_vendor-!~{003}~.js"
27
27
  },
28
- "_vendor-CP0b0YG0.js": {
29
- "file": "assets/vendor-CP0b0YG0.js",
28
+ "_vendor-BMWfu6zp.js": {
29
+ "file": "assets/vendor-BMWfu6zp.js",
30
30
  "name": "vendor",
31
31
  "imports": [
32
32
  "_vendor-three-DwGkEfCM.js"
@@ -35,25 +35,25 @@
35
35
  "assets/vendor-DxkFTwjz.css"
36
36
  ]
37
37
  },
38
- "_vendor-arizeai-DTbiPGp6.js": {
39
- "file": "assets/vendor-arizeai-DTbiPGp6.js",
38
+ "_vendor-arizeai-CkyzG9Wl.js": {
39
+ "file": "assets/vendor-arizeai-CkyzG9Wl.js",
40
40
  "name": "vendor-arizeai",
41
41
  "imports": [
42
- "_vendor-CP0b0YG0.js"
42
+ "_vendor-BMWfu6zp.js"
43
43
  ]
44
44
  },
45
- "_vendor-codemirror-DtdPDzrv.js": {
46
- "file": "assets/vendor-codemirror-DtdPDzrv.js",
45
+ "_vendor-codemirror-DO3VqEcD.js": {
46
+ "file": "assets/vendor-codemirror-DO3VqEcD.js",
47
47
  "name": "vendor-codemirror",
48
48
  "imports": [
49
- "_vendor-CP0b0YG0.js"
49
+ "_vendor-BMWfu6zp.js"
50
50
  ]
51
51
  },
52
- "_vendor-recharts-A0DA1O99.js": {
53
- "file": "assets/vendor-recharts-A0DA1O99.js",
52
+ "_vendor-recharts-BGN0SxgJ.js": {
53
+ "file": "assets/vendor-recharts-BGN0SxgJ.js",
54
54
  "name": "vendor-recharts",
55
55
  "imports": [
56
- "_vendor-CP0b0YG0.js"
56
+ "_vendor-BMWfu6zp.js"
57
57
  ]
58
58
  },
59
59
  "_vendor-three-DwGkEfCM.js": {
@@ -61,18 +61,18 @@
61
61
  "name": "vendor-three"
62
62
  },
63
63
  "index.tsx": {
64
- "file": "assets/index-BQG5WVX7.js",
64
+ "file": "assets/index-BIFmgnip.js",
65
65
  "name": "index",
66
66
  "src": "index.tsx",
67
67
  "isEntry": true,
68
68
  "imports": [
69
- "_vendor-CP0b0YG0.js",
70
- "_vendor-arizeai-DTbiPGp6.js",
71
- "_pages-BrevprVW.js",
72
- "_components-Ci5kMOk5.js",
69
+ "_vendor-BMWfu6zp.js",
70
+ "_vendor-arizeai-CkyzG9Wl.js",
71
+ "_components-B2sHrnz0.js",
72
+ "_pages-BTHjBGHq.js",
73
73
  "_vendor-three-DwGkEfCM.js",
74
- "_vendor-recharts-A0DA1O99.js",
75
- "_vendor-codemirror-DtdPDzrv.js"
74
+ "_vendor-codemirror-DO3VqEcD.js",
75
+ "_vendor-recharts-BGN0SxgJ.js"
76
76
  ]
77
77
  }
78
78
  }