arize-phoenix 5.5.2__tar.gz → 5.6.0__tar.gz

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 (326) hide show
  1. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/PKG-INFO +3 -6
  2. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/README.md +1 -1
  3. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/pyproject.toml +4 -7
  4. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/config.py +8 -8
  5. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/core/model.py +3 -3
  6. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/core/model_schema.py +41 -50
  7. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/core/model_schema_adapter.py +17 -16
  8. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/datetime_utils.py +2 -2
  9. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/bulk_inserter.py +10 -20
  10. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/engines.py +2 -1
  11. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/enums.py +2 -2
  12. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/helpers.py +8 -7
  13. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/insertion/dataset.py +9 -19
  14. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/insertion/document_annotation.py +14 -13
  15. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/insertion/helpers.py +6 -16
  16. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/insertion/span_annotation.py +14 -13
  17. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/insertion/trace_annotation.py +14 -13
  18. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/insertion/types.py +19 -30
  19. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +8 -8
  20. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/models.py +28 -28
  21. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/experiments/evaluators/base.py +2 -1
  22. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/experiments/evaluators/code_evaluators.py +4 -5
  23. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +157 -4
  24. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/experiments/evaluators/utils.py +3 -2
  25. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/experiments/functions.py +10 -21
  26. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/experiments/tracing.py +2 -1
  27. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/experiments/types.py +20 -29
  28. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/experiments/utils.py +2 -1
  29. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/inferences/errors.py +6 -5
  30. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/inferences/fixtures.py +6 -5
  31. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/inferences/inferences.py +37 -37
  32. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/inferences/schema.py +11 -10
  33. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/inferences/validation.py +13 -14
  34. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/logging/_formatter.py +3 -3
  35. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/metrics/__init__.py +5 -4
  36. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/metrics/binning.py +2 -1
  37. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/metrics/metrics.py +2 -1
  38. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/metrics/mixins.py +7 -6
  39. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/metrics/retrieval_metrics.py +2 -1
  40. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/metrics/timeseries.py +5 -4
  41. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/metrics/wrappers.py +2 -2
  42. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/pointcloud/clustering.py +3 -4
  43. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/pointcloud/pointcloud.py +7 -5
  44. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/pointcloud/umap_parameters.py +2 -1
  45. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +12 -19
  46. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +2 -2
  47. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +3 -2
  48. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +3 -8
  49. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +2 -5
  50. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +12 -18
  51. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +3 -7
  52. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +6 -13
  53. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +4 -8
  54. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +2 -5
  55. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +3 -7
  56. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +1 -5
  57. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +2 -5
  58. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +21 -30
  59. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +7 -13
  60. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/project_by_name.py +3 -3
  61. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/record_counts.py +11 -18
  62. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/span_annotations.py +3 -7
  63. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +3 -8
  64. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/span_descendants.py +3 -7
  65. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/span_projects.py +2 -2
  66. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/token_counts.py +12 -19
  67. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/trace_row_ids.py +3 -7
  68. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/user_roles.py +3 -3
  69. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/users.py +3 -3
  70. arize_phoenix-5.6.0/src/phoenix/server/api/helpers/__init__.py +12 -0
  71. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/helpers/dataset_helpers.py +10 -9
  72. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +2 -2
  73. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +2 -2
  74. arize_phoenix-5.6.0/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +24 -0
  75. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/ClusterInput.py +2 -2
  76. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +1 -3
  77. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +2 -2
  78. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +1 -3
  79. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/DimensionFilter.py +4 -4
  80. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/Granularity.py +1 -1
  81. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/InvocationParameters.py +2 -2
  82. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +2 -2
  83. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/mutations/dataset_mutations.py +4 -4
  84. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/mutations/experiment_mutations.py +1 -2
  85. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/mutations/export_events_mutations.py +7 -7
  86. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +4 -4
  87. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +4 -4
  88. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/mutations/user_mutations.py +4 -4
  89. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/openapi/schema.py +2 -2
  90. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/queries.py +20 -20
  91. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/routers/oauth2.py +4 -4
  92. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/routers/v1/datasets.py +22 -36
  93. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/routers/v1/evaluations.py +6 -5
  94. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +2 -2
  95. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +2 -2
  96. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/routers/v1/experiments.py +4 -4
  97. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/routers/v1/spans.py +13 -12
  98. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/routers/v1/traces.py +5 -5
  99. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/routers/v1/utils.py +5 -5
  100. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/subscriptions.py +284 -162
  101. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/AnnotationSummary.py +3 -3
  102. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/Cluster.py +8 -7
  103. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/Dataset.py +5 -4
  104. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/Dimension.py +3 -3
  105. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +8 -7
  106. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/EmbeddingDimension.py +6 -5
  107. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/EvaluationSummary.py +3 -3
  108. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/Event.py +7 -7
  109. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/Experiment.py +3 -3
  110. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/ExperimentComparison.py +2 -4
  111. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/Inferences.py +9 -8
  112. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/InferencesRole.py +2 -2
  113. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/Model.py +2 -2
  114. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/Project.py +11 -18
  115. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/Segments.py +3 -3
  116. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/Span.py +8 -7
  117. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/TimeSeries.py +8 -7
  118. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/Trace.py +2 -2
  119. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/UMAPPoints.py +6 -6
  120. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/User.py +3 -3
  121. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/node.py +1 -3
  122. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/pagination.py +4 -4
  123. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/utils.py +2 -4
  124. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/app.py +16 -25
  125. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/bearer_auth.py +4 -10
  126. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/dml_event.py +3 -3
  127. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/dml_event_handler.py +10 -24
  128. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/grpc_server.py +3 -2
  129. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/jwt_store.py +22 -21
  130. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/main.py +3 -3
  131. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/oauth2.py +3 -2
  132. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/rate_limiters.py +5 -8
  133. arize_phoenix-5.6.0/src/phoenix/server/static/.vite/manifest.json +78 -0
  134. arize_phoenix-5.6.0/src/phoenix/server/static/assets/components-C70HJiXz.js +1612 -0
  135. arize_phoenix-5.5.2/src/phoenix/server/static/assets/index-DCzakdJq.js → arize_phoenix-5.6.0/src/phoenix/server/static/assets/index-DLe1Oo3l.js +2 -2
  136. arize_phoenix-5.5.2/src/phoenix/server/static/assets/pages-CAL1FDMt.js → arize_phoenix-5.6.0/src/phoenix/server/static/assets/pages-C8-Sl7JI.js +269 -434
  137. arize_phoenix-5.5.2/src/phoenix/server/static/assets/vendor-6IcPAw_j.js → arize_phoenix-5.6.0/src/phoenix/server/static/assets/vendor-CtqfhlbC.js +6 -6
  138. arize_phoenix-5.5.2/src/phoenix/server/static/assets/vendor-arizeai-DRZuoyuF.js → arize_phoenix-5.6.0/src/phoenix/server/static/assets/vendor-arizeai-C_3SBz56.js +2 -2
  139. arize_phoenix-5.5.2/src/phoenix/server/static/assets/vendor-codemirror-DVE2_WBr.js → arize_phoenix-5.6.0/src/phoenix/server/static/assets/vendor-codemirror-wfdk9cjp.js +1 -1
  140. arize_phoenix-5.5.2/src/phoenix/server/static/assets/vendor-recharts-DwrexFA4.js → arize_phoenix-5.6.0/src/phoenix/server/static/assets/vendor-recharts-BiVnSv90.js +1 -1
  141. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/thread_server.py +1 -1
  142. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/types.py +17 -29
  143. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/services.py +4 -3
  144. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/session/client.py +12 -24
  145. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/session/data_extractor.py +3 -3
  146. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/session/evaluation.py +1 -2
  147. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/session/session.py +11 -20
  148. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/attributes.py +16 -28
  149. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/dsl/filter.py +17 -21
  150. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/dsl/helpers.py +3 -3
  151. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/dsl/query.py +13 -22
  152. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/fixtures.py +11 -17
  153. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/otel.py +5 -15
  154. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/projects.py +3 -2
  155. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/schemas.py +2 -2
  156. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/span_evaluations.py +9 -8
  157. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/span_json_decoder.py +3 -3
  158. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/span_json_encoder.py +2 -2
  159. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/trace_dataset.py +6 -5
  160. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/utils.py +6 -6
  161. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/utilities/deprecation.py +3 -2
  162. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/utilities/error_handling.py +3 -2
  163. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/utilities/json.py +2 -1
  164. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/utilities/logging.py +2 -2
  165. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/utilities/project.py +1 -1
  166. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/utilities/re.py +3 -4
  167. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/utilities/template_formatters.py +5 -4
  168. arize_phoenix-5.6.0/src/phoenix/version.py +1 -0
  169. arize_phoenix-5.5.2/src/phoenix/server/api/helpers/__init__.py +0 -11
  170. arize_phoenix-5.5.2/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -12
  171. arize_phoenix-5.5.2/src/phoenix/server/static/.vite/manifest.json +0 -78
  172. arize_phoenix-5.5.2/src/phoenix/server/static/assets/components-hX0LgYz3.js +0 -1428
  173. arize_phoenix-5.5.2/src/phoenix/version.py +0 -1
  174. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/.gitignore +0 -0
  175. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/IP_NOTICE +0 -0
  176. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/LICENSE +0 -0
  177. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/__init__.py +0 -0
  178. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/auth.py +0 -0
  179. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/core/__init__.py +0 -0
  180. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/core/embedding_dimension.py +0 -0
  181. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/README.md +0 -0
  182. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/__init__.py +0 -0
  183. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/alembic.ini +0 -0
  184. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/facilitator.py +0 -0
  185. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/insertion/__init__.py +0 -0
  186. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/insertion/constants.py +0 -0
  187. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/insertion/evaluation.py +0 -0
  188. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/insertion/span.py +0 -0
  189. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/migrate.py +0 -0
  190. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/migrations/__init__.py +0 -0
  191. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/migrations/env.py +0 -0
  192. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/migrations/script.py.mako +0 -0
  193. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  194. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
  195. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  196. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/exceptions.py +0 -0
  197. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/experiments/__init__.py +0 -0
  198. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  199. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/inferences/__init__.py +0 -0
  200. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/logging/__init__.py +0 -0
  201. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/logging/_config.py +0 -0
  202. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/logging/_filter.py +0 -0
  203. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/metrics/README.md +0 -0
  204. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/pointcloud/__init__.py +0 -0
  205. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/pointcloud/projectors.py +0 -0
  206. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/py.typed +0 -0
  207. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/__init__.py +0 -0
  208. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/README.md +0 -0
  209. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/__init__.py +0 -0
  210. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/auth.py +0 -0
  211. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/context.py +0 -0
  212. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
  213. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  214. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/exceptions.py +0 -0
  215. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  216. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  217. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  218. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
  219. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
  220. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  221. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  222. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  223. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  224. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  225. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  226. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
  227. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  228. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  229. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  230. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  231. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  232. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  233. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
  234. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
  235. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/interceptor.py +0 -0
  236. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
  237. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/mutations/api_key_mutations.py +0 -0
  238. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
  239. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
  240. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/openapi/main.py +0 -0
  241. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/routers/__init__.py +0 -0
  242. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/routers/auth.py +0 -0
  243. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/routers/embeddings.py +0 -0
  244. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/routers/utils.py +0 -0
  245. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/routers/v1/__init__.py +0 -0
  246. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/routers/v1/pydantic_compat.py +0 -0
  247. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/schema.py +0 -0
  248. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/Annotation.py +0 -0
  249. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
  250. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
  251. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/AuthMethod.py +0 -0
  252. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
  253. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  254. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  255. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  256. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  257. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  258. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  259. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  260. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  261. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
  262. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  263. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  264. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  265. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
  266. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  267. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  268. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  269. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  270. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  271. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  272. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/Functionality.py +0 -0
  273. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
  274. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/GenerativeProvider.py +0 -0
  275. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  276. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/MimeType.py +0 -0
  277. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
  278. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  279. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  280. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
  281. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  282. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/SortDir.py +0 -0
  283. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
  284. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
  285. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
  286. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
  287. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/UserRole.py +0 -0
  288. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  289. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  290. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/api/types/__init__.py +0 -0
  291. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/email/__init__.py +0 -0
  292. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/email/sender.py +0 -0
  293. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/email/templates/__init__.py +0 -0
  294. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/email/templates/password_reset.html +0 -0
  295. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/email/types.py +0 -0
  296. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/openapi/__init__.py +0 -0
  297. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/prometheus.py +0 -0
  298. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  299. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  300. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  301. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  302. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  303. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  304. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  305. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  306. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/static/assets/vendor-DxkFTwjz.css +0 -0
  307. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/static/assets/vendor-three-DwGkEfCM.js +0 -0
  308. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/static/favicon.ico +0 -0
  309. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/static/modernizr.js +0 -0
  310. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/telemetry.py +0 -0
  311. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/templates/__init__.py +0 -0
  312. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/server/templates/index.html +0 -0
  313. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/session/__init__.py +0 -0
  314. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/settings.py +0 -0
  315. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/__init__.py +0 -0
  316. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/dsl/README.md +0 -0
  317. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/dsl/__init__.py +0 -0
  318. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/errors.py +0 -0
  319. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
  320. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/exporter.py +0 -0
  321. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/v1/__init__.py +0 -0
  322. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  323. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  324. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/utilities/__init__.py +0 -0
  325. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/utilities/client.py +0 -0
  326. {arize_phoenix-5.5.2 → arize_phoenix-5.6.0}/src/phoenix/utilities/span_store.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arize-phoenix
