arize-phoenix 4.32.0__tar.gz → 4.33.1__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 (312) hide show
  1. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/.gitignore +1 -0
  2. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/PKG-INFO +20 -17
  3. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/README.md +13 -11
  4. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/pyproject.toml +9 -7
  5. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/config.py +11 -1
  6. arize_phoenix-4.33.1/src/phoenix/db/README.md +54 -0
  7. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/engines.py +13 -1
  8. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/migrate.py +1 -0
  9. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/models.py +3 -2
  10. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/experiments/functions.py +1 -1
  11. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +1 -1
  12. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +1 -1
  13. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +1 -1
  14. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +1 -1
  15. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +2 -2
  16. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +1 -1
  17. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +1 -1
  18. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +1 -1
  19. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/span_projects.py +1 -1
  20. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/mutations/api_key_mutations.py +2 -1
  21. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/app.py +18 -19
  22. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/grpc_server.py +2 -2
  23. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/main.py +14 -8
  24. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/.vite/manifest.json +9 -9
  25. arize_phoenix-4.32.0/src/phoenix/server/static/assets/components-Ddr-5VpM.js → arize_phoenix-4.33.1/src/phoenix/server/static/assets/components-r5FGhZ3q.js +86 -87
  26. arize_phoenix-4.32.0/src/phoenix/server/static/assets/index-BvNNAF8n.js → arize_phoenix-4.33.1/src/phoenix/server/static/assets/index-D97e4SiJ.js +1 -1
  27. arize_phoenix-4.32.0/src/phoenix/server/static/assets/pages-CU_QMYRP.js → arize_phoenix-4.33.1/src/phoenix/server/static/assets/pages-Dtpf5TRQ.js +220 -196
  28. arize_phoenix-4.33.1/src/phoenix/version.py +1 -0
  29. arize_phoenix-4.32.0/src/phoenix/db/README.md +0 -28
  30. arize_phoenix-4.32.0/src/phoenix/version.py +0 -1
  31. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/IP_NOTICE +0 -0
  32. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/LICENSE +0 -0
  33. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/examples/manually-instrumented-chatbot/chat-service/chat/__init__.py +0 -0
  34. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/examples/manually-instrumented-chatbot/chat-service/chat/app.py +0 -0
  35. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/examples/manually-instrumented-chatbot/chat-service/chat/types.py +0 -0
  36. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/examples/manually-instrumented-chatbot/frontend/Dockerfile +0 -0
  37. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/examples/manually-instrumented-chatbot/frontend/Makefile +0 -0
  38. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/examples/manually-instrumented-chatbot/frontend/__init__.py +0 -0
  39. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/examples/manually-instrumented-chatbot/frontend/pyproject.toml +0 -0
  40. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/examples/manually-instrumented-chatbot/frontend/requirements.txt +0 -0
  41. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/examples/manually-instrumented-chatbot/frontend/schema.json +0 -0
  42. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/__init__.py +0 -0
  43. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/auth.py +0 -0
  44. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/core/__init__.py +0 -0
  45. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/core/embedding_dimension.py +0 -0
  46. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/core/model.py +0 -0
  47. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/core/model_schema.py +0 -0
  48. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/core/model_schema_adapter.py +0 -0
  49. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/datetime_utils.py +0 -0
  50. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/__init__.py +0 -0
  51. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/alembic.ini +0 -0
  52. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/bulk_inserter.py +0 -0
  53. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/helpers.py +0 -0
  54. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/insertion/__init__.py +0 -0
  55. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/insertion/constants.py +0 -0
  56. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/insertion/dataset.py +0 -0
  57. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/insertion/document_annotation.py +0 -0
  58. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/insertion/evaluation.py +0 -0
  59. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/insertion/helpers.py +0 -0
  60. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/insertion/span.py +0 -0
  61. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/insertion/span_annotation.py +0 -0
  62. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/insertion/trace_annotation.py +0 -0
  63. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/insertion/types.py +0 -0
  64. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/migrations/__init__.py +0 -0
  65. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/migrations/env.py +0 -0
  66. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/migrations/future_versions/README.md +0 -0
  67. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/migrations/future_versions/cd164e83824f_users_and_tokens.py +0 -0
  68. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/migrations/script.py.mako +0 -0
  69. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/migrations/versions/.gitignore +0 -0
  70. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  71. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
  72. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  73. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/exceptions.py +0 -0
  74. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/experiments/__init__.py +0 -0
  75. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  76. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/experiments/evaluators/base.py +0 -0
  77. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
  78. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
  79. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/experiments/evaluators/utils.py +0 -0
  80. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/experiments/tracing.py +0 -0
  81. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/experiments/types.py +0 -0
  82. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/experiments/utils.py +0 -0
  83. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/inferences/__init__.py +0 -0
  84. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/inferences/errors.py +0 -0
  85. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/inferences/fixtures.py +0 -0
  86. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/inferences/inferences.py +0 -0
  87. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/inferences/schema.py +0 -0
  88. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/inferences/validation.py +0 -0
  89. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/metrics/README.md +0 -0
  90. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/metrics/__init__.py +0 -0
  91. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/metrics/binning.py +0 -0
  92. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/metrics/metrics.py +0 -0
  93. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/metrics/mixins.py +0 -0
  94. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  95. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/metrics/timeseries.py +0 -0
  96. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/metrics/wrappers.py +0 -0
  97. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/pointcloud/__init__.py +0 -0
  98. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/pointcloud/clustering.py +0 -0
  99. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/pointcloud/pointcloud.py +0 -0
  100. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/pointcloud/projectors.py +0 -0
  101. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  102. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/py.typed +0 -0
  103. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/__init__.py +0 -0
  104. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/__init__.py +0 -0
  105. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/context.py +0 -0
  106. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
  107. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
  108. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  109. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
  110. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
  111. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
  112. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
  113. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
  114. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
  115. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
  116. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
  117. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
  118. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
  119. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
  120. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
  121. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/dataloaders/trace_row_ids.py +0 -0
  122. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/exceptions.py +0 -0
  123. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/helpers/__init__.py +0 -0
  124. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
  125. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
  126. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
  127. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  128. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  129. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  130. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  131. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
  132. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
  133. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  134. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  135. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  136. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  137. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
  138. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
  139. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  140. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
  141. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  142. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  143. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  144. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
  145. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
  146. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  147. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  148. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  149. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  150. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  151. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  152. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
  153. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/input_types/__init__.py +0 -0
  154. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/interceptor.py +0 -0
  155. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/mutations/__init__.py +0 -0
  156. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/mutations/auth.py +0 -0
  157. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/mutations/auth_mutations.py +0 -0
  158. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
  159. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
  160. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
  161. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
  162. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
  163. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
  164. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
  165. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/openapi/__init__.py +0 -0
  166. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/openapi/main.py +0 -0
  167. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/openapi/schema.py +0 -0
  168. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/queries.py +0 -0
  169. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/routers/__init__.py +0 -0
  170. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/routers/utils.py +0 -0
  171. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/routers/v1/__init__.py +0 -0
  172. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/routers/v1/datasets.py +0 -0
  173. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/routers/v1/evaluations.py +0 -0
  174. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
  175. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
  176. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/routers/v1/experiments.py +0 -0
  177. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/routers/v1/pydantic_compat.py +0 -0
  178. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/routers/v1/spans.py +0 -0
  179. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/routers/v1/traces.py +0 -0
  180. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/routers/v1/utils.py +0 -0
  181. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/schema.py +0 -0
  182. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/Annotation.py +0 -0
  183. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
  184. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
  185. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/ApiKey.py +0 -0
  186. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/Cluster.py +0 -0
  187. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  188. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  189. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/Dataset.py +0 -0
  190. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  191. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  192. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  193. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  194. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/Dimension.py +0 -0
  195. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  196. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  197. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/DimensionType.py +0 -0
  198. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  199. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  200. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  201. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  202. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  203. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/Evaluation.py +0 -0
  204. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  205. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/Event.py +0 -0
  206. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  207. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  208. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/Experiment.py +0 -0
  209. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  210. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
  211. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  212. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  213. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  214. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/Functionality.py +0 -0
  215. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/Inferences.py +0 -0
  216. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/InferencesRole.py +0 -0
  217. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  218. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/MimeType.py +0 -0
  219. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/Model.py +0 -0
  220. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/NumericRange.py +0 -0
  221. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  222. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/Project.py +0 -0
  223. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  224. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/Retrieval.py +0 -0
  225. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  226. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/Segments.py +0 -0
  227. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/SortDir.py +0 -0
  228. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/Span.py +0 -0
  229. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
  230. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
  231. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  232. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/Trace.py +0 -0
  233. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
  234. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  235. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/User.py +0 -0
  236. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/UserApiKey.py +0 -0
  237. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/UserRole.py +0 -0
  238. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  239. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  240. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/__init__.py +0 -0
  241. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/node.py +0 -0
  242. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/types/pagination.py +0 -0
  243. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/api/utils.py +0 -0
  244. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/dml_event.py +0 -0
  245. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/dml_event_handler.py +0 -0
  246. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/openapi/__init__.py +0 -0
  247. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/prometheus.py +0 -0
  248. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  249. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  250. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  251. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  252. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  253. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  254. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  255. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  256. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/assets/vendor-Dpio9q2e.js +0 -0
  257. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/assets/vendor-DxkFTwjz.css +0 -0
  258. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/assets/vendor-arizeai-DDzwX9A6.js +0 -0
  259. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/assets/vendor-codemirror-xRvQKK1G.js +0 -0
  260. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/assets/vendor-recharts-DoxlB_Wo.js +0 -0
  261. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/assets/vendor-three-DwGkEfCM.js +0 -0
  262. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/favicon.ico +0 -0
  263. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/static/modernizr.js +0 -0
  264. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/telemetry.py +0 -0
  265. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/templates/__init__.py +0 -0
  266. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/templates/index.html +0 -0
  267. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/thread_server.py +0 -0
  268. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/server/types.py +0 -0
  269. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/services.py +0 -0
  270. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/session/__init__.py +0 -0
  271. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/session/client.py +0 -0
  272. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/session/data_extractor.py +0 -0
  273. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/session/evaluation.py +0 -0
  274. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/session/session.py +0 -0
  275. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/settings.py +0 -0
  276. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/__init__.py +0 -0
  277. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/attributes.py +0 -0
  278. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/dsl/README.md +0 -0
  279. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/dsl/__init__.py +0 -0
  280. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/dsl/filter.py +0 -0
  281. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/dsl/helpers.py +0 -0
  282. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/dsl/query.py +0 -0
  283. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/errors.py +0 -0
  284. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/evaluation_conventions.py +0 -0
  285. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/exporter.py +0 -0
  286. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/fixtures.py +0 -0
  287. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/langchain/__init__.py +0 -0
  288. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/langchain/instrumentor.py +0 -0
  289. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/llama_index/__init__.py +0 -0
  290. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/llama_index/callback.py +0 -0
  291. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/openai/__init__.py +0 -0
  292. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/openai/instrumentor.py +0 -0
  293. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/otel.py +0 -0
  294. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/projects.py +0 -0
  295. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/schemas.py +0 -0
  296. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/span_evaluations.py +0 -0
  297. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/span_json_decoder.py +0 -0
  298. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/span_json_encoder.py +0 -0
  299. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/trace_dataset.py +0 -0
  300. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/utils.py +0 -0
  301. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/v1/__init__.py +0 -0
  302. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  303. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  304. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/utilities/__init__.py +0 -0
  305. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/utilities/client.py +0 -0
  306. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/utilities/deprecation.py +0 -0
  307. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/utilities/error_handling.py +0 -0
  308. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/utilities/json.py +0 -0
  309. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/utilities/logging.py +0 -0
  310. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/utilities/project.py +0 -0
  311. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/src/phoenix/utilities/re.py +0 -0
  312. {arize_phoenix-4.32.0 → arize_phoenix-4.33.1}/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.32.0
