arize-phoenix 11.24.1__py3-none-any.whl → 11.25.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 (33) hide show
  1. {arize_phoenix-11.24.1.dist-info → arize_phoenix-11.25.0.dist-info}/METADATA +1 -1
  2. {arize_phoenix-11.24.1.dist-info → arize_phoenix-11.25.0.dist-info}/RECORD +33 -32
  3. phoenix/__init__.py +2 -1
  4. phoenix/db/engines.py +12 -18
  5. phoenix/db/insertion/document_annotation.py +0 -1
  6. phoenix/db/insertion/span_annotation.py +0 -1
  7. phoenix/db/insertion/trace_annotation.py +0 -1
  8. phoenix/db/insertion/types.py +0 -15
  9. phoenix/db/models.py +2 -2
  10. phoenix/server/api/dataloaders/annotation_summaries.py +60 -8
  11. phoenix/server/api/dataloaders/latency_ms_quantile.py +40 -8
  12. phoenix/server/api/dataloaders/record_counts.py +37 -10
  13. phoenix/server/api/dataloaders/span_cost_summary_by_project.py +28 -14
  14. phoenix/server/api/helpers/playground_clients.py +10 -4
  15. phoenix/server/api/routers/v1/spans.py +17 -17
  16. phoenix/server/api/types/Project.py +106 -44
  17. phoenix/server/email/sender.py +5 -2
  18. phoenix/server/session_filters.py +49 -0
  19. phoenix/server/static/.vite/manifest.json +43 -43
  20. phoenix/server/static/assets/{components-CBjkyAZ_.js → components-Dpf_EwE7.js} +334 -332
  21. phoenix/server/static/assets/{index-kl9TdGAc.js → index-gkM1FDH4.js} +5 -2
  22. phoenix/server/static/assets/{pages-B8T9ap-6.js → pages-Dz3WExiG.js} +703 -462
  23. phoenix/server/static/assets/{vendor-CU36oj8y.js → vendor-RdRDaQiR.js} +1 -1
  24. phoenix/server/static/assets/{vendor-arizeai-Ctgw0e1G.js → vendor-arizeai-DsYDNOqt.js} +2 -2
  25. phoenix/server/static/assets/{vendor-codemirror-Cojjzqb9.js → vendor-codemirror-BzJDUbEx.js} +3 -3
  26. phoenix/server/static/assets/{vendor-recharts-Bw30oz1A.js → vendor-recharts-BTHn5Y2R.js} +1 -1
  27. phoenix/server/static/assets/{vendor-shiki-DZajAPeq.js → vendor-shiki-BAcocHFl.js} +1 -1
  28. phoenix/trace/dsl/query.py +2 -0
  29. phoenix/version.py +1 -1
  30. {arize_phoenix-11.24.1.dist-info → arize_phoenix-11.25.0.dist-info}/WHEEL +0 -0
  31. {arize_phoenix-11.24.1.dist-info → arize_phoenix-11.25.0.dist-info}/entry_points.txt +0 -0
  32. {arize_phoenix-11.24.1.dist-info → arize_phoenix-11.25.0.dist-info}/licenses/IP_NOTICE +0 -0
  33. {arize_phoenix-11.24.1.dist-info → arize_phoenix-11.25.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arize-phoenix
3
- Version: 11.24.1
3
+ Version: 11.25.0
4
4
  Summary: AI Observability and Evaluation
5
5
  Project-URL: Documentation, https://arize.com/docs/phoenix/
6
6
  Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
@@ -1,4 +1,4 @@
1
- phoenix/__init__.py,sha256=xkpXH76HFbEDCq8IhiFp-2GnEHx39xPMdOpV5Skew1w,5481
1
+ phoenix/__init__.py,sha256=Sgb4r2MLoY2BbC9Caky5C0bwnOyiVOMHly2sRItmg3Q,5555
2
2
  phoenix/auth.py,sha256=9rscOefuxy5VPcb6MlOYenuy3gDd5l7RxknONovGslE,11342
3
3
  phoenix/config.py,sha256=oz-7FW2Pixzgp3Xvs5RM-M7J7mES8_yWdVGo_Tzde9s,63133
4
4
  phoenix/datetime_utils.py,sha256=pRD-nzxXYKlMWNtd3r2tKGKfPFhwuJhfOAtlGLVAO60,8784
@@ -6,7 +6,7 @@ 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=2kHfT3BNOVd4dAO1bq-syEQbHSG8oX2-7NhOwK2QREk,896
9
- phoenix/version.py,sha256=mGBiZ5kWDRIkrK_DfzDbLzuv6RJUqP094nDynBZ7N_A,24
9
+ phoenix/version.py,sha256=nausyt9ru1_40PInSw-LEDDfhSxB-gXbap31hGbEtag,24
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
@@ -17,23 +17,23 @@ 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=MbbmKip6gFtnLP1ZA3Z-mP-zy-Qnb9bPD8mRXJQOW2c,14536
19
19
  phoenix/db/constants.py,sha256=-YE2rkzcROG06_rerfnX5hC7fLzOHx1Gjw4nXhX_um4,46
20
- phoenix/db/engines.py,sha256=tB_8iWMDz0folryVvw29sbBUxJOB2XZ-Xx0Uexj3uns,6889
20
+ phoenix/db/engines.py,sha256=e-VdW9FZVrs-F8P8FeQP2NzOTOXuq9LeUq1ebv99ZdM,6731
21
21
  phoenix/db/enums.py,sha256=w3O5YuJEEzVTwVDZb8b2UUFhU8yK_GosF081VVrrno0,188
22
22
  phoenix/db/facilitator.py,sha256=UIC-l14p3R8GFVWPmz04NY-CDm_zAynXCAuIYpj_W_g,20254
23
23
  phoenix/db/helpers.py,sha256=jqX13kO4qdGozDRdw6nME4BloPtzEQd0fweQpGHbj3I,15078
24
24
  phoenix/db/migrate.py,sha256=oUrXH8yEbcpL4eh09aSCuUiSrhFli0eT5D_j4ZmYChY,2797
25
- phoenix/db/models.py,sha256=5MHQA6oHD3O7YJyb3XryROn8VMfZh5zurYuPT1KqCrA,62045
25
+ phoenix/db/models.py,sha256=VV8oPYwfkeg0KbeuUCtgr3dwLXveQ3bs8J6tPboTH84,61989
26
26
  phoenix/db/pg_config.py,sha256=h6mB7qF7t4Zk6VGvAiyefHGVu74o-yJynaWzeE39k9Y,6001
27
27
  phoenix/db/insertion/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  phoenix/db/insertion/constants.py,sha256=8wifm7X-1XvroZ__R2Gc96NsgLhTDn0zXl4lehlXtcA,70
29
29
  phoenix/db/insertion/dataset.py,sha256=KeUtfSnznmkDDlGs6KM5URduZtIo8I951tybamwoLsc,7216
30
- phoenix/db/insertion/document_annotation.py,sha256=46IHWgILlIIoCkzgEtZIubqfpgF9KVA8ETWeblcpff0,6544
30
+ phoenix/db/insertion/document_annotation.py,sha256=rLL35nxcBXh2O1RaY-R_nucER6wVPZBVJ3XkQQnmiQE,6498
31
31
  phoenix/db/insertion/evaluation.py,sha256=XIlDQMx9FFu_hO1TEao8_ScgKETw61AoeGezsmngXrY,6876
32
32
  phoenix/db/insertion/helpers.py,sha256=wA4f_B8DI1pfNvX7R5luG1MklwX6rtCrvv_SOcjtJGo,4106
33
33
  phoenix/db/insertion/span.py,sha256=UB4UR8QlkJdVzbJ7_-S6FXIHYjyKZSOEVzCOvwGw7cY,8414
34
- phoenix/db/insertion/span_annotation.py,sha256=7m0kaOkdHhLTqs_E9Kt8BeCiHUpaU3mspm5ZdMz3lio,5728
35
- phoenix/db/insertion/trace_annotation.py,sha256=Qijh7eROXLjV6OLIuKwsrc2OB9A7JnefzP4eZxlPRlc,5768
36
- phoenix/db/insertion/types.py,sha256=T9WjPxqt7N3AuZ9WA53WT85jmFmPaHcJ98wdPxByISo,8760
34
+ phoenix/db/insertion/span_annotation.py,sha256=EqjT7OcCUO69PAw3shkOSQunxWtLNpToO7gtqlK8dbY,5682
35
+ phoenix/db/insertion/trace_annotation.py,sha256=0wIrAEDMYDvwRbd7zYAGIcnZtdjoPEINP51m28Wk1VI,5722
36
+ phoenix/db/insertion/types.py,sha256=hOwtuYeKA7rjRXT2bfsD_SwYnkrIpxdVirQ50jq1fws,8253
37
37
  phoenix/db/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  phoenix/db/migrations/env.py,sha256=tFO3ceuCx9Es5_2w_BXclaQMmNQKNX21b1UEV5mYdeo,3387
39
39
  phoenix/db/migrations/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
@@ -103,6 +103,7 @@ phoenix/server/oauth2.py,sha256=GvUqZBoZ5dG-l2G1RMl1SUcN10jNAjaMXFznMSWz2Zs,3336
103
103
  phoenix/server/prometheus.py,sha256=PV3XNUvtBQqpIjFS5ulyhGK_WF-2v-Wf3rsXjfDxeUs,8694
104
104
  phoenix/server/rate_limiters.py,sha256=cFc73D2NaxqNZZDbwfIDw4So-fRVOJPBtqxOZ8Qky_s,7155
105
105
  phoenix/server/retention.py,sha256=MQe1FWuc_NxhqgIq5q2hfFhWT8ddAmpppgI74xYEQ6c,3064
106
+ phoenix/server/session_filters.py,sha256=zEJHnF2sDCxjWti2eOz1Yx4r4-zS1rAzq0oUxzl0gEY,1697
106
107
  phoenix/server/telemetry.py,sha256=4EluDDrhdDPxAjaW6lVSbi73xkB5XeUCZWOmZGdk0hg,2755
107
108
  phoenix/server/thread_server.py,sha256=Ea2AWreN1lwJsT2wYvGaRaiXrzBqH4kgkZpx0FO5Ocw,2144
108
109
  phoenix/server/types.py,sha256=j8erl9iRNaR8t0DCQG84-uDVbHy9Qnm7T2EuTtDNNsU,8013
@@ -118,7 +119,7 @@ phoenix/server/api/subscriptions.py,sha256=U7JZl-FGfsaIhRkIFdeSQLqR7xCS7CY1h-21B
118
119
  phoenix/server/api/utils.py,sha256=quCBRcusc6PUq9tJq7M8PgwFZp7nXgVAxtbw8feribY,833
119
120
  phoenix/server/api/dataloaders/__init__.py,sha256=ddiX1BdbyGkPTzMZNo-hkF_2kqIquelBUFvQejnAJYk,6834
120
121
  phoenix/server/api/dataloaders/annotation_configs_by_project.py,sha256=_Nfiug9o01JimU3Z0LpZJ0uaMCjchXomyt_dYAxPFRY,1178
121
- phoenix/server/api/dataloaders/annotation_summaries.py,sha256=U-mVB6pY65umyjtmF-cLGJAp5QCAaB7psgTie6_gLGI,12943
122
+ phoenix/server/api/dataloaders/annotation_summaries.py,sha256=0b23-bucBKyL25RWb2QzCNJjQzrq403qMmHKUVD5W4M,14377
122
123
  phoenix/server/api/dataloaders/average_experiment_run_latency.py,sha256=GLFoFAbztOH-0FVzzZ77mATIO63UcjB50j3qXiNi-tE,1811
123
124
  phoenix/server/api/dataloaders/dataset_example_revisions.py,sha256=xF7M2dg3UmjhdCrscnztCIBBI0cg3RF48IIqvilpc18,4623
124
125
  phoenix/server/api/dataloaders/dataset_example_spans.py,sha256=z_MFquqAcJ9wat7BBp7MVeJ9BYuu2EZEdaog52iWDno,1390
@@ -131,14 +132,14 @@ phoenix/server/api/dataloaders/experiment_run_annotations.py,sha256=uJ--9Ue4tnmZ
131
132
  phoenix/server/api/dataloaders/experiment_run_counts.py,sha256=j_7229IL705p_TycxIMYylhSgLHsAn91TiGPYXtOuQ8,1617
132
133
  phoenix/server/api/dataloaders/experiment_sequence_number.py,sha256=zM_f78fnqhppLtevrx9iISQSN7w_BNeXT9CoX8jYgAI,1534
133
134
  phoenix/server/api/dataloaders/last_used_times_by_generative_model_id.py,sha256=4i3HqwP71bZ8vwyyj7v63IuKEJnUZI1GWpP1FW_xMZA,1330
134
- phoenix/server/api/dataloaders/latency_ms_quantile.py,sha256=CHWV9nvEEM3xqpXWubywtLtFLzbwyLU85EaP_kQajJU,7363
135
+ phoenix/server/api/dataloaders/latency_ms_quantile.py,sha256=LjxXK8pM-_yPmT5k23uLD17bbgt_UOMSAVvNPwqtWME,8542
135
136
  phoenix/server/api/dataloaders/min_start_or_max_end_times.py,sha256=1jYglTXv4S8k7OWSGdgeJ2OxVCmZtX8a6sjJp9GPZ04,2783
136
137
  phoenix/server/api/dataloaders/num_child_spans.py,sha256=655g9SP_3gfT4qqukfgKzLy5uBLQmnVQBP-mZL3in0s,1200
137
138
  phoenix/server/api/dataloaders/num_spans_per_trace.py,sha256=nNAxj6QYcTc8oykfJZxH0vtS9tE83oXoArVwQTJHzTw,922
138
139
  phoenix/server/api/dataloaders/project_by_name.py,sha256=O24Rjs0ZQaYtSnPfA6YBQfbHfUgNsHKUcc_gIKyK9vo,1086
139
140
  phoenix/server/api/dataloaders/project_ids_by_trace_retention_policy_id.py,sha256=KWaFZGI4wJaUftLoUJ4ufJYNx1UAWrFfVfloVGOX1XE,1606
140
141
  phoenix/server/api/dataloaders/prompt_version_sequence_number.py,sha256=tBaCbpI9KgjCACvpd-5hZy5TDSHH7PJPn4bd1xJuN-g,1314
141
- phoenix/server/api/dataloaders/record_counts.py,sha256=NLlMEaJ-HxiJavqbSkMbzOrIRzqzYxO8-t2mfp1vXqM,4160
142
+ phoenix/server/api/dataloaders/record_counts.py,sha256=xUEb-eufdfShkEpdzWxzWJ81A3s0vmbYE5mmhN-DFWM,5310
142
143
  phoenix/server/api/dataloaders/session_io.py,sha256=1c2b-87KGHuF2sgeQvXmIv1-kFHEt6CfAvuH11jKfh4,3168
143
144
  phoenix/server/api/dataloaders/session_num_traces.py,sha256=lu5EMdQWQzEr_4wCiu7FycnIShjGf0yQXpwBG_DDzGs,1050
144
145
  phoenix/server/api/dataloaders/session_num_traces_with_error.py,sha256=Y5xmr4Nme2ZMfvJljW9yhBfuCNdGlxTRka0h9VdXdqA,1149
@@ -155,7 +156,7 @@ phoenix/server/api/dataloaders/span_cost_details_by_span_cost.py,sha256=f8ztQACG
155
156
  phoenix/server/api/dataloaders/span_cost_summary_by_experiment.py,sha256=EvivIoLsg1KxlRm4MM-LiInxFsRzqZpLarsvjyQk8e8,2453
156
157
  phoenix/server/api/dataloaders/span_cost_summary_by_experiment_run.py,sha256=IJFirEPeR1UGKTg6Gz3MJQGDigoPy6SaFnUdBibyVac,2539
157
158
  phoenix/server/api/dataloaders/span_cost_summary_by_generative_model.py,sha256=Fhp0NPsoSbTBgnE38hregVVeVHEhPw_QANiOfNyaTf8,2295
158
- phoenix/server/api/dataloaders/span_cost_summary_by_project.py,sha256=UjLkGvsVAY5-vltd08iR_NyWZ-_dWLc70yglMKSPPzY,5203
159
+ phoenix/server/api/dataloaders/span_cost_summary_by_project.py,sha256=N3cds3ooMU25Xbp9Z5Zlp-3a4AcNwRu0XpqaTgsKOoE,6002
159
160
  phoenix/server/api/dataloaders/span_cost_summary_by_project_session.py,sha256=kvsMK8GkFBubMiKZ0KwDk5O2D3LvXIg_zKT66MoKazE,2362
160
161
  phoenix/server/api/dataloaders/span_cost_summary_by_trace.py,sha256=XCq1mRGwNN5xucf4ea-V1cHus_VQQJyjR40UKCOmWHg,2274
161
162
  phoenix/server/api/dataloaders/span_costs.py,sha256=hlNrofQNNuGi4XFxOt7OV_ceBJ6mu_aKsDMz7SSoM3A,1161
@@ -176,7 +177,7 @@ phoenix/server/api/helpers/__init__.py,sha256=m2-xaSPqUiSs91k62JaRDjFNfl-1byxBfY
176
177
  phoenix/server/api/helpers/annotations.py,sha256=9gMXKpMTfWEChoSCnvdWYuyB0hlSnNOp-qUdar9Vono,262
177
178
  phoenix/server/api/helpers/dataset_helpers.py,sha256=3bdGBoUzqrtg-sr5p2wpQLOU6dhg_3TKFHNeJj8p0TU,9155
178
179
  phoenix/server/api/helpers/experiment_run_filters.py,sha256=DOnVwrmn39eAkk2mwuZP8kIcAnR5jrOgllEwWSjsw94,29893
179
- phoenix/server/api/helpers/playground_clients.py,sha256=R_lXbm58ejnsdHMvlbHbrasC7XsaLfqh5pZoHaL3DSg,72129
180
+ phoenix/server/api/helpers/playground_clients.py,sha256=DgmDM6ismCwm1GLB4_9DnWsPCZsd2L-vpc0m8-5mjN0,72212
180
181
  phoenix/server/api/helpers/playground_registry.py,sha256=n0v4-KnvZJxeaEwOla5qBbnOQjSWznKmMhZnh9ziJt0,2584
181
182
  phoenix/server/api/helpers/playground_spans.py,sha256=QpXwPl_fFNwm_iA1A77XApUyXMl1aDmonw8aXuNZ_4k,17132
182
183
  phoenix/server/api/helpers/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -265,7 +266,7 @@ phoenix/server/api/routers/v1/experiments.py,sha256=hIBecGACzGZEgl93ap_JV52pUv-I
265
266
  phoenix/server/api/routers/v1/models.py,sha256=p3gJN-9SWiUYTUTft4bZMsZVCBNTb4nN1Foy68eRZzQ,1997
266
267
  phoenix/server/api/routers/v1/projects.py,sha256=XR6uJxHXXtC1q8LNyS9W6iaj440sv1OKCu-OSBfxEys,12824
267
268
  phoenix/server/api/routers/v1/prompts.py,sha256=chRYcLkOYDJdJfVZVukVTUyIRnLPvsJCg41CuPxOIU8,26695
268
- phoenix/server/api/routers/v1/spans.py,sha256=4aEUlfbfoyxP78TxQxBzriJYFBUe5ObFU99uesbz-iI,49390
269
+ phoenix/server/api/routers/v1/spans.py,sha256=la_bfxrVPGY-N8qvk9o9ICrGiwl1B6-jbZ0uDjR5QXc,49345
269
270
  phoenix/server/api/routers/v1/traces.py,sha256=Skn0N_L4ZjoJ7x76PBrqvbKPFiAk8xSe1yxfiOaQ0Gc,11285
270
271
  phoenix/server/api/routers/v1/users.py,sha256=eO8zMtGU33Td2_G1l9D7Z0a4CG1CwBUCj_Z9z2uk7wg,12089
271
272
  phoenix/server/api/routers/v1/utils.py,sha256=oXIOGPzPTkE0ZWUTRCoRIQQ7wTzoSwtWFaUSjlGBqts,4960
@@ -321,7 +322,7 @@ phoenix/server/api/types/ModelInterface.py,sha256=Qe7H23wDb_Q2-HmeY2t0R5Jsn4aAfY
321
322
  phoenix/server/api/types/NumericRange.py,sha256=afEjgF97Go_OvmjMggbPBt-zGM8IONewAyEiKEHRds0,192
322
323
  phoenix/server/api/types/PerformanceMetric.py,sha256=KFkmJDqP43eDUtARQOUqR7NYcxvL6Vh2uisHWU6H3ko,387
323
324
  phoenix/server/api/types/PlaygroundModel.py,sha256=IqJFxsAAJMRyaFI9ryI3GQrpFOJ5Llf6kIutEO-tFvM,321
324
- phoenix/server/api/types/Project.py,sha256=AxKlA7FHlI48uRKx5-MRzMzEyyWPZPffX_iZOV0jeJs,69652
325
+ phoenix/server/api/types/Project.py,sha256=XJUVEGCmEgToIyoVNWpNgcgtV1g24DvAKzFHpDNpCJY,72020
325
326
  phoenix/server/api/types/ProjectSession.py,sha256=uwqTsDTfSGz13AvP-cwS_mJR5JZ1lHqu10ungbl7g5s,6245
326
327
  phoenix/server/api/types/ProjectTraceRetentionPolicy.py,sha256=tYy2kgalPDyuaYZr0VUHjH0YpXaiF_QOzg5yfaV_c7c,3782
327
328
  phoenix/server/api/types/Prompt.py,sha256=ccP4eq1e38xbF0afclGWLOuDpBVpNbJ3AOSRClF8yFQ,4955
@@ -370,7 +371,7 @@ phoenix/server/daemons/db_disk_usage_monitor.py,sha256=2WBkrL1QyRGbLtskXEdxwAdnW
370
371
  phoenix/server/daemons/generative_model_store.py,sha256=CkMG0jFWtxcUNP_7iFTgzHPyl5IgnXUwwJb7584pmkI,1566
371
372
  phoenix/server/daemons/span_cost_calculator.py,sha256=M7bG8fas99xz37bZUkBXnG37U2otUcu1-FI5RmrtPgU,3052
372
373
  phoenix/server/email/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
373
- phoenix/server/email/sender.py,sha256=qUurj76b9IKFEbYsKO7lB7Lxie3GOFrnhZ5ahBzFaCs,5048
374
+ phoenix/server/email/sender.py,sha256=tmigvAyLV6cyGLfH6Ks_q0L5wlTpo6mBB951QCmhadw,5161
374
375
  phoenix/server/email/types.py,sha256=f1XXk4OQJlLSCHweujrGlkZic7CtbUSnfdPXzqP9WRI,772
375
376
  phoenix/server/email/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
376
377
  phoenix/server/email/templates/db_disk_usage_notification.html,sha256=Atv2XnKkC7HasTTCZYAWySr7VbupAGwbIiJ9eQ4r2l0,906
@@ -391,16 +392,16 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
391
392
  phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
392
393
  phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
393
394
  phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
394
- phoenix/server/static/.vite/manifest.json,sha256=Ho_J6fezlPBRJHEHCRerQfQRyO92NSAEsZB9rdP5X9k,2328
395
- phoenix/server/static/assets/components-CBjkyAZ_.js,sha256=RNCrBR-sIdgtODABtr2Eq-pBg7MdDrY_dXMUewQ3wac,660611
396
- phoenix/server/static/assets/index-kl9TdGAc.js,sha256=IMqTzZwMp4a3923GDScHRvQgm7m0ImJRtFemYqi3ly0,63295
397
- phoenix/server/static/assets/pages-B8T9ap-6.js,sha256=7te4Ot67y8BhWlL15ja0UX95V1cj1SgHYDyjof0LMEY,1239874
398
- phoenix/server/static/assets/vendor-CU36oj8y.js,sha256=rZlYxvj7jMRVoS5R8tE1MPDinsDMw1uPJK1wfhYhB9A,2595492
395
+ phoenix/server/static/.vite/manifest.json,sha256=1p6CFldL1B2ozidI2mlXUZK6OGNKgZriJuJm5Js2GcE,2328
396
+ phoenix/server/static/assets/components-Dpf_EwE7.js,sha256=ThUtEg3emYU04geudL-beTYLWLps3-fbM7LR0fpeQgE,662204
397
+ phoenix/server/static/assets/index-gkM1FDH4.js,sha256=STwgF05WHMxpiZ8CVVwd8F_fgEgTWg_4yi7YfqFTGUE,63396
398
+ phoenix/server/static/assets/pages-Dz3WExiG.js,sha256=kwVTyXKXRaU6svXYq4FkeQ5Szug7s7MJCPVCE0KRdOw,1264641
399
399
  phoenix/server/static/assets/vendor-CqDb5u4o.css,sha256=zIyFiNJKxMaQk8AvtLgt1rR01oO10d1MFndSDKH9Clw,5517
400
- phoenix/server/static/assets/vendor-arizeai-Ctgw0e1G.js,sha256=M69_iRk4LHHQ0kCOhNkTR74sBtupXa2APxbM14fpvhI,121514
401
- phoenix/server/static/assets/vendor-codemirror-Cojjzqb9.js,sha256=og15ZGjVjSeYWnjJSZMxhvsuhDtzamtEsw-KdAGE-18,402623
402
- phoenix/server/static/assets/vendor-recharts-Bw30oz1A.js,sha256=B8eVL3uTKjb_jOdVFAFuPE0NpUE7vBVlTFmwyooccD8,231651
403
- phoenix/server/static/assets/vendor-shiki-DZajAPeq.js,sha256=yfcvr320CuHx6WFuQuXUHci_4togc-3g-337Q7hlss0,305160
400
+ phoenix/server/static/assets/vendor-RdRDaQiR.js,sha256=oTxLetZZXJ20yoKNAYExto9V73y8X5zjddWV46K9CWM,2595492
401
+ phoenix/server/static/assets/vendor-arizeai-DsYDNOqt.js,sha256=0HIkPJXbKTh85nqphdAXYeStRzdaim0IQxRXiXxa21U,121514
402
+ phoenix/server/static/assets/vendor-codemirror-BzJDUbEx.js,sha256=bhTldvpKQzXpFgxi3cdGSFjNupkDYuEKcJzQLCN5WwY,402623
403
+ phoenix/server/static/assets/vendor-recharts-BTHn5Y2R.js,sha256=yzTedksGlH1StFC39Tr3K0i86SQHtT2VZls7-2uQWys,231651
404
+ phoenix/server/static/assets/vendor-shiki-BAcocHFl.js,sha256=70yCHhKjrYFycTHifz6VT7KsAekW1wA4OX0Op8YhlIY,305160
404
405
  phoenix/server/static/assets/vendor-three-BLWp5bic.js,sha256=vfSCVXS20jA0Ceo_O0mDxYBcROinWMdPE6RR4JXmtec,620972
405
406
  phoenix/server/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
406
407
  phoenix/server/templates/index.html,sha256=QAYh0TG5mg-GvDQUR09aD9ebl9Sfq0fYAcfIa5G7J6E,7148
@@ -427,7 +428,7 @@ phoenix/trace/dsl/README.md,sha256=ihmP9zGUC5V-TDbzKla76LuyDqPDQIBUH2BORwxNI68,2
427
428
  phoenix/trace/dsl/__init__.py,sha256=WIQIjJg362XD3s50OsPJJ0xbDsGp41bSv7vDllLrPuA,144
428
429
  phoenix/trace/dsl/filter.py,sha256=FYOzH1gkwlKBYepscZzwHeeXnJdTadC_m4v0cYRs00Y,31557
429
430
  phoenix/trace/dsl/helpers.py,sha256=Hc0HRqvYWl71waee0vKLNwmszc2Q1ba4Q8svXxeEqJI,7708
430
- phoenix/trace/dsl/query.py,sha256=pJdws0gkFoMoJKxvcrbgd0FDshA6BaDplqs8DmnIQJM,36350
431
+ phoenix/trace/dsl/query.py,sha256=QzK7I3juzUwb65Dkqf-nFw9dvt6F0hBNNSCGRNuXOeY,36511
431
432
  phoenix/trace/v1/__init__.py,sha256=-IbAD0ruESMjvQLvGAg9CTfjBUATFDx1OXseDPis6-0,88
432
433
  phoenix/trace/v1/evaluation_pb2.py,sha256=8sXvv2BW_vqD30MOMbmkeE2zpmm7ncik21kl3e-HzeQ,2254
433
434
  phoenix/trace/v1/evaluation_pb2.pyi,sha256=cCbbx06gwQmaH14s3J1X25TtaARh-k1abbxQdQCXGm8,4500
@@ -441,9 +442,9 @@ phoenix/utilities/project.py,sha256=auVpARXkDb-JgeX5f2aStyFIkeKvGwN9l7qrFeJMVxI,
441
442
  phoenix/utilities/re.py,sha256=6YyUWIkv0zc2SigsxfOWIHzdpjKA_TZo2iqKq7zJKvw,2081
442
443
  phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
443
444
  phoenix/utilities/template_formatters.py,sha256=gh9PJD6WEGw7TEYXfSst1UR4pWWwmjxMLrDVQ_CkpkQ,2779
444
- arize_phoenix-11.24.1.dist-info/METADATA,sha256=sg6jiy2Vnkd2nO5lEK54ihTvuyvIVjLBN2dpYzJUlEQ,31634
445
- arize_phoenix-11.24.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
446
- arize_phoenix-11.24.1.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
447
- arize_phoenix-11.24.1.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
448
- arize_phoenix-11.24.1.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
449
- arize_phoenix-11.24.1.dist-info/RECORD,,
445
+ arize_phoenix-11.25.0.dist-info/METADATA,sha256=uBFF5d07OVgeH4gaZ8cPljig7T4syd6PS1Zgvg_GWI0,31634
446
+ arize_phoenix-11.25.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
447
+ arize_phoenix-11.25.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
448
+ arize_phoenix-11.25.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
449
+ arize_phoenix-11.25.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
450
+ arize_phoenix-11.25.0.dist-info/RECORD,,
phoenix/__init__.py CHANGED
@@ -87,8 +87,9 @@ class PhoenixTraceOpenAILoader(Loader):
87
87
  "https://arize.com/docs/phoenix/tracing/integrations-tracing/openai"
88
88
  "\n\n"
89
89
  "Example usage:\n\n"
90
+ "pip install openinference-instrumentation-openai\n\n"
90
91
  "```python\n"
91
- "from phoenix.otel register\n"
92
+ "from phoenix.otel import register\n"
92
93
  "from openinference.instrumentation.openai import OpenAIInstrumentor\n\n"
93
94
  "tracer_provider = register()\n"
94
95
  "OpenAIInstrumentor().instrument(tracer_provider=tracer_provider)\n"
phoenix/db/engines.py CHANGED
@@ -1,16 +1,15 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
- import json
5
4
  import logging
6
5
  from collections.abc import Callable
7
- from datetime import datetime
8
6
  from enum import Enum
9
7
  from sqlite3 import Connection
10
8
  from typing import Any
11
9
 
12
10
  import aiosqlite
13
11
  import numpy as np
12
+ import orjson
14
13
  import sqlalchemy
15
14
  import sqlean
16
15
  from sqlalchemy import URL, StaticPool, event, make_url
@@ -193,19 +192,14 @@ def aio_postgresql_engine(
193
192
 
194
193
 
195
194
  def _dumps(obj: Any) -> str:
196
- return json.dumps(obj, cls=_Encoder)
197
-
198
-
199
- class _Encoder(json.JSONEncoder):
200
- def default(self, obj: Any) -> Any:
201
- if isinstance(obj, datetime):
202
- return obj.isoformat()
203
- elif isinstance(obj, Enum):
204
- return obj.value
205
- elif isinstance(obj, np.ndarray):
206
- return list(obj)
207
- elif isinstance(obj, np.integer):
208
- return int(obj)
209
- elif isinstance(obj, np.floating):
210
- return float(obj)
211
- return super().default(obj)
195
+ return orjson.dumps(obj, default=_default).decode()
196
+
197
+
198
+ def _default(obj: Any) -> Any:
199
+ if isinstance(obj, np.ndarray):
200
+ return obj.tolist()
201
+ if isinstance(obj, (np.integer, np.floating, np.bool_)):
202
+ return obj.item()
203
+ if isinstance(obj, Enum):
204
+ return obj.value
205
+ raise TypeError(f"Object of type {type(obj).__name__} is not serializable")
@@ -107,7 +107,6 @@ class DocumentAnnotationQueueInserter(
107
107
  received_at=p.received_at,
108
108
  item=p.item.as_insertable(
109
109
  span_rowid=anno.span_rowid,
110
- id_=anno.id_,
111
110
  ),
112
111
  )
113
112
  )
@@ -100,7 +100,6 @@ class SpanAnnotationQueueInserter(
100
100
  received_at=p.received_at,
101
101
  item=p.item.as_insertable(
102
102
  span_rowid=anno.span_rowid,
103
- id_=anno.id_,
104
103
  ),
105
104
  )
106
105
  )