3
- Version: 5.5.2
3
+ Version: 5.6.0
4
4
  Summary: AI Observability and Evaluation
5
5
  Project-URL: Documentation, https://docs.arize.com/phoenix/
6
6
  Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
@@ -23,13 +23,11 @@ Requires-Dist: arize-phoenix-evals>=0.13.1
23
23
  Requires-Dist: arize-phoenix-otel>=0.5.1
24
24
  Requires-Dist: authlib
25
25
  Requires-Dist: cachetools
26
- Requires-Dist: fast-hdbscan>=0.2.0
27
26
  Requires-Dist: fastapi
28
27
  Requires-Dist: grpc-interceptor
29
28
  Requires-Dist: grpcio
30
29
  Requires-Dist: httpx
31
30
  Requires-Dist: jinja2
32
- Requires-Dist: numba>=0.60.0
33
31
  Requires-Dist: numpy!=2.0.0
34
32
  Requires-Dist: openinference-instrumentation>=0.1.12
35
33
  Requires-Dist: openinference-semantic-conventions>=0.1.9
@@ -51,7 +49,6 @@ Requires-Dist: starlette
51
49
  Requires-Dist: strawberry-graphql==0.243.1
52
50
  Requires-Dist: tqdm
53
51
  Requires-Dist: typing-extensions>=4.6
