arize-phoenix 8.2.2__py3-none-any.whl → 8.3.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 (27) hide show
  1. {arize_phoenix-8.2.2.dist-info → arize_phoenix-8.3.0.dist-info}/METADATA +3 -3
  2. {arize_phoenix-8.2.2.dist-info → arize_phoenix-8.3.0.dist-info}/RECORD +27 -27
  3. phoenix/config.py +32 -5
  4. phoenix/db/models.py +1 -25
  5. phoenix/server/api/context.py +4 -2
  6. phoenix/server/api/dataloaders/__init__.py +2 -2
  7. phoenix/server/api/dataloaders/{span_fields.py → table_fields.py} +21 -19
  8. phoenix/server/api/helpers/playground_clients.py +4 -0
  9. phoenix/server/api/helpers/prompts/models.py +1 -0
  10. phoenix/server/api/queries.py +8 -17
  11. phoenix/server/api/types/Experiment.py +2 -4
  12. phoenix/server/api/types/ExperimentRun.py +2 -2
  13. phoenix/server/api/types/ExperimentRunAnnotation.py +2 -2
  14. phoenix/server/api/types/Project.py +67 -38
  15. phoenix/server/api/types/ProjectSession.py +2 -2
  16. phoenix/server/api/types/Span.py +31 -2
  17. phoenix/server/api/types/Trace.py +98 -30
  18. phoenix/server/app.py +4 -2
  19. phoenix/server/static/.vite/manifest.json +9 -9
  20. phoenix/server/static/assets/{components-MeFAEc1z.js → components-T5K9z49d.js} +3 -3
  21. phoenix/server/static/assets/{index-BSRuZ-_J.js → index-DvHwFF8e.js} +2 -2
  22. phoenix/server/static/assets/{pages-NrL4hb9q.js → pages-CY3ZXSHj.js} +375 -356
  23. phoenix/version.py +1 -1
  24. {arize_phoenix-8.2.2.dist-info → arize_phoenix-8.3.0.dist-info}/WHEEL +0 -0
  25. {arize_phoenix-8.2.2.dist-info → arize_phoenix-8.3.0.dist-info}/entry_points.txt +0 -0
  26. {arize_phoenix-8.2.2.dist-info → arize_phoenix-8.3.0.dist-info}/licenses/IP_NOTICE +0 -0
  27. {arize_phoenix-8.2.2.dist-info → arize_phoenix-8.3.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.3.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'
@@ -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=hiR7PouSkHWKTT2q2JFrz5vsu1x5YsLxuo4hVevNMUU,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=qYSU_1kA8vE1_NjfADYO35M71-CzmoxTmR9zRi7EaRo,39200
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=ZdhMuj7QSKDBt8Nd8BnndNSIunLuekttP50a3NIm3BA,6301
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=DvWj6xbpEOE5yX_zYwvq3OIicRXQEwnI2h0uDctMmTs,31891
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=L-VTXrf_loh2klLixKDT80wRrJIUox8bMV7bpt2p_Uo,4182
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
@@ -130,8 +130,8 @@ phoenix/server/api/dataloaders/span_annotations.py,sha256=y5TvxnljS2P3hm_NiQd24q
130
130
  phoenix/server/api/dataloaders/span_by_id.py,sha256=gaqsMqMjJfzgsAuC--lZoRvgHk_1o78_0HnpXejg9Bc,1001
131
131
  phoenix/server/api/dataloaders/span_dataset_examples.py,sha256=rpBStVP7ZMIH11Cpq4-zCJ4amNC5ZzX72NYv4vAQTdc,1255
132
132
  phoenix/server/api/dataloaders/span_descendants.py,sha256=lEUpPkQtM5twbBrwzBbrJN7wZpG0K2rdL7hG2PAs5pk,2308
133
- phoenix/server/api/dataloaders/span_fields.py,sha256=HNggF00gbajMEUh5pwIpUPGENytRSVL304Lp4p9L7yk,2965
134
133
  phoenix/server/api/dataloaders/span_projects.py,sha256=JTfuKn2BBn72QdAP53ZGP2OUCgZJ7AzlzQAx8WivBog,1234
134
+ phoenix/server/api/dataloaders/table_fields.py,sha256=C3ywv87XphMEvqsQGl33H4iOiXbvqWqvaM4Snps4Sv0,3068
135
135
  phoenix/server/api/dataloaders/token_counts.py,sha256=Sr_sBfLgsKYCIjgzTFV-fuat7s7DATM2u6ZftLaOnoQ,4629
136
136
  phoenix/server/api/dataloaders/trace_by_trace_ids.py,sha256=xqYJOjCgXlTzour4vY72kO-2gJFgWMjD3759o78cq44,874
137
137
  phoenix/server/api/dataloaders/trace_root_spans.py,sha256=0Y2ImTPmDHpz_quRMIjuxED2M0dAm2M0StZUmSTiTiw,1000
@@ -142,11 +142,11 @@ phoenix/server/api/dataloaders/cache/two_tier_cache.py,sha256=cmo8FUT3E91R139IEz
142
142
  phoenix/server/api/helpers/__init__.py,sha256=m2-xaSPqUiSs91k62JaRDjFNfl-1byxBfY-m_Vxw16U,272
143
143
  phoenix/server/api/helpers/dataset_helpers.py,sha256=DoMBTg-qXTnC_K4Evx1WKpCCYgRbITpVqyY-8efJRf0,8984
144
144
  phoenix/server/api/helpers/experiment_run_filters.py,sha256=DOnVwrmn39eAkk2mwuZP8kIcAnR5jrOgllEwWSjsw94,29893
145
- phoenix/server/api/helpers/playground_clients.py,sha256=NIRyKp61OLLZ-UOUUitM8zCh2Xg8bep4qXxSLwEb3XU,39804
145
+ phoenix/server/api/helpers/playground_clients.py,sha256=VG2vEHi4ysPHH4ycNhB8VzNH7BS4uvIe57ZTR3MWuR4,40061
146
146
  phoenix/server/api/helpers/playground_registry.py,sha256=CPLMziFB2wmr-dfbx7VbzO2f8YIG_k5RftzvGXYGQ1w,2570
147
147
  phoenix/server/api/helpers/playground_spans.py,sha256=PjGNDc7cpqn5lmRM6TO_J1eVRGlgsNdQ8IT--5JVz0o,16881
148
148
  phoenix/server/api/helpers/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
149
- phoenix/server/api/helpers/prompts/models.py,sha256=EtPHulW8mUQ6MlSSuUIJNvdwSM2aGK6j-Xxg143mLqg,18691
149
+ phoenix/server/api/helpers/prompts/models.py,sha256=10dIZlDy1a3sKmFk--Af5jk-8ATBqbNPXlOZYSIDwGk,18734
150
150
  phoenix/server/api/helpers/prompts/conversions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
151
  phoenix/server/api/helpers/prompts/conversions/anthropic.py,sha256=uGTPzlw_9RaRPUsAIHyiRgD0NpDoajQzf7Am8nlJ4Cg,3279
152
152
  phoenix/server/api/helpers/prompts/conversions/openai.py,sha256=a43WAftFn_me6ePHDufqvlg-4Z2C31owUSsqYC0YUP8,2589
@@ -247,11 +247,11 @@ phoenix/server/api/types/EvaluationSummary.py,sha256=vILYejnfPvMwWEXOwhQZsANvYe3
247
247
  phoenix/server/api/types/Event.py,sha256=iYt_Jx1Roioo0vZ0iPeJTHcTu6NSm4ilVMJ-IMUHAKk,3970
248
248
  phoenix/server/api/types/EventMetadata.py,sha256=-J0tYF9eZTHwCjwxQHY7Gckr2_MNW5OoWT1mydweZNM,635
249
249
  phoenix/server/api/types/ExampleRevisionInterface.py,sha256=gV3Gt9-3Oi5wjaVtepC6nOt3FzTzZFD1KebNnqiw56E,294
250
- phoenix/server/api/types/Experiment.py,sha256=hqqIwgeWoylOeBAMmQyzefn_p_COwxW0VqEGOqdcTpE,5470
250
+ phoenix/server/api/types/Experiment.py,sha256=r_D7lDJ9nEthuyZdZ7HafxsODlcLNcXtCNaL70HRpjc,5349
251
251
  phoenix/server/api/types/ExperimentAnnotationSummary.py,sha256=Uk3JtxIrsMoZT5tqc4nJdUOM3XegVzjUyoV3pkjNotE,256
252
252
  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
253
+ phoenix/server/api/types/ExperimentRun.py,sha256=DMqxXEDFP4evEzCCnJ7JZHdv9z-nrcDxl0uKQOL6_ps,4179
254
+ phoenix/server/api/types/ExperimentRunAnnotation.py,sha256=YGw5zIbjRXUK3zH475DnEeg4SDNGOmdxtuUVkzGw1E8,1734
255
255
  phoenix/server/api/types/ExportedFile.py,sha256=e3GTn7B5LgsTbqiwjhMCQH7VsiqXitrBO4aCMS1lHsg,163
256
256
  phoenix/server/api/types/Functionality.py,sha256=tzV9xdhB8zqfsjWxP66NDC7EZsplYkYO7jRbLWJIeeg,382
257
257
  phoenix/server/api/types/GenerativeModel.py,sha256=P7eBUMXbeqaLwSSGBKdZy3a5gOLd9I0fuP8o1st6H08,193
@@ -264,8 +264,8 @@ phoenix/server/api/types/MimeType.py,sha256=Zpi6zCalkSFgsvhzvOs-O1gYA04usAi9H__Q
264
264
  phoenix/server/api/types/Model.py,sha256=8UIFqMe1q-2ufBNg-gxHusV8wM1h-KbfLUeJjyVcMvQ,8081
265
265
  phoenix/server/api/types/NumericRange.py,sha256=afEjgF97Go_OvmjMggbPBt-zGM8IONewAyEiKEHRds0,192
266
266
  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
267
+ phoenix/server/api/types/Project.py,sha256=qETsEdX0NR-qmRBrjfaFAoYOdOVUzk1oZ1nWoc1hwK0,19950
268
+ phoenix/server/api/types/ProjectSession.py,sha256=fyfVtpUpFOTnBx8DFnH3dr7WXAssN0ooAgrQSSi7kEI,4677
269
269
  phoenix/server/api/types/Prompt.py,sha256=ccP4eq1e38xbF0afclGWLOuDpBVpNbJ3AOSRClF8yFQ,4955
270
270
  phoenix/server/api/types/PromptLabel.py,sha256=g3IDSPYRZwb0qpMAk93R6J96jgYULUYGOciTnpeh3sI,1321
271
271
  phoenix/server/api/types/PromptResponse.py,sha256=Q8HKtpp8GpUOcxPCzZpkkokidDd6u0aZOv_SuPZZd5Q,630
@@ -277,14 +277,14 @@ phoenix/server/api/types/Retrieval.py,sha256=OhMK2ncjoyp5h1yjKhjlKpoTbQrMHuxmgSF
277
277
  phoenix/server/api/types/ScalarDriftMetricEnum.py,sha256=IUAcRPpgL41WdoIgK6cNk2Te38SspXGyEs-S1fY23_A,232
278
278
  phoenix/server/api/types/Segments.py,sha256=vT2v0efoa5cuBKxLtxTnsUP5YJJCZfTloM71Spu0tMI,2915
279
279
  phoenix/server/api/types/SortDir.py,sha256=OUpXhlCzCxPoXSDkJJygEs9Rw9pMymfaZUG5zPTrw4Y,152
280
- phoenix/server/api/types/Span.py,sha256=0ofZR79IP2zGIW5Bt5kGxxaHqUl8HDWVwO3SwK8Ypos,23184
280
+ phoenix/server/api/types/Span.py,sha256=lXxvp_c9P6Ot3iKnr33Ch_glEn5yXh4qNG2ovB7bxFM,24112
281
281
  phoenix/server/api/types/SpanAnnotation.py,sha256=6b5G-b_OoRvDL2ayWk7MkbqarLK-F-pQMx21CpUuNGY,1168
282
282
  phoenix/server/api/types/SpanIOValue.py,sha256=c5TWdZZN3v0gHI5xWeY7gjD-sE9ugWlGGAio-gDS-Uo,1653
283
283
  phoenix/server/api/types/SystemApiKey.py,sha256=2ym8EgsTBIvxx1l9xZ-2YMovz58ZwYb_MaHBTJ9NH2E,166
284
284
  phoenix/server/api/types/TimeSeries.py,sha256=nuuZtfHmOhTjeB8_SvZ5PUQexAkTcPScwYeFC5RUlRU,5491
285
285
  phoenix/server/api/types/TokenUsage.py,sha256=g-PjAGVigpchQgkXAuC5sc53fn2YwAgfeXkGmFPi_TE,201
286
286
  phoenix/server/api/types/ToolDefinition.py,sha256=T6UH2vcbuPBDy7jKYOqMth2NdqxMPgDBf11Tpbt5Yb8,187
287
- phoenix/server/api/types/Trace.py,sha256=6CqXcrI8rpEetGWAN8-lv6XoieLKqwobsKFV1qY4fsY,5645
287
+ phoenix/server/api/types/Trace.py,sha256=kH0Tv3m8chVbxMiQ27_W5v8gz6RsvGvl2qS9eoELXlw,7992
288
288
  phoenix/server/api/types/TraceAnnotation.py,sha256=OW6A2zr1gomOuG0XQe55dk15XXX2DSM0DzatRbHWH5A,1256
289
289
  phoenix/server/api/types/UMAPPoints.py,sha256=49sWnxjcAJKRzqUY71Fa0tOPti5XjIIFT5cSg6oNu_U,1650
290
290
  phoenix/server/api/types/User.py,sha256=iTVUrI8U6-asOhBt1bOZNtoRAaRNC4WHgR1Uv2rHnWQ,1975
@@ -311,10 +311,10 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
311
311
  phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
312
312
  phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
313
313
  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
314
+ phoenix/server/static/.vite/manifest.json,sha256=gLp2U44u4hOPLF2QtY0f1NAv2iBDdiCQUMrTo4Y_k8k,2165
315
+ phoenix/server/static/assets/components-T5K9z49d.js,sha256=QrGTa7_27jTP0_2xAR7Mv9Ags8nvdEuWGH9WeUmG1iY,420526
316
+ phoenix/server/static/assets/index-DvHwFF8e.js,sha256=feyHQ14eei_xu4EeBpawOncl4aloxknZL3GVJMHdxkg,58955
317
+ phoenix/server/static/assets/pages-CY3ZXSHj.js,sha256=2DIfOTzkx_tAjtisqbemS-JYw0SnKJD4MqHZpRjFGhU,822632
318
318
  phoenix/server/static/assets/vendor-Cg6lcjUC.css,sha256=nZrkr0u6NNElFGvpWHk9GTHeGoibCXCli1bE7mXZGZg,1816
319
319
  phoenix/server/static/assets/vendor-Cqfydjep.js,sha256=3sepoB8zViIDMxKuc4lpMVfCmATxlvc9vCEPI2B2uVQ,2235092
320
320
  phoenix/server/static/assets/vendor-arizeai-WnerlUPN.js,sha256=MahCU9MTwcGSh9tsu-gsF-SWqCISSFIYq9ZnMoKLPkA,202331
@@ -361,9 +361,9 @@ phoenix/utilities/project.py,sha256=auVpARXkDb-JgeX5f2aStyFIkeKvGwN9l7qrFeJMVxI,
361
361
  phoenix/utilities/re.py,sha256=6YyUWIkv0zc2SigsxfOWIHzdpjKA_TZo2iqKq7zJKvw,2081
362
362
  phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
363
363
  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,,
364
+ arize_phoenix-8.3.0.dist-info/METADATA,sha256=Zs8uZJku1gMbtL3XbMU8ggOLLNVzvkGNzj2nrUvqIcU,23433
365
+ arize_phoenix-8.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
366
+ arize_phoenix-8.3.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
367
+ arize_phoenix-8.3.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
368
+ arize_phoenix-8.3.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
369
+ arize_phoenix-8.3.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(
@@ -41,8 +41,8 @@ from phoenix.server.api.dataloaders import (
41
41
  SpanByIdDataLoader,
42
42
  SpanDatasetExamplesDataLoader,
43
43
  SpanDescendantsDataLoader,
44
- SpanFieldsDataLoader,
45
44
  SpanProjectsDataLoader,
45
+ TableFieldsDataLoader,
46
46
  TokenCountDataLoader,
47
47
  TraceByTraceIdsDataLoader,
48
48
  TraceRootSpansDataLoader,
@@ -76,6 +76,7 @@ class DataLoaders:
76
76
  experiment_sequence_number: ExperimentSequenceNumberDataLoader
77
77
  latency_ms_quantile: LatencyMsQuantileDataLoader
78
78
  min_start_or_max_end_times: MinStartOrMaxEndTimeDataLoader
79
+ project_fields: TableFieldsDataLoader
79
80
  prompt_version_sequence_number: PromptVersionSequenceNumberDataLoader
80
81
  record_counts: RecordCountDataLoader
81
82
  session_first_inputs: SessionIODataLoader
@@ -88,10 +89,11 @@ class DataLoaders:
88
89
  span_by_id: SpanByIdDataLoader
89
90
  span_dataset_examples: SpanDatasetExamplesDataLoader
90
91
  span_descendants: SpanDescendantsDataLoader
91
- span_fields: SpanFieldsDataLoader
92
+ span_fields: TableFieldsDataLoader
92
93
  span_projects: SpanProjectsDataLoader
93
94
  token_counts: TokenCountDataLoader
94
95
  trace_by_trace_ids: TraceByTraceIdsDataLoader
96
+ trace_fields: TableFieldsDataLoader
95
97
  trace_root_spans: TraceRootSpansDataLoader
96
98
  project_by_name: ProjectByNameDataLoader
97
99
  users: UsersDataLoader
@@ -29,8 +29,8 @@ from .span_annotations import SpanAnnotationsDataLoader
29
29
  from .span_by_id import SpanByIdDataLoader
30
30
  from .span_dataset_examples import SpanDatasetExamplesDataLoader
31
31
  from .span_descendants import SpanDescendantsDataLoader
32
- from .span_fields import SpanFieldsDataLoader
33
32
  from .span_projects import SpanProjectsDataLoader
33
+ from .table_fields import TableFieldsDataLoader
34
34
  from .token_counts import TokenCountCache, TokenCountDataLoader
35
35
  from .trace_by_trace_ids import TraceByTraceIdsDataLoader
36
36
  from .trace_root_spans import TraceRootSpansDataLoader
@@ -60,11 +60,11 @@ __all__ = [
60
60
  "SessionNumTracesWithErrorDataLoader",
61
61
  "SessionTokenUsagesDataLoader",
62
62
  "SessionTraceLatencyMsQuantileDataLoader",
63
- "SpanFieldsDataLoader",
64
63
  "SpanByIdDataLoader",
65
64
  "SpanDatasetExamplesDataLoader",
66
65
  "SpanDescendantsDataLoader",
67
66
  "SpanProjectsDataLoader",
67
+ "TableFieldsDataLoader",
68
68
  "TokenCountDataLoader",
69
69
  "TraceByTraceIdsDataLoader",
70
70
  "TraceRootSpansDataLoader",
@@ -8,35 +8,36 @@ from typing_extensions import TypeAlias
8
8
  from phoenix.db import models
9
9
  from phoenix.server.types import DbSessionFactory
10
10
 
11
- SpanRowId: TypeAlias = int
11
+ RowId: TypeAlias = int
12
12
 
13
- Key: TypeAlias = tuple[SpanRowId, QueryableAttribute[Any]]
13
+ Key: TypeAlias = tuple[RowId, QueryableAttribute[Any]]
14
14
  Result: TypeAlias = Any
15
15
 
16
-
17
16
  _ResultColumnPosition: TypeAlias = int
18
17
  _AttrStrIdentifier: TypeAlias = str
19
18
 
20
19
 
21
- class SpanFieldsDataLoader(DataLoader[Key, Result]):
22
- def __init__(self, db: DbSessionFactory) -> None:
20
+ class TableFieldsDataLoader(DataLoader[Key, Result]):
21
+ def __init__(self, db: DbSessionFactory, table: type[models.Base]) -> None:
23
22
  super().__init__(load_fn=self._load_fn)
24
23
  self._db = db
24
+ self._table = table
25
25
 
26
26
  async def _load_fn(self, keys: Iterable[Key]) -> list[Union[Result, ValueError]]:
27
- result: dict[tuple[SpanRowId, _AttrStrIdentifier], Result] = {}
28
- stmt, attr_strs = _get_stmt(keys)
27
+ result: dict[tuple[RowId, _AttrStrIdentifier], Result] = {}
28
+ stmt, attr_strs = _get_stmt(keys, self._table)
29
29
  async with self._db() as session:
30
30
  data = await session.stream(stmt)
31
31
  async for row in data:
32
- span_rowid: SpanRowId = row[0] # models.Span's primary key
32
+ rowid: RowId = row[0] # models.Span's primary key
33
33
  for i, value in enumerate(row[1:]):
34
- result[span_rowid, attr_strs[i]] = value
35
- return [result.get((span_rowid, str(attr))) for span_rowid, attr in keys]
34
+ result[rowid, attr_strs[i]] = value
35
+ return [result.get((rowid, str(attr))) for rowid, attr in keys]
36
36
 
37
37
 
38
38
  def _get_stmt(
39
- keys: Iterable[Key],
39
+ keys: Iterable[tuple[RowId, QueryableAttribute[Any]]],
40
+ table: type[models.Base],
40
41
  ) -> tuple[
41
42
  Select[Any],
42
43
  dict[_ResultColumnPosition, _AttrStrIdentifier],
@@ -52,7 +53,8 @@ def _get_stmt(
52
53
 
53
54
  Args:
54
55
  keys (list[Key]): A list of tuples, where each tuple contains an integer ID, i.e. the
55
- primary key of models.Span, and a QueryableAttribute.
56
+ primary key of table, and a QueryableAttribute.
57
+ table (models.Base): The table to query.
56
58
 
57
59
  Returns:
58
60
  tuple: A tuple containing:
@@ -61,16 +63,16 @@ def _get_stmt(
61
63
  at the second column (because the first column is the span's primary key)--in the
62
64
  result to the attribute's string identifier.
63
65
  """
64
- span_rowids: set[SpanRowId] = set()
66
+ rowids: set[RowId] = set()
65
67
  attrs: dict[_AttrStrIdentifier, QueryableAttribute[Any]] = {}
66
68
  joins = set()
67
- for span_rowid, attr in keys:
68
- span_rowids.add(span_rowid)
69
+ for rowid, attr in keys:
70
+ rowids.add(rowid)
69
71
  attrs[str(attr)] = attr
70
- if (entity := attr.parent.entity) is not models.Span:
72
+ if (entity := attr.parent.entity) is not table:
71
73
  joins.add(entity)
72
- stmt = select(models.Span.id).where(models.Span.id.in_(span_rowids))
73
- for table in joins:
74
- stmt = stmt.join(table)
74
+ stmt = select(table.id).where(table.id.in_(rowids))
75
+ for other_table in joins:
76
+ stmt = stmt.join(other_table)
75
77
  identifiers, columns = zip(*attrs.items())
76
78
  return stmt.add_columns(*columns), dict(enumerate(identifiers))
@@ -806,6 +806,10 @@ class AnthropicStreamingClient(PlaygroundStreamingClient):
806
806
  raise NotImplementedError
807
807
  elif isinstance(event, anthropic_streaming._types.CitationEvent):
808
808
  raise NotImplementedError
809
+ elif isinstance(event, anthropic_streaming._types.ThinkingEvent):
810
+ raise NotImplementedError
811
+ elif isinstance(event, anthropic_streaming._types.SignatureEvent):
812
+ raise NotImplementedError
809
813
  else:
810
814
  assert_never(event)
811
815
 
@@ -348,6 +348,7 @@ class AnthropicToolDefinition(PromptModel):
348
348
  class PromptOpenAIInvocationParametersContent(PromptModel):
349
349
  temperature: float = UNDEFINED
350
350
  max_tokens: int = UNDEFINED
351
+ max_completion_tokens: int = UNDEFINED
351
352
  frequency_penalty: float = UNDEFINED
352
353
  presence_penalty: float = UNDEFINED
353
354
  top_p: float = UNDEFINED
@@ -66,7 +66,7 @@ from phoenix.server.api.types.PromptVersion import PromptVersion, to_gql_prompt_
66
66
  from phoenix.server.api.types.SortDir import SortDir
67
67
  from phoenix.server.api.types.Span import Span
68
68
  from phoenix.server.api.types.SystemApiKey import SystemApiKey
69
- from phoenix.server.api.types.Trace import to_gql_trace
69
+ from phoenix.server.api.types.Trace import Trace
70
70
  from phoenix.server.api.types.User import User, to_gql_user
71
71
  from phoenix.server.api.types.UserApiKey import UserApiKey, to_gql_api_key
72
72
  from phoenix.server.api.types.UserRole import UserRole
@@ -236,10 +236,8 @@ class Query:
236
236
  projects = await session.stream_scalars(stmt)
237
237
  data = [
238
238
  Project(
239
- id_attr=project.id,
240
- name=project.name,
241
- gradient_start_color=project.gradient_start_color,
242
- gradient_end_color=project.gradient_end_color,
239
+ project_rowid=project.id,
240
+ db_project=project,
243
241
  )
244
242
  async for project in projects
245
243
  ]
@@ -448,21 +446,14 @@ class Query:
448
446
  embedding_dimension = info.context.model.embedding_dimensions[node_id]
449
447
  return to_gql_embedding_dimension(node_id, embedding_dimension)
450
448
  elif type_name == "Project":
451
- project_stmt = select(
452
- models.Project.id,
453
- models.Project.name,
454
- models.Project.gradient_start_color,
455
- models.Project.gradient_end_color,
456
- ).where(models.Project.id == node_id)
449
+ project_stmt = select(models.Project).filter_by(id=node_id)
457
450
  async with info.context.db() as session:
458
- project = (await session.execute(project_stmt)).first()
451
+ project = await session.scalar(project_stmt)
459
452
  if project is None:
460
453
  raise NotFound(f"Unknown project: {id}")
461
454
  return Project(
462
- id_attr=project.id,
463
- name=project.name,
464
- gradient_start_color=project.gradient_start_color,
465
- gradient_end_color=project.gradient_end_color,
455
+ project_rowid=project.id,
456
+ db_project=project,
466
457
  )
467
458
  elif type_name == "Trace":
468
459
  trace_stmt = select(models.Trace).filter_by(id=node_id)
@@ -470,7 +461,7 @@ class Query:
470
461
  trace = await session.scalar(trace_stmt)
471
462
  if trace is None:
472
463
  raise NotFound(f"Unknown trace: {id}")
473
- return to_gql_trace(trace)
464
+ return Trace(trace_rowid=trace.id, db_trace=trace)
474
465
  elif type_name == Span.__name__:
475
466
  span_stmt = (
476
467
  select(models.Span)