@@ -99,7 +99,6 @@ class TraceAnnotationQueueInserter(
99
99
  received_at=p.received_at,
100
100
  item=p.item.as_insertable(
101
101
  trace_rowid=anno.trace_rowid,
102
- id_=anno.id_,
103
102
  ),
104
103
  )
105
104
  )
@@ -180,13 +180,11 @@ class Precursors(ABC):
180
180
  def as_insertable(
181
181
  self,
182
182
  span_rowid: int,
183
- id_: Optional[int] = None,
184
183
  ) -> Insertables.SpanAnnotation:
185
184
  return Insertables.SpanAnnotation(
186
185
  span_id=self.span_id,
187
186
  obj=self.obj,
188
187
  span_rowid=span_rowid,
189
- id_=id_,
190
188
  )
191
189
 
192
190
  @dataclass(frozen=True)
@@ -197,13 +195,11 @@ class Precursors(ABC):
197
195
  def as_insertable(
198
196
  self,
199
197
  trace_rowid: int,
200
- id_: Optional[int] = None,
201
198
  ) -> Insertables.TraceAnnotation:
202
199
  return Insertables.TraceAnnotation(
203
200
  trace_id=self.trace_id,
204
201
  obj=self.obj,
205
202
  trace_rowid=trace_rowid,
206
- id_=id_,
207
203
  )