3
+ Version: 4.33.1
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,13 +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'
102
- Requires-Dist: tox; extra == 'dev'
103
- Requires-Dist: tox-uv; extra == 'dev'
103
+ Requires-Dist: tox-uv==1.11.2; extra == 'dev'
104
+ Requires-Dist: tox==4.18.0; extra == 'dev'
104
105
  Requires-Dist: types-tabulate; extra == 'dev'
105
- Requires-Dist: uv; extra == 'dev'
106
+ Requires-Dist: uv==0.4.2; extra == 'dev'
106
107
  Requires-Dist: uvloop; (platform_system != 'Windows') and extra == 'dev'
107
108
  Provides-Extra: evals
108
109
  Provides-Extra: experimental
@@ -149,15 +150,17 @@ Description-Content-Type: text/markdown
149
150
 
150
151
  Phoenix is an open-source AI observability platform designed for experimentation, evaluation, and troubleshooting. It provides:
151
152
 
152
- - **_Tracing_** - Trace your LLM application's runtime using OpenTelemetry-based instrumentation.
153
- - **_Evaluation_** - Leverage LLMs to benchmark your application's performance using response and retrieval evals.
154
- - **_Datasets_** - Create versioned datasets of examples for experimentation, evaluation, and fine-tuning.
155
- - **_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.
156
157
 
