arize-phoenix 4.31.0__tar.gz → 4.33.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 (314) hide show
  1. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/.gitignore +1 -0
  2. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/PKG-INFO +22 -21
  3. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/README.md +15 -18
  4. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/pyproject.toml +9 -4
  5. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/config.py +21 -1
  6. arize_phoenix-4.33.0/src/phoenix/db/README.md +54 -0
  7. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/engines.py +13 -1
  8. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrate.py +1 -0
  9. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/models.py +3 -2
  10. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/api_key_mutations.py +2 -1
  11. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/app.py +65 -58
  12. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/grpc_server.py +2 -2
  13. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/main.py +27 -14
  14. arize_phoenix-4.33.0/src/phoenix/server/static/.vite/manifest.json +78 -0
  15. arize_phoenix-4.31.0/src/phoenix/server/static/assets/components-CEsu6itL.js → arize_phoenix-4.33.0/src/phoenix/server/static/assets/components-CPHugqwr.js +91 -91
  16. arize_phoenix-4.33.0/src/phoenix/server/static/assets/index-U9TnafOn.js +100 -0
  17. arize_phoenix-4.31.0/src/phoenix/server/static/assets/pages-eeRVG3GZ.js → arize_phoenix-4.33.0/src/phoenix/server/static/assets/pages-Ds3nQwKE.js +293 -230
  18. arize_phoenix-4.31.0/src/phoenix/server/static/assets/vendor-DsnEJuEV.js → arize_phoenix-4.33.0/src/phoenix/server/static/assets/vendor-Dpio9q2e.js +1 -1
  19. arize_phoenix-4.31.0/src/phoenix/server/static/assets/vendor-arizeai-DtynTLNi.js → arize_phoenix-4.33.0/src/phoenix/server/static/assets/vendor-arizeai-DDzwX9A6.js +24 -24
  20. arize_phoenix-4.31.0/src/phoenix/server/static/assets/vendor-codemirror-C5to5cK4.js → arize_phoenix-4.33.0/src/phoenix/server/static/assets/vendor-codemirror-xRvQKK1G.js +1 -1
  21. arize_phoenix-4.31.0/src/phoenix/server/static/assets/vendor-recharts-reihe2SJ.js → arize_phoenix-4.33.0/src/phoenix/server/static/assets/vendor-recharts-DoxlB_Wo.js +1 -1
  22. arize_phoenix-4.33.0/src/phoenix/version.py +1 -0
  23. arize_phoenix-4.31.0/src/phoenix/db/README.md +0 -28
  24. arize_phoenix-4.31.0/src/phoenix/server/static/.vite/manifest.json +0 -78
  25. arize_phoenix-4.31.0/src/phoenix/server/static/assets/index-Cuxn1Qdi.js +0 -100
  26. arize_phoenix-4.31.0/src/phoenix/version.py +0 -1
  27. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/IP_NOTICE +0 -0
  28. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/LICENSE +0 -0
  29. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/chat-service/chat/__init__.py +0 -0
  30. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/chat-service/chat/app.py +0 -0
  31. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/chat-service/chat/types.py +0 -0
  32. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/frontend/Dockerfile +0 -0
  33. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/frontend/Makefile +0 -0
  34. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/frontend/__init__.py +0 -0
  35. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/frontend/pyproject.toml +0 -0
  36. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/frontend/requirements.txt +0 -0
  37. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/frontend/schema.json +0 -0
  38. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/__init__.py +0 -0
  39. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/auth.py +0 -0
  40. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/core/__init__.py +0 -0
  41. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/core/embedding_dimension.py +0 -0
  42. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/core/model.py +0 -0
  43. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/core/model_schema.py +0 -0
  44. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/core/model_schema_adapter.py +0 -0
  45. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/datetime_utils.py +0 -0
  46. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/__init__.py +0 -0
  47. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/alembic.ini +0 -0
  48. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/bulk_inserter.py +0 -0
  49. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/helpers.py +0 -0
  50. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/__init__.py +0 -0
  51. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/constants.py +0 -0
  52. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/dataset.py +0 -0
  53. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
  54. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/evaluation.py +0 -0
  55. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/helpers.py +0 -0
  56. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/span.py +0 -0
  57. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
  58. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
  59. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/types.py +0 -0
  60. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/__init__.py +0 -0
  61. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/env.py +0 -0
  62. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/future_versions/README.md +0 -0
  63. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/future_versions/cd164e83824f_users_and_tokens.py +0 -0
  64. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/script.py.mako +0 -0
  65. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/versions/.gitignore +0 -0
  66. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  67. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
  68. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  69. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/exceptions.py +0 -0
  70. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/__init__.py +0 -0
  71. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  72. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/evaluators/base.py +0 -0
  73. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
  74. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
  75. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
  76. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/functions.py +0 -0
  77. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/tracing.py +0 -0
  78. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/types.py +0 -0
  79. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/utils.py +0 -0
  80. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/inferences/__init__.py +0 -0
  81. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/inferences/errors.py +0 -0
  82. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/inferences/fixtures.py +0 -0
  83. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/inferences/inferences.py +0 -0
  84. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/inferences/schema.py +0 -0
  85. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/inferences/validation.py +0 -0
  86. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/README.md +0 -0
  87. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/__init__.py +0 -0
  88. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/binning.py +0 -0
  89. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/metrics.py +0 -0
  90. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/mixins.py +0 -0
  91. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  92. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/timeseries.py +0 -0
  93. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/wrappers.py +0 -0
  94. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/pointcloud/__init__.py +0 -0
  95. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/pointcloud/clustering.py +0 -0
  96. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
  97. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/pointcloud/projectors.py +0 -0
  98. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  99. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/py.typed +0 -0
  100. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/__init__.py +0 -0
  101. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/__init__.py +0 -0
  102. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/context.py +0 -0
  103. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
  104. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
  105. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
  106. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  107. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
  108. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
  109. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
  110. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
  111. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
  112. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
  113. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
  114. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
  115. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
  116. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
  117. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
  118. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
  119. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
  120. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
  121. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
  122. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
  123. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
  124. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
  125. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
  126. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
  127. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/trace_row_ids.py +0 -0
  128. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/exceptions.py +0 -0
  129. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
  130. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
  131. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
  132. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
  133. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  134. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  135. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  136. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  137. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
  138. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
  139. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  140. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  141. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  142. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  143. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
  144. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
  145. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  146. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
  147. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  148. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  149. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  150. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
  151. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
  152. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  153. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  154. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  155. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  156. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  157. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  158. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
  159. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
  160. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/interceptor.py +0 -0
  161. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
  162. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/auth.py +0 -0
  163. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/auth_mutations.py +0 -0
  164. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
  165. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
  166. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
  167. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
  168. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
  169. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
  170. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
  171. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
  172. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/openapi/main.py +0 -0
  173. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/openapi/schema.py +0 -0
  174. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/queries.py +0 -0
  175. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/__init__.py +0 -0
  176. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/utils.py +0 -0
  177. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/__init__.py +0 -0
  178. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/datasets.py +0 -0
  179. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/evaluations.py +0 -0
  180. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
  181. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
  182. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/experiments.py +0 -0
  183. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/pydantic_compat.py +0 -0
  184. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/spans.py +0 -0
  185. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/traces.py +0 -0
  186. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
  187. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/schema.py +0 -0
  188. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Annotation.py +0 -0
  189. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
  190. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
  191. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
  192. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Cluster.py +0 -0
  193. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  194. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  195. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Dataset.py +0 -0
  196. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  197. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  198. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  199. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  200. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Dimension.py +0 -0
  201. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  202. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  203. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
  204. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  205. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  206. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  207. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  208. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  209. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
  210. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  211. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Event.py +0 -0
  212. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  213. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  214. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Experiment.py +0 -0
  215. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  216. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
  217. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  218. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  219. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  220. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Functionality.py +0 -0
  221. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Inferences.py +0 -0
  222. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
  223. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  224. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/MimeType.py +0 -0
  225. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Model.py +0 -0
  226. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
  227. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  228. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Project.py +0 -0
  229. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  230. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
  231. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  232. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Segments.py +0 -0
  233. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/SortDir.py +0 -0
  234. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Span.py +0 -0
  235. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
  236. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
  237. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  238. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Trace.py +0 -0
  239. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
  240. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  241. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/User.py +0 -0
  242. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
  243. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/UserRole.py +0 -0
  244. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  245. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  246. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/__init__.py +0 -0
  247. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/node.py +0 -0
  248. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/pagination.py +0 -0
  249. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/utils.py +0 -0
  250. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/dml_event.py +0 -0
  251. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/dml_event_handler.py +0 -0
  252. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/openapi/__init__.py +0 -0
  253. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/prometheus.py +0 -0
  254. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  255. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  256. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  257. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  258. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  259. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  260. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  261. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  262. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/assets/vendor-DxkFTwjz.css +0 -0
  263. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/assets/vendor-three-DwGkEfCM.js +0 -0
  264. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/favicon.ico +0 -0
  265. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/modernizr.js +0 -0
  266. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/telemetry.py +0 -0
  267. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/templates/__init__.py +0 -0
  268. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/templates/index.html +0 -0
  269. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/thread_server.py +0 -0
  270. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/types.py +0 -0
  271. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/services.py +0 -0
  272. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/session/__init__.py +0 -0
  273. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/session/client.py +0 -0
  274. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/session/data_extractor.py +0 -0
  275. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/session/evaluation.py +0 -0
  276. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/session/session.py +0 -0
  277. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/settings.py +0 -0
  278. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/__init__.py +0 -0
  279. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/attributes.py +0 -0
  280. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/dsl/README.md +0 -0
  281. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/dsl/__init__.py +0 -0
  282. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/dsl/filter.py +0 -0
  283. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/dsl/helpers.py +0 -0
  284. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/dsl/query.py +0 -0
  285. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/errors.py +0 -0
  286. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
  287. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/exporter.py +0 -0
  288. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/fixtures.py +0 -0
  289. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/langchain/__init__.py +0 -0
  290. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/langchain/instrumentor.py +0 -0
  291. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/llama_index/__init__.py +0 -0
  292. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/llama_index/callback.py +0 -0
  293. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/openai/__init__.py +0 -0
  294. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/openai/instrumentor.py +0 -0
  295. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/otel.py +0 -0
  296. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/projects.py +0 -0
  297. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/schemas.py +0 -0
  298. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/span_evaluations.py +0 -0
  299. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/span_json_decoder.py +0 -0
  300. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/span_json_encoder.py +0 -0
  301. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/trace_dataset.py +0 -0
  302. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/utils.py +0 -0
  303. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/v1/__init__.py +0 -0
  304. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  305. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  306. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/__init__.py +0 -0
  307. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/client.py +0 -0
  308. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/deprecation.py +0 -0
  309. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/error_handling.py +0 -0
  310. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/json.py +0 -0
  311. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/logging.py +0 -0
  312. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/project.py +0 -0
  313. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/re.py +0 -0
  314. {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/span_store.py +0 -0
@@ -28,3 +28,4 @@ pyrightconfig.json
28
28
 
29
29
  # Demo data
30
30
  tutorials/internal/demo_llama_index/*.json
31
+ .env
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arize-phoenix
3
- Version: 4.31.0
3
+ Version: 4.33.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
@@ -77,12 +77,13 @@ Requires-Dist: asyncpg; extra == 'dev'
77
77
  Requires-Dist: faker>=26.0.0; extra == 'dev'
78
78
  Requires-Dist: gcsfs; extra == 'dev'
79
79
  Requires-Dist: google-cloud-aiplatform>=1.3; extra == 'dev'
80
+ Requires-Dist: grpc-interceptor[testing]; extra == 'dev'
80
81
  Requires-Dist: hatch; extra == 'dev'
81
82
  Requires-Dist: jupyter; extra == 'dev'
82
83
  Requires-Dist: langchain>=0.0.334; extra == 'dev'
83
84
  Requires-Dist: litellm>=1.0.3; extra == 'dev'
84
85
  Requires-Dist: llama-index>=0.10.3; extra == 'dev'
85
- Requires-Dist: mypy==1.11.1; extra == 'dev'
86
+ Requires-Dist: mypy==1.11.2; extra == 'dev'
86
87
  Requires-Dist: nbqa; extra == 'dev'
87
88
  Requires-Dist: pandas-stubs==2.0.3.230814; (python_version < '3.9') and extra == 'dev'
88
89
  Requires-Dist: pandas-stubs==2.2.2.240603; (python_version >= '3.9') and extra == 'dev'
@@ -96,10 +97,13 @@ Requires-Dist: pytest-cov; extra == 'dev'
96
97
  Requires-Dist: pytest-postgresql; extra == 'dev'
97
98
  Requires-Dist: pytest-xdist; extra == 'dev'
98
99
  Requires-Dist: pytest==8.3.2; extra == 'dev'
99
- Requires-Dist: ruff==0.6.1; extra == 'dev'
100
+ Requires-Dist: ruff==0.6.3; extra == 'dev'
100
101
  Requires-Dist: strawberry-graphql[debug-server,opentelemetry]==0.236.0; extra == 'dev'
101
102
  Requires-Dist: tabulate; extra == 'dev'
103
+ Requires-Dist: tox-uv==1.11.2; extra == 'dev'
104
+ Requires-Dist: tox==4.18.0; extra == 'dev'
102
105
  Requires-Dist: types-tabulate; extra == 'dev'
106
+ Requires-Dist: uv==0.4.2; extra == 'dev'
103
107
  Requires-Dist: uvloop; (platform_system != 'Windows') and extra == 'dev'
104
108
  Provides-Extra: evals
105
109
  Provides-Extra: experimental
@@ -146,21 +150,23 @@ Description-Content-Type: text/markdown
146
150
 
147
151
  Phoenix is an open-source AI observability platform designed for experimentation, evaluation, and troubleshooting. It provides:
148
152
 
149
- - **_Tracing_** - Trace your LLM application's runtime using OpenTelemetry-based instrumentation.
150
- - **_Evaluation_** - Leverage LLMs to benchmark your application's performance using response and retrieval evals.
151
- - **_Datasets_** - Create versioned datasets of examples for experimentation, evaluation, and fine-tuning.
152
- - **_Experiments_** - Track and evaluate changes to prompts, LLMs, and retrieval.
153
+ - **_Tracing_** - Trace your LLM application's runtime using OpenTelemetry-based instrumentation.
154
+ - **_Evaluation_** - Leverage LLMs to benchmark your application's performance using response and retrieval evals.
155
+ - **_Datasets_** - Create versioned datasets of examples for experimentation, evaluation, and fine-tuning.
156
+ - **_Experiments_** - Track and evaluate changes to prompts, LLMs, and retrieval.
153
157
 
154
158
  Phoenix is vendor and language agnostic with out-of-the-box support for popular frameworks (🦙LlamaIndex, 🦜⛓LangChain, Haystack, 🧩DSPy) and LLM providers (OpenAI, Bedrock, and more). For details on auto-instrumentation, check out the [OpenInference](https://github.com/Arize-ai/openinference) project.
155
159
 
156
160
  Phoenix runs practically anywhere, including your Jupyter notebook, local machine, containerized deployment, or in the cloud.
157
161
 
162
+ <img alt="phoenix_overview.gif" width="100%" src="https://github.com/Arize-ai/phoenix-assets/blob/main/gifs/phoenix_overview.gif?raw=true">
163
+
158
164
  ## Installation
159
165
 
160
- Install Phoenix via `pip` or `conda` along with extra dependencies for running evals:
166
+ Install Phoenix via `pip` or `conda`
161
167
 
162
168
  ```shell
163
- pip install 'arize-phoenix[evals]'
169
+ pip install arize-phoenix
164
170
  ```
165
171
 
166
172
  Phoenix container images are available via [Docker Hub](https://hub.docker.com/r/arizephoenix/phoenix) and can be deployed using Docker or Kubernetes.
@@ -169,18 +175,13 @@ Phoenix container images are available via [Docker Hub](https://hub.docker.com/r
169
175
 
170
176
  Join our community to connect with thousands of AI builders.
171
177
 
172
- - 🌍 Join our [Slack community](https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q).
173
- - 💡 Ask questions and provide feedback in the _#phoenix-support_ channel.
174
- - 🌟 Leave a star on our [GitHub](https://github.com/Arize-ai/phoenix).
175
- - 🐞 Report bugs with [GitHub Issues](https://github.com/Arize-ai/phoenix/issues).
176
- - 𝕏 Follow us on [𝕏](https://twitter.com/ArizePhoenix).
177
- - 💌️ Sign up for our [mailing list](https://phoenix.arize.com/#updates).
178
- - 🗺️ Check out our [roadmap](https://github.com/orgs/Arize-ai/projects/45) to see where we're heading next.
179
-
180
- ## Thanks
181
-
182
- - [UMAP](https://github.com/lmcinnes/umap) For unlocking the ability to visualize and reason about embeddings
183
- - [HDBSCAN](https://github.com/scikit-learn-contrib/hdbscan) For providing a clustering algorithm to aid in the discovery of drift and performance degradation
178
+ - 🌍 Join our [Slack community](https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q).
179
+ - 💡 Ask questions and provide feedback in the _#phoenix-support_ channel.
180
+ - 🌟 Leave a star on our [GitHub](https://github.com/Arize-ai/phoenix).
181
+ - 🐞 Report bugs with [GitHub Issues](https://github.com/Arize-ai/phoenix/issues).
182
+ - 𝕏 Follow us on [𝕏](https://twitter.com/ArizePhoenix).
183
+ - 💌️ Sign up for our [mailing list](https://phoenix.arize.com/#updates).
184
+ - 🗺️ Check out our [roadmap](https://github.com/orgs/Arize-ai/projects/45) to see where we're heading next.
184
185
 
185
186
  ## Breaking Changes
186
187
 
@@ -29,21 +29,23 @@
29
29
 
30
30
  Phoenix is an open-source AI observability platform designed for experimentation, evaluation, and troubleshooting. It provides:
31
31
 
32
- - **_Tracing_** - Trace your LLM application's runtime using OpenTelemetry-based instrumentation.
33
- - **_Evaluation_** - Leverage LLMs to benchmark your application's performance using response and retrieval evals.
34
- - **_Datasets_** - Create versioned datasets of examples for experimentation, evaluation, and fine-tuning.
35
- - **_Experiments_** - Track and evaluate changes to prompts, LLMs, and retrieval.
32
+ - **_Tracing_** - Trace your LLM application's runtime using OpenTelemetry-based instrumentation.
33
+ - **_Evaluation_** - Leverage LLMs to benchmark your application's performance using response and retrieval evals.
34
+ - **_Datasets_** - Create versioned datasets of examples for experimentation, evaluation, and fine-tuning.
35
+ - **_Experiments_** - Track and evaluate changes to prompts, LLMs, and retrieval.
36
36
 
37
37
  Phoenix is vendor and language agnostic with out-of-the-box support for popular frameworks (🦙LlamaIndex, 🦜⛓LangChain, Haystack, 🧩DSPy) and LLM providers (OpenAI, Bedrock, and more). For details on auto-instrumentation, check out the [OpenInference](https://github.com/Arize-ai/openinference) project.
38
38
 
39
39
  Phoenix runs practically anywhere, including your Jupyter notebook, local machine, containerized deployment, or in the cloud.
40
40
 
41
+ <img alt="phoenix_overview.gif" width="100%" src="https://github.com/Arize-ai/phoenix-assets/blob/main/gifs/phoenix_overview.gif?raw=true">
42
+
41
43
  ## Installation
42
44
 
43
- Install Phoenix via `pip` or `conda` along with extra dependencies for running evals:
45
+ Install Phoenix via `pip` or `conda`
44
46
 
45
47
  ```shell
46
- pip install 'arize-phoenix[evals]'
48
+ pip install arize-phoenix
47
49
  ```
48
50
 
49
51
  Phoenix container images are available via [Docker Hub](https://hub.docker.com/r/arizephoenix/phoenix) and can be deployed using Docker or Kubernetes.
@@ -52,18 +54,13 @@ Phoenix container images are available via [Docker Hub](https://hub.docker.com/r
52
54
 
53
55
  Join our community to connect with thousands of AI builders.
54
56
 
55
- - 🌍 Join our [Slack community](https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q).
56
- - 💡 Ask questions and provide feedback in the _#phoenix-support_ channel.
57
- - 🌟 Leave a star on our [GitHub](https://github.com/Arize-ai/phoenix).
58
- - 🐞 Report bugs with [GitHub Issues](https://github.com/Arize-ai/phoenix/issues).
59
- - 𝕏 Follow us on [𝕏](https://twitter.com/ArizePhoenix).
60
- - 💌️ Sign up for our [mailing list](https://phoenix.arize.com/#updates).
61
- - 🗺️ Check out our [roadmap](https://github.com/orgs/Arize-ai/projects/45) to see where we're heading next.
62
-
63
- ## Thanks
64
-
65
- - [UMAP](https://github.com/lmcinnes/umap) For unlocking the ability to visualize and reason about embeddings
66
- - [HDBSCAN](https://github.com/scikit-learn-contrib/hdbscan) For providing a clustering algorithm to aid in the discovery of drift and performance degradation
57
+ - 🌍 Join our [Slack community](https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q).
58
+ - 💡 Ask questions and provide feedback in the _#phoenix-support_ channel.
59
+ - 🌟 Leave a star on our [GitHub](https://github.com/Arize-ai/phoenix).
60
+ - 🐞 Report bugs with [GitHub Issues](https://github.com/Arize-ai/phoenix/issues).
61
+ - 𝕏 Follow us on [𝕏](https://twitter.com/ArizePhoenix).
62
+ - 💌️ Sign up for our [mailing list](https://phoenix.arize.com/#updates).
63
+ - 🗺️ Check out our [roadmap](https://github.com/orgs/Arize-ai/projects/45) to see where we're heading next.
67
64
 
68
65
  ## Breaking Changes
69
66
 
@@ -70,10 +70,13 @@ dynamic = ["version"]
70
70
  dev = [
71
71
  "gcsfs",
72
72
  "hatch",
73
+ "tox==4.18.0",
74
+ "tox-uv==1.11.2",
75
+ "uv==0.4.2",
73
76
  "jupyter",
74
77
  "nbqa",
75
- "ruff==0.6.1",
76
- "mypy==1.11.1",
78
+ "ruff==0.6.3",
79
+ "mypy==1.11.2",
77
80
  "pandas>=1.0",
78
81
  "tabulate", # used by DataFrame.to_markdown()
79
82
  "types-tabulate",
@@ -99,6 +102,7 @@ dev = [
99
102
  "Faker>=26.0.0",
100
103
  "portpicker",
101
104
  "uvloop; platform_system != 'Windows'",
105
+ "grpc-interceptor[testing]",
102
106
  ]
103
107
  evals = []
104
108
  experimental = []
@@ -187,7 +191,7 @@ dependencies = [
187
191
 
188
192
  [tool.hatch.envs.type]
189
193
  dependencies = [
190
- "mypy==1.11.1",
194
+ "mypy==1.11.2",
191
195
  "tenacity",
192
196
  "pandas>=1.0",
193
197
  "pandas-stubs==2.0.3.230814",
@@ -222,7 +226,7 @@ python = ["3.8", "3.9", "3.12"]
222
226
  [tool.hatch.envs.style]
223
227
  detached = true
224
228
  dependencies = [
225
- "ruff==0.6.1",
229
+ "ruff==0.6.3",
226
230
  ]
227
231
 
228
232
  [[tool.hatch.envs.style.matrix]]
@@ -256,6 +260,7 @@ addopts = [
256
260
  "--doctest-modules",
257
261
  "--new-first",
258
262
  "--showlocals",
263
+ "--exitfirst",
259
264
  ]
260
265
  testpaths = [
261
266
  "tests",
@@ -1,4 +1,5 @@
1
1
  import os
2
+ import re
2
3
  import tempfile
3
4
  from logging import getLogger
4
5
  from pathlib import Path
@@ -46,7 +47,11 @@ Phoenix supports two types of database URLs:
46
47
  Note that if you plan on using SQLite, it's advised to to use a persistent volume
47
48
  and simply point the PHOENIX_WORKING_DIR to that volume.
48
49
  """
49
-
50
+ ENV_PHOENIX_SQL_DATABASE_SCHEMA = "PHOENIX_SQL_DATABASE_SCHEMA"
51
+ """
52
+ The schema to use for the PostgresSQL database. (This is ignored for SQLite.)
53
+ See e.g. https://www.postgresql.org/docs/current/ddl-schemas.html
54
+ """
50
55
  ENV_PHOENIX_ENABLE_PROMETHEUS = "PHOENIX_ENABLE_PROMETHEUS"
51
56
  """
52
57
  Whether to enable Prometheus. Defaults to false.
@@ -231,6 +236,14 @@ def get_env_port() -> int:
231
236
  return PORT
232
237
  if port.isnumeric():
233
238
  return int(port)
239
+ if _KUBERNETES_PHOENIX_PORT_PATTERN.match(port) is not None:
240
+ raise ValueError(
241
+ 'If you are deploying Phoenix with Kubernetes using a service named "phoenix", '
242
+ "Kubernetes will automatically generate an environment variable `PHOENIX_PORT` "
243
+ 'of the form "tcp://<IP>:<PORT>" that is not the integer format Phoenix expects. '
244
+ "To resolve this issue, explicitly set the `PHOENIX_PORT` environment variable to "
245
+ "an integer value in your Kubernetes deployment configuration."
246
+ )
234
247
  raise ValueError(
235
248
  f"Invalid value for environment variable {ENV_PHOENIX_PORT}: "
236
249
  f"{port}. Value must be an integer."
@@ -272,6 +285,12 @@ def get_env_database_connection_str() -> str:
272
285
  return env_url
273
286
 
274
287
 
288
+ def get_env_database_schema() -> Optional[str]:
289
+ if get_env_database_connection_str().startswith("sqlite"):
290
+ return None
291
+ return os.getenv(ENV_PHOENIX_SQL_DATABASE_SCHEMA)
292
+
293
+
275
294
  def get_env_enable_prometheus() -> bool:
276
295
  if (enable_promotheus := os.getenv(ENV_PHOENIX_ENABLE_PROMETHEUS)) is None or (
277
296
  enable_promotheus_lower := enable_promotheus.lower()
@@ -313,3 +332,4 @@ def get_web_base_url() -> str:
313
332
 
314
333
 
315
334
  DEFAULT_PROJECT_NAME = "default"
335
+ _KUBERNETES_PHOENIX_PORT_PATTERN = re.compile(r"^tcp://\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}:\d+$")
@@ -0,0 +1,54 @@
1
+ # Database
2
+
3
+ This module is responsible for the database connection and the migrations.
4
+
5
+
6
+ ## Migrations
7
+
8
+ All migrations are managed by Alembic. Migrations are applied to the database automatically when the application starts.
9
+
10
+
11
+ ### Manually Applying Migrations
12
+
13
+ Sometimes, it's necessary to manually apply migrations, e.g., to recover from a failed migration. To manually apply migrations, you must first clone the Phoenix repository.
14
+
15
+ ```bash
16
+ git clone https://github.com/Arize-ai/phoenix.git
17
+ ```
18
+
19
+ Then navigate to the current directory.
20
+
21
+ ```bash
22
+ cd phoenix/src/phoenix/db
23
+ ```
24
+
25
+ If you are using a non-default SQL database URL (e.g., for running PostgreSQL), ensure your `PHOENIX_SQL_DATABASE_URL` is set. This is not needed if you are running Phoenix with the default SQLite URL.
26
+
27
+ ```bash
28
+ export PHOENIX_SQL_DATABASE_URL=<sql-database-url>
29
+ ```
30
+
31
+
32
+ To manually run up-migrations, run the following command:
33
+
34
+ ```bash
35
+ alembic upgrade head
36
+ ```
37
+
38
+ If the above command fails, it may be necessary to undo partially applied changes from a failed migration by first running down-migrations. This can be accomplished by identifying the ID of the migration revision you wish to return to. Revisions are defined [here](./migrations/versions/).
39
+
40
+ ⚠️ Running down-migrations can result in lost data. Only run down-migrations if you know what you are doing and consider backing up your database first. If you have any questions or doubts, contact the Phoenix team in the `#phoenix-support` channel of the [Arize AI Slack community](https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q) or via GitHub.
41
+
42
+ ```bash
43
+ alembic downgrade <revision-id>
44
+ ```
45
+
46
+ ### Creating a Migration
47
+
48
+ All migrations are stored in the `migrations` folder. To create a new migration, run the following command:
49
+
50
+ ```bash
51
+ alembic revision -m "your_revision_name"
52
+ ```
53
+
54
+ Then fill the migration file with the necessary changes.
@@ -3,7 +3,7 @@ import json
3
3
  from datetime import datetime
4
4
  from enum import Enum
5
5
  from sqlite3 import Connection
6
- from typing import Any
6
+ from typing import Any, Callable
7
7
 
8
8
  import aiosqlite
9
9
  import numpy as np
@@ -13,6 +13,7 @@ from sqlalchemy import URL, StaticPool, event, make_url
13
13
  from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
14
14
  from typing_extensions import assert_never
15
15
 
16
+ from phoenix.config import get_env_database_schema
16
17
  from phoenix.db.helpers import SupportedSQLDialect
17
18
  from phoenix.db.migrate import migrate_in_thread
18
19
  from phoenix.db.models import init_models
@@ -130,6 +131,15 @@ def aio_sqlite_engine(
130
131
  return engine
131
132
 
132
133
 
134
+ def set_postgresql_search_path(schema: str) -> Callable[[Connection, Any], None]:
135
+ def _(connection: Connection, _: Any) -> None:
136
+ cursor = connection.cursor()
137
+ cursor.execute(f"CREATE SCHEMA IF NOT EXISTS {schema};")
138
+ cursor.execute(f"SET search_path TO {schema};")
139
+
140
+ return _
141
+
142
+
133
143
  def aio_postgresql_engine(
134
144
  url: URL,
135
145
  migrate: bool = True,
@@ -143,6 +153,8 @@ def aio_postgresql_engine(
143
153
  echo=Settings.log_migrations,
144
154
  json_serializer=_dumps,
145
155
  )
156
+ if schema := get_env_database_schema():
157
+ event.listen(sync_engine, "connect", set_postgresql_search_path(schema))
146
158
  migrate_in_thread(sync_engine)
147
159
  return engine
148
160
 
@@ -50,6 +50,7 @@ def migrate(
50
50
  alembic_cfg.set_main_option("sqlalchemy.url", url)
51
51
  alembic_cfg.attributes["connection"] = engine.connect()
52
52
  command.upgrade(alembic_cfg, "head")
53
+ engine.dispose()
53
54
  printif(log_migrations, "---------------------------")
54
55
  printif(log_migrations, "✅ Migrations complete.")
55
56
  except BaseException as e:
@@ -34,7 +34,7 @@ from sqlalchemy.orm import (
34
34
  )
35
35
  from sqlalchemy.sql import expression
36
36
 
37
- from phoenix.config import ENABLE_AUTH
37
+ from phoenix.config import ENABLE_AUTH, get_env_database_schema
38
38
  from phoenix.datetime_utils import normalize_datetime
39
39
 
40
40
 
@@ -100,13 +100,14 @@ class Base(DeclarativeBase):
100
100
  # Enforce best practices for naming constraints
101
101
  # https://alembic.sqlalchemy.org/en/latest/naming.html#integration-of-naming-conventions-into-operations-autogenerate
102
102
  metadata = MetaData(
103
+ schema=get_env_database_schema(),
103
104
  naming_convention={
104
105
  "ix": "ix_%(table_name)s_%(column_0_N_name)s",
105
106
  "uq": "uq_%(table_name)s_%(column_0_N_name)s",
106
107
  "ck": "ck_%(table_name)s_`%(constraint_name)s`",
107
108
  "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
108
109
  "pk": "pk_%(table_name)s",
109
- }
110
+ },
110
111
  )
111
112
  type_annotation_map = {
112
113
  Dict[str, Any]: JsonDict,
@@ -39,6 +39,7 @@ class DeleteApiKeyInput:
39
39
  @strawberry.type
40
40
  class DeleteSystemApiKeyMutationPayload:
41
41
  id: GlobalID
42
+ query: Query
42
43
 
43
44
 
44
45
  @strawberry.type
@@ -106,7 +107,7 @@ class ApiKeyMutationMixin:
106
107
 
107
108
  await session.delete(api_key)
108
109
 
109
- return DeleteSystemApiKeyMutationPayload(id=input.id)
110
+ return DeleteSystemApiKeyMutationPayload(id=input.id, query=Query())
110
111
 
111
112
 
112
113
  def create_jwt(
@@ -2,6 +2,8 @@ import asyncio
2
2
  import contextlib
3
3
  import json
4
4
  import logging
5
+ from contextlib import AsyncExitStack
6
+ from dataclasses import dataclass, field
5
7
  from datetime import datetime, timedelta, timezone
6
8
  from functools import cached_property
7
9
  from pathlib import Path
@@ -18,7 +20,6 @@ from typing import (
18
20
  List,
19
21
  NamedTuple,
20
22
  Optional,
21
- Set,
22
23
  Tuple,
23
24
  Union,
24
25
  cast,
@@ -133,6 +134,7 @@ If so, demo data is automatically ingested upon initial boot up to populate the
133
134
  NEW_DB_AGE_THRESHOLD_MINUTES = 2
134
135
 
135
136
  ProjectName: TypeAlias = str
137
+ _Callback: TypeAlias = Callable[[], Union[None, Awaitable[None]]]
136
138
 
137
139
 
138
140
  class AppConfig(NamedTuple):
@@ -251,27 +253,36 @@ def _db(engine: AsyncEngine) -> Callable[[], AsyncContextManager[AsyncSession]]:
251
253
  return factory
252
254
 
253
255
 
256
+ @dataclass(frozen=True)
257
+ class ScaffolderConfig:
258
+ db: DbSessionFactory
259
+ tracing_fixture_names: Iterable[str] = field(default_factory=list)
260
+ force_fixture_ingestion: bool = False
261
+ scaffold_datasets: bool = False
262
+ phoenix_url: str = f"http://{get_env_host()}:{get_env_port()}"
263
+
264
+
254
265
  class Scaffolder(DaemonTask):
255
266
  def __init__(
256
267
  self,
257
- db: DbSessionFactory,
268
+ config: ScaffolderConfig,
258
269
  queue_span: Callable[[Span, ProjectName], Awaitable[None]],
259
270
  queue_evaluation: Callable[[pb.Evaluation], Awaitable[None]],
260
- tracing_fixture_names: Set[str] = set(),
261
- force_fixture_ingestion: bool = False,
262
- scaffold_datasets: bool = False,
263
271
  ) -> None:
264
272
  super().__init__()
265
- self._db = db
273
+ self._db = config.db
266
274
  self._queue_span = queue_span
267
275
  self._queue_evaluation = queue_evaluation
268
- self._tracing_fixtures = set(
269
- get_trace_fixture_by_name(name) for name in tracing_fixture_names
270
- )
271
- self._force_fixture_ingestion = force_fixture_ingestion
272
- self._scaffold_datasets = scaffold_datasets
276
+ self._tracing_fixtures = [
277
+ get_trace_fixture_by_name(name) for name in set(config.tracing_fixture_names)
278
+ ]
279
+ self._force_fixture_ingestion = config.force_fixture_ingestion
280
+ self._scaffold_datasets = config.scaffold_datasets
281
+ self._phoenix_url = config.phoenix_url
273
282
 
274
283
  async def __aenter__(self) -> None:
284
+ if not self._tracing_fixtures:
285
+ return
275
286
  await self.start()
276
287
 
277
288
  async def __aexit__(self, *args: Any, **kwargs: Any) -> None:
@@ -353,7 +364,7 @@ class Scaffolder(DaemonTask):
353
364
  await loop.run_in_executor(
354
365
  None,
355
366
  send_dataset_fixtures,
356
- f"http://{get_env_host()}:{get_env_port()}",
367
+ self._phoenix_url,
357
368
  dataset_fixtures,
358
369
  )
359
370
  except Exception as e:
@@ -367,37 +378,40 @@ def _lifespan(
367
378
  dml_event_handler: DmlEventHandler,
368
379
  tracer_provider: Optional["TracerProvider"] = None,
369
380
  enable_prometheus: bool = False,
370
- startup_callbacks: Iterable[Callable[[], None]] = (),
371
- shutdown_callbacks: Iterable[Callable[[], None]] = (),
381
+ startup_callbacks: Iterable[_Callback] = (),
382
+ shutdown_callbacks: Iterable[_Callback] = (),
372
383
  read_only: bool = False,
373
- tracing_fixture_names: Set[str] = set(),
374
- force_fixture_ingestion: bool = False,
375
- scaffold_datasets: bool = False,
384
+ scaffolder_config: Optional[ScaffolderConfig] = None,
376
385
  ) -> StatefulLifespan[FastAPI]:
377
386
  @contextlib.asynccontextmanager
378
387
  async def lifespan(_: FastAPI) -> AsyncIterator[Dict[str, Any]]:
388
+ for callback in startup_callbacks:
389
+ if isinstance((res := callback()), Awaitable):
390
+ await res
379
391
  global DB_MUTEX
380
392
  DB_MUTEX = asyncio.Lock() if db.dialect is SupportedSQLDialect.SQLITE else None
381
- async with bulk_inserter as (
382
- enqueue,
383
- queue_span,
384
- queue_evaluation,
385
- enqueue_operation,
386
- ), GrpcServer(
387
- queue_span,
388
- disabled=read_only,
389
- tracer_provider=tracer_provider,
390
- enable_prometheus=enable_prometheus,
391
- ), dml_event_handler, Scaffolder(
392
- db=db,
393
- queue_span=queue_span,
394
- queue_evaluation=queue_evaluation,
395
- tracing_fixture_names=tracing_fixture_names,
396
- force_fixture_ingestion=force_fixture_ingestion,
397
- scaffold_datasets=scaffold_datasets,
398
- ):
399
- for callback in startup_callbacks:
400
- callback()
393
+ async with AsyncExitStack() as stack:
394
+ (
395
+ enqueue,
396
+ queue_span,
397
+ queue_evaluation,
398
+ enqueue_operation,
399
+ ) = await stack.enter_async_context(bulk_inserter)
400
+ grpc_server = GrpcServer(
401
+ queue_span,
402
+ disabled=read_only,
403
+ tracer_provider=tracer_provider,
404
+ enable_prometheus=enable_prometheus,
405
+ )
406
+ await stack.enter_async_context(grpc_server)
407
+ await stack.enter_async_context(dml_event_handler)
408
+ if scaffolder_config:
409
+ scaffolder = Scaffolder(
410
+ config=scaffolder_config,
411
+ queue_span=queue_span,
412
+ queue_evaluation=queue_evaluation,
413
+ )
414
+ await stack.enter_async_context(scaffolder)
401
415
  yield {
402
416
  "event_queue": dml_event_handler,
403
417
  "enqueue": enqueue,
@@ -406,7 +420,8 @@ def _lifespan(
406
420
  "enqueue_operation": enqueue_operation,
407
421
  }
408
422
  for callback in shutdown_callbacks:
409
- callback()
423
+ if isinstance((res := callback()), Awaitable):
424
+ await res
410
425
 
411
426
  return lifespan
412
427
 
@@ -584,15 +599,13 @@ def create_app(
584
599
  initial_spans: Optional[Iterable[Union[Span, Tuple[Span, str]]]] = None,
585
600
  initial_evaluations: Optional[Iterable[pb.Evaluation]] = None,
586
601
  serve_ui: bool = True,
587
- startup_callbacks: Iterable[Callable[[], None]] = (),
588
- shutdown_callbacks: Iterable[Callable[[], None]] = (),
602
+ startup_callbacks: Iterable[_Callback] = (),
603
+ shutdown_callbacks: Iterable[_Callback] = (),
589
604
  secret: Optional[str] = None,
590
- tracing_fixture_names: Set[str] = set(),
591
- force_fixture_ingestion: bool = False,
592
- scaffold_datasets: bool = False,
605
+ scaffolder_config: Optional[ScaffolderConfig] = None,
593
606
  ) -> FastAPI:
594
- startup_callbacks_list: List[Callable[[], None]] = list(startup_callbacks)
595
- shutdown_callbacks_list: List[Callable[[], None]] = list(shutdown_callbacks)
607
+ startup_callbacks_list: List[_Callback] = list(startup_callbacks)
608
+ shutdown_callbacks_list: List[_Callback] = list(shutdown_callbacks)
596
609
  initial_batch_of_spans: Iterable[Tuple[Span, str]] = (
597
610
  ()
598
611
  if initial_spans is None
@@ -606,6 +619,7 @@ def create_app(
606
619
  CacheForDataLoaders() if db.dialect is SupportedSQLDialect.SQLITE else None
607
620
  )
608
621
  last_updated_at = LastUpdatedAt()
622
+ middlewares: List[Middleware] = [Middleware(HeadersMiddleware)]
609
623
  dml_event_handler = DmlEventHandler(
610
624
  db=db,
611
625
  cache_for_dataloaders=cache_for_dataloaders,
@@ -659,10 +673,7 @@ def create_app(
659
673
  if enable_prometheus:
660
674
  from phoenix.server.prometheus import PrometheusMiddleware
661
675
 
662
- prometheus_middlewares = [Middleware(PrometheusMiddleware)]
663
- else:
664
- prometheus_middlewares = []
665
-
676
+ middlewares.append(Middleware(PrometheusMiddleware))
666
677
  app = FastAPI(
667
678
  title="Arize-Phoenix REST API",
668
679
  version=REST_API_VERSION,
@@ -675,14 +686,9 @@ def create_app(
675
686
  enable_prometheus=enable_prometheus,
676
687
  shutdown_callbacks=shutdown_callbacks_list,
677
688
  startup_callbacks=startup_callbacks_list,
678
- tracing_fixture_names=tracing_fixture_names,
679
- force_fixture_ingestion=force_fixture_ingestion,
680
- scaffold_datasets=scaffold_datasets,
689
+ scaffolder_config=scaffolder_config,
681
690
  ),
682
- middleware=[
683
- Middleware(HeadersMiddleware),
684
- *prometheus_middlewares,
685
- ],
691
+ middleware=middlewares,
686
692
  exception_handlers={HTTPException: plain_text_http_exception_handler},
687
693
  debug=debug,
688
694
  swagger_ui_parameters={
@@ -695,7 +701,8 @@ def create_app(
695
701
  app.include_router(router)
696
702
  app.include_router(graphql_router)
697
703
  app.add_middleware(GZipMiddleware)
698
- if serve_ui:
704
+ web_manifest_path = SERVER_DIR / "static" / ".vite" / "manifest.json"
705
+ if serve_ui and web_manifest_path.is_file():
699
706
  app.mount(
700
707
  "/",
701
708
  app=Static(
@@ -708,7 +715,7 @@ def create_app(
708
715
  n_samples=umap_params.n_samples,
709
716
  is_development=dev,
710
717
  authentication_enabled=authentication_enabled,
711
- web_manifest_path=SERVER_DIR / "static" / ".vite" / "manifest.json",
718
+ web_manifest_path=web_manifest_path,
712
719
  ),
713
720
  ),
714
721
  name="static",
@@ -23,7 +23,7 @@ if TYPE_CHECKING:
23
23
  ProjectName: TypeAlias = str
24
24
 
25
25
 
26
- class Servicer(TraceServiceServicer): # type:ignore
26
+ class Servicer(TraceServiceServicer): # type: ignore[misc,unused-ignore]
27
27
  def __init__(
28
28
  self,
29
29
  callback: Callable[[Span, ProjectName], Awaitable[None]],
@@ -78,7 +78,7 @@ class GrpcServer:
78
78
  interceptors=interceptors,
79
79
  )
80
80
  server.add_insecure_port(f"[::]:{get_env_grpc_port()}")
81
- add_TraceServiceServicer_to_server(Servicer(self._callback), server)
81
+ add_TraceServiceServicer_to_server(Servicer(self._callback), server) # type: ignore[no-untyped-call,unused-ignore]
82
82
  await server.start()
83
83
  self._server = server
84
84