208
204
 
209
205
  @dataclass(frozen=True)
@@ -215,14 +211,12 @@ class Precursors(ABC):
215
211
  def as_insertable(
216
212
  self,
217
213
  span_rowid: int,
218
- id_: Optional[int] = None,
219
214
  ) -> Insertables.DocumentAnnotation:
220
215
  return Insertables.DocumentAnnotation(
221
216
  span_id=self.span_id,
222
217
  document_position=self.document_position,
223
218
  obj=self.obj,
224
219
  span_rowid=span_rowid,
225
- id_=id_,
226
220
  )
227
221
 
228
222
 
@@ -231,40 +225,31 @@ class Insertables(ABC):
231
225
  class SpanAnnotation(Precursors.SpanAnnotation):
232
226
  span_rowid: int
233
227
  identifier: str = ""
234
- id_: Optional[int] = None
235
228
 
236
229
  @property
237
230
  def row(self) -> models.SpanAnnotation:
238
231
  obj = copy(self.obj)
239
232
  obj.span_rowid = self.span_rowid
240
- if self.id_ is not None:
241
- obj.id = self.id_
242
233
  return obj
243
234
 
244
235
  @dataclass(frozen=True)
245
236
  class TraceAnnotation(Precursors.TraceAnnotation):
246
237
  trace_rowid: int
