arize-phoenix 8.2.2__py3-none-any.whl → 8.4.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-8.2.2.dist-info → arize_phoenix-8.4.0.dist-info}/METADATA +4 -3
  2. {arize_phoenix-8.2.2.dist-info → arize_phoenix-8.4.0.dist-info}/RECORD +33 -32
  3. phoenix/config.py +32 -5
  4. phoenix/db/models.py +1 -25
  5. phoenix/server/api/context.py +6 -2
  6. phoenix/server/api/dataloaders/__init__.py +4 -2
  7. phoenix/server/api/dataloaders/num_child_spans.py +35 -0
  8. phoenix/server/api/dataloaders/{span_fields.py → table_fields.py} +21 -19
  9. phoenix/server/api/helpers/playground_clients.py +4 -0
  10. phoenix/server/api/helpers/prompts/models.py +1 -0
  11. phoenix/server/api/queries.py +80 -20
  12. phoenix/server/api/types/Experiment.py +2 -4
  13. phoenix/server/api/types/ExperimentRun.py +2 -2
  14. phoenix/server/api/types/ExperimentRunAnnotation.py +2 -2
  15. phoenix/server/api/types/Project.py +67 -38
  16. phoenix/server/api/types/ProjectSession.py +2 -2
  17. phoenix/server/api/types/Span.py +35 -2
  18. phoenix/server/api/types/Trace.py +98 -30
  19. phoenix/server/app.py +6 -2
  20. phoenix/server/static/.vite/manifest.json +40 -40
  21. phoenix/server/static/assets/{components-MeFAEc1z.js → components-BgFPI6sn.js} +166 -167
  22. phoenix/server/static/assets/{index-BSRuZ-_J.js → index-CIkk8uHr.js} +9 -9
  23. phoenix/server/static/assets/{pages-NrL4hb9q.js → pages-CmDiPH1A.js} +660 -623
  24. phoenix/server/static/assets/{vendor-Cqfydjep.js → vendor-CRRq3WgM.js} +116 -116
  25. phoenix/server/static/assets/{vendor-arizeai-WnerlUPN.js → vendor-arizeai-Dq64X_0o.js} +1 -1
  26. phoenix/server/static/assets/{vendor-codemirror-D-ZZKLFq.js → vendor-codemirror-C1oevlym.js} +1 -1
  27. phoenix/server/static/assets/{vendor-recharts-KY97ZPfK.js → vendor-recharts-CPj01S89.js} +1 -1
  28. phoenix/server/static/assets/{vendor-shiki-D5K9GnFn.js → vendor-shiki-aY7rz1pm.js} +1 -1
  29. phoenix/version.py +1 -1
  30. {arize_phoenix-8.2.2.dist-info → arize_phoenix-8.4.0.dist-info}/WHEEL +0 -0
  31. {arize_phoenix-8.2.2.dist-info → arize_phoenix-8.4.0.dist-info}/entry_points.txt +0 -0
  32. {arize_phoenix-8.2.2.dist-info → arize_phoenix-8.4.0.dist-info}/licenses/IP_NOTICE +0 -0
  33. {arize_phoenix-8.2.2.dist-info → arize_phoenix-8.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arize-phoenix
3
- Version: 8.2.2
3
+ Version: 8.4.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
@@ -55,7 +55,7 @@ Requires-Dist: uvicorn
55
55
  Requires-Dist: websockets
56
56
  Requires-Dist: wrapt>=1.17.2
57
57
  Provides-Extra: container
58
- Requires-Dist: anthropic>=0.45.2; extra == 'container'
58
+ Requires-Dist: anthropic>=0.47.0; extra == 'container'
59
59
  Requires-Dist: fast-hdbscan>=0.2.0; extra == 'container'
60
60
  Requires-Dist: google-generativeai; extra == 'container'
61
61
  Requires-Dist: numba>=0.60.0; extra == 'container'
@@ -73,7 +73,7 @@ Requires-Dist: strawberry-graphql[opentelemetry]==0.253.1; extra == 'container'
73
73
  Requires-Dist: umap-learn; extra == 'container'
74
74
  Requires-Dist: uvloop; (platform_system != 'Windows') and extra == 'container'
75
75
  Provides-Extra: dev
76
- Requires-Dist: anthropic; extra == 'dev'
76
+ Requires-Dist: anthropic>=0.47.0; extra == 'dev'
77
77
  Requires-Dist: arize[autoembeddings,llm-evaluation]; extra == 'dev'
78
78
  Requires-Dist: asgi-lifespan; extra == 'dev'
79
79
  Requires-Dist: asyncpg; extra == 'dev'
@@ -162,6 +162,7 @@ Phoenix is an open-source AI observability platform designed for experimentation
162
162
  - [**_Datasets_**](https://docs.arize.com/phoenix/datasets-and-experiments/overview-datasets) - Create versioned datasets of examples for experimentation, evaluation, and fine-tuning.
163
163
  - [**_Experiments_**](https://docs.arize.com/phoenix/datasets-and-experiments/overview-datasets#experiments) - Track and evaluate changes to prompts, LLMs, and retrieval.
164
164
  - [**_Playground_**](https://docs.arize.com/phoenix/prompt-engineering/overview-prompts)- Optimize prompts, compare models, adjust parameters, and replay traced LLM calls.
165
+ - [**_Prompt Mangement_**](https://docs.arize.com/phoenix/prompt-engineering/overview-prompts/prompt-management)- Manage and test prompt changes systematically using version control, tagging, and experimentation.
165
166
 
166
167
  Phoenix is vendor and language agnostic with out-of-the-box support for popular frameworks (🦙[LlamaIndex](https://docs.arize.com/phoenix/tracing/integrations-tracing/llamaindex), 🦜⛓[LangChain](https://docs.arize.com/phoenix/tracing/integrations-tracing/langchain), [Haystack](https://docs.arize.com/phoenix/tracing/integrations-tracing/haystack), 🧩[DSPy](https://docs.arize.com/phoenix/tracing/integrations-tracing/dspy)) and LLM providers ([OpenAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/openai), [Bedrock](https://docs.arize.com/phoenix/tracing/integrations-tracing/bedrock), [MistralAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/mistralai), [VertexAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/vertexai), [LiteLLM](https://docs.arize.com/phoenix/tracing/integrations-tracing/litellm), and more). For details on auto-instrumentation, check out the [OpenInference](https://github.com/Arize-ai/openinference) project.
167
168
 
@@ -1,12 +1,12 @@
1
1
  phoenix/__init__.py,sha256=X3eUEwd2rG8KKWWYVNNDJoqo08ihfjgHhlP29dcdNJE,5481
2
2
  phoenix/auth.py,sha256=VVMHrWN31tln3Zo4z6ofecrV4daiqJjLd8r85mqlxek,10939
3
- phoenix/config.py,sha256=uGAIiD0dEdUybvCGNeO6TsL12BJl09vjGuXcWjnuPUA,28049
3
+ phoenix/config.py,sha256=V5DtJ5JZOqFr7CdXdYo_fPEDHVvxyY856xftHl3g9NY,29007
4
4
  phoenix/datetime_utils.py,sha256=iJzNG6YJ6V7_u8B2iA7P2Z26FyxYbOPtx0dhJ7kNDHA,3398
5
5
  phoenix/exceptions.py,sha256=n2L2KKuecrdflB9MsCdAYCiSEvGJptIsfRkXMoJle7A,169
6
6
  phoenix/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
7
7
  phoenix/services.py,sha256=kpW1WL0kiB8XJsO6XycvZVJ-lBkNoenhQ7atCvBoSe8,5365
8
8
  phoenix/settings.py,sha256=ht-0oN-sMV6SPXrk7Tu1EZlngpAYkGNLYPhO8DyrdQI,661
9
- phoenix/version.py,sha256=qHoUgbIt6pjWzUYt9wXlO8qcrd9dEl09FyPsRTkJshI,22
9
+ phoenix/version.py,sha256=ewV4OXfRKUnA7PPA-m0T-EIAUCBmvPUrtesvVXFrkWA,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
@@ -21,7 +21,7 @@ phoenix/db/enums.py,sha256=tt7iovXLhVTLZ3_LbHNGgcI44SnNjXfkKtLAZG57T54,428
21
21
  phoenix/db/facilitator.py,sha256=sAYqzBXYSVBKPTQVYrd7ZmtqMAr1zP9dVJwjfNGW7hc,4207
22
22
  phoenix/db/helpers.py,sha256=daKbpY2QhTPo9a_T1xNHKI4WzWHkMmmrGIws7Hw-RZ4,4884
23
23
  phoenix/db/migrate.py,sha256=oUrXH8yEbcpL4eh09aSCuUiSrhFli0eT5D_j4ZmYChY,2797
24
- phoenix/db/models.py,sha256=MpG6E3vGP5_kcc2p-4_CmLwPQgHs2-ht_Iwt6oJgljs,43888
24
+ phoenix/db/models.py,sha256=JxZkG4qLW7O2A9cHFVbw5y09y_QtJT7GoUxazcmeQlk,42601
25
25
  phoenix/db/insertion/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
26
  phoenix/db/insertion/constants.py,sha256=8wifm7X-1XvroZ__R2Gc96NsgLhTDn0zXl4lehlXtcA,70
27
27
  phoenix/db/insertion/dataset.py,sha256=I9OC1ouVx7m6BH_c8hvcxW1dWGRAtpvXee29yBTuFkg,7136
@@ -80,7 +80,7 @@ phoenix/pointcloud/pointcloud.py,sha256=SN_1wXZcwKrtSnHGZLDZGx71orqE1WyVF7E-D58d
80
80
  phoenix/pointcloud/projectors.py,sha256=TQgwc9cJDjJkin1WZyZzgl3HsYrLLiyWD7Czy4jNW3U,1088
81
81
  phoenix/pointcloud/umap_parameters.py,sha256=db_WEPoamuWtopZx7tQfAXPnoE0MS8FkAV0_ThjEx_Q,1735
82
82
  phoenix/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
- phoenix/server/app.py,sha256=9wYjV0Nmc5oascyqAhQ_Cx5dIH_ofEsdn_L_77mtG6w,39041
83
+ phoenix/server/app.py,sha256=MRy_pDDS0R63Wp8roLCxr_sDe_ZFZJLgwq7-n1mOYTo,39290
84
84
  phoenix/server/bearer_auth.py,sha256=0UudvkAS_dxna5JEJJhGUYwB6Ny-e22ssX5Mm79QwCk,5907
85
85
  phoenix/server/dml_event.py,sha256=MjJmVEKytq75chBOSyvYDusUnEbg1pHpIjR3pZkUaJA,2838
86
86
  phoenix/server/dml_event_handler.py,sha256=EZLXmCvx4pJrCkz29gxwKwmvmUkTtPCHw6klR-XM8qE,8258
@@ -96,14 +96,14 @@ phoenix/server/types.py,sha256=gJJPBcDRkQ9VHZIt_aLqG_OBbGt1oWp4e3W3Jp61oKs,7409
96
96
  phoenix/server/api/README.md,sha256=Pyq1PLPgTzXAswrfIhGXrjI3Skq8it2jTVnanT6Ba4Q,1162
97
97
  phoenix/server/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
98
  phoenix/server/api/auth.py,sha256=nywpmfMI1trZTbZRD3oBj4kFjzg_vnxDljcM431T1eY,1246
99
- phoenix/server/api/context.py,sha256=6dty-UK5ARXG8wVbyBEUPD9aARVjlkCbqkeSHL8ZJIw,6217
99
+ phoenix/server/api/context.py,sha256=zeIANzIfUPfs3odkDGvFs6RNRXYmpsz1DJoYlXNR6nM,6375
100
100
  phoenix/server/api/exceptions.py,sha256=TA0JuY2YRnj35qGuMSQ8d0ToHum9gWm9W--3fSKHrX0,1171
101
101
  phoenix/server/api/interceptor.py,sha256=ykDnoC_apUd-llVli3m1CW18kNSIgjz2qZ6m5JmPDu8,1294
102
- phoenix/server/api/queries.py,sha256=33FaHsmiVWRT21rJwMjDwF6UnJyknF97vto24zwfJWQ,32328
102
+ phoenix/server/api/queries.py,sha256=Zygu1nR2Ktkw0-Bc3vnpG5C9LSI_DHRxfujxlOJ7_BU,34542
103
103
  phoenix/server/api/schema.py,sha256=fcs36xQwFF_Qe41_5cWR8wYpDvOrnbcyTeo5WNMbDsA,1702
104
104
  phoenix/server/api/subscriptions.py,sha256=DSIgQF6lQqkbc7D0AaI5R4g3hIHbU04H5Y2UIpwmpy0,22989
105
105
  phoenix/server/api/utils.py,sha256=quCBRcusc6PUq9tJq7M8PgwFZp7nXgVAxtbw8feribY,833
106
- phoenix/server/api/dataloaders/__init__.py,sha256=32yLWx_Hzeh5F1zVHm6ZqRoN6d43ThMU9d47iuQH3BY,4179
106
+ phoenix/server/api/dataloaders/__init__.py,sha256=ZgJVbqIH-Y4M863fMIOsf4Ka9iVFmWtzqr0a4mQ92BU,4266
107
107
  phoenix/server/api/dataloaders/annotation_summaries.py,sha256=2sHmIDX7n8tuPeBTs9bMKtlMKWn_Ph9awTZqmwn2Owc,5505
108
108
  phoenix/server/api/dataloaders/average_experiment_run_latency.py,sha256=GLFoFAbztOH-0FVzzZ77mATIO63UcjB50j3qXiNi-tE,1811
109
109
  phoenix/server/api/dataloaders/dataset_example_revisions.py,sha256=xF7M2dg3UmjhdCrscnztCIBBI0cg3RF48IIqvilpc18,4623
@@ -118,6 +118,7 @@ phoenix/server/api/dataloaders/experiment_run_counts.py,sha256=j_7229IL705p_Tycx
118
118
  phoenix/server/api/dataloaders/experiment_sequence_number.py,sha256=zM_f78fnqhppLtevrx9iISQSN7w_BNeXT9CoX8jYgAI,1534
119
119
  phoenix/server/api/dataloaders/latency_ms_quantile.py,sha256=CHWV9nvEEM3xqpXWubywtLtFLzbwyLU85EaP_kQajJU,7363
120
120
  phoenix/server/api/dataloaders/min_start_or_max_end_times.py,sha256=1jYglTXv4S8k7OWSGdgeJ2OxVCmZtX8a6sjJp9GPZ04,2783
121
+ phoenix/server/api/dataloaders/num_child_spans.py,sha256=655g9SP_3gfT4qqukfgKzLy5uBLQmnVQBP-mZL3in0s,1200
121
122
  phoenix/server/api/dataloaders/project_by_name.py,sha256=O24Rjs0ZQaYtSnPfA6YBQfbHfUgNsHKUcc_gIKyK9vo,1086
122
123
  phoenix/server/api/dataloaders/prompt_version_sequence_number.py,sha256=tBaCbpI9KgjCACvpd-5hZy5TDSHH7PJPn4bd1xJuN-g,1314
123
124
  phoenix/server/api/dataloaders/record_counts.py,sha256=NLlMEaJ-HxiJavqbSkMbzOrIRzqzYxO8-t2mfp1vXqM,4160
@@ -130,8 +131,8 @@ phoenix/server/api/dataloaders/span_annotations.py,sha256=y5TvxnljS2P3hm_NiQd24q
130
131
  phoenix/server/api/dataloaders/span_by_id.py,sha256=gaqsMqMjJfzgsAuC--lZoRvgHk_1o78_0HnpXejg9Bc,1001
131
132
  phoenix/server/api/dataloaders/span_dataset_examples.py,sha256=rpBStVP7ZMIH11Cpq4-zCJ4amNC5ZzX72NYv4vAQTdc,1255
132
133
  phoenix/server/api/dataloaders/span_descendants.py,sha256=lEUpPkQtM5twbBrwzBbrJN7wZpG0K2rdL7hG2PAs5pk,2308
133
- phoenix/server/api/dataloaders/span_fields.py,sha256=HNggF00gbajMEUh5pwIpUPGENytRSVL304Lp4p9L7yk,2965
134
134
  phoenix/server/api/dataloaders/span_projects.py,sha256=JTfuKn2BBn72QdAP53ZGP2OUCgZJ7AzlzQAx8WivBog,1234
135
+ phoenix/server/api/dataloaders/table_fields.py,sha256=C3ywv87XphMEvqsQGl33H4iOiXbvqWqvaM4Snps4Sv0,3068
135
136
  phoenix/server/api/dataloaders/token_counts.py,sha256=Sr_sBfLgsKYCIjgzTFV-fuat7s7DATM2u6ZftLaOnoQ,4629
136
137
  phoenix/server/api/dataloaders/trace_by_trace_ids.py,sha256=xqYJOjCgXlTzour4vY72kO-2gJFgWMjD3759o78cq44,874
137
138
  phoenix/server/api/dataloaders/trace_root_spans.py,sha256=0Y2ImTPmDHpz_quRMIjuxED2M0dAm2M0StZUmSTiTiw,1000
@@ -142,11 +143,11 @@ phoenix/server/api/dataloaders/cache/two_tier_cache.py,sha256=cmo8FUT3E91R139IEz
142
143
  phoenix/server/api/helpers/__init__.py,sha256=m2-xaSPqUiSs91k62JaRDjFNfl-1byxBfY-m_Vxw16U,272
143
144
  phoenix/server/api/helpers/dataset_helpers.py,sha256=DoMBTg-qXTnC_K4Evx1WKpCCYgRbITpVqyY-8efJRf0,8984
144
145
  phoenix/server/api/helpers/experiment_run_filters.py,sha256=DOnVwrmn39eAkk2mwuZP8kIcAnR5jrOgllEwWSjsw94,29893
145
- phoenix/server/api/helpers/playground_clients.py,sha256=NIRyKp61OLLZ-UOUUitM8zCh2Xg8bep4qXxSLwEb3XU,39804
146
+ phoenix/server/api/helpers/playground_clients.py,sha256=VG2vEHi4ysPHH4ycNhB8VzNH7BS4uvIe57ZTR3MWuR4,40061
146
147
  phoenix/server/api/helpers/playground_registry.py,sha256=CPLMziFB2wmr-dfbx7VbzO2f8YIG_k5RftzvGXYGQ1w,2570
147
148
  phoenix/server/api/helpers/playground_spans.py,sha256=PjGNDc7cpqn5lmRM6TO_J1eVRGlgsNdQ8IT--5JVz0o,16881
148
149
  phoenix/server/api/helpers/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
149
- phoenix/server/api/helpers/prompts/models.py,sha256=EtPHulW8mUQ6MlSSuUIJNvdwSM2aGK6j-Xxg143mLqg,18691
150
+ phoenix/server/api/helpers/prompts/models.py,sha256=10dIZlDy1a3sKmFk--Af5jk-8ATBqbNPXlOZYSIDwGk,18734
150
151
  phoenix/server/api/helpers/prompts/conversions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
152
  phoenix/server/api/helpers/prompts/conversions/anthropic.py,sha256=uGTPzlw_9RaRPUsAIHyiRgD0NpDoajQzf7Am8nlJ4Cg,3279
152
153
  phoenix/server/api/helpers/prompts/conversions/openai.py,sha256=a43WAftFn_me6ePHDufqvlg-4Z2C31owUSsqYC0YUP8,2589
@@ -247,11 +248,11 @@ phoenix/server/api/types/EvaluationSummary.py,sha256=vILYejnfPvMwWEXOwhQZsANvYe3
247
248
  phoenix/server/api/types/Event.py,sha256=iYt_Jx1Roioo0vZ0iPeJTHcTu6NSm4ilVMJ-IMUHAKk,3970
248
249
  phoenix/server/api/types/EventMetadata.py,sha256=-J0tYF9eZTHwCjwxQHY7Gckr2_MNW5OoWT1mydweZNM,635
249
250
  phoenix/server/api/types/ExampleRevisionInterface.py,sha256=gV3Gt9-3Oi5wjaVtepC6nOt3FzTzZFD1KebNnqiw56E,294
250
- phoenix/server/api/types/Experiment.py,sha256=hqqIwgeWoylOeBAMmQyzefn_p_COwxW0VqEGOqdcTpE,5470
251
+ phoenix/server/api/types/Experiment.py,sha256=r_D7lDJ9nEthuyZdZ7HafxsODlcLNcXtCNaL70HRpjc,5349
251
252
  phoenix/server/api/types/ExperimentAnnotationSummary.py,sha256=Uk3JtxIrsMoZT5tqc4nJdUOM3XegVzjUyoV3pkjNotE,256
252
253
  phoenix/server/api/types/ExperimentComparison.py,sha256=cFQZy5rj_klzTV-3jnxIlkrCHXkW8gYnp5uSR1UWCzg,416
253
- phoenix/server/api/types/ExperimentRun.py,sha256=5PjvIx-VLx-W9Xw8JURbbfOYYIL-FAaZs1kyJB0icp4,4169
254
- phoenix/server/api/types/ExperimentRunAnnotation.py,sha256=HEbPygBwbWg10fwY3VZyM10OL1TKlnQk_x5MZIjZKPs,1724
254
+ phoenix/server/api/types/ExperimentRun.py,sha256=DMqxXEDFP4evEzCCnJ7JZHdv9z-nrcDxl0uKQOL6_ps,4179
255
+ phoenix/server/api/types/ExperimentRunAnnotation.py,sha256=YGw5zIbjRXUK3zH475DnEeg4SDNGOmdxtuUVkzGw1E8,1734
255
256
  phoenix/server/api/types/ExportedFile.py,sha256=e3GTn7B5LgsTbqiwjhMCQH7VsiqXitrBO4aCMS1lHsg,163
256
257
  phoenix/server/api/types/Functionality.py,sha256=tzV9xdhB8zqfsjWxP66NDC7EZsplYkYO7jRbLWJIeeg,382
257
258
  phoenix/server/api/types/GenerativeModel.py,sha256=P7eBUMXbeqaLwSSGBKdZy3a5gOLd9I0fuP8o1st6H08,193
@@ -264,8 +265,8 @@ phoenix/server/api/types/MimeType.py,sha256=Zpi6zCalkSFgsvhzvOs-O1gYA04usAi9H__Q
264
265
  phoenix/server/api/types/Model.py,sha256=8UIFqMe1q-2ufBNg-gxHusV8wM1h-KbfLUeJjyVcMvQ,8081
265
266
  phoenix/server/api/types/NumericRange.py,sha256=afEjgF97Go_OvmjMggbPBt-zGM8IONewAyEiKEHRds0,192
266
267
  phoenix/server/api/types/PerformanceMetric.py,sha256=KFkmJDqP43eDUtARQOUqR7NYcxvL6Vh2uisHWU6H3ko,387
267
- phoenix/server/api/types/Project.py,sha256=abX-1eefV8tdmv9gEBz0nZaKKtvFPBrJJYcdaCr7vP4,18752
268
- phoenix/server/api/types/ProjectSession.py,sha256=LVsFSoWt9U1dykWVtyOXF_mqp0Re8fj4oaogsOKKO1Y,4660
268
+ phoenix/server/api/types/Project.py,sha256=qETsEdX0NR-qmRBrjfaFAoYOdOVUzk1oZ1nWoc1hwK0,19950
269
+ phoenix/server/api/types/ProjectSession.py,sha256=fyfVtpUpFOTnBx8DFnH3dr7WXAssN0ooAgrQSSi7kEI,4677
269
270
  phoenix/server/api/types/Prompt.py,sha256=ccP4eq1e38xbF0afclGWLOuDpBVpNbJ3AOSRClF8yFQ,4955
270
271
  phoenix/server/api/types/PromptLabel.py,sha256=g3IDSPYRZwb0qpMAk93R6J96jgYULUYGOciTnpeh3sI,1321
271
272
  phoenix/server/api/types/PromptResponse.py,sha256=Q8HKtpp8GpUOcxPCzZpkkokidDd6u0aZOv_SuPZZd5Q,630
@@ -277,14 +278,14 @@ phoenix/server/api/types/Retrieval.py,sha256=OhMK2ncjoyp5h1yjKhjlKpoTbQrMHuxmgSF
277
278
  phoenix/server/api/types/ScalarDriftMetricEnum.py,sha256=IUAcRPpgL41WdoIgK6cNk2Te38SspXGyEs-S1fY23_A,232
278
279
  phoenix/server/api/types/Segments.py,sha256=vT2v0efoa5cuBKxLtxTnsUP5YJJCZfTloM71Spu0tMI,2915
279
280
  phoenix/server/api/types/SortDir.py,sha256=OUpXhlCzCxPoXSDkJJygEs9Rw9pMymfaZUG5zPTrw4Y,152
280
- phoenix/server/api/types/Span.py,sha256=0ofZR79IP2zGIW5Bt5kGxxaHqUl8HDWVwO3SwK8Ypos,23184
281
+ phoenix/server/api/types/Span.py,sha256=3Neeb1bEc2W2fNyoAfI0ULyb9gtze3Mv6iWHWRFv-Xc,24291
281
282
  phoenix/server/api/types/SpanAnnotation.py,sha256=6b5G-b_OoRvDL2ayWk7MkbqarLK-F-pQMx21CpUuNGY,1168
282
283
  phoenix/server/api/types/SpanIOValue.py,sha256=c5TWdZZN3v0gHI5xWeY7gjD-sE9ugWlGGAio-gDS-Uo,1653
283
284
  phoenix/server/api/types/SystemApiKey.py,sha256=2ym8EgsTBIvxx1l9xZ-2YMovz58ZwYb_MaHBTJ9NH2E,166
284
285
  phoenix/server/api/types/TimeSeries.py,sha256=nuuZtfHmOhTjeB8_SvZ5PUQexAkTcPScwYeFC5RUlRU,5491
285
286
  phoenix/server/api/types/TokenUsage.py,sha256=g-PjAGVigpchQgkXAuC5sc53fn2YwAgfeXkGmFPi_TE,201
286
287
  phoenix/server/api/types/ToolDefinition.py,sha256=T6UH2vcbuPBDy7jKYOqMth2NdqxMPgDBf11Tpbt5Yb8,187
287
- phoenix/server/api/types/Trace.py,sha256=6CqXcrI8rpEetGWAN8-lv6XoieLKqwobsKFV1qY4fsY,5645
288
+ phoenix/server/api/types/Trace.py,sha256=kH0Tv3m8chVbxMiQ27_W5v8gz6RsvGvl2qS9eoELXlw,7992
288
289
  phoenix/server/api/types/TraceAnnotation.py,sha256=OW6A2zr1gomOuG0XQe55dk15XXX2DSM0DzatRbHWH5A,1256
289
290
  phoenix/server/api/types/UMAPPoints.py,sha256=49sWnxjcAJKRzqUY71Fa0tOPti5XjIIFT5cSg6oNu_U,1650
290
291
  phoenix/server/api/types/User.py,sha256=iTVUrI8U6-asOhBt1bOZNtoRAaRNC4WHgR1Uv2rHnWQ,1975
@@ -311,16 +312,16 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
311
312
  phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
312
313
  phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
313
314
  phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
314
- phoenix/server/static/.vite/manifest.json,sha256=ALphee1UXe1OBBG-bgcQbpzJlvFnjRk4HNUnKyjUSMI,2165
315
- phoenix/server/static/assets/components-MeFAEc1z.js,sha256=jjceqJQcldgy3VJbQGKbKIpxEeDwGswwDGEmKg24i9g,420461
316
- phoenix/server/static/assets/index-BSRuZ-_J.js,sha256=-Aq4mHpppkyyieGZBkPHgfPf05Z0WV_ekbcpvaL1ik8,58963
317
- phoenix/server/static/assets/pages-NrL4hb9q.js,sha256=h_YJmI-gG-Jvxgja5efhTM7zm-JQ4WQ1q0VSGwQGIRk,821649
315
+ phoenix/server/static/.vite/manifest.json,sha256=E-HVSSr4xC4d_P49I-_9XpFni5j937QU2rPN0G0GDyU,2165
316
+ phoenix/server/static/assets/components-BgFPI6sn.js,sha256=a7Oru901CqeUXNKQ5nUX2qa8qWWrzc6a6Sb_UTCFTPQ,420595
317
+ phoenix/server/static/assets/index-CIkk8uHr.js,sha256=V2MOiWJp1tlJmjxW7QFk5VE-x5coElaXKqVeEPCYSYc,59131
318
+ phoenix/server/static/assets/pages-CmDiPH1A.js,sha256=r1U0ZTva747v8lUvq1-dwBS6aVN_nsKk4xKQmIaTNpU,828439
319
+ phoenix/server/static/assets/vendor-CRRq3WgM.js,sha256=J5mIL57AMCQb5lg2CVj-4e5dGb4NOhDeZNBN61fIROM,2235517
318
320
  phoenix/server/static/assets/vendor-Cg6lcjUC.css,sha256=nZrkr0u6NNElFGvpWHk9GTHeGoibCXCli1bE7mXZGZg,1816
319
- phoenix/server/static/assets/vendor-Cqfydjep.js,sha256=3sepoB8zViIDMxKuc4lpMVfCmATxlvc9vCEPI2B2uVQ,2235092
320
- phoenix/server/static/assets/vendor-arizeai-WnerlUPN.js,sha256=MahCU9MTwcGSh9tsu-gsF-SWqCISSFIYq9ZnMoKLPkA,202331
321
- phoenix/server/static/assets/vendor-codemirror-D-ZZKLFq.js,sha256=DJbYiCh2ng3IV5yyktfweoMAKiLYdhz0EFElIpbzsco,393496
322
- phoenix/server/static/assets/vendor-recharts-KY97ZPfK.js,sha256=5LKQPOTBvQfISnmmzDoWqK-AaVtRQTKTYXVTEvyG1KU,282095
323
- phoenix/server/static/assets/vendor-shiki-D5K9GnFn.js,sha256=mi8NXvOV1AbRuOTVp3wlon_CBUs4RtzqbPjqTD2OnbU,8980312
321
+ phoenix/server/static/assets/vendor-arizeai-Dq64X_0o.js,sha256=jAFsbq-7Q6v08obSM4NW5oMHsouV6Nd9DDV5A9YqsRE,202331
322
+ phoenix/server/static/assets/vendor-codemirror-C1oevlym.js,sha256=UoItJZMSk_7qu0Ru_Pc7AlLDzAIUiX_XE0fSlSXxiWg,393496
323
+ phoenix/server/static/assets/vendor-recharts-CPj01S89.js,sha256=Ko4axsrs0GW5yMWkW6awnBDjtx_s7_jcPYrh-E0gYIU,282095
324
+ phoenix/server/static/assets/vendor-shiki-aY7rz1pm.js,sha256=eC9R-Z5o7yMLGWR-NEvogNGFYv-KlPcUfXnJk7fOWC8,8980312
324
325
  phoenix/server/static/assets/vendor-three-C-AGeJYv.js,sha256=c9nLPH5YDRFCzTNuwWO8_5KqcnunPo53mQsb7y9JFW8,620972
325
326
  phoenix/server/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
326
327
  phoenix/server/templates/index.html,sha256=e8_jdi7Eo19SK7DI_gglkTW094D17E0VAegoMmmmvIc,4330
@@ -361,9 +362,9 @@ phoenix/utilities/project.py,sha256=auVpARXkDb-JgeX5f2aStyFIkeKvGwN9l7qrFeJMVxI,
361
362
  phoenix/utilities/re.py,sha256=6YyUWIkv0zc2SigsxfOWIHzdpjKA_TZo2iqKq7zJKvw,2081
362
363
  phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
363
364
  phoenix/utilities/template_formatters.py,sha256=gh9PJD6WEGw7TEYXfSst1UR4pWWwmjxMLrDVQ_CkpkQ,2779
364
- arize_phoenix-8.2.2.dist-info/METADATA,sha256=RgPi_NuwiGaxiImVhDIwzLlGA4iC0lKsymPrKRnipa0,23425
365
- arize_phoenix-8.2.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
366
- arize_phoenix-8.2.2.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
367
- arize_phoenix-8.2.2.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
368
- arize_phoenix-8.2.2.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
369
- arize_phoenix-8.2.2.dist-info/RECORD,,
365
+ arize_phoenix-8.4.0.dist-info/METADATA,sha256=1rIrOe2Lz0jCoaJ66BH56BqI5E-0Rdm2Zkp8YBx6xaU,23646
366
+ arize_phoenix-8.4.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
367
+ arize_phoenix-8.4.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
368
+ arize_phoenix-8.4.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
369
+ arize_phoenix-8.4.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
370
+ arize_phoenix-8.4.0.dist-info/RECORD,,
phoenix/config.py CHANGED
@@ -54,6 +54,33 @@ Phoenix supports two types of database URLs:
54
54
  Note that if you plan on using SQLite, it's advised to to use a persistent volume
55
55
  and simply point the PHOENIX_WORKING_DIR to that volume.
56
56
  """
57
+ ENV_PHOENIX_POSTGRES_HOST = "PHOENIX_POSTGRES_HOST"
58
+ """
59
+ As an alternative to setting PHOENIX_SQL_DATABASE_URL, you can set the following
60
+ environment variables to connect to a PostgreSQL database:
61
+ - PHOENIX_POSTGRES_HOST
62
+ - PHOENIX_POSTGRES_PORT
63
+ - PHOENIX_POSTGRES_USER
64
+ - PHOENIX_POSTGRES_PASSWORD
65
+ - PHOENIX_POSTGRES_DB
66
+ """
67
+ ENV_PHOENIX_POSTGRES_PORT = "PHOENIX_POSTGRES_PORT"
68
+ """
69
+ Used with PHOENIX_POSTGRES_HOST to specify the port to use for the PostgreSQL database.
70
+ """
71
+ ENV_PHOENIX_POSTGRES_USER = "PHOENIX_POSTGRES_USER"
72
+ """
73
+ Used with PHOENIX_POSTGRES_HOST to specify the user to use for the PostgreSQL database (required).
74
+ """
75
+ ENV_PHOENIX_POSTGRES_PASSWORD = "PHOENIX_POSTGRES_PASSWORD"
76
+ """
77
+ Used with PHOENIX_POSTGRES_HOST to specify the password to use for the PostgreSQL database
78
+ (required).
79
+ """
80
+ ENV_PHOENIX_POSTGRES_DB = "PHOENIX_POSTGRES_DB"
81
+ """
82
+ Used with PHOENIX_POSTGRES_HOST to specify the database to use for the PostgreSQL database.
83
+ """
57
84
  ENV_PHOENIX_SQL_DATABASE_SCHEMA = "PHOENIX_SQL_DATABASE_SCHEMA"
58
85
  """
59
86
  The schema to use for the PostgresSQL database. (This is ignored for SQLite.)
@@ -635,11 +662,11 @@ def get_env_database_connection_str() -> str:
635
662
 
636
663
 
637
664
  def get_env_postgres_connection_str() -> Optional[str]:
638
- pg_user = os.getenv("PHOENIX_POSTGRES_USER")
639
- pg_password = os.getenv("PHOENIX_POSTGRES_PASSWORD")
640
- pg_host = os.getenv("PHOENIX_POSTGRES_HOST")
641
- pg_port = os.getenv("PHOENIX_POSTGRES_PORT")
642
- pg_db = os.getenv("PHOENIX_POSTGRES_DB")
665
+ pg_user = os.getenv(ENV_PHOENIX_POSTGRES_USER)
666
+ pg_password = os.getenv(ENV_PHOENIX_POSTGRES_PASSWORD)
667
+ pg_host = os.getenv(ENV_PHOENIX_POSTGRES_HOST)
668
+ pg_port = os.getenv(ENV_PHOENIX_POSTGRES_PORT)
669
+ pg_db = os.getenv(ENV_PHOENIX_POSTGRES_DB)
643
670
 
644
671
  if pg_host and ":" in pg_host:
645
672
  pg_host, parsed_port = pg_host.split(":")
phoenix/db/models.py CHANGED
@@ -271,6 +271,7 @@ class ExperimentRunOutput(TypedDict, total=False):
271
271
 
272
272
 
273
273
  class Base(DeclarativeBase):
274
+ id: Mapped[int] = mapped_column(Integer, primary_key=True)
274
275
  # Enforce best practices for naming constraints
275
276
  # https://alembic.sqlalchemy.org/en/latest/naming.html#integration-of-naming-conventions-into-operations-autogenerate
276
277
  metadata = MetaData(
@@ -292,7 +293,6 @@ class Base(DeclarativeBase):
292
293
 
293
294
  class Project(Base):
294
295
  __tablename__ = "projects"
295
- id: Mapped[int] = mapped_column(primary_key=True)
296
296
  name: Mapped[str]
297
297
  description: Mapped[Optional[str]]
298
298
  gradient_start_color: Mapped[str] = mapped_column(
@@ -325,7 +325,6 @@ class Project(Base):
325
325
 
326
326
  class ProjectSession(Base):
327
327
  __tablename__ = "project_sessions"
328
- id: Mapped[int] = mapped_column(primary_key=True)
329
328
  session_id: Mapped[str] = mapped_column(String, nullable=False, unique=True)
330
329
  project_id: Mapped[int] = mapped_column(
331
330
  ForeignKey("projects.id", ondelete="CASCADE"),
@@ -343,7 +342,6 @@ class ProjectSession(Base):
343
342
 
344
343
  class Trace(Base):
345
344
  __tablename__ = "traces"
346
- id: Mapped[int] = mapped_column(primary_key=True)
347
345
  project_rowid: Mapped[int] = mapped_column(
348
346
  ForeignKey("projects.id", ondelete="CASCADE"),
349
347
  nullable=False,
@@ -393,7 +391,6 @@ class Trace(Base):
393
391
 
394
392
  class Span(Base):
395
393
  __tablename__ = "spans"
396
- id: Mapped[int] = mapped_column(primary_key=True)
397
394
  trace_rowid: Mapped[int] = mapped_column(
398
395
  ForeignKey("traces.id", ondelete="CASCADE"),
399
396
  index=True,
@@ -660,7 +657,6 @@ async def init_models(engine: AsyncEngine) -> None:
660
657
 
661
658
  class SpanAnnotation(Base):
662
659
  __tablename__ = "span_annotations"
663
- id: Mapped[int] = mapped_column(primary_key=True)
664
660
  span_rowid: Mapped[int] = mapped_column(
665
661
  ForeignKey("spans.id", ondelete="CASCADE"),
666
662
  index=True,
@@ -687,7 +683,6 @@ class SpanAnnotation(Base):
687
683
 
688
684
  class TraceAnnotation(Base):
689
685
  __tablename__ = "trace_annotations"
690
- id: Mapped[int] = mapped_column(primary_key=True)
691
686
  trace_rowid: Mapped[int] = mapped_column(
692
687
  ForeignKey("traces.id", ondelete="CASCADE"),
693
688
  index=True,
@@ -714,7 +709,6 @@ class TraceAnnotation(Base):
714
709
 
715
710
  class DocumentAnnotation(Base):
716
711
  __tablename__ = "document_annotations"
717
- id: Mapped[int] = mapped_column(primary_key=True)
718
712
  span_rowid: Mapped[int] = mapped_column(
719
713
  ForeignKey("spans.id", ondelete="CASCADE"),
720
714
  index=True,
@@ -745,7 +739,6 @@ class DocumentAnnotation(Base):
745
739
 
746
740
  class Dataset(Base):
747
741
  __tablename__ = "datasets"
748
- id: Mapped[int] = mapped_column(primary_key=True)
749
742
  name: Mapped[str] = mapped_column(unique=True)
750
743
  description: Mapped[Optional[str]]
751
744
  metadata_: Mapped[dict[str, Any]] = mapped_column("metadata")
@@ -805,7 +798,6 @@ class Dataset(Base):
805
798
 
806
799
  class DatasetVersion(Base):
807
800
  __tablename__ = "dataset_versions"
808
- id: Mapped[int] = mapped_column(primary_key=True)
809
801
  dataset_id: Mapped[int] = mapped_column(
810
802
  ForeignKey("datasets.id", ondelete="CASCADE"),
811
803
  index=True,
@@ -817,7 +809,6 @@ class DatasetVersion(Base):
817
809
 
818
810
  class DatasetExample(Base):
819
811
  __tablename__ = "dataset_examples"
820
- id: Mapped[int] = mapped_column(primary_key=True)
821
812
  dataset_id: Mapped[int] = mapped_column(
822
813
  ForeignKey("datasets.id", ondelete="CASCADE"),
823
814
  index=True,
@@ -834,7 +825,6 @@ class DatasetExample(Base):
834
825
 
835
826
  class DatasetExampleRevision(Base):
836
827
  __tablename__ = "dataset_example_revisions"
837
- id: Mapped[int] = mapped_column(primary_key=True)
838
828
  dataset_example_id: Mapped[int] = mapped_column(
839
829
  ForeignKey("dataset_examples.id", ondelete="CASCADE"),
840
830
  index=True,
@@ -863,7 +853,6 @@ class DatasetExampleRevision(Base):
863
853
 
864
854
  class Experiment(Base):
865
855
  __tablename__ = "experiments"
866
- id: Mapped[int] = mapped_column(primary_key=True)
867
856
  dataset_id: Mapped[int] = mapped_column(
868
857
  ForeignKey("datasets.id", ondelete="CASCADE"),
869
858
  index=True,
@@ -885,7 +874,6 @@ class Experiment(Base):
885
874
 
886
875
  class ExperimentRun(Base):
887
876
  __tablename__ = "experiment_runs"
888
- id: Mapped[int] = mapped_column(primary_key=True)
889
877
  experiment_id: Mapped[int] = mapped_column(
890
878
  ForeignKey("experiments.id", ondelete="CASCADE"),
891
879
  index=True,
@@ -928,7 +916,6 @@ class ExperimentRun(Base):
928
916
 
929
917
  class ExperimentRunAnnotation(Base):
930
918
  __tablename__ = "experiment_run_annotations"
931
- id: Mapped[int] = mapped_column(primary_key=True)
932
919
  experiment_run_id: Mapped[int] = mapped_column(
933
920
  ForeignKey("experiment_runs.id", ondelete="CASCADE"),
934
921
  index=True,
@@ -956,14 +943,12 @@ class ExperimentRunAnnotation(Base):
956
943
 
957
944
  class UserRole(Base):
958
945
  __tablename__ = "user_roles"
959
- id: Mapped[int] = mapped_column(primary_key=True)
960
946
  name: Mapped[str] = mapped_column(unique=True, index=True)
961
947
  users: Mapped[list["User"]] = relationship("User", back_populates="role")
962
948
 
963
949
 
964
950
  class User(Base):
965
951
  __tablename__ = "users"
966
- id: Mapped[int] = mapped_column(primary_key=True)
967
952
  user_role_id: Mapped[int] = mapped_column(
968
953
  ForeignKey("user_roles.id", ondelete="CASCADE"),
969
954
  index=True,
@@ -1038,7 +1023,6 @@ class User(Base):
1038
1023
 
1039
1024
  class PasswordResetToken(Base):
1040
1025
  __tablename__ = "password_reset_tokens"
1041
- id: Mapped[int] = mapped_column(primary_key=True)
1042
1026
  user_id: Mapped[int] = mapped_column(
1043
1027
  ForeignKey("users.id", ondelete="CASCADE"),
1044
1028
  unique=True,
@@ -1052,7 +1036,6 @@ class PasswordResetToken(Base):
1052
1036
 
1053
1037
  class RefreshToken(Base):
1054
1038
  __tablename__ = "refresh_tokens"
1055
- id: Mapped[int] = mapped_column(primary_key=True)
1056
1039
  user_id: Mapped[int] = mapped_column(
1057
1040
  ForeignKey("users.id", ondelete="CASCADE"),
1058
1041
  index=True,
@@ -1065,7 +1048,6 @@ class RefreshToken(Base):
1065
1048
 
1066
1049
  class AccessToken(Base):
1067
1050
  __tablename__ = "access_tokens"
1068
- id: Mapped[int] = mapped_column(primary_key=True)
1069
1051
  user_id: Mapped[int] = mapped_column(
1070
1052
  ForeignKey("users.id", ondelete="CASCADE"),
1071
1053
  index=True,
@@ -1083,7 +1065,6 @@ class AccessToken(Base):
1083
1065
 
1084
1066
  class ApiKey(Base):
1085
1067
  __tablename__ = "api_keys"
1086
- id: Mapped[int] = mapped_column(primary_key=True)
1087
1068
  user_id: Mapped[int] = mapped_column(
1088
1069
  ForeignKey("users.id", ondelete="CASCADE"),
1089
1070
  index=True,
@@ -1099,7 +1080,6 @@ class ApiKey(Base):
1099
1080
  class PromptLabel(Base):
1100
1081
  __tablename__ = "prompt_labels"
1101
1082
 
1102
- id: Mapped[int] = mapped_column(primary_key=True)
1103
1083
  name: Mapped[str] = mapped_column(String, unique=True, index=True, nullable=False)
1104
1084
  description: Mapped[Optional[str]]
1105
1085
  color: Mapped[str] = mapped_column(String, nullable=True)
@@ -1115,7 +1095,6 @@ class PromptLabel(Base):
1115
1095
  class Prompt(Base):
1116
1096
  __tablename__ = "prompts"
1117
1097
 
1118
- id: Mapped[int] = mapped_column(primary_key=True)
1119
1098
  source_prompt_id: Mapped[Optional[int]] = mapped_column(
1120
1099
  ForeignKey("prompts.id", ondelete="SET NULL"),
1121
1100
  index=True,
@@ -1154,7 +1133,6 @@ class Prompt(Base):
1154
1133
  class PromptPromptLabel(Base):
1155
1134
  __tablename__ = "prompts_prompt_labels"
1156
1135
 
1157
- id: Mapped[int] = mapped_column(primary_key=True)
1158
1136
  prompt_label_id: Mapped[int] = mapped_column(
1159
1137
  ForeignKey("prompt_labels.id", ondelete="CASCADE"),
1160
1138
  index=True,
@@ -1177,7 +1155,6 @@ class PromptPromptLabel(Base):
1177
1155
  class PromptVersion(Base):
1178
1156
  __tablename__ = "prompt_versions"
1179
1157
 
1180
- id: Mapped[int] = mapped_column(primary_key=True)
1181
1158
  prompt_id: Mapped[int] = mapped_column(
1182
1159
  ForeignKey("prompts.id", ondelete="CASCADE"),
1183
1160
  index=True,
@@ -1227,7 +1204,6 @@ class PromptVersion(Base):
1227
1204
  class PromptVersionTag(Base):
1228
1205
  __tablename__ = "prompt_version_tags"
1229
1206
 
1230
- id: Mapped[int] = mapped_column(primary_key=True)
1231
1207
  name: Mapped[Identifier] = mapped_column(_Identifier, nullable=False)
1232
1208
  description: Mapped[Optional[str]] = mapped_column(String, nullable=True)
1233
1209
  prompt_id: Mapped[int] = mapped_column(
@@ -29,6 +29,7 @@ from phoenix.server.api.dataloaders import (
29
29
  ExperimentSequenceNumberDataLoader,
30
30
  LatencyMsQuantileDataLoader,
31
31
  MinStartOrMaxEndTimeDataLoader,
32
+ NumChildSpansDataLoader,
32
33
  ProjectByNameDataLoader,
33
34
  PromptVersionSequenceNumberDataLoader,
34
35
  RecordCountDataLoader,
@@ -41,8 +42,8 @@ from phoenix.server.api.dataloaders import (
41
42
  SpanByIdDataLoader,
42
43
  SpanDatasetExamplesDataLoader,
43
44
  SpanDescendantsDataLoader,
44
- SpanFieldsDataLoader,
45
45
  SpanProjectsDataLoader,
46
+ TableFieldsDataLoader,
46
47
  TokenCountDataLoader,
47
48
  TraceByTraceIdsDataLoader,
48
49
  TraceRootSpansDataLoader,
@@ -76,6 +77,8 @@ class DataLoaders:
76
77
  experiment_sequence_number: ExperimentSequenceNumberDataLoader
77
78
  latency_ms_quantile: LatencyMsQuantileDataLoader
78
79
  min_start_or_max_end_times: MinStartOrMaxEndTimeDataLoader
80
+ num_child_spans: NumChildSpansDataLoader
81
+ project_fields: TableFieldsDataLoader
79
82
  prompt_version_sequence_number: PromptVersionSequenceNumberDataLoader
80
83
  record_counts: RecordCountDataLoader
81
84
  session_first_inputs: SessionIODataLoader
@@ -88,10 +91,11 @@ class DataLoaders:
88
91
  span_by_id: SpanByIdDataLoader
89
92
  span_dataset_examples: SpanDatasetExamplesDataLoader
90
93
  span_descendants: SpanDescendantsDataLoader
91
- span_fields: SpanFieldsDataLoader
94
+ span_fields: TableFieldsDataLoader
92
95
  span_projects: SpanProjectsDataLoader
93
96
  token_counts: TokenCountDataLoader
94
97
  trace_by_trace_ids: TraceByTraceIdsDataLoader
98
+ trace_fields: TableFieldsDataLoader
95
99
  trace_root_spans: TraceRootSpansDataLoader
96
100
  project_by_name: ProjectByNameDataLoader
97
101
  users: UsersDataLoader
@@ -17,6 +17,7 @@ from .experiment_run_counts import ExperimentRunCountsDataLoader
17
17
  from .experiment_sequence_number import ExperimentSequenceNumberDataLoader
18
18
  from .latency_ms_quantile import LatencyMsQuantileCache, LatencyMsQuantileDataLoader
19
19
  from .min_start_or_max_end_times import MinStartOrMaxEndTimeCache, MinStartOrMaxEndTimeDataLoader
20
+ from .num_child_spans import NumChildSpansDataLoader
20
21
  from .project_by_name import ProjectByNameDataLoader
21
22
  from .prompt_version_sequence_number import PromptVersionSequenceNumberDataLoader
22
23
  from .record_counts import RecordCountCache, RecordCountDataLoader
@@ -29,8 +30,8 @@ from .span_annotations import SpanAnnotationsDataLoader
29
30
  from .span_by_id import SpanByIdDataLoader
30
31
  from .span_dataset_examples import SpanDatasetExamplesDataLoader
31
32
  from .span_descendants import SpanDescendantsDataLoader
32
- from .span_fields import SpanFieldsDataLoader
33
33
  from .span_projects import SpanProjectsDataLoader
34
+ from .table_fields import TableFieldsDataLoader
34
35
  from .token_counts import TokenCountCache, TokenCountDataLoader
35
36
  from .trace_by_trace_ids import TraceByTraceIdsDataLoader
36
37
  from .trace_root_spans import TraceRootSpansDataLoader
@@ -53,6 +54,7 @@ __all__ = [
53
54
  "ExperimentSequenceNumberDataLoader",
54
55
  "LatencyMsQuantileDataLoader",
55
56
  "MinStartOrMaxEndTimeDataLoader",
57
+ "NumChildSpansDataLoader",
56
58
  "PromptVersionSequenceNumberDataLoader",
57
59
  "RecordCountDataLoader",
58
60
  "SessionIODataLoader",
@@ -60,11 +62,11 @@ __all__ = [
60
62
  "SessionNumTracesWithErrorDataLoader",
61
63
  "SessionTokenUsagesDataLoader",
62
64
  "SessionTraceLatencyMsQuantileDataLoader",
63
- "SpanFieldsDataLoader",
64
65
  "SpanByIdDataLoader",
65
66
  "SpanDatasetExamplesDataLoader",
66
67
  "SpanDescendantsDataLoader",
67
68
  "SpanProjectsDataLoader",
69
+ "TableFieldsDataLoader",
68
70
  "TokenCountDataLoader",
69
71
  "TraceByTraceIdsDataLoader",
70
72
  "TraceRootSpansDataLoader",
@@ -0,0 +1,35 @@
1
+ from typing import Iterable
2
+
3
+ from sqlalchemy import func, select
4
+ from strawberry.dataloader import DataLoader
5
+ from typing_extensions import TypeAlias
6
+
7
+ from phoenix.db import models
8
+ from phoenix.server.types import DbSessionFactory
9
+
10
+ SpanRowId: TypeAlias = int
11
+
12
+ Key: TypeAlias = SpanRowId
13
+ Result: TypeAlias = int
14
+
15
+
16
+ class NumChildSpansDataLoader(DataLoader[Key, Result]):
17
+ def __init__(self, db: DbSessionFactory) -> None:
18
+ super().__init__(load_fn=self._load_fn)
19
+ self._db = db
20
+
21
+ async def _load_fn(self, keys: Iterable[Key]) -> list[Result]:
22
+ span_rowids = list(set(keys))
23
+ result: dict[Key, Result] = {}
24
+ children = select(models.Span).alias("children")
25
+ stmt = (
26
+ select(models.Span.id, func.count())
27
+ .where(models.Span.id.in_(span_rowids))
28
+ .join(children, children.c.parent_id == models.Span.span_id)
29
+ .group_by(models.Span.id)
30
+ )
31
+ async with self._db() as session:
32
+ data = await session.stream(stmt)
33
+ async for span_rowid, num_child_spans in data:
34
+ result[span_rowid] = num_child_spans
35
+ return [result.get(span_rowid, 0) for span_rowid in keys]