arize-phoenix 9.4.0__py3-none-any.whl → 9.6.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.
- {arize_phoenix-9.4.0.dist-info → arize_phoenix-9.6.0.dist-info}/METADATA +4 -4
- {arize_phoenix-9.4.0.dist-info → arize_phoenix-9.6.0.dist-info}/RECORD +28 -24
- phoenix/db/README.md +1 -1
- phoenix/experiments/functions.py +11 -2
- phoenix/server/api/helpers/playground_clients.py +1 -1
- phoenix/server/api/routers/v1/datasets.py +11 -3
- phoenix/server/api/types/Project.py +126 -5
- phoenix/server/api/types/Span.py +49 -0
- phoenix/server/api/types/TokenCountPromptDetails.py +10 -0
- phoenix/server/cost_tracking/__init__.py +0 -0
- phoenix/server/cost_tracking/cost_lookup.py +255 -0
- phoenix/server/cost_tracking/model_cost_manifest.json +830 -0
- phoenix/server/main.py +1 -1
- phoenix/server/static/.vite/manifest.json +41 -41
- phoenix/server/static/assets/{components-DIphpoYn.js → components-BqMUivPb.js} +187 -190
- phoenix/server/static/assets/{index-RiEaQhz1.js → index-B6aQZkI9.js} +20 -11
- phoenix/server/static/assets/{pages-BPhRdaQm.js → pages-C9XLSuBO.js} +800 -674
- phoenix/server/static/assets/{vendor-BbE93T2A.css → vendor-WIZid84E.css} +1 -1
- phoenix/server/static/assets/{vendor-arizeai-CGce5406.js → vendor-arizeai-BhbMHqQs.js} +1 -1
- phoenix/server/static/assets/{vendor-codemirror-KgXtr1rz.js → vendor-codemirror-CeLHFooz.js} +1 -1
- phoenix/server/static/assets/{vendor-recharts-Cm-8_DB9.js → vendor-recharts-PlWJHgM9.js} +2 -2
- phoenix/server/static/assets/{vendor-shiki-BsLqKLvc.js → vendor-shiki-CPwL2jwA.js} +1 -1
- phoenix/version.py +1 -1
- {arize_phoenix-9.4.0.dist-info → arize_phoenix-9.6.0.dist-info}/WHEEL +0 -0
- {arize_phoenix-9.4.0.dist-info → arize_phoenix-9.6.0.dist-info}/entry_points.txt +0 -0
- {arize_phoenix-9.4.0.dist-info → arize_phoenix-9.6.0.dist-info}/licenses/IP_NOTICE +0 -0
- {arize_phoenix-9.4.0.dist-info → arize_phoenix-9.6.0.dist-info}/licenses/LICENSE +0 -0
- /phoenix/server/static/assets/{vendor-CHbwJtRJ.js → vendor-CToBXdDM.js} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: arize-phoenix
|
|
3
|
-
Version: 9.
|
|
3
|
+
Version: 9.6.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
|
|
@@ -49,7 +49,7 @@ Requires-Dist: scipy
|
|
|
49
49
|
Requires-Dist: sqlalchemy[asyncio]<3,>=2.0.4
|
|
50
50
|
Requires-Dist: sqlean-py>=3.45.1
|
|
51
51
|
Requires-Dist: starlette
|
|
52
|
-
Requires-Dist: strawberry-graphql==0.
|
|
52
|
+
Requires-Dist: strawberry-graphql==0.269.0
|
|
53
53
|
Requires-Dist: tqdm
|
|
54
54
|
Requires-Dist: typing-extensions>=4.6
|
|
55
55
|
Requires-Dist: uvicorn
|
|
@@ -71,7 +71,7 @@ Requires-Dist: opentelemetry-sdk; extra == 'container'
|
|
|
71
71
|
Requires-Dist: opentelemetry-semantic-conventions; extra == 'container'
|
|
72
72
|
Requires-Dist: prometheus-client; extra == 'container'
|
|
73
73
|
Requires-Dist: py-grpc-prometheus; extra == 'container'
|
|
74
|
-
Requires-Dist: strawberry-graphql[opentelemetry]==0.
|
|
74
|
+
Requires-Dist: strawberry-graphql[opentelemetry]==0.269.0; extra == 'container'
|
|
75
75
|
Requires-Dist: umap-learn; extra == 'container'
|
|
76
76
|
Requires-Dist: uvloop; (platform_system != 'Windows') and extra == 'container'
|
|
77
77
|
Provides-Extra: dev
|
|
@@ -102,7 +102,7 @@ Requires-Dist: pytest-postgresql; extra == 'dev'
|
|
|
102
102
|
Requires-Dist: pytest-xdist; extra == 'dev'
|
|
103
103
|
Requires-Dist: pytest==8.3.3; extra == 'dev'
|
|
104
104
|
Requires-Dist: ruff==0.6.9; extra == 'dev'
|
|
105
|
-
Requires-Dist: strawberry-graphql[debug-server,opentelemetry]==0.
|
|
105
|
+
Requires-Dist: strawberry-graphql[debug-server,opentelemetry]==0.269.0; extra == 'dev'
|
|
106
106
|
Requires-Dist: tabulate; extra == 'dev'
|
|
107
107
|
Requires-Dist: tox-uv==1.11.3; extra == 'dev'
|
|
108
108
|
Requires-Dist: tox==4.18.1; extra == 'dev'
|
|
@@ -6,13 +6,13 @@ phoenix/exceptions.py,sha256=n2L2KKuecrdflB9MsCdAYCiSEvGJptIsfRkXMoJle7A,169
|
|
|
6
6
|
phoenix/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
7
7
|
phoenix/services.py,sha256=ngkyKGVatX3cO2WJdo2hKdaVKP-xJCMvqthvga6kJss,5196
|
|
8
8
|
phoenix/settings.py,sha256=x87BX7hWGQQZbrW_vrYqFR_izCGfO9gFc--JXUG4Tdk,754
|
|
9
|
-
phoenix/version.py,sha256=
|
|
9
|
+
phoenix/version.py,sha256=jP5yI9oWeZu1rQh6IVThNAP8FCgbFraE_UpmFYSvfWs,22
|
|
10
10
|
phoenix/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
11
|
phoenix/core/embedding_dimension.py,sha256=zKGbcvwOXgLf-yrJBpQyKtd-LEOPRKHnUToyAU8Owis,87
|
|
12
12
|
phoenix/core/model.py,sha256=qBFraOtmwCCnWJltKNP18DDG0mULXigytlFsa6YOz6k,4837
|
|
13
13
|
phoenix/core/model_schema.py,sha256=9JChtyXtid0GzEYImDcNA8Ppk7jmCO5xC5dBIUMNYjE,50504
|
|
14
14
|
phoenix/core/model_schema_adapter.py,sha256=y1RXPYGt2HLTGpkB2X-XVQvRJXYGmJ9EL4m7TpOMvj0,8456
|
|
15
|
-
phoenix/db/README.md,sha256=
|
|
15
|
+
phoenix/db/README.md,sha256=z3jgbp6zYJV9NfcoQw1ODz9UWJLO3rVvnAnwqO6sa0I,8680
|
|
16
16
|
phoenix/db/__init__.py,sha256=pDjEFXukHmJBM-1D8RjmXkvLsz85YWNxMQczt81ec3A,118
|
|
17
17
|
phoenix/db/alembic.ini,sha256=GIS6HpHaKaJbbuahZg1Rc1D2_QqyCkV9r58wdARGf6w,3262
|
|
18
18
|
phoenix/db/bulk_inserter.py,sha256=faNjuwLqqsw4ky8sa4D0h9u5TvEDTOjrccUW89L008E,12725
|
|
@@ -55,7 +55,7 @@ phoenix/db/types/identifier.py,sha256=Opr3_1di6e5ncrBDn30WfBSr-jN_VGBnkkA4BMuSoy
|
|
|
55
55
|
phoenix/db/types/model_provider.py,sha256=96UMeqiy5X9PmYMOWA6dZAmI_BSV3yVxt9HEVYGe5Ns,157
|
|
56
56
|
phoenix/db/types/trace_retention.py,sha256=UoLVX4efhv-mcF32zHpMX_hXWe8474cmhEyPmYqeMfI,9573
|
|
57
57
|
phoenix/experiments/__init__.py,sha256=6JGwgUd7xCbGpuHqYZlsmErmYvVgv7N_j43bn3dUqsk,123
|
|
58
|
-
phoenix/experiments/functions.py,sha256=
|
|
58
|
+
phoenix/experiments/functions.py,sha256=hmTLqNgrWGFWQlQnWvNgOrpeWStGvbzQkD-1Tx-wM94,33270
|
|
59
59
|
phoenix/experiments/tracing.py,sha256=seNh9rBH-rtQe8_FPI_VJj1rbo3ADcP6wDvERkMoxNc,2858
|
|
60
60
|
phoenix/experiments/types.py,sha256=yntt6fnAny1U4Q9Y5Mm4ZYIb9319OaJovl-kyXFtGQE,23475
|
|
61
61
|
phoenix/experiments/utils.py,sha256=MZ1-OnTcavk_KUtbfGqt55Fk9TGtJpYG_K71WsN-zDk,785
|
|
@@ -95,7 +95,7 @@ phoenix/server/dml_event.py,sha256=MjJmVEKytq75chBOSyvYDusUnEbg1pHpIjR3pZkUaJA,2
|
|
|
95
95
|
phoenix/server/dml_event_handler.py,sha256=EZLXmCvx4pJrCkz29gxwKwmvmUkTtPCHw6klR-XM8qE,8258
|
|
96
96
|
phoenix/server/grpc_server.py,sha256=dod29zE_Zlir7NyLcdVM8GH3P8sy-9ykzfaBfVifyE4,4656
|
|
97
97
|
phoenix/server/jwt_store.py,sha256=asxzY4_ZBM2FWAMstHvhvnKUP_0AA3v3xPTL2IOgNqY,16831
|
|
98
|
-
phoenix/server/main.py,sha256=
|
|
98
|
+
phoenix/server/main.py,sha256=8iOi3HhYjnpbAZLe7D0KxFOj2MyjTueaSeDI8BldHC8,18048
|
|
99
99
|
phoenix/server/oauth2.py,sha256=EV4wcCwG0N7cJRcfGNURdP5rZgRVCeRDvXyle19A27Y,2064
|
|
100
100
|
phoenix/server/prometheus.py,sha256=1KjvSfjSa2-BPjDybVMM_Kag316CsN-Zwt64YNr_snc,7825
|
|
101
101
|
phoenix/server/rate_limiters.py,sha256=cFc73D2NaxqNZZDbwfIDw4So-fRVOJPBtqxOZ8Qky_s,7155
|
|
@@ -157,7 +157,7 @@ phoenix/server/api/helpers/__init__.py,sha256=m2-xaSPqUiSs91k62JaRDjFNfl-1byxBfY
|
|
|
157
157
|
phoenix/server/api/helpers/annotations.py,sha256=9gMXKpMTfWEChoSCnvdWYuyB0hlSnNOp-qUdar9Vono,262
|
|
158
158
|
phoenix/server/api/helpers/dataset_helpers.py,sha256=DoMBTg-qXTnC_K4Evx1WKpCCYgRbITpVqyY-8efJRf0,8984
|
|
159
159
|
phoenix/server/api/helpers/experiment_run_filters.py,sha256=DOnVwrmn39eAkk2mwuZP8kIcAnR5jrOgllEwWSjsw94,29893
|
|
160
|
-
phoenix/server/api/helpers/playground_clients.py,sha256=
|
|
160
|
+
phoenix/server/api/helpers/playground_clients.py,sha256=C-GPq4wklcnGXiW5-7-ipx5wjowDuwSKzqbGHta2QEc,41888
|
|
161
161
|
phoenix/server/api/helpers/playground_registry.py,sha256=CPLMziFB2wmr-dfbx7VbzO2f8YIG_k5RftzvGXYGQ1w,2570
|
|
162
162
|
phoenix/server/api/helpers/playground_spans.py,sha256=ObAhvV_yNwEQDkjzgU5G73wfIisc8q4cpB0OFH5cd24,16974
|
|
163
163
|
phoenix/server/api/helpers/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -231,7 +231,7 @@ phoenix/server/api/routers/utils.py,sha256=M41BoH-fl37izhRuN2aX7lWm7jOC20A_3uClv
|
|
|
231
231
|
phoenix/server/api/routers/v1/__init__.py,sha256=0oOcsKJkQtBXAjZAo3AMtfjyW3OGCU4MI4TGW5nV6lo,2614
|
|
232
232
|
phoenix/server/api/routers/v1/annotation_configs.py,sha256=rZ3yJm7m75BVegSjSHqsdqf7n26roGg7vYYiiKfWA3A,15898
|
|
233
233
|
phoenix/server/api/routers/v1/annotations.py,sha256=oeafR2tCLu-uIwM9J72gN3MX5WDhrOMU3Jqd1uIiFqg,5921
|
|
234
|
-
phoenix/server/api/routers/v1/datasets.py,sha256=
|
|
234
|
+
phoenix/server/api/routers/v1/datasets.py,sha256=Wqiy6ZKqn4BZSFyn93gzuhWx3mGn7kOkNncHzCWuBq8,37325
|
|
235
235
|
phoenix/server/api/routers/v1/evaluations.py,sha256=GFTo42aIEX0Htn0EjjoE1JZDYlvryeZ_CK9kowhwzGw,12830
|
|
236
236
|
phoenix/server/api/routers/v1/experiment_evaluations.py,sha256=xSs004jNYsOl3eg-6Zjo2tt9TefTd7WR3twWYrsNQNk,4828
|
|
237
237
|
phoenix/server/api/routers/v1/experiment_runs.py,sha256=jqpquCygtUYNNN7lgSvGvOlXCE7KTleDRFjxJ7bbDfM,6400
|
|
@@ -291,7 +291,7 @@ phoenix/server/api/types/MimeType.py,sha256=Zpi6zCalkSFgsvhzvOs-O1gYA04usAi9H__Q
|
|
|
291
291
|
phoenix/server/api/types/Model.py,sha256=8UIFqMe1q-2ufBNg-gxHusV8wM1h-KbfLUeJjyVcMvQ,8081
|
|
292
292
|
phoenix/server/api/types/NumericRange.py,sha256=afEjgF97Go_OvmjMggbPBt-zGM8IONewAyEiKEHRds0,192
|
|
293
293
|
phoenix/server/api/types/PerformanceMetric.py,sha256=KFkmJDqP43eDUtARQOUqR7NYcxvL6Vh2uisHWU6H3ko,387
|
|
294
|
-
phoenix/server/api/types/Project.py,sha256=
|
|
294
|
+
phoenix/server/api/types/Project.py,sha256=l1mz-j0ECEuW6aQrSMtDaLiosysjecs-tRqpxXqNBWQ,28804
|
|
295
295
|
phoenix/server/api/types/ProjectSession.py,sha256=fyfVtpUpFOTnBx8DFnH3dr7WXAssN0ooAgrQSSi7kEI,4677
|
|
296
296
|
phoenix/server/api/types/ProjectTraceRetentionPolicy.py,sha256=tYy2kgalPDyuaYZr0VUHjH0YpXaiF_QOzg5yfaV_c7c,3782
|
|
297
297
|
phoenix/server/api/types/Prompt.py,sha256=ccP4eq1e38xbF0afclGWLOuDpBVpNbJ3AOSRClF8yFQ,4955
|
|
@@ -305,11 +305,12 @@ phoenix/server/api/types/Retrieval.py,sha256=OhMK2ncjoyp5h1yjKhjlKpoTbQrMHuxmgSF
|
|
|
305
305
|
phoenix/server/api/types/ScalarDriftMetricEnum.py,sha256=IUAcRPpgL41WdoIgK6cNk2Te38SspXGyEs-S1fY23_A,232
|
|
306
306
|
phoenix/server/api/types/Segments.py,sha256=vT2v0efoa5cuBKxLtxTnsUP5YJJCZfTloM71Spu0tMI,2915
|
|
307
307
|
phoenix/server/api/types/SortDir.py,sha256=OUpXhlCzCxPoXSDkJJygEs9Rw9pMymfaZUG5zPTrw4Y,152
|
|
308
|
-
phoenix/server/api/types/Span.py,sha256=
|
|
308
|
+
phoenix/server/api/types/Span.py,sha256=ZaDUBOPk4YE9nV0379Yc1NEZKnItWmIdCbJVgXaBgAU,30482
|
|
309
309
|
phoenix/server/api/types/SpanAnnotation.py,sha256=uPWu7Z8rmpfKhaaxbged4_o00pPCR3nkn7Gji9vB8jY,1959
|
|
310
310
|
phoenix/server/api/types/SpanIOValue.py,sha256=c5TWdZZN3v0gHI5xWeY7gjD-sE9ugWlGGAio-gDS-Uo,1653
|
|
311
311
|
phoenix/server/api/types/SystemApiKey.py,sha256=2ym8EgsTBIvxx1l9xZ-2YMovz58ZwYb_MaHBTJ9NH2E,166
|
|
312
312
|
phoenix/server/api/types/TimeSeries.py,sha256=nuuZtfHmOhTjeB8_SvZ5PUQexAkTcPScwYeFC5RUlRU,5491
|
|
313
|
+
phoenix/server/api/types/TokenCountPromptDetails.py,sha256=CWDWLrYoufrR1ePWfbq0-AgAkdjmGnJQt4_wNIt6bOQ,183
|
|
313
314
|
phoenix/server/api/types/TokenUsage.py,sha256=g-PjAGVigpchQgkXAuC5sc53fn2YwAgfeXkGmFPi_TE,201
|
|
314
315
|
phoenix/server/api/types/ToolDefinition.py,sha256=T6UH2vcbuPBDy7jKYOqMth2NdqxMPgDBf11Tpbt5Yb8,187
|
|
315
316
|
phoenix/server/api/types/Trace.py,sha256=fx1ozxiFMu-9AUyJ9LyMr6QtMqxzGEkucu7eE_dDZBM,8195
|
|
@@ -323,6 +324,9 @@ phoenix/server/api/types/VectorDriftMetricEnum.py,sha256=etiJM5ZjQuD-oE7sY-FbdIK
|
|
|
323
324
|
phoenix/server/api/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
324
325
|
phoenix/server/api/types/node.py,sha256=BLl_IOFr0zrqUxaAtGLGui5aeM5VNVXFTzGeAKrztr0,822
|
|
325
326
|
phoenix/server/api/types/pagination.py,sha256=BXm46gXZfrBS4hpiLvVSEdsbb29ctUMVJYjKXlOLxUA,9064
|
|
327
|
+
phoenix/server/cost_tracking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
328
|
+
phoenix/server/cost_tracking/cost_lookup.py,sha256=c9COURDSW-LFAeuX1k2PX-kKpy8WZeIiwwjJr_YZOqY,9416
|
|
329
|
+
phoenix/server/cost_tracking/model_cost_manifest.json,sha256=tlOYj69-K0ru53ql3UtX-ynRU_J3C_g5BUGZR6aSirM,19270
|
|
326
330
|
phoenix/server/email/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
327
331
|
phoenix/server/email/sender.py,sha256=eC6RcLANVJH0mh20mGZ2qr-bU-OWo9po2e5og2tMzJw,4127
|
|
328
332
|
phoenix/server/email/types.py,sha256=IO2bTtCh-1cve-xiM4MWnunCCVNOQ3Z2cqTqF7vH-do,466
|
|
@@ -342,16 +346,16 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
|
|
|
342
346
|
phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
|
|
343
347
|
phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
|
|
344
348
|
phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
|
|
345
|
-
phoenix/server/static/.vite/manifest.json,sha256
|
|
346
|
-
phoenix/server/static/assets/components-
|
|
347
|
-
phoenix/server/static/assets/index-
|
|
348
|
-
phoenix/server/static/assets/pages-
|
|
349
|
-
phoenix/server/static/assets/vendor-
|
|
350
|
-
phoenix/server/static/assets/vendor-
|
|
351
|
-
phoenix/server/static/assets/vendor-arizeai-
|
|
352
|
-
phoenix/server/static/assets/vendor-codemirror-
|
|
353
|
-
phoenix/server/static/assets/vendor-recharts-
|
|
354
|
-
phoenix/server/static/assets/vendor-shiki-
|
|
349
|
+
phoenix/server/static/.vite/manifest.json,sha256=-ChN4Paj3JNSZ9xDjzRn6y4BpReztJzqTC95_D7TZFk,2165
|
|
350
|
+
phoenix/server/static/assets/components-BqMUivPb.js,sha256=WkQgh_zw83wnli3CACB3nmHy09B3fockDXWJSMbzZS8,535614
|
|
351
|
+
phoenix/server/static/assets/index-B6aQZkI9.js,sha256=bFY90jOG6fJohirxmFdaCM7b8b-kauG0DrDtGA6O0OE,60240
|
|
352
|
+
phoenix/server/static/assets/pages-C9XLSuBO.js,sha256=uJho__6L4Q6zCEKLqWqKXozs5kHCtzs4Rrtzbp0dxQM,1038144
|
|
353
|
+
phoenix/server/static/assets/vendor-CToBXdDM.js,sha256=q_UwZrhCRrNhrvFyv3OO6bW52jM1TDiYk3aTj-NgdLU,2744392
|
|
354
|
+
phoenix/server/static/assets/vendor-WIZid84E.css,sha256=spZD2r7XL5GfLO13ln-IuXfnjAref8l6g_n_AvxxOlI,5517
|
|
355
|
+
phoenix/server/static/assets/vendor-arizeai-BhbMHqQs.js,sha256=l3G1o-P_IYcqQWOHBcSpT5RextOH2myGl58ZSN7NvcQ,193248
|
|
356
|
+
phoenix/server/static/assets/vendor-codemirror-CeLHFooz.js,sha256=TzeLFkY7fiI1tUZYGvlHgZcdHwwclMtUItntKu6SdbA,781264
|
|
357
|
+
phoenix/server/static/assets/vendor-recharts-PlWJHgM9.js,sha256=2F5ko_UqDn7-C7v7rh_bI17wbUA7kZA_JTzja3kD6uk,282151
|
|
358
|
+
phoenix/server/static/assets/vendor-shiki-CPwL2jwA.js,sha256=goWi7CncK66zsIjhFTExUD-0cWQSFSGtpXjb1GYflcw,8980312
|
|
355
359
|
phoenix/server/static/assets/vendor-three-C5WAXd5r.js,sha256=ELkg06u70N7h8oFmvqdoHyPuUf9VgGEWeT4LKFx4VWo,620975
|
|
356
360
|
phoenix/server/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
357
361
|
phoenix/server/templates/index.html,sha256=e8_jdi7Eo19SK7DI_gglkTW094D17E0VAegoMmmmvIc,4330
|
|
@@ -392,9 +396,9 @@ phoenix/utilities/project.py,sha256=auVpARXkDb-JgeX5f2aStyFIkeKvGwN9l7qrFeJMVxI,
|
|
|
392
396
|
phoenix/utilities/re.py,sha256=6YyUWIkv0zc2SigsxfOWIHzdpjKA_TZo2iqKq7zJKvw,2081
|
|
393
397
|
phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
394
398
|
phoenix/utilities/template_formatters.py,sha256=gh9PJD6WEGw7TEYXfSst1UR4pWWwmjxMLrDVQ_CkpkQ,2779
|
|
395
|
-
arize_phoenix-9.
|
|
396
|
-
arize_phoenix-9.
|
|
397
|
-
arize_phoenix-9.
|
|
398
|
-
arize_phoenix-9.
|
|
399
|
-
arize_phoenix-9.
|
|
400
|
-
arize_phoenix-9.
|
|
399
|
+
arize_phoenix-9.6.0.dist-info/METADATA,sha256=Xl32fO8SXZUIT-ja0Ki-Xrba3X5VbZws6lPdhJB9Cp4,25590
|
|
400
|
+
arize_phoenix-9.6.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
401
|
+
arize_phoenix-9.6.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
|
|
402
|
+
arize_phoenix-9.6.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
|
|
403
|
+
arize_phoenix-9.6.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
|
|
404
|
+
arize_phoenix-9.6.0.dist-info/RECORD,,
|
phoenix/db/README.md
CHANGED
|
@@ -37,7 +37,7 @@ alembic upgrade head
|
|
|
37
37
|
|
|
38
38
|
If the above command fails, it may be necessary to undo partially applied changes from a failed migration by first running down-migrations. This can be accomplished by identifying the ID of the migration revision you wish to return to. Revisions are defined [here](./migrations/versions/).
|
|
39
39
|
|
|
40
|
-
⚠️ Running down-migrations can result in lost data. Only run down-migrations if you know what you are doing and consider backing up your database first. If you have any questions or doubts, contact the Phoenix team in the `#phoenix-support` channel of the [Arize AI Slack community](https://
|
|
40
|
+
⚠️ Running down-migrations can result in lost data. Only run down-migrations if you know what you are doing and consider backing up your database first. If you have any questions or doubts, contact the Phoenix team in the `#phoenix-support` channel of the [Arize AI Slack community](https://arize-ai.slack.com/join/shared_invite/zt-2w57bhem8-hq24MB6u7yE_ZF_ilOYSBw#/shared-invite/email) or via GitHub.
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
43
|
alembic downgrade <revision-id>
|
phoenix/experiments/functions.py
CHANGED
|
@@ -116,8 +116,17 @@ def run_experiment(
|
|
|
116
116
|
- `metadata`: Metadata associated with the dataset example
|
|
117
117
|
- `example`: The dataset `Example` object with all associated fields
|
|
118
118
|
|
|
119
|
-
An `evaluator` is either a synchronous or asynchronous function that returns
|
|
120
|
-
|
|
119
|
+
An `evaluator` is either a synchronous or asynchronous function that returns an evaluation
|
|
120
|
+
result object, which can take any of the following forms.
|
|
121
|
+
|
|
122
|
+
- phoenix.experiments.types.EvaluationResult with optional fields for score, label, explanation
|
|
123
|
+
and metadata
|
|
124
|
+
- a `bool`, which will be interpreted as a score of 0 or 1 plus a label of "True" or "False"
|
|
125
|
+
- a `float`, which will be interpreted as a score
|
|
126
|
+
- a `str`, which will be interpreted as a label
|
|
127
|
+
- a 2-`tuple` of (`float`, `str`), which will be interpreted as (score, explanation)
|
|
128
|
+
|
|
129
|
+
If the `evaluator` is a function of one argument then that argument will be
|
|
121
130
|
bound to the `output` of the task. Alternatively, the `evaluator` can be a function of any
|
|
122
131
|
combination of specific argument names that will be bound to special values:
|
|
123
132
|
|
|
@@ -701,7 +701,7 @@ class AzureOpenAIStreamingClient(OpenAIBaseStreamingClient):
|
|
|
701
701
|
provider_key=GenerativeProviderKey.ANTHROPIC,
|
|
702
702
|
model_names=[
|
|
703
703
|
PROVIDER_DEFAULT,
|
|
704
|
-
"claude-3-7-latest",
|
|
704
|
+
"claude-3-7-sonnet-latest",
|
|
705
705
|
"claude-3-7-sonnet-20250219",
|
|
706
706
|
"claude-3-5-sonnet-latest",
|
|
707
707
|
"claude-3-5-haiku-latest",
|
|
@@ -3,6 +3,7 @@ import gzip
|
|
|
3
3
|
import io
|
|
4
4
|
import json
|
|
5
5
|
import logging
|
|
6
|
+
import urllib
|
|
6
7
|
import zlib
|
|
7
8
|
from asyncio import QueueFull
|
|
8
9
|
from collections import Counter
|
|
@@ -817,10 +818,11 @@ async def get_dataset_csv(
|
|
|
817
818
|
except ValueError as e:
|
|
818
819
|
raise HTTPException(detail=str(e), status_code=HTTP_422_UNPROCESSABLE_ENTITY)
|
|
819
820
|
content = await run_in_threadpool(_get_content_csv, examples)
|
|
821
|
+
encoded_dataset_name = urllib.parse.quote(dataset_name)
|
|
820
822
|
return Response(
|
|
821
823
|
content=content,
|
|
822
824
|
headers={
|
|
823
|
-
"content-disposition": f
|
|
825
|
+
"content-disposition": f"attachment; filename*=UTF-8''{encoded_dataset_name}.csv",
|
|
824
826
|
"content-type": "text/csv",
|
|
825
827
|
},
|
|
826
828
|
)
|
|
@@ -859,7 +861,10 @@ async def get_dataset_jsonl_openai_ft(
|
|
|
859
861
|
except ValueError as e:
|
|
860
862
|
raise HTTPException(detail=str(e), status_code=HTTP_422_UNPROCESSABLE_ENTITY)
|
|
861
863
|
content = await run_in_threadpool(_get_content_jsonl_openai_ft, examples)
|
|
862
|
-
|
|
864
|
+
encoded_dataset_name = urllib.parse.quote(dataset_name)
|
|
865
|
+
response.headers["content-disposition"] = (
|
|
866
|
+
f"attachment; filename*=UTF-8''{encoded_dataset_name}.jsonl"
|
|
867
|
+
)
|
|
863
868
|
return content
|
|
864
869
|
|
|
865
870
|
|
|
@@ -896,7 +901,10 @@ async def get_dataset_jsonl_openai_evals(
|
|
|
896
901
|
except ValueError as e:
|
|
897
902
|
raise HTTPException(detail=str(e), status_code=HTTP_422_UNPROCESSABLE_ENTITY)
|
|
898
903
|
content = await run_in_threadpool(_get_content_jsonl_openai_evals, examples)
|
|
899
|
-
|
|
904
|
+
encoded_dataset_name = urllib.parse.quote(dataset_name)
|
|
905
|
+
response.headers["content-disposition"] = (
|
|
906
|
+
f"attachment; filename*=UTF-8''{encoded_dataset_name}.jsonl"
|
|
907
|
+
)
|
|
900
908
|
return content
|
|
901
909
|
|
|
902
910
|
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import operator
|
|
4
|
-
from datetime import datetime
|
|
4
|
+
from datetime import datetime, timedelta
|
|
5
5
|
from typing import TYPE_CHECKING, Annotated, Any, ClassVar, Optional
|
|
6
6
|
|
|
7
7
|
import strawberry
|
|
8
8
|
from aioitertools.itertools import islice
|
|
9
9
|
from openinference.semconv.trace import SpanAttributes
|
|
10
10
|
from sqlalchemy import desc, distinct, func, or_, select
|
|
11
|
+
from sqlalchemy.dialects import postgresql, sqlite
|
|
11
12
|
from sqlalchemy.sql.elements import ColumnElement
|
|
12
13
|
from sqlalchemy.sql.expression import tuple_
|
|
13
14
|
from strawberry import ID, UNSET, Private, lazy
|
|
@@ -17,6 +18,7 @@ from typing_extensions import assert_never
|
|
|
17
18
|
|
|
18
19
|
from phoenix.datetime_utils import right_open_time_range
|
|
19
20
|
from phoenix.db import models
|
|
21
|
+
from phoenix.db.helpers import SupportedSQLDialect
|
|
20
22
|
from phoenix.server.api.context import Context
|
|
21
23
|
from phoenix.server.api.input_types.ProjectSessionSort import (
|
|
22
24
|
ProjectSessionColumn,
|
|
@@ -38,6 +40,7 @@ from phoenix.server.api.types.pagination import (
|
|
|
38
40
|
from phoenix.server.api.types.ProjectSession import ProjectSession, to_gql_project_session
|
|
39
41
|
from phoenix.server.api.types.SortDir import SortDir
|
|
40
42
|
from phoenix.server.api.types.Span import Span
|
|
43
|
+
from phoenix.server.api.types.TimeSeries import TimeSeries, TimeSeriesDataPoint
|
|
41
44
|
from phoenix.server.api.types.Trace import Trace
|
|
42
45
|
from phoenix.server.api.types.ValidationResult import ValidationResult
|
|
43
46
|
from phoenix.trace.dsl import SpanFilter
|
|
@@ -528,19 +531,46 @@ class Project(Node):
|
|
|
528
531
|
return info.context.last_updated_at.get(self._table, self.project_rowid)
|
|
529
532
|
|
|
530
533
|
@strawberry.field
|
|
531
|
-
async def validate_span_filter_condition(
|
|
534
|
+
async def validate_span_filter_condition(
|
|
535
|
+
self,
|
|
536
|
+
info: Info[Context, None],
|
|
537
|
+
condition: str,
|
|
538
|
+
) -> ValidationResult:
|
|
539
|
+
"""Validates a span filter condition by attempting to compile it for both SQLite and PostgreSQL.
|
|
540
|
+
|
|
541
|
+
This method checks if the provided filter condition is syntactically valid and can be compiled
|
|
542
|
+
into SQL queries for both SQLite and PostgreSQL databases. It does not execute the query,
|
|
543
|
+
only validates its syntax. Any exception during compilation (syntax errors, invalid expressions,
|
|
544
|
+
etc.) will result in an invalid validation result.
|
|
545
|
+
|
|
546
|
+
Args:
|
|
547
|
+
condition (str): The span filter condition string to validate.
|
|
548
|
+
|
|
549
|
+
Returns:
|
|
550
|
+
ValidationResult: A result object containing:
|
|
551
|
+
- is_valid (bool): True if the condition is valid, False otherwise
|
|
552
|
+
- error_message (Optional[str]): Error message if validation fails, None if valid
|
|
553
|
+
""" # noqa: E501
|
|
532
554
|
# This query is too expensive to run on every validation
|
|
533
555
|
# valid_eval_names = await self.span_annotation_names()
|
|
534
556
|
try:
|
|
535
|
-
SpanFilter(
|
|
557
|
+
span_filter = SpanFilter(
|
|
536
558
|
condition=condition,
|
|
537
559
|
# valid_eval_names=valid_eval_names,
|
|
538
560
|
)
|
|
561
|
+
stmt = span_filter(select(models.Span))
|
|
562
|
+
dialect = info.context.db.dialect
|
|
563
|
+
if dialect is SupportedSQLDialect.POSTGRESQL:
|
|
564
|
+
str(stmt.compile(dialect=sqlite.dialect())) # type: ignore[no-untyped-call]
|
|
565
|
+
elif dialect is SupportedSQLDialect.SQLITE:
|
|
566
|
+
str(stmt.compile(dialect=postgresql.dialect())) # type: ignore[no-untyped-call]
|
|
567
|
+
else:
|
|
568
|
+
assert_never(dialect)
|
|
539
569
|
return ValidationResult(is_valid=True, error_message=None)
|
|
540
|
-
except
|
|
570
|
+
except Exception as e:
|
|
541
571
|
return ValidationResult(
|
|
542
572
|
is_valid=False,
|
|
543
|
-
error_message=e
|
|
573
|
+
error_message=str(e),
|
|
544
574
|
)
|
|
545
575
|
|
|
546
576
|
@strawberry.field
|
|
@@ -610,6 +640,97 @@ class Project(Node):
|
|
|
610
640
|
)
|
|
611
641
|
return updated_at
|
|
612
642
|
|
|
643
|
+
@strawberry.field(
|
|
644
|
+
description="Hourly span count for the project.",
|
|
645
|
+
) # type: ignore
|
|
646
|
+
async def span_count_time_series(
|
|
647
|
+
self,
|
|
648
|
+
info: Info[Context, None],
|
|
649
|
+
time_range: Optional[TimeRange] = UNSET,
|
|
650
|
+
) -> SpanCountTimeSeries:
|
|
651
|
+
"""Returns a time series of span counts grouped by hour for the project.
|
|
652
|
+
|
|
653
|
+
This field provides hourly aggregated span counts, which can be useful for
|
|
654
|
+
visualizing span activity over time. The data points represent the number
|
|
655
|
+
of spans that started in each hour.
|
|
656
|
+
|
|
657
|
+
Args:
|
|
658
|
+
info: The GraphQL info object containing context information.
|
|
659
|
+
time_range: Optional time range to filter the spans. If provided, only
|
|
660
|
+
spans that started within this range will be counted.
|
|
661
|
+
|
|
662
|
+
Returns:
|
|
663
|
+
A SpanCountTimeSeries object containing data points with timestamps
|
|
664
|
+
(rounded to the nearest hour) and corresponding span counts.
|
|
665
|
+
|
|
666
|
+
Notes:
|
|
667
|
+
- The timestamps are rounded down to the nearest hour.
|
|
668
|
+
- If a time range is provided, the start time is rounded down to the
|
|
669
|
+
nearest hour, and the end time is rounded up to the nearest hour.
|
|
670
|
+
- The SQL query is optimized for both PostgreSQL and SQLite databases.
|
|
671
|
+
"""
|
|
672
|
+
# Determine the appropriate SQL function to truncate timestamps to hours
|
|
673
|
+
# based on the database dialect
|
|
674
|
+
if info.context.db.dialect is SupportedSQLDialect.POSTGRESQL:
|
|
675
|
+
# PostgreSQL uses date_trunc for timestamp truncation
|
|
676
|
+
hour = func.date_trunc("hour", models.Span.start_time)
|
|
677
|
+
elif info.context.db.dialect is SupportedSQLDialect.SQLITE:
|
|
678
|
+
# SQLite uses strftime for timestamp formatting
|
|
679
|
+
hour = func.strftime("%Y-%m-%dT%H:00:00.000+00:00", models.Span.start_time)
|
|
680
|
+
else:
|
|
681
|
+
assert_never(info.context.db.dialect)
|
|
682
|
+
|
|
683
|
+
# Build the base query to count spans grouped by hour
|
|
684
|
+
stmt = (
|
|
685
|
+
select(hour, func.count())
|
|
686
|
+
.join(models.Trace)
|
|
687
|
+
.where(models.Trace.project_rowid == self.project_rowid)
|
|
688
|
+
.group_by(hour)
|
|
689
|
+
.order_by(hour)
|
|
690
|
+
)
|
|
691
|
+
|
|
692
|
+
# Apply time range filtering if provided
|
|
693
|
+
if time_range:
|
|
694
|
+
if t := time_range.start:
|
|
695
|
+
# Round down to nearest hour for the start time
|
|
696
|
+
start = t.replace(minute=0, second=0, microsecond=0)
|
|
697
|
+
stmt = stmt.where(start <= models.Span.start_time)
|
|
698
|
+
if t := time_range.end:
|
|
699
|
+
# Round up to nearest hour for the end time
|
|
700
|
+
# If the time is already at the start of an hour, use it as is
|
|
701
|
+
if t.minute == 0 and t.second == 0 and t.microsecond == 0:
|
|
702
|
+
end = t
|
|
703
|
+
else:
|
|
704
|
+
# Otherwise, round up to the next hour
|
|
705
|
+
end = t.replace(minute=0, second=0, microsecond=0) + timedelta(hours=1)
|
|
706
|
+
stmt = stmt.where(models.Span.start_time < end)
|
|
707
|
+
|
|
708
|
+
# Execute the query and convert the results to a time series
|
|
709
|
+
async with info.context.db() as session:
|
|
710
|
+
data = await session.stream(stmt)
|
|
711
|
+
return SpanCountTimeSeries(
|
|
712
|
+
data=[
|
|
713
|
+
TimeSeriesDataPoint(
|
|
714
|
+
timestamp=_as_datetime(t),
|
|
715
|
+
value=v,
|
|
716
|
+
)
|
|
717
|
+
async for t, v in data
|
|
718
|
+
]
|
|
719
|
+
)
|
|
720
|
+
|
|
721
|
+
|
|
722
|
+
@strawberry.type
|
|
723
|
+
class SpanCountTimeSeries(TimeSeries):
|
|
724
|
+
"""A time series of span count"""
|
|
725
|
+
|
|
613
726
|
|
|
614
727
|
INPUT_VALUE = SpanAttributes.INPUT_VALUE.split(".")
|
|
615
728
|
OUTPUT_VALUE = SpanAttributes.OUTPUT_VALUE.split(".")
|
|
729
|
+
|
|
730
|
+
|
|
731
|
+
def _as_datetime(value: Any) -> datetime:
|
|
732
|
+
if isinstance(value, datetime):
|
|
733
|
+
return value
|
|
734
|
+
if isinstance(value, str):
|
|
735
|
+
return datetime.fromisoformat(value)
|
|
736
|
+
raise ValueError(f"Cannot convert {value} to datetime")
|
phoenix/server/api/types/Span.py
CHANGED
|
@@ -44,6 +44,8 @@ from phoenix.server.api.types.SpanAnnotation import SpanAnnotation, to_gql_span_
|
|
|
44
44
|
from phoenix.server.api.types.SpanIOValue import SpanIOValue, truncate_value
|
|
45
45
|
from phoenix.trace.attributes import get_attribute_value
|
|
46
46
|
|
|
47
|
+
from .TokenCountPromptDetails import TokenCountPromptDetails
|
|
48
|
+
|
|
47
49
|
if TYPE_CHECKING:
|
|
48
50
|
from phoenix.server.api.types.Project import Project
|
|
49
51
|
from phoenix.server.api.types.Trace import Trace
|
|
@@ -351,6 +353,48 @@ class Span(Node):
|
|
|
351
353
|
)
|
|
352
354
|
return cast(Optional[int], value)
|
|
353
355
|
|
|
356
|
+
@strawberry.field
|
|
357
|
+
async def token_prompt_details(
|
|
358
|
+
self,
|
|
359
|
+
info: Info[Context, None],
|
|
360
|
+
) -> TokenCountPromptDetails:
|
|
361
|
+
if self.db_span:
|
|
362
|
+
attributes = self.db_span.attributes
|
|
363
|
+
else:
|
|
364
|
+
attributes = await info.context.data_loaders.span_fields.load(
|
|
365
|
+
(self.span_rowid, models.Span.attributes),
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
cache_read: Optional[int] = None
|
|
369
|
+
raw_cache_read = get_attribute_value(
|
|
370
|
+
attributes=attributes,
|
|
371
|
+
key=LLM_TOKEN_COUNT_PROMPT_DETAILS_CACHE_READ,
|
|
372
|
+
)
|
|
373
|
+
if isinstance(raw_cache_read, int):
|
|
374
|
+
cache_read = raw_cache_read
|
|
375
|
+
|
|
376
|
+
cache_write: Optional[int] = None
|
|
377
|
+
raw_cache_write = get_attribute_value(
|
|
378
|
+
attributes=attributes,
|
|
379
|
+
key=LLM_TOKEN_COUNT_PROMPT_DETAILS_CACHE_WRITE,
|
|
380
|
+
)
|
|
381
|
+
if isinstance(raw_cache_write, int):
|
|
382
|
+
cache_write = raw_cache_write
|
|
383
|
+
|
|
384
|
+
audio: Optional[int] = None
|
|
385
|
+
raw_audio = get_attribute_value(
|
|
386
|
+
attributes=attributes,
|
|
387
|
+
key=LLM_TOKEN_COUNT_PROMPT_DETAILS_AUDIO,
|
|
388
|
+
)
|
|
389
|
+
if isinstance(raw_audio, int):
|
|
390
|
+
audio = raw_audio
|
|
391
|
+
|
|
392
|
+
return TokenCountPromptDetails(
|
|
393
|
+
cache_read=cache_read,
|
|
394
|
+
cache_write=cache_write,
|
|
395
|
+
audio=audio,
|
|
396
|
+
)
|
|
397
|
+
|
|
354
398
|
@strawberry.field
|
|
355
399
|
async def input(
|
|
356
400
|
self,
|
|
@@ -800,6 +844,11 @@ def _convert_metadata_to_string(metadata: Any) -> Optional[str]:
|
|
|
800
844
|
|
|
801
845
|
INPUT_MIME_TYPE = SpanAttributes.INPUT_MIME_TYPE
|
|
802
846
|
INPUT_VALUE = SpanAttributes.INPUT_VALUE
|
|
847
|
+
LLM_TOKEN_COUNT_PROMPT_DETAILS_AUDIO = SpanAttributes.LLM_TOKEN_COUNT_PROMPT_DETAILS_AUDIO
|
|
848
|
+
LLM_TOKEN_COUNT_PROMPT_DETAILS_CACHE_READ = SpanAttributes.LLM_TOKEN_COUNT_PROMPT_DETAILS_CACHE_READ
|
|
849
|
+
LLM_TOKEN_COUNT_PROMPT_DETAILS_CACHE_WRITE = (
|
|
850
|
+
SpanAttributes.LLM_TOKEN_COUNT_PROMPT_DETAILS_CACHE_WRITE
|
|
851
|
+
)
|
|
803
852
|
METADATA = SpanAttributes.METADATA
|
|
804
853
|
OUTPUT_MIME_TYPE = SpanAttributes.OUTPUT_MIME_TYPE
|
|
805
854
|
OUTPUT_VALUE = SpanAttributes.OUTPUT_VALUE
|
|
File without changes
|