247
238
  identifier: str = ""
248
- id_: Optional[int] = None
249
239
 
250
240
  @property
251
241
  def row(self) -> models.TraceAnnotation:
252
242
  obj = copy(self.obj)
253
243
  obj.trace_rowid = self.trace_rowid
254
- if self.id_ is not None:
255
- obj.id = self.id_
256
244
  return obj
257
245
 
258
246
  @dataclass(frozen=True)
259
247
  class DocumentAnnotation(Precursors.DocumentAnnotation):
260
248
  span_rowid: int
261
249
  identifier: str = ""
262
- id_: Optional[int] = None
263
250
 
264
251
  @property
265
252
  def row(self) -> models.DocumentAnnotation:
266
253
  obj = copy(self.obj)
267
254
  obj.span_rowid = self.span_rowid
268
- if self.id_ is not None:
269
- obj.id = self.id_
270
255
  return obj
phoenix/db/models.py CHANGED
@@ -188,7 +188,7 @@ class JsonDict(TypeDecorator[dict[str, Any]]):
188
188
  impl = JSON_
189
189
 
190
190
  def process_bind_param(self, value: Optional[dict[str, Any]], _: Dialect) -> dict[str, Any]:
191
- return orjson.loads(orjson.dumps(value)) if isinstance(value, dict) else {}
191
+ return value if isinstance(value, dict) else {}
192
192
 