54
- Requires-Dist: umap-learn
55
52
  Requires-Dist: uvicorn
56
53
  Requires-Dist: websockets
57
54
  Requires-Dist: wrapt
@@ -86,7 +83,7 @@ Requires-Dist: jupyter; extra == 'dev'
86
83
  Requires-Dist: langchain>=0.0.334; extra == 'dev'
87
84
  Requires-Dist: litellm>=1.0.3; extra == 'dev'
88
85
  Requires-Dist: llama-index>=0.10.3; extra == 'dev'
89
- Requires-Dist: mypy==1.11.2; extra == 'dev'
86
+ Requires-Dist: mypy==1.12.1; extra == 'dev'
90
87
  Requires-Dist: nbqa; extra == 'dev'
91
88
  Requires-Dist: pandas-stubs==2.2.2.240603; extra == 'dev'
92
89
  Requires-Dist: pandas>=1.0; extra == 'dev'
@@ -193,7 +190,7 @@ Phoenix container images are available via [Docker Hub](https://hub.docker.com/r
193
190
  | [Data Export](https://docs.arize.com/phoenix/tracing/how-to-tracing/extract-data-from-spans) | ✅ |
194
191
  | REST API | ✅ |
195
192
  | GraphQL API | ✅ |
196
- | Data Retention | Costomizable |
193
+ | Data Retention | Customizable |
197
194
  | Authentication | ✅ |
198
195
  | Social Login | ✅ |
199
196
  | RBAC | ✅ |
@@ -66,7 +66,7 @@ Phoenix container images are available via [Docker Hub](https://hub.docker.com/r
66
66
  | [Data Export](https://docs.arize.com/phoenix/tracing/how-to-tracing/extract-data-from-spans) | ✅ |
67
67
  | REST API | ✅ |
68
68
  | GraphQL API | ✅ |
69
- | Data Retention | Costomizable |
69
+ | Data Retention | Customizable |
70
70
  | Authentication | ✅ |
71
71
  | Social Login | ✅ |
72
72
  | RBAC | ✅ |
@@ -25,9 +25,6 @@ dependencies = [
25
25
  "numpy!=2.0.0", # https://github.com/lmcinnes/umap/issues/1138
26
26
  "pandas>=1.0",
27
27
  "jinja2",
28
- "umap-learn",
29
- "fast-hdbscan>=0.2.0",
30
- "numba>=0.60.0", # https://github.com/astral-sh/uv/issues/6281
31
28
  "starlette",
32
29
  "uvicorn",
33
30
  "psutil",
@@ -77,7 +74,7 @@ dev = [
77
74
  "jupyter",
78
75
  "nbqa",
79
76
  "ruff==0.6.9",
80
- "mypy==1.11.2",
77
+ "mypy==1.12.1",
81
78
  "pandas>=1.0",
82
79
  "tabulate", # used by DataFrame.to_markdown()
83
80
  "types-tabulate",
@@ -215,7 +212,7 @@ dependencies = [
215
212
  dependencies = [
216
213
  "grpcio",
217
214
  "litellm>=1.0.3",
218
- "mypy==1.11.2",
215
+ "mypy==1.12.1",
219
216
  "openai>=1.0.0",
220
217
  "opentelemetry-exporter-otlp",
221
218
  "opentelemetry-instrumentation-fastapi",
@@ -396,14 +393,14 @@ module = [
396
393
  "orjson", # suppress fastapi internal type errors
397
394
  "pypistats",
398
395
  "authlib.*",
396
+ "google.*",
397
+ "mistralai.*",
399
398
  ]
400
399
  ignore_missing_imports = true
401
400
 
402
401
  [tool.ruff]
403
402
  exclude = [
404
403
  "api_reference",
405
- "packages",
406
- "src/phoenix/evals/",
407
404
  "dist/",
408
405
  ".git",
409
406
  "__pycache__",
@@ -6,7 +6,7 @@ from dataclasses import dataclass
6
6
  from datetime import timedelta
7
7
  from enum import Enum
8
8
  from pathlib import Path
9
- from typing import Dict, List, Optional, Tuple, overload
9
+ from typing import Optional, overload
10
10
  from urllib.parse import urlparse
11
11
 
12
12
  from phoenix.utilities.logging import log_a_list
@@ -273,7 +273,7 @@ def get_env_phoenix_api_key() -> Optional[str]:
273
273
  return os.environ.get(ENV_PHOENIX_API_KEY)
274
274
 
275
275
 
276
- def get_env_auth_settings() -> Tuple[bool, Optional[str]]:
276
+ def get_env_auth_settings() -> tuple[bool, Optional[str]]:
277
277
  """
278
278
  Gets auth settings and performs validation.
279
279
  """
@@ -329,8 +329,8 @@ def get_env_refresh_token_expiry() -> timedelta:
329
329
  return timedelta(minutes=minutes)
330
330
 
331
331
 
332
- def get_env_csrf_trusted_origins() -> List[str]:
333
- origins: List[str] = []
332
+ def get_env_csrf_trusted_origins() -> list[str]:
333
+ origins: list[str] = []
334
334
  if not (csrf_trusted_origins := os.getenv(ENV_PHOENIX_CSRF_TRUSTED_ORIGINS)):
335
335
  return origins
336
336
  for origin in csrf_trusted_origins.split(","):
@@ -428,7 +428,7 @@ class OAuth2ClientConfig:
428
428
  )
429
429
 
430
430
 
431
- def get_env_oauth2_settings() -> List[OAuth2ClientConfig]:
431
+ def get_env_oauth2_settings() -> list[OAuth2ClientConfig]:
432
432
  """
433
433
  Get OAuth2 settings from environment variables.
434
434
  """
@@ -494,7 +494,7 @@ def ensure_working_dir() -> None:
494
494
  ensure_working_dir()
495
495
 
496
496
 
497
- def get_exported_files(directory: Path) -> List[Path]:
497
+ def get_exported_files(directory: Path) -> list[Path]:
498
498
  """
499
499
  Yields the list of paths of exported files.
500
500
 
@@ -505,7 +505,7 @@ def get_exported_files(directory: Path) -> List[Path]:
505
505
 
506
506
  Returns
507
507
  -------
508
- list: List[Path]
508
+ list: list[Path]
509
509
  List of paths of the exported files.
510
510
  """
511
511
  return list(directory.glob("*.parquet"))
@@ -584,7 +584,7 @@ def get_env_enable_prometheus() -> bool:
584
584
  )
585
585
 
586
586
 
587
- def get_env_client_headers() -> Optional[Dict[str, str]]:
587
+ def get_env_client_headers() -> Optional[dict[str, str]]:
588
588
  if headers_str := os.getenv(ENV_PHOENIX_CLIENT_HEADERS):
589
589
  return parse_env_headers(headers_str)
590
590
  return None
@@ -1,4 +1,4 @@
1
- from typing import List, Optional, Union
1
+ from typing import Optional, Union
2
2
 
3
3
  from phoenix.inferences.inferences import Inferences
4
4
  from phoenix.inferences.schema import EmbeddingColumnNames, EmbeddingFeatures
@@ -8,8 +8,8 @@ from .embedding_dimension import EmbeddingDimension
8
8
 
9
9
  def _get_embedding_dimensions(
10
10
  primary_inferences: Inferences, reference_inferences: Optional[Inferences]
11
- ) -> List[EmbeddingDimension]:
12
- embedding_dimensions: List[EmbeddingDimension] = []
11
+ ) -> list[EmbeddingDimension]:
12
+ embedding_dimensions: list[EmbeddingDimension] = []
13
13
  embedding_features: EmbeddingFeatures = {}
14
14
 
15
15
  primary_embedding_features: Optional[EmbeddingFeatures] = (
@@ -4,6 +4,7 @@ import re
4
4
  import threading
5
5
  from abc import ABC, abstractmethod
6
6
  from collections import defaultdict
7
+ from collections.abc import Callable, Hashable, Iterable, Iterator, Mapping, Sequence
7
8
  from contextlib import contextmanager
8
9
  from dataclasses import dataclass, field, fields, replace
9
10
  from datetime import datetime, timedelta, timezone
@@ -14,19 +15,9 @@ from random import random
14
15
  from typing import (
15
16
  Any,
16
17
  BinaryIO,
17
- Callable,
18
- Dict,
19
18
  Generic,
20
- Hashable,
21
- Iterable,
22
- Iterator,
23
- List,
24
- Mapping,
25
19
  NamedTuple,
26
20
  Optional,
27
- Sequence,
28
- Tuple,
29
- Type,
30
21
  TypeVar,
31
22
  Union,
32
23
  cast,
@@ -265,7 +256,7 @@ class _Cache(Generic[_Key, _Value]):
265
256
  2
266
257
  """
267
258
 
268
- _cache: Dict[_Key, _Value] = field(
259
+ _cache: dict[_Key, _Value] = field(
269
260
  init=False,
270
261
  default_factory=dict,
271
262
  )
@@ -275,7 +266,7 @@ class _Cache(Generic[_Key, _Value]):
275
266
  )
276
267
 
277
268
  @contextmanager
278
- def __call__(self) -> Iterator[Dict[_Key, _Value]]:
269
+ def __call__(self) -> Iterator[dict[_Key, _Value]]:
279
270
  with self._lock:
280
271
  yield self._cache
281
272
 
@@ -405,14 +396,14 @@ class Dimension(Column, ABC):
405
396
  @dataclass(frozen=True)
406
397
  class ScalarDimension(Dimension):
407
398
  @property
408
- def min_max(self) -> Tuple[Any, Any]:
399
+ def min_max(self) -> tuple[Any, Any]:
409
400
  if self._model is None:
410
401
  return np.nan, np.nan
411
402
  model = cast(Model, self._model)
412
403
  return model.dimension_min_max_from_all_df(self.name)
413
404
 
414
405
  @property
415
- def categories(self) -> Tuple[str, ...]:
406
+ def categories(self) -> tuple[str, ...]:
416
407
  if self._model is None or self.data_type is CONTINUOUS:
417
408
  return ()
418
409
  model = cast(Model, self._model)
@@ -502,7 +493,7 @@ class RetrievalEmbeddingDimension(EmbeddingDimension):
502
493
  Name: TypeAlias = str
503
494
  ColumnKey: TypeAlias = Union[Name, Column, SingularDimensionalRole]
504
495
  MultiDimensionKey: TypeAlias = Union[MultiDimensionalRole, Sequence[DimensionRole]]
505
- RowNumbering: TypeAlias = Union[int, List[int]]
496
+ RowNumbering: TypeAlias = Union[int, list[int]]
506
497
 
507
498
 
508
499
  def _is_column_key(key: Any) -> TypeGuard[ColumnKey]:
@@ -525,7 +516,7 @@ def _is_multi_dimension_key(
525
516
 
526
517
  def _is_dimension_type_filter(
527
518
  key: Any,
528
- ) -> TypeGuard[Tuple[MultiDimensionKey, Union[Type[ScalarDimension], Type[EmbeddingDimension]]]]:
519
+ ) -> TypeGuard[tuple[MultiDimensionKey, Union[type[ScalarDimension], type[EmbeddingDimension]]]]:
529
520
  return (
530
521
  isinstance(key, tuple)
531
522
  and len(key) == 2
@@ -534,7 +525,7 @@ def _is_dimension_type_filter(
534
525
  )
535
526
 
536
527
 
537
- def _is_named_df(obj: Any) -> TypeGuard[Tuple[Name, pd.DataFrame]]:
528
+ def _is_named_df(obj: Any) -> TypeGuard[tuple[Name, pd.DataFrame]]:
538
529
  return (
539
530
  isinstance(obj, tuple)
540
531
  and len(obj) == 2
@@ -664,7 +655,7 @@ class Events(ModelData):
664
655
  def __getitem__(self, key: ColumnKey) -> "pd.Series[Any]": ...
665
656
 
666
657
  @overload
667
- def __getitem__(self, key: List[RowId]) -> "Events": ...
658
+ def __getitem__(self, key: list[RowId]) -> "Events": ...
668
659
 
669
660
  def __getitem__(self, key: Any) -> Any:
670
661
  if isinstance(key, list):
@@ -722,7 +713,7 @@ class Inferences(Events):
722
713
  def __getitem__(self, key: ColumnKey) -> "pd.Series[Any]": ...
723
714
 
724
715
  @overload
725
- def __getitem__(self, key: List[RowId]) -> Events: ...
716
+ def __getitem__(self, key: list[RowId]) -> Events: ...
726
717
 
727
718
  def __getitem__(self, key: Any) -> Any:
728
719
  if isinstance(key, list):
@@ -746,19 +737,19 @@ class Model:
746
737
  a column of NaNs.
747
738
  """
748
739
 
749
- _inference_sets: Dict[InferencesRole, Inferences]
750
- _dimensions: Dict[Name, Dimension]
751
- _dim_names_by_role: Dict[DimensionRole, List[Name]]
752
- _original_columns_by_role: Dict[InferencesRole, "pd.Index[Any]"]
740
+ _inference_sets: dict[InferencesRole, Inferences]
741
+ _dimensions: dict[Name, Dimension]
742
+ _dim_names_by_role: dict[DimensionRole, list[Name]]
743
+ _original_columns_by_role: dict[InferencesRole, "pd.Index[Any]"]
753
744
  _default_timestamps_factory: _ConstantValueSeriesFactory
754
745
  _nan_series_factory: _ConstantValueSeriesFactory
755
- _dimension_categories_from_all_inferences: _Cache[Name, Tuple[str, ...]]
756
- _dimension_min_max_from_all_inferences: _Cache[Name, Tuple[float, float]]
746
+ _dimension_categories_from_all_inferences: _Cache[Name, tuple[str, ...]]
747
+ _dimension_min_max_from_all_inferences: _Cache[Name, tuple[float, float]]
757
748
 
758
749
  def __init__(
759
750
  self,
760
751
  dimensions: Iterable[Dimension],
761
- dataframes: Iterable[Union[pd.DataFrame, Tuple[Name, pd.DataFrame]]],
752
+ dataframes: Iterable[Union[pd.DataFrame, tuple[Name, pd.DataFrame]]],
762
753
  /,
763
754
  treat_omitted_columns_as_features: bool = True,
764
755
  timestamps_already_normalized: bool = False,
@@ -775,11 +766,11 @@ class Model:
775
766
  object.__setattr__(
776
767
  self,
777
768
  "_dimension_min_max_from_all_inferences",
778
- _Cache[Name, Tuple[float, float]](),
769
+ _Cache[Name, tuple[float, float]](),
779
770
  )
780
771
 
781
772
  df_names, dfs = cast(
782
- Tuple[Iterable[Name], Iterable[pd.DataFrame]],
773
+ tuple[Iterable[Name], Iterable[pd.DataFrame]],
783
774
  zip(*_coerce_tuple(dataframes)),
784
775
  )
785
776
  str_col_dfs = _coerce_str_column_names(dfs)
@@ -956,7 +947,7 @@ class Model:
956
947
  )
957
948
 
958
949
  @cached_property
959
- def scalar_dimensions(self) -> Tuple[ScalarDimension, ...]:
950
+ def scalar_dimensions(self) -> tuple[ScalarDimension, ...]:
960
951
  """Put these in a cached sequence because currently their positions
961
952
  in this list also determine their node IDs in graphql.
962
953
  """
@@ -969,7 +960,7 @@ class Model:
969
960
  )
970
961
 
971
962
  @cached_property
972
- def embedding_dimensions(self) -> Tuple[EmbeddingDimension, ...]:
963
+ def embedding_dimensions(self) -> tuple[EmbeddingDimension, ...]:
973
964
  """Put these in a cached sequence because currently their positions
974
965
  in this list also determine their node IDs in graphql.
975
966
  """
@@ -982,10 +973,10 @@ class Model:
982
973
  def dimension_categories_from_all_inferences(
983
974
  self,
984
975
  dimension_name: Name,
985
- ) -> Tuple[str, ...]:
976
+ ) -> tuple[str, ...]:
986
977
  dim = self[dimension_name]
987
978
  if dim.data_type is CONTINUOUS:
988
- return cast(Tuple[str, ...], ())
979
+ return cast(tuple[str, ...], ())
989
980
  with self._dimension_categories_from_all_inferences() as cache:
990
981
  try:
991
982
  return cache[dimension_name]
@@ -1003,7 +994,7 @@ class Model:
1003
994
  def dimension_min_max_from_all_df(
1004
995
  self,
1005
996
  dimension_name: Name,
1006
- ) -> Tuple[float, float]:
997
+ ) -> tuple[float, float]:
1007
998
  dim = self[dimension_name]
1008
999
  if dim.data_type is not CONTINUOUS:
1009
1000
  return (np.nan, np.nan)
@@ -1021,7 +1012,7 @@ class Model:
1021
1012
  return ans
1022
1013
 
1023
1014
  @overload
1024
- def __getitem__(self, key: Type[Inferences]) -> Iterator[Inferences]: ...
1015
+ def __getitem__(self, key: type[Inferences]) -> Iterator[Inferences]: ...
1025
1016
 
1026
1017
  @overload
1027
1018
  def __getitem__(self, key: InferencesRole) -> Inferences: ...
@@ -1033,20 +1024,20 @@ class Model:
1033
1024
  def __getitem__(self, key: MultiDimensionKey) -> Iterator[Dimension]: ...
1034
1025
 
1035
1026
  @overload
1036
- def __getitem__(self, key: Type[ScalarDimension]) -> Iterator[ScalarDimension]: ...
1027
+ def __getitem__(self, key: type[ScalarDimension]) -> Iterator[ScalarDimension]: ...
1037
1028
 
1038
1029
  @overload
1039
- def __getitem__(self, key: Type[EmbeddingDimension]) -> Iterator[EmbeddingDimension]: ...
1030
+ def __getitem__(self, key: type[EmbeddingDimension]) -> Iterator[EmbeddingDimension]: ...
1040
1031
 
1041
1032
  @overload
1042
- def __getitem__(self, key: Type[Dimension]) -> Iterator[Dimension]: ...
1033
+ def __getitem__(self, key: type[Dimension]) -> Iterator[Dimension]: ...
1043
1034
 
1044
1035
  @overload
1045
1036
  def __getitem__(
1046
1037
  self,
1047
- key: Tuple[
1038
+ key: tuple[
1048
1039
  MultiDimensionKey,
1049
- Union[Type[ScalarDimension], Type[EmbeddingDimension]],
1040
+ Union[type[ScalarDimension], type[EmbeddingDimension]],
1050
1041
  ],
1051
1042
  ) -> Iterator[Dimension]: ...
1052
1043
 
@@ -1094,9 +1085,9 @@ class Model:
1094
1085
 
1095
1086
  def _get_multi_dims_by_type(
1096
1087
  self,
1097
- key: Tuple[
1088
+ key: tuple[
1098
1089
  MultiDimensionKey,
1099
- Union[Type[ScalarDimension], Type[EmbeddingDimension]],
1090
+ Union[type[ScalarDimension], type[EmbeddingDimension]],
1100
1091
  ],
1101
1092
  ) -> Iterator[Dimension]:
1102
1093
  return filter(lambda dim: type(dim) is key[1], self[key[0]])
@@ -1105,7 +1096,7 @@ class Model:
1105
1096
  def _new_dimension(
1106
1097
  self,
1107
1098
  obj: DimensionRole,
1108
- cls: Type[Dimension] = ScalarDimension,
1099
+ cls: type[Dimension] = ScalarDimension,
1109
1100
  **kwargs: Any,
1110
1101
  ) -> Dimension: ...
1111
1102
 
@@ -1113,7 +1104,7 @@ class Model:
1113
1104
  def _new_dimension(
1114
1105
  self,
1115
1106
  obj: Name,
1116
- cls: Type[Dimension] = ScalarDimension,
1107
+ cls: type[Dimension] = ScalarDimension,
1117
1108
  **kwargs: Any,
1118
1109
  ) -> Dimension: ...
1119
1110
 
@@ -1125,7 +1116,7 @@ class Model:
1125
1116
  ) -> Dimension: ...
1126
1117
 
1127
1118
  def _new_dimension(
1128
- self, obj: Any, cls: Type[Dimension] = ScalarDimension, **kwargs: Any
1119
+ self, obj: Any, cls: type[Dimension] = ScalarDimension, **kwargs: Any
1129
1120
  ) -> Dimension:
1130
1121
  """Creates a new Dimension or copies an existing one, setting the
1131
1122
  model weak reference to the `self` Model instance, and sharing the
@@ -1175,13 +1166,13 @@ class Schema(SchemaSpec):
1175
1166
  prediction_score: Optional[str] = None
1176
1167
  actual_label: Optional[str] = None
1177
1168
  actual_score: Optional[str] = None
1178
- prompt: Optional[RetrievalEmbedding] = None
1169
+ prompt: Optional[Embedding] = None
1179
1170
  response: Optional[Union[str, Embedding]] = None
1180
1171
  features: Iterable[Union[str, CompositeDimensionSpec]] = field(default_factory=list)
1181
1172
  tags: Iterable[Union[str, CompositeDimensionSpec]] = field(default_factory=list)
1182
1173
 
1183
1174
  # internal attribute not exposed to users
1184
- _dimensions: List[Dimension] = field(
1175
+ _dimensions: list[Dimension] = field(
1185
1176
  init=False, repr=False, hash=False, compare=False, default_factory=list
1186
1177
  )
1187
1178
 
@@ -1248,7 +1239,7 @@ class Schema(SchemaSpec):
1248
1239
 
1249
1240
  def __call__(
1250
1241
  self,
1251
- *dataframes: Union[pd.DataFrame, Tuple[Name, pd.DataFrame]],
1242
+ *dataframes: Union[pd.DataFrame, tuple[Name, pd.DataFrame]],
1252
1243
  **kwargs: Any,
1253
1244
  ) -> Model:
1254
1245
  """Dimensions are the "baton" that Schema hands over to Model."""
@@ -1302,7 +1293,7 @@ def _get_omitted_column_names(
1302
1293
 
1303
1294
  def _group_names_by_dim_role(
1304
1295
  dimensions: Iterable[Dimension],
1305
- ) -> Iterator[Tuple[DimensionRole, List[str]]]:
1296
+ ) -> Iterator[tuple[DimensionRole, list[str]]]:
1306
1297
  return (
1307
1298
  (role, [dim.name for dim in dims])
1308
1299
  for role, dims in groupby(
@@ -1356,8 +1347,8 @@ def _coerce_str(obj: Optional[str]) -> str:
1356
1347
 
1357
1348
 
1358
1349
  def _coerce_tuple(
1359
- dataframes: Iterable[Union[pd.DataFrame, Tuple[Name, pd.DataFrame]]],
1360
- ) -> Iterator[Tuple[Name, pd.DataFrame]]:
1350
+ dataframes: Iterable[Union[pd.DataFrame, tuple[Name, pd.DataFrame]]],
1351
+ ) -> Iterator[tuple[Name, pd.DataFrame]]:
1361
1352
  for dataframe in dataframes:
1362
1353
  if isinstance(dataframe, pd.DataFrame):
1363
1354
  yield (_rand_str(), dataframe)
@@ -1,6 +1,7 @@
1
+ from collections.abc import Iterable, Sized
1
2
  from itertools import chain
2
3
  from operator import itemgetter
3
- from typing import Dict, Iterable, List, Optional, Sized, Tuple, Union
4
+ from typing import Optional, Union
4
5
 
5
6
  import pandas as pd
6
7
  from pandas.api.types import is_object_dtype
@@ -24,18 +25,18 @@ def create_model_from_inferences(*inference_sets: Optional[Inferences]) -> Model
24
25
  # have the same length between inferences.
25
26
  _ = _get_embedding_dimensions(inference_sets[0], inference_sets[1])
26
27
 
27
- named_dataframes: List[Tuple[InferencesName, pd.DataFrame]] = []
28
- prediction_ids: List[ColumnName] = []
29
- timestamps: List[ColumnName] = []
30
- prediction_labels: List[ColumnName] = []
31
- prediction_scores: List[ColumnName] = []
32
- actual_labels: List[ColumnName] = []
33
- actual_scores: List[ColumnName] = []
34
- features: List[ColumnName] = []
35
- tags: List[ColumnName] = []
36
- embeddings: Dict[DisplayName, EmbeddingColumnNames] = {}
37
- prompts: List[EmbeddingColumnNames] = []
38
- responses: List[Union[str, EmbeddingColumnNames]] = []
28
+ named_dataframes: list[tuple[InferencesName, pd.DataFrame]] = []
29
+ prediction_ids: list[ColumnName] = []
30
+ timestamps: list[ColumnName] = []
31
+ prediction_labels: list[ColumnName] = []
32
+ prediction_scores: list[ColumnName] = []
33
+ actual_labels: list[ColumnName] = []
34
+ actual_scores: list[ColumnName] = []
35
+ features: list[ColumnName] = []
36
+ tags: list[ColumnName] = []
37
+ embeddings: dict[DisplayName, EmbeddingColumnNames] = {}
38
+ prompts: list[EmbeddingColumnNames] = []
39
+ responses: list[Union[str, EmbeddingColumnNames]] = []
39
40
 
40
41
  for inferences in filter(_is_inferences, inference_sets):
41
42
  df = inferences.dataframe
@@ -184,14 +185,14 @@ def _translate_prompt_embedding(
184
185
  def _split_vectors_vs_scalars(
185
186
  names: Iterable[str],
186
187
  *dataframes: pd.DataFrame,
187
- ) -> Tuple[List[str], List[Embedding]]:
188
+ ) -> tuple[list[str], list[Embedding]]:
188
189
  """A best-effort attempt at separating vector columns from scalar columns
189
190
  by examining the first non-null item of the column from each dataframe. If
190
191
  any item is `Iterable` and `Sized`, but not `str`, then the column is
191
192
  returned as `Embedding`, else it's returned as scalar.
192
193
  """
193
- scalars: List[str] = []
194
- vectors: List[Embedding] = []
194
+ scalars: list[str] = []
195
+ vectors: list[Embedding] = []
195
196
  # convert to sets for a speedier lookup
196
197
  column_names = [set(df.columns) for df in dataframes]
197
198
  for name in names:
@@ -1,5 +1,5 @@
1
1
  from datetime import datetime, timedelta, timezone, tzinfo
2
- from typing import Any, Optional, Tuple, cast
2
+ from typing import Any, Optional, cast
3
3
 
4
4
  import pandas as pd
5
5
  import pytz
@@ -96,7 +96,7 @@ MINUTE_DATETIME_FORMAT = "%Y-%m-%dT%H:%M:00%z"
96
96
  def right_open_time_range(
97
97
  min_time: Optional[datetime],
98
98
  max_time: Optional[datetime],
99
- ) -> Tuple[Optional[datetime], Optional[datetime]]:
99
+ ) -> tuple[Optional[datetime], Optional[datetime]]:
100
100
  """
101
101
  First adds one minute to `max_time`, because time intervals are right
102
102
  open and one minute is the smallest interval allowed, then rounds down
@@ -1,22 +1,12 @@
1
1
  import asyncio
2
2
  import logging
3
3
  from asyncio import Queue, as_completed
4
+ from collections.abc import AsyncIterator, Awaitable, Callable, Iterable
4
5
  from dataclasses import dataclass, field
5
6
  from functools import singledispatchmethod
6
7
  from itertools import islice
7
8
  from time import perf_counter
8
- from typing import (
9
- Any,
10
- AsyncIterator,
11
- Awaitable,
12
- Callable,
13
- Iterable,
14
- List,
15
- Optional,
16
- Set,
17
- Tuple,
18
- cast,
19
- )
9
+ from typing import Any, Optional, cast
20
10
 
21
11
  from typing_extensions import TypeAlias
22
12
 
@@ -43,7 +33,7 @@ ProjectRowId: TypeAlias = int
43
33
 
44
34
  @dataclass(frozen=True)
45
35
  class TransactionResult:
46
- updated_project_rowids: Set[ProjectRowId] = field(default_factory=set)
36
+ updated_project_rowids: set[ProjectRowId] = field(default_factory=set)
47
37
 
48
38
 
49
39
  class BulkInserter:
@@ -52,7 +42,7 @@ class BulkInserter:
52
42
  db: DbSessionFactory,
53
43
  *,
54
44
  event_queue: CanPutItem[DmlEvent],
55
- initial_batch_of_spans: Optional[Iterable[Tuple[Span, str]]] = None,
45
+ initial_batch_of_spans: Optional[Iterable[tuple[Span, str]]] = None,
56
46
  initial_batch_of_evaluations: Optional[Iterable[pb.Evaluation]] = None,
57
47
  sleep: float = 0.1,
58
48
  max_ops_per_transaction: int = 1000,
@@ -76,10 +66,10 @@ class BulkInserter:
76
66
  self._max_ops_per_transaction = max_ops_per_transaction
77
67
  self._operations: Optional[Queue[DataManipulation]] = None
78
68
  self._max_queue_size = max_queue_size
79
- self._spans: List[Tuple[Span, str]] = (
69
+ self._spans: list[tuple[Span, str]] = (
80
70
  [] if initial_batch_of_spans is None else list(initial_batch_of_spans)
81
71
  )
82
- self._evaluations: List[pb.Evaluation] = (
72
+ self._evaluations: list[pb.Evaluation] = (
83
73
  [] if initial_batch_of_evaluations is None else list(initial_batch_of_evaluations)
84
74
  )
85
75
  self._task: Optional[asyncio.Task[None]] = None
@@ -91,7 +81,7 @@ class BulkInserter:
91
81
 
92
82
  async def __aenter__(
93
83
  self,
94
- ) -> Tuple[
84
+ ) -> tuple[
95
85
  Callable[[Any], Awaitable[None]],
96
86
  Callable[[Span, str], Awaitable[None]],
97
87
  Callable[[pb.Evaluation], Awaitable[None]],
@@ -183,7 +173,7 @@ class BulkInserter:
183
173
  self._event_queue.put(event)
184
174
  await asyncio.sleep(self._sleep)
185
175
 
186
- async def _insert_spans(self, spans: List[Tuple[Span, str]]) -> None:
176
+ async def _insert_spans(self, spans: list[tuple[Span, str]]) -> None:
187
177
  project_ids = set()
188
178
  for i in range(0, len(spans), self._max_ops_per_transaction):
189
179
  try:
@@ -220,7 +210,7 @@ class BulkInserter:
220
210
  logger.exception("Failed to insert spans")
221
211
  self._event_queue.put(SpanInsertEvent(tuple(project_ids)))
222
212
 
223
- async def _insert_evaluations(self, evaluations: List[pb.Evaluation]) -> None:
213
+ async def _insert_evaluations(self, evaluations: list[pb.Evaluation]) -> None:
224
214
  for i in range(0, len(evaluations), self._max_ops_per_transaction):
225
215
  try:
226
216
  start = perf_counter()
@@ -273,7 +263,7 @@ class _QueueInserters:
273
263
  if self.empty:
274
264
  return
275
265
  for coro in as_completed([q.insert() for q in self._queues if not q.empty]):
276
- if events := cast(Optional[List[DmlEvent]], await coro):
266
+ if events := cast(Optional[list[DmlEvent]], await coro):
277
267
  for event in events:
278
268
  yield event
279
269
 
@@ -1,9 +1,10 @@
1
1
  import asyncio
2
2
  import json
3
+ from collections.abc import Callable
3
4
  from datetime import datetime
4
5
  from enum import Enum
5
6
  from sqlite3 import Connection
6
- from typing import Any, Callable
7
+ from typing import Any
7
8
 
8
9
  import aiosqlite
9
10
  import numpy as np
@@ -1,5 +1,5 @@
1
+ from collections.abc import Mapping
1
2
  from enum import Enum
2
- from typing import Mapping, Type
3
3
 
4
4
  from sqlalchemy.orm import InstrumentedAttribute
5
5
 
@@ -15,6 +15,6 @@ class UserRole(Enum):
15
15
  MEMBER = "MEMBER"
16
16
 
17
17
 
18
- COLUMN_ENUMS: Mapping[InstrumentedAttribute[str], Type[Enum]] = {
18
+ COLUMN_ENUMS: Mapping[InstrumentedAttribute[str], type[Enum]] = {
19
19
  models.UserRole.name: UserRole,
20
20
  }