157
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.
158
159
 
159
160
  Phoenix runs practically anywhere, including your Jupyter notebook, local machine, containerized deployment, or in the cloud.
160
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
+
161
164
  ## Installation
162
165
 
163
166
  Install Phoenix via `pip` or `conda`
@@ -172,13 +175,13 @@ Phoenix container images are available via [Docker Hub](https://hub.docker.com/r
172
175
 
173
176
  Join our community to connect with thousands of AI builders.
174
177
 
175
- - 🌍 Join our [Slack community](https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q).
176
- - 💡 Ask questions and provide feedback in the _#phoenix-support_ channel.
177
- - 🌟 Leave a star on our [GitHub](https://github.com/Arize-ai/phoenix).
178
- - 🐞 Report bugs with [GitHub Issues](https://github.com/Arize-ai/phoenix/issues).
179
- - 𝕏 Follow us on [𝕏](https://twitter.com/ArizePhoenix).
180
- - 💌️ Sign up for our [mailing list](https://phoenix.arize.com/#updates).
181
- - 🗺️ Check out our [roadmap](https://github.com/orgs/Arize-ai/projects/45) to see where we're heading next.
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.
182
185
 
183
186
  ## Breaking Changes
184
187
 
@@ -29,15 +29,17 @@
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
45
  Install Phoenix via `pip` or `conda`
@@ -52,13 +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.
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.
62
64
 
63
65
  ## Breaking Changes
64
66
 
@@ -70,13 +70,13 @@ dynamic = ["version"]
70
70
  dev = [
71
71
  "gcsfs",
72
72
  "hatch",
73
- "tox",
74
- "tox-uv",
75
- "uv",
73
+ "tox==4.18.0",
74
+ "tox-uv==1.11.2",
75
+ "uv==0.4.2",
76
76
  "jupyter",
77
77
  "nbqa",
78
- "ruff==0.6.1",
79
- "mypy==1.11.1",
78
+ "ruff==0.6.3",
79
+ "mypy==1.11.2",
80
80
  "pandas>=1.0",
81
81
  "tabulate", # used by DataFrame.to_markdown()
82
82
  "types-tabulate",
@@ -102,6 +102,7 @@ dev = [
102
102
  "Faker>=26.0.0",
103
103
  "portpicker",
104
104
  "uvloop; platform_system != 'Windows'",
105
+ "grpc-interceptor[testing]",
105
106
  ]
106
107
  evals = []
107
108
  experimental = []
@@ -190,7 +191,7 @@ dependencies = [
190
191
 
191
192
  [tool.hatch.envs.type]
192
193
  dependencies = [
193
- "mypy==1.11.1",
194
+ "mypy==1.11.2",
194
195
  "tenacity",
195
196
  "pandas>=1.0",
196
197
  "pandas-stubs==2.0.3.230814",
@@ -225,7 +226,7 @@ python = ["3.8", "3.9", "3.12"]
225
226
  [tool.hatch.envs.style]
226
227
  detached = true
227
228
  dependencies = [
228
- "ruff==0.6.1",
229
+ "ruff==0.6.3",
229
230
  ]
230
231
 
231
232
  [[tool.hatch.envs.style.matrix]]
@@ -259,6 +260,7 @@ addopts = [
259
260
  "--doctest-modules",
260
261
  "--new-first",
261
262
  "--showlocals",
263
+ "--exitfirst",
262
264
  ]
263
265
  testpaths = [
264
266
  "tests",
@@ -47,7 +47,11 @@ Phoenix supports two types of database URLs:
47
47
  Note that if you plan on using SQLite, it's advised to to use a persistent volume
48
48
  and simply point the PHOENIX_WORKING_DIR to that volume.
49
49
  """
50
-
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
+ """
51
55
  ENV_PHOENIX_ENABLE_PROMETHEUS = "PHOENIX_ENABLE_PROMETHEUS"
52
56
  """
53
57
  Whether to enable Prometheus. Defaults to false.
@@ -281,6 +285,12 @@ def get_env_database_connection_str() -> str:
281
285
  return env_url
282
286
 
283
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
+
284
294
  def get_env_enable_prometheus() -> bool:
285
295
  if (enable_promotheus := os.getenv(ENV_PHOENIX_ENABLE_PROMETHEUS)) is None or (
286
296
  enable_promotheus_lower := enable_promotheus.lower()
@@ -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,
@@ -153,7 +153,7 @@ def run_experiment(
153
153
  experiment. Defaults to None.
154
154
  rate_limit_errors (Optional[BaseException | Sequence[BaseException]]): An exception or
155
155
  sequence of exceptions to adaptively throttle on. Defaults to None.
156
- dry_run (bool | int): R the experiment in dry-run mode. When set, experiment results will
156
+ dry_run (bool | int): Run the experiment in dry-run mode. When set, experiment results will
157
157
  not be recorded in Phoenix. If True, the experiment will run on a random dataset
158
158
  example. If an integer, the experiment will run on a random sample of the dataset
159
159
  examples of the given size. Defaults to False.
@@ -50,5 +50,5 @@ class AverageExperimentRunLatencyDataLoader(DataLoader[Key, Result]):
50
50
  }
51
51
  return [
52
52
  avg_latencies.get(experiment_id, ValueError(f"Unknown experiment: {experiment_id}"))
53
- for experiment_id in experiment_ids
53
+ for experiment_id in keys
54
54
  ]
@@ -38,4 +38,4 @@ class DatasetExampleSpansDataLoader(DataLoader[Key, Result]):
38
38
  )
39
39
  )
40
40
  }
41
- return [spans.get(example_id) for example_id in example_ids]
41
+ return [spans.get(example_id) for example_id in keys]
@@ -79,5 +79,5 @@ class ExperimentAnnotationSummaryDataLoader(DataLoader[Key, Result]):
79
79
  )
80
80
  return [
81
81
  sorted(summaries[experiment_id], key=lambda summary: summary.annotation_name)
82
- for experiment_id in experiment_ids
82
+ for experiment_id in keys
83
83
  ]
@@ -57,5 +57,5 @@ class ExperimentErrorRatesDataLoader(DataLoader[Key, Result]):
57
57
  }
58
58
  return [
59
59
  error_rates.get(experiment_id, ValueError(f"Unknown experiment ID: {experiment_id}"))
60
- for experiment_id in experiment_ids
60
+ for experiment_id in keys
61
61
  ]
@@ -25,7 +25,7 @@ class ExperimentRunAnnotations(DataLoader[Key, Result]):
25
25
  self._db = db
26
26
 
27
27
  async def _load_fn(self, keys: List[Key]) -> List[Result]:
28
- run_ids = tuple(set(keys))
28
+ run_ids = keys
29
29
  annotations: DefaultDict[Key, Result] = defaultdict(list)
30
30
  async with self._db() as session:
31
31
  async for run_id, annotation in await session.stream(
@@ -36,5 +36,5 @@ class ExperimentRunAnnotations(DataLoader[Key, Result]):
36
36
  annotations[run_id].append(annotation)
37
37
  return [
38
38
  sorted(annotations[run_id], key=lambda annotation: annotation.name, reverse=True)
39
- for run_id in run_ids
39
+ for run_id in keys
40
40
  ]
@@ -49,5 +49,5 @@ class ExperimentRunCountsDataLoader(DataLoader[Key, Result]):
49
49
  }
50
50
  return [
51
51
  run_counts.get(experiment_id, ValueError(f"Unknown experiment: {experiment_id}"))
52
- for experiment_id in experiment_ids
52
+ for experiment_id in keys
53
53
  ]
@@ -44,4 +44,4 @@ class ExperimentSequenceNumberDataLoader(DataLoader[Key, Result]):
44
44
  experiment_id: sequence_number
45
45
  async for experiment_id, sequence_number in await session.stream(stmt)
46
46
  }
47
- return [result.get(experiment_id) for experiment_id in experiment_ids]
47
+ return [result.get(experiment_id) for experiment_id in keys]
@@ -33,4 +33,4 @@ class SpanDatasetExamplesDataLoader(DataLoader[Key, Result]):
33
33
  .where(models.Span.id.in_(span_rowids))
34
34
  ):
35
35
  dataset_examples[span_rowid].append(dataset_example)
36
- return [dataset_examples.get(span_rowid, []) for span_rowid in span_rowids]
36
+ return [dataset_examples.get(span_rowid, []) for span_rowid in keys]
@@ -30,4 +30,4 @@ class SpanProjectsDataLoader(DataLoader[Key, Result]):
30
30
  .where(models.Span.id.in_(span_ids))
31
31
  )
32
32
  }
33
- return [projects.get(span_id) or ValueError("Invalid span ID") for span_id in span_ids]
33
+ return [projects.get(span_id) or ValueError("Invalid span ID") for span_id in keys]
@@ -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(
@@ -134,6 +134,7 @@ If so, demo data is automatically ingested upon initial boot up to populate the
134
134
  NEW_DB_AGE_THRESHOLD_MINUTES = 2
135
135
 
136
136
  ProjectName: TypeAlias = str
137
+ _Callback: TypeAlias = Callable[[], Union[None, Awaitable[None]]]
137
138
 
138
139
 
139
140
  class AppConfig(NamedTuple):
@@ -377,13 +378,16 @@ def _lifespan(
377
378
  dml_event_handler: DmlEventHandler,
378
379
  tracer_provider: Optional["TracerProvider"] = None,
379
380
  enable_prometheus: bool = False,
380
- startup_callbacks: Iterable[Callable[[], None]] = (),
381
- shutdown_callbacks: Iterable[Callable[[], None]] = (),
381
+ startup_callbacks: Iterable[_Callback] = (),
382
+ shutdown_callbacks: Iterable[_Callback] = (),
382
383
  read_only: bool = False,
383
384
  scaffolder_config: Optional[ScaffolderConfig] = None,
384
385
  ) -> StatefulLifespan[FastAPI]:
385
386
  @contextlib.asynccontextmanager
386
387
  async def lifespan(_: FastAPI) -> AsyncIterator[Dict[str, Any]]:
388
+ for callback in startup_callbacks:
389
+ if isinstance((res := callback()), Awaitable):
390
+ await res
387
391
  global DB_MUTEX
388
392
  DB_MUTEX = asyncio.Lock() if db.dialect is SupportedSQLDialect.SQLITE else None
389
393
  async with AsyncExitStack() as stack:
@@ -408,8 +412,6 @@ def _lifespan(
408
412
  queue_evaluation=queue_evaluation,
409
413
  )
410
414
  await stack.enter_async_context(scaffolder)
411
- for callback in startup_callbacks:
412
- callback()
413
415
  yield {
414
416
  "event_queue": dml_event_handler,
415
417
  "enqueue": enqueue,
@@ -418,7 +420,8 @@ def _lifespan(
418
420
  "enqueue_operation": enqueue_operation,
419
421
  }
420
422
  for callback in shutdown_callbacks:
421
- callback()
423
+ if isinstance((res := callback()), Awaitable):
424
+ await res
422
425
 
423
426
  return lifespan
424
427
 
@@ -596,13 +599,13 @@ def create_app(
596
599
  initial_spans: Optional[Iterable[Union[Span, Tuple[Span, str]]]] = None,
597
600
  initial_evaluations: Optional[Iterable[pb.Evaluation]] = None,
598
601
  serve_ui: bool = True,
599
- startup_callbacks: Iterable[Callable[[], None]] = (),
600
- shutdown_callbacks: Iterable[Callable[[], None]] = (),
602
+ startup_callbacks: Iterable[_Callback] = (),
603
+ shutdown_callbacks: Iterable[_Callback] = (),
601
604
  secret: Optional[str] = None,
602
605
  scaffolder_config: Optional[ScaffolderConfig] = None,
603
606
  ) -> FastAPI:
604
- startup_callbacks_list: List[Callable[[], None]] = list(startup_callbacks)
605
- 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)
606
609
  initial_batch_of_spans: Iterable[Tuple[Span, str]] = (
607
610
  ()
608
611
  if initial_spans is None
@@ -616,6 +619,7 @@ def create_app(
616
619
  CacheForDataLoaders() if db.dialect is SupportedSQLDialect.SQLITE else None
617
620
  )
618
621
  last_updated_at = LastUpdatedAt()
622
+ middlewares: List[Middleware] = [Middleware(HeadersMiddleware)]
619
623
  dml_event_handler = DmlEventHandler(
620
624
  db=db,
621
625
  cache_for_dataloaders=cache_for_dataloaders,
@@ -669,10 +673,7 @@ def create_app(
669
673
  if enable_prometheus:
670
674
  from phoenix.server.prometheus import PrometheusMiddleware
671
675
 
672
- prometheus_middlewares = [Middleware(PrometheusMiddleware)]
673
- else:
674
- prometheus_middlewares = []
675
-
676
+ middlewares.append(Middleware(PrometheusMiddleware))
676
677
  app = FastAPI(
677
678
  title="Arize-Phoenix REST API",
678
679
  version=REST_API_VERSION,
@@ -687,10 +688,7 @@ def create_app(
687
688
  startup_callbacks=startup_callbacks_list,
688
689
  scaffolder_config=scaffolder_config,
689
690
  ),
690
- middleware=[
691
- Middleware(HeadersMiddleware),
692
- *prometheus_middlewares,
693
- ],
691
+ middleware=middlewares,
694
692
  exception_handlers={HTTPException: plain_text_http_exception_handler},
695
693
  debug=debug,
696
694
  swagger_ui_parameters={
@@ -703,7 +701,8 @@ def create_app(
703
701
  app.include_router(router)
704
702
  app.include_router(graphql_router)
705
703
  app.add_middleware(GZipMiddleware)
706
- if serve_ui:
704
+ web_manifest_path = SERVER_DIR / "static" / ".vite" / "manifest.json"
705
+ if serve_ui and web_manifest_path.is_file():
707
706
  app.mount(
708
707
  "/",
709
708
  app=Static(
@@ -716,7 +715,7 @@ def create_app(
716
715
  n_samples=umap_params.n_samples,
717
716
  is_development=dev,
718
717
  authentication_enabled=authentication_enabled,
719
- web_manifest_path=SERVER_DIR / "static" / ".vite" / "manifest.json",
718
+ web_manifest_path=web_manifest_path,
720
719
  ),
721
720
  ),
722
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
 
@@ -11,6 +11,7 @@ from time import sleep, time
11
11
  from typing import List, Optional
12
12
  from urllib.parse import urljoin
13
13
 
14
+ from jinja2 import BaseLoader, Environment
14
15
  from uvicorn import Config, Server
15
16
 
16
17
  import phoenix.trace.v1 as pb
@@ -18,6 +19,7 @@ from phoenix.config import (
18
19
  EXPORT_DIR,
19
20
  get_auth_settings,
20
21
  get_env_database_connection_str,
22
+ get_env_database_schema,
21
23
  get_env_enable_prometheus,
22
24
  get_env_grpc_port,
23
25
  get_env_host,
@@ -60,14 +62,14 @@ from phoenix.trace.schemas import Span
60
62
  logger = logging.getLogger(__name__)
61
63
  logger.addHandler(logging.NullHandler())
62
64
 
63
- _WELCOME_MESSAGE = """
65
+ _WELCOME_MESSAGE = Environment(loader=BaseLoader()).from_string("""
64
66
 
65
67
  ██████╗ ██╗ ██╗ ██████╗ ███████╗███╗ ██╗██╗██╗ ██╗
66
68
  ██╔══██╗██║ ██║██╔═══██╗██╔════╝████╗ ██║██║╚██╗██╔╝
67
69
  ██████╔╝███████║██║ ██║█████╗ ██╔██╗ ██║██║ ╚███╔╝
68
70
  ██╔═══╝ ██╔══██║██║ ██║██╔══╝ ██║╚██╗██║██║ ██╔██╗
69
71
  ██║ ██║ ██║╚██████╔╝███████╗██║ ╚████║██║██╔╝ ██╗
70
- ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝╚═╝╚═╝ ╚═╝ v{version}
72
+ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═══╝╚═╝╚═╝ ╚═╝ v{{ version }}
71
73
 
72
74
  |
73
75
  | 🌎 Join our Community 🌎
@@ -80,12 +82,15 @@ _WELCOME_MESSAGE = """
80
82
  | https://docs.arize.com/phoenix
81
83
  |
82
84
  | 🚀 Phoenix Server 🚀
83
- | Phoenix UI: {ui_path}
85
+ | Phoenix UI: {{ ui_path }}
84
86
  | Log traces:
85
- | - gRPC: {grpc_path}
86
- | - HTTP: {http_path}
87
- | Storage: {storage}
88
- """
87
+ | - gRPC: {{ grpc_path }}
88
+ | - HTTP: {{ http_path }}
89
+ | Storage: {{ storage }}
90
+ {% if schema -%}
91
+ | - Schema: {{ schema }}
92
+ {% endif -%}
93
+ """)
89
94
 
90
95
  _EXPERIMENTAL_WARNING = """
91
96
  🚨 WARNING: Phoenix is running in experimental mode. 🚨
@@ -346,12 +351,13 @@ if __name__ == "__main__":
346
351
  )
347
352
  # Print information about the server
348
353
  root_path = urljoin(f"http://{host}:{port}", host_root_path)
349
- msg = _WELCOME_MESSAGE.format(
354
+ msg = _WELCOME_MESSAGE.render(
350
355
  version=version("arize-phoenix"),
351
356
  ui_path=root_path,
352
357
  grpc_path=f"http://{host}:{get_env_grpc_port()}",
353
358
  http_path=urljoin(root_path, "v1/traces"),
354
359
  storage=get_printable_db_url(db_connection_str),
360
+ schema=get_env_database_schema(),
355
361
  )
356
362
  if authentication_enabled:
357
363
  msg += _EXPERIMENTAL_WARNING.format(auth_enabled=True)