193
193
  def process_result_value(self, value: Optional[Any], _: Dialect) -> Optional[dict[str, Any]]:
194
194
  return orjson.loads(orjson.dumps(value)) if isinstance(value, dict) and value else value
@@ -200,7 +200,7 @@ class JsonList(TypeDecorator[list[Any]]):
200
200
  impl = JSON_
201
201
 
202
202
  def process_bind_param(self, value: Optional[list[Any]], _: Dialect) -> list[Any]:
203
- return orjson.loads(orjson.dumps(value)) if isinstance(value, list) else []
203
+ return value if isinstance(value, list) else []
204
204
 
205
205
  def process_result_value(self, value: Optional[Any], _: Dialect) -> Optional[list[Any]]:
206
206
  return orjson.loads(orjson.dumps(value)) if isinstance(value, list) and value else value
@@ -13,6 +13,7 @@ from phoenix.db import models
13
13
  from phoenix.server.api.dataloaders.cache import TwoTierCache
14
14
  from phoenix.server.api.input_types.TimeRange import TimeRange
15
15
  from phoenix.server.api.types.AnnotationSummary import AnnotationSummary
16
+ from phoenix.server.session_filters import get_filtered_session_rowids_subquery
16
17
  from phoenix.server.types import DbSessionFactory
17
18
  from phoenix.trace.dsl import SpanFilter
18
19
 
@@ -20,27 +21,41 @@ Kind: TypeAlias = Literal["span", "trace"]
20
21
  ProjectRowId: TypeAlias = int
21
22
  TimeInterval: TypeAlias = tuple[Optional[datetime], Optional[datetime]]
22
23
  FilterCondition: TypeAlias = Optional[str]
24
+ SessionFilterCondition: TypeAlias = Optional[str]
23
25
  AnnotationName: TypeAlias = str
24
26
 
25
- Segment: TypeAlias = tuple[Kind, ProjectRowId, TimeInterval, FilterCondition]
27
+ Segment: TypeAlias = tuple[
28
+ Kind,
29
+ ProjectRowId,
30
+ TimeInterval,
31
+ FilterCondition,
32
+ SessionFilterCondition,
33
+ ]
26
34
  Param: TypeAlias = AnnotationName
27
35
 
28
- Key: TypeAlias = tuple[Kind, ProjectRowId, Optional[TimeRange], FilterCondition, AnnotationName]
36
+ Key: TypeAlias = tuple[
37
+ Kind,
38
+ ProjectRowId,
39
+ Optional[TimeRange],
40
+ FilterCondition,
41
+ SessionFilterCondition,
42
+ AnnotationName,
43
+ ]
29
44
  Result: TypeAlias = Optional[AnnotationSummary]
30
45
  ResultPosition: TypeAlias = int
31
46
  DEFAULT_VALUE: Result = None
32
47
 
33
48
 
34
49
  def _cache_key_fn(key: Key) -> tuple[Segment, Param]:
35
- kind, project_rowid, time_range, filter_condition, eval_name = key
50
+ kind, project_rowid, time_range, filter_condition, session_filter_condition, eval_name = key
36
51
  interval = (
37
52
  (time_range.start, time_range.end) if isinstance(time_range, TimeRange) else (None, None)
38
53
  )
39
- return (kind, project_rowid, interval, filter_condition), eval_name
54
+ return (kind, project_rowid, interval, filter_condition, session_filter_condition), eval_name
40
55
 
41
56
 
42
57
  _Section: TypeAlias = tuple[ProjectRowId, AnnotationName, Kind]
43
- _SubKey: TypeAlias = tuple[TimeInterval, FilterCondition]
58
+ _SubKey: TypeAlias = tuple[TimeInterval, FilterCondition, SessionFilterCondition]
44
59
 
45
60
 
46
61
  class AnnotationSummaryCache(
@@ -61,8 +76,21 @@ class AnnotationSummaryCache(
61
76
  del self._cache[section]
62
77
 
63
78
  def _cache_key(self, key: Key) -> tuple[_Section, _SubKey]:
64
- (kind, project_rowid, interval, filter_condition), annotation_name = _cache_key_fn(key)
65
- return (project_rowid, annotation_name, kind), (interval, filter_condition)
79
+ (
80
+ (
81
+ kind,
82
+ project_rowid,
83
+ interval,
84
+ filter_condition,
85
+ session_filter_condition,
86
+ ),
87
+ annotation_name,
88
+ ) = _cache_key_fn(key)
89
+ return (project_rowid, annotation_name, kind), (
90
+ interval,
91
+ filter_condition,
92
+ session_filter_condition,
93
+ )
66
94
 
67
95
 
68
96
  class AnnotationSummaryDataLoader(DataLoader[Key, Result]):
@@ -102,7 +130,9 @@ def _get_stmt(
102
130
  segment: Segment,
103
131
  *annotation_names: Param,
104
132
  ) -> Select[Any]:
105
- kind, project_rowid, (start_time, end_time), filter_condition = segment
133
+ kind, project_rowid, (start_time, end_time), filter_condition, session_filter_condition = (
134
+ segment
135
+ )
106
136
 
107
137
  annotation_model: Union[Type[models.SpanAnnotation], Type[models.TraceAnnotation]]
108
138
  entity_model: Union[Type[models.Span], Type[models.Trace]]
@@ -144,6 +174,19 @@ def _get_stmt(
144
174
  entity_count_query = entity_count_query.where(
145
175
  cast(Type[models.Trace], entity_model).project_rowid == project_rowid
146
176
  )
177
+ else:
178
+ assert_never(kind)
179
+
180
+ if session_filter_condition:
181
+ filtered_session_rowids = get_filtered_session_rowids_subquery(
182
+ session_filter_condition=session_filter_condition,
183
+ project_rowids=[project_rowid],
184
+ start_time=start_time,
185
+ end_time=end_time,
186
+ )
187
+ entity_count_query = entity_count_query.where(
188
+ models.Trace.project_session_rowid.in_(filtered_session_rowids)
189
+ )
147
190
 
148
191
  entity_count_query = entity_count_query.where(
149
192
  or_(score_column.is_not(None), label_column.is_not(None))
@@ -186,6 +229,15 @@ def _get_stmt(
186
229
  else:
187
230
  assert_never(kind)
188
231
 
232
+ if session_filter_condition:
233
+ filtered_session_rowids = get_filtered_session_rowids_subquery(
234
+ session_filter_condition=session_filter_condition,
235
+ project_rowids=[project_rowid],
236
+ start_time=start_time,
237
+ end_time=end_time,
238
+ )
239
+ base_stmt = base_stmt.where(models.Trace.project_session_rowid.in_(filtered_session_rowids))
240
+
189
241
  base_stmt = base_stmt.where(or_(score_column.is_not(None), label_column.is_not(None)))
190
242
  base_stmt = base_stmt.where(name_column.in_(annotation_names))
191
243
 
@@ -25,6 +25,7 @@ from phoenix.db import models
25
25
  from phoenix.db.helpers import SupportedSQLDialect
26
26
  from phoenix.server.api.dataloaders.cache import TwoTierCache
27
27
  from phoenix.server.api.input_types.TimeRange import TimeRange
28
+ from phoenix.server.session_filters import get_filtered_session_rowids_subquery
28
29
  from phoenix.server.types import DbSessionFactory
29
30
  from phoenix.trace.dsl import SpanFilter
30
31
 
@@ -32,13 +33,16 @@ Kind: TypeAlias = Literal["span", "trace"]
32
33
  ProjectRowId: TypeAlias = int
33
34
  TimeInterval: TypeAlias = tuple[Optional[datetime], Optional[datetime]]
34
35
  FilterCondition: TypeAlias = Optional[str]
36
+ SessionFilterCondition: TypeAlias = Optional[str]
35
37
  Probability: TypeAlias = float
36
38
  QuantileValue: TypeAlias = float
37
39
 
38
- Segment: TypeAlias = tuple[Kind, TimeInterval, FilterCondition]
40
+ Segment: TypeAlias = tuple[Kind, TimeInterval, FilterCondition, SessionFilterCondition]
39
41
  Param: TypeAlias = tuple[ProjectRowId, Probability]
40
42
 
41
- Key: TypeAlias = tuple[Kind, ProjectRowId, Optional[TimeRange], FilterCondition, Probability]
43
+ Key: TypeAlias = tuple[
44
+ Kind, ProjectRowId, Optional[TimeRange], FilterCondition, SessionFilterCondition, Probability
45
+ ]
42
46
  Result: TypeAlias = Optional[QuantileValue]
43
47
  ResultPosition: TypeAlias = int
44
48
  DEFAULT_VALUE: Result = None
@@ -47,15 +51,18 @@ FloatCol: TypeAlias = SQLColumnExpression[Float[float]]
47
51
 
48
52
 
49
53
  def _cache_key_fn(key: Key) -> tuple[Segment, Param]:
50
- kind, project_rowid, time_range, filter_condition, probability = key
54
+ kind, project_rowid, time_range, filter_condition, session_filter_condition, probability = key
51
55
  interval = (
52
56
  (time_range.start, time_range.end) if isinstance(time_range, TimeRange) else (None, None)
53
57
  )
54
- return (kind, interval, filter_condition), (project_rowid, probability)
58
+ return (kind, interval, filter_condition, session_filter_condition), (
59
+ project_rowid,
60
+ probability,
61
+ )
55
62
 
56
63
 
57
64
  _Section: TypeAlias = ProjectRowId
58
- _SubKey: TypeAlias = tuple[TimeInterval, FilterCondition, Kind, Probability]
65
+ _SubKey: TypeAlias = tuple[TimeInterval, FilterCondition, SessionFilterCondition, Kind, Probability]
59
66
 
60
67
 
61
68
  class LatencyMsQuantileCache(
@@ -71,8 +78,17 @@ class LatencyMsQuantileCache(
71
78
  )
72
79
 
73
80
  def _cache_key(self, key: Key) -> tuple[_Section, _SubKey]:
74
- (kind, interval, filter_condition), (project_rowid, probability) = _cache_key_fn(key)
75
- return project_rowid, (interval, filter_condition, kind, probability)
81
+ (
82
+ (kind, interval, filter_condition, session_filter_condition),
83
+ (project_rowid, probability),
84
+ ) = _cache_key_fn(key)
85
+ return project_rowid, (
86
+ interval,
87
+ filter_condition,
88
+ session_filter_condition,
89
+ kind,
90
+ probability,
91
+ )
76
92
 
77
93
 
78
94
  class LatencyMsQuantileDataLoader(DataLoader[Key, Result]):
@@ -113,11 +129,18 @@ async def _get_results(
113
129
  segment: Segment,
114
130
  params: Mapping[Param, list[ResultPosition]],
115
131
  ) -> AsyncIterator[tuple[ResultPosition, QuantileValue]]:
116
- kind, (start_time, end_time), filter_condition = segment
132
+ kind, (start_time, end_time), filter_condition, session_filter_condition = segment
117
133
  stmt = select(models.Trace.project_rowid)
118
134
  if kind == "trace":
119
135
  latency_column = cast(FloatCol, models.Trace.latency_ms)
120
136
  time_column = models.Trace.start_time
137
+ if filter_condition:
138
+ sf = SpanFilter(filter_condition)
139
+ stmt = stmt.where(
140
+ models.Trace.id.in_(
141
+ sf(select(models.Span.trace_rowid).distinct()).scalar_subquery()
142
+ )
143
+ )
121
144
  elif kind == "span":
122
145
  latency_column = cast(FloatCol, models.Span.latency_ms)
123
146
  time_column = models.Span.start_time
@@ -127,6 +150,15 @@ async def _get_results(
127
150
  stmt = sf(stmt)
128
151
  else:
129
152
  assert_never(kind)
153
+ if session_filter_condition:
154
+ project_rowids = [project_rowid for project_rowid, _ in params]
155
+ filtered_session_rowids = get_filtered_session_rowids_subquery(
156
+ session_filter_condition=session_filter_condition,
157
+ project_rowids=project_rowids,
158
+ start_time=start_time,
159
+ end_time=end_time,
160
+ )
161
+ stmt = stmt.where(models.Trace.project_session_rowid.in_(filtered_session_rowids))
130
162
  if start_time:
131
163
  stmt = stmt.where(start_time <= time_column)
132
164
  if end_time: