arize-phoenix 8.22.1__tar.gz → 8.23.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 (375) hide show
  1. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/PKG-INFO +22 -2
  2. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/README.md +21 -1
  3. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/config.py +17 -1
  4. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/__init__.py +2 -0
  5. arize_phoenix-8.23.0/src/phoenix/server/api/routers/v1/projects.py +383 -0
  6. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/app.py +10 -0
  7. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/main.py +6 -0
  8. arize_phoenix-8.23.0/src/phoenix/server/static/.vite/manifest.json +87 -0
  9. arize_phoenix-8.22.1/src/phoenix/server/static/assets/components-BAc4OPED.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/components-D8xtf7Q6.js +82 -82
  10. arize_phoenix-8.22.1/src/phoenix/server/static/assets/index-Du53xkjY.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/index-CGfsCafL.js +2 -2
  11. arize_phoenix-8.22.1/src/phoenix/server/static/assets/pages-Dz-gbBPF.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/pages-BiUq97Df.js +342 -339
  12. arize_phoenix-8.22.1/src/phoenix/server/static/assets/vendor-CEisxXSv.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/vendor-C3H3sezv.js +1 -1
  13. arize_phoenix-8.22.1/src/phoenix/server/static/assets/vendor-arizeai-BCTsSnvS.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/vendor-arizeai-DT8pwHfH.js +1 -1
  14. arize_phoenix-8.22.1/src/phoenix/server/static/assets/vendor-codemirror-DIWnRs_7.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/vendor-codemirror-DvimrGxD.js +1 -1
  15. arize_phoenix-8.22.1/src/phoenix/server/static/assets/vendor-recharts-Bame54mG.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/vendor-recharts-DuSQBcYW.js +1 -1
  16. arize_phoenix-8.22.1/src/phoenix/server/static/assets/vendor-shiki-Cc73E4D-.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/vendor-shiki-i05Hmswh.js +1 -1
  17. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/session/session.py +10 -0
  18. arize_phoenix-8.23.0/src/phoenix/version.py +1 -0
  19. arize_phoenix-8.22.1/src/phoenix/server/static/.vite/manifest.json +0 -87
  20. arize_phoenix-8.22.1/src/phoenix/version.py +0 -1
  21. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/.gitignore +0 -0
  22. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/IP_NOTICE +0 -0
  23. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/LICENSE +0 -0
  24. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/pyproject.toml +0 -0
  25. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/__init__.py +0 -0
  26. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/auth.py +0 -0
  27. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/core/__init__.py +0 -0
  28. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/core/embedding_dimension.py +0 -0
  29. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/core/model.py +0 -0
  30. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/core/model_schema.py +0 -0
  31. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/core/model_schema_adapter.py +0 -0
  32. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/datetime_utils.py +0 -0
  33. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/README.md +0 -0
  34. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/__init__.py +0 -0
  35. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/alembic.ini +0 -0
  36. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/bulk_inserter.py +0 -0
  37. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/engines.py +0 -0
  38. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/enums.py +0 -0
  39. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/facilitator.py +0 -0
  40. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/helpers.py +0 -0
  41. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/__init__.py +0 -0
  42. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/constants.py +0 -0
  43. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/dataset.py +0 -0
  44. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
  45. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/evaluation.py +0 -0
  46. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/helpers.py +0 -0
  47. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/span.py +0 -0
  48. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
  49. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
  50. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/types.py +0 -0
  51. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrate.py +0 -0
  52. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/__init__.py +0 -0
  53. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/data_migration_scripts/__init__.py +0 -0
  54. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +0 -0
  55. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/env.py +0 -0
  56. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/script.py.mako +0 -0
  57. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  58. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
  59. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +0 -0
  60. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/versions/bc8fea3c2bc8_add_prompt_tables.py +0 -0
  61. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
  62. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  63. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/models.py +0 -0
  64. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/types/__init__.py +0 -0
  65. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/types/identifier.py +0 -0
  66. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/types/model_provider.py +0 -0
  67. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/exceptions.py +0 -0
  68. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/__init__.py +0 -0
  69. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  70. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/evaluators/base.py +0 -0
  71. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
  72. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
  73. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
  74. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/functions.py +0 -0
  75. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/tracing.py +0 -0
  76. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/types.py +0 -0
  77. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/utils.py +0 -0
  78. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/inferences/__init__.py +0 -0
  79. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/inferences/errors.py +0 -0
  80. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/inferences/fixtures.py +0 -0
  81. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/inferences/inferences.py +0 -0
  82. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/inferences/schema.py +0 -0
  83. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/inferences/validation.py +0 -0
  84. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/logging/__init__.py +0 -0
  85. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/logging/_config.py +0 -0
  86. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/logging/_filter.py +0 -0
  87. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/logging/_formatter.py +0 -0
  88. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/README.md +0 -0
  89. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/__init__.py +0 -0
  90. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/binning.py +0 -0
  91. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/metrics.py +0 -0
  92. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/mixins.py +0 -0
  93. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  94. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/timeseries.py +0 -0
  95. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/wrappers.py +0 -0
  96. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/pointcloud/__init__.py +0 -0
  97. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/pointcloud/clustering.py +0 -0
  98. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
  99. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/pointcloud/projectors.py +0 -0
  100. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  101. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/py.typed +0 -0
  102. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/__init__.py +0 -0
  103. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/README.md +0 -0
  104. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/__init__.py +0 -0
  105. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/auth.py +0 -0
  106. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/context.py +0 -0
  107. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
  108. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
  109. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
  110. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  111. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
  112. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
  113. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
  114. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
  115. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
  116. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
  117. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
  118. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
  119. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
  120. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
  121. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
  122. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
  123. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
  124. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/num_child_spans.py +0 -0
  125. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/num_spans_per_trace.py +0 -0
  126. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
  127. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/prompt_version_sequence_number.py +0 -0
  128. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
  129. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/session_io.py +0 -0
  130. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/session_num_traces.py +0 -0
  131. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/session_num_traces_with_error.py +0 -0
  132. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/session_token_usages.py +0 -0
  133. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +0 -0
  134. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
  135. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/span_by_id.py +0 -0
  136. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
  137. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
  138. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
  139. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/table_fields.py +0 -0
  140. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
  141. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/trace_by_trace_ids.py +0 -0
  142. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/trace_root_spans.py +0 -0
  143. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/user_roles.py +0 -0
  144. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/users.py +0 -0
  145. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/exceptions.py +0 -0
  146. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
  147. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
  148. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/experiment_run_filters.py +0 -0
  149. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/playground_clients.py +0 -0
  150. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/playground_registry.py +0 -0
  151. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/playground_spans.py +0 -0
  152. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/prompts/__init__.py +0 -0
  153. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/prompts/conversions/__init__.py +0 -0
  154. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/prompts/conversions/anthropic.py +0 -0
  155. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/prompts/conversions/openai.py +0 -0
  156. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/prompts/models.py +0 -0
  157. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
  158. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
  159. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/ChatCompletionInput.py +0 -0
  160. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -0
  161. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  162. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  163. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  164. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  165. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
  166. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
  167. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  168. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  169. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  170. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  171. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
  172. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
  173. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  174. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
  175. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  176. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  177. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/GenerativeModelInput.py +0 -0
  178. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  179. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/InvocationParameters.py +0 -0
  180. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
  181. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
  182. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  183. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  184. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/ProjectSessionSort.py +0 -0
  185. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/PromptTemplateOptions.py +0 -0
  186. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/PromptVersionInput.py +0 -0
  187. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  188. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  189. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  190. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  191. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
  192. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
  193. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/interceptor.py +0 -0
  194. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
  195. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/api_key_mutations.py +0 -0
  196. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/chat_mutations.py +0 -0
  197. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
  198. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
  199. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
  200. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
  201. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/prompt_label_mutations.py +0 -0
  202. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/prompt_mutations.py +0 -0
  203. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/prompt_version_tag_mutations.py +0 -0
  204. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
  205. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
  206. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/trace_mutations.py +0 -0
  207. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
  208. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
  209. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/openapi/main.py +0 -0
  210. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/openapi/schema.py +0 -0
  211. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/queries.py +0 -0
  212. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/__init__.py +0 -0
  213. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/auth.py +0 -0
  214. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/embeddings.py +0 -0
  215. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/oauth2.py +0 -0
  216. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/utils.py +0 -0
  217. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/datasets.py +0 -0
  218. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/evaluations.py +0 -0
  219. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
  220. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
  221. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/experiments.py +0 -0
  222. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/models.py +0 -0
  223. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/prompts.py +0 -0
  224. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/spans.py +0 -0
  225. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/traces.py +0 -0
  226. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
  227. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/schema.py +0 -0
  228. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/subscriptions.py +0 -0
  229. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Annotation.py +0 -0
  230. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
  231. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
  232. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
  233. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/AuthMethod.py +0 -0
  234. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
  235. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +0 -0
  236. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Cluster.py +0 -0
  237. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  238. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  239. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Dataset.py +0 -0
  240. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  241. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  242. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  243. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  244. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Dimension.py +0 -0
  245. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  246. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  247. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
  248. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  249. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  250. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  251. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  252. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  253. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
  254. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  255. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Event.py +0 -0
  256. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  257. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  258. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Experiment.py +0 -0
  259. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  260. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
  261. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  262. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  263. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  264. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Functionality.py +0 -0
  265. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
  266. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/GenerativeProvider.py +0 -0
  267. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Identifier.py +0 -0
  268. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Inferences.py +0 -0
  269. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
  270. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  271. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/MimeType.py +0 -0
  272. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Model.py +0 -0
  273. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
  274. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  275. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Project.py +0 -0
  276. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ProjectSession.py +0 -0
  277. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Prompt.py +0 -0
  278. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/PromptLabel.py +0 -0
  279. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  280. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/PromptVersion.py +0 -0
  281. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/PromptVersionTag.py +0 -0
  282. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/PromptVersionTemplate.py +0 -0
  283. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ResponseFormat.py +0 -0
  284. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
  285. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  286. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Segments.py +0 -0
  287. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/SortDir.py +0 -0
  288. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Span.py +0 -0
  289. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
  290. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/SpanIOValue.py +0 -0
  291. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
  292. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  293. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/TokenUsage.py +0 -0
  294. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ToolDefinition.py +0 -0
  295. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Trace.py +0 -0
  296. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
  297. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  298. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/User.py +0 -0
  299. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
  300. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/UserRole.py +0 -0
  301. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  302. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  303. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/__init__.py +0 -0
  304. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/node.py +0 -0
  305. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/pagination.py +0 -0
  306. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/utils.py +0 -0
  307. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/bearer_auth.py +0 -0
  308. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/dml_event.py +0 -0
  309. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/dml_event_handler.py +0 -0
  310. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/email/__init__.py +0 -0
  311. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/email/sender.py +0 -0
  312. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/email/templates/__init__.py +0 -0
  313. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/email/templates/password_reset.html +0 -0
  314. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/email/types.py +0 -0
  315. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/grpc_server.py +0 -0
  316. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/jwt_store.py +0 -0
  317. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/oauth2.py +0 -0
  318. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/openapi/__init__.py +0 -0
  319. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/prometheus.py +0 -0
  320. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/rate_limiters.py +0 -0
  321. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  322. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  323. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  324. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  325. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  326. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  327. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  328. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  329. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/assets/vendor-Cg6lcjUC.css +0 -0
  330. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/assets/vendor-three-C5WAXd5r.js +0 -0
  331. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/favicon.ico +0 -0
  332. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/modernizr.js +0 -0
  333. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/telemetry.py +0 -0
  334. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/templates/__init__.py +0 -0
  335. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/templates/index.html +0 -0
  336. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/thread_server.py +0 -0
  337. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/types.py +0 -0
  338. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/services.py +0 -0
  339. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/session/__init__.py +0 -0
  340. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/session/client.py +0 -0
  341. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/session/data_extractor.py +0 -0
  342. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/session/evaluation.py +0 -0
  343. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/settings.py +0 -0
  344. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/__init__.py +0 -0
  345. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/attributes.py +0 -0
  346. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/dsl/README.md +0 -0
  347. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/dsl/__init__.py +0 -0
  348. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/dsl/filter.py +0 -0
  349. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/dsl/helpers.py +0 -0
  350. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/dsl/query.py +0 -0
  351. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/errors.py +0 -0
  352. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
  353. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/exporter.py +0 -0
  354. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/fixtures.py +0 -0
  355. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/otel.py +0 -0
  356. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/projects.py +0 -0
  357. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/schemas.py +0 -0
  358. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/span_evaluations.py +0 -0
  359. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/span_json_decoder.py +0 -0
  360. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/span_json_encoder.py +0 -0
  361. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/trace_dataset.py +0 -0
  362. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/utils.py +0 -0
  363. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/v1/__init__.py +0 -0
  364. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  365. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  366. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/__init__.py +0 -0
  367. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/client.py +0 -0
  368. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/deprecation.py +0 -0
  369. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/error_handling.py +0 -0
  370. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/json.py +0 -0
  371. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/logging.py +0 -0
  372. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/project.py +0 -0
  373. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/re.py +0 -0
  374. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/span_store.py +0 -0
  375. {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/template_formatters.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arize-phoenix
3
- Version: 8.22.1
3
+ Version: 8.23.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
@@ -141,7 +141,10 @@ Description-Content-Type: text/markdown
141
141
  <a target="_blank" href="https://arize-ai.slack.com/join/shared_invite/zt-11t1vbu4x-xkBIHmOREQnYnYDH1GDfCg?__hstc=259489365.a667dfafcfa0169c8aee4178d115dc81.1733501603539.1733501603539.1733501603539.1&__hssc=259489365.1.1733501603539&__hsfp=3822854628&submissionGuid=381a0676-8f38-437b-96f2-fc10875658df#/shared-invite/email">
142
142
  <img src="https://img.shields.io/static/v1?message=Community&logo=slack&labelColor=grey&color=blue&logoColor=white&label=%20"/>
143
143
  </a>
144
- <a target="_blank" href="https://twitter.com/ArizePhoenix">
144
+ <a target="_blank" href="https://bsky.app/profile/arize-phoenix.bsky.social">
145
+ <img src="https://img.shields.io/badge/-phoenix-blue.svg?color=blue&labelColor=gray&logo=bluesky">
146
+ </a>
147
+ <a target="_blank" href="https://x.com/ArizePhoenix">
145
148
  <img src="https://img.shields.io/badge/-ArizePhoenix-blue.svg?color=blue&labelColor=gray&logo=x">
146
149
  </a>
147
150
  <a target="_blank" href="https://pypi.org/project/arize-phoenix/">
@@ -156,6 +159,9 @@ Description-Content-Type: text/markdown
156
159
  <a target="_blank" href="https://hub.docker.com/r/arizephoenix/phoenix/tags">
157
160
  <img src="https://img.shields.io/docker/v/arizephoenix/phoenix?sort=semver&logo=docker&label=image&color=blue">
158
161
  </a>
162
+ <a target="_blank" href="https://github.com/Arize-ai/phoenix/tree/main/js/packages/phoenix-mcp">
163
+ <img src="https://badge.mcpx.dev?status=on" title="MCP Enabled"/>
164
+ </a>
159
165
  </p>
160
166
 
161
167
  Phoenix is an open-source AI observability platform designed for experimentation, evaluation, and troubleshooting. It provides:
@@ -181,6 +187,20 @@ pip install arize-phoenix
181
187
 
182
188
  Phoenix container images are available via [Docker Hub](https://hub.docker.com/r/arizephoenix/phoenix) and can be deployed using Docker or Kubernetes.
183
189
 
190
+ ## Packages
191
+
192
+ The `arize-phoenix` package includes the entire Phoenix platfom. However if you have deployed the Phoenix platform, there are light-weight Python sub-packages and TypeScript packages that can be used in conjunction with the platfrom.
193
+
194
+ ### Subpackages
195
+
196
+ | Package | Language | Description |
197
+ | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
198
+ | [arize-phoenix-otel](https://github.com/Arize-ai/phoenix/tree/main/packages/phoenix-otel) | Python [![PyPI Version](https://img.shields.io/pypi/v/arize-phoenix-otel)](https://pypi.org/project/arize-phoenix-otel/) | Provides a lightweight wrapper around OpenTelemetry primitives with Phoenix-aware defaults |
199
+ | [arize-phoenix-client](https://github.com/Arize-ai/phoenix/tree/main/packages/phoenix-client) | Python [![PyPI Version](https://img.shields.io/pypi/v/arize-phoenix-client)](https://pypi.org/project/arize-phoenix-client/) | Lightweight client for interacting with the Phoenix server via its OpenAPI REST interface |
200
+ | [arize-phoenix-evals](https://github.com/Arize-ai/phoenix/tree/main/packages/phoenix-evals) | Python [![PyPI Version](https://img.shields.io/pypi/v/arize-phoenix-evals)](https://pypi.org/project/arize-phoenix-evals/) | Tooling to evaluate LLM applications including RAG relevance, answer relevance, and more |
201
+ | [@arizeai/phoenix-client](https://github.com/Arize-ai/phoenix/tree/main/js/packages/phoenix-client) | JavaScript [![NPM Version](https://img.shields.io/npm/v/%40arizeai%2Fphoenix-client)](https://www.npmjs.com/package/@arizeai/phoenix-client) | Client for the Arize Phoenix API |
202
+ | [@arizeai/phoenix-mcp](https://github.com/Arize-ai/phoenix/tree/main/js/packages/phoenix-mcp) | JavaScript [![NPM Version](https://img.shields.io/npm/v/%40arizeai%2Fphoenix-mcp)](https://www.npmjs.com/package/@arizeai/phoenix-mcp) | MCP server implementation for Arize Phoenix providing unified interface to Phoenix's capabilities |
203
+
184
204
  ## Tracing Integrations
185
205
 
186
206
  Phoenix is built on top of OpenTelemetry and is vendor, language, and framework agnostic. For details about tracing integrations and example applications, see the [OpenInference](https://github.com/Arize-ai/openinference) project.
@@ -10,7 +10,10 @@
10
10
  <a target="_blank" href="https://arize-ai.slack.com/join/shared_invite/zt-11t1vbu4x-xkBIHmOREQnYnYDH1GDfCg?__hstc=259489365.a667dfafcfa0169c8aee4178d115dc81.1733501603539.1733501603539.1733501603539.1&__hssc=259489365.1.1733501603539&__hsfp=3822854628&submissionGuid=381a0676-8f38-437b-96f2-fc10875658df#/shared-invite/email">
11
11
  <img src="https://img.shields.io/static/v1?message=Community&logo=slack&labelColor=grey&color=blue&logoColor=white&label=%20"/>
12
12
  </a>
13
- <a target="_blank" href="https://twitter.com/ArizePhoenix">
13
+ <a target="_blank" href="https://bsky.app/profile/arize-phoenix.bsky.social">
14
+ <img src="https://img.shields.io/badge/-phoenix-blue.svg?color=blue&labelColor=gray&logo=bluesky">
15
+ </a>
16
+ <a target="_blank" href="https://x.com/ArizePhoenix">
14
17
  <img src="https://img.shields.io/badge/-ArizePhoenix-blue.svg?color=blue&labelColor=gray&logo=x">
15
18
  </a>
16
19
  <a target="_blank" href="https://pypi.org/project/arize-phoenix/">
@@ -25,6 +28,9 @@
25
28
  <a target="_blank" href="https://hub.docker.com/r/arizephoenix/phoenix/tags">
26
29
  <img src="https://img.shields.io/docker/v/arizephoenix/phoenix?sort=semver&logo=docker&label=image&color=blue">
27
30
  </a>
31
+ <a target="_blank" href="https://github.com/Arize-ai/phoenix/tree/main/js/packages/phoenix-mcp">
32
+ <img src="https://badge.mcpx.dev?status=on" title="MCP Enabled"/>
33
+ </a>
28
34
  </p>
29
35
 
30
36
  Phoenix is an open-source AI observability platform designed for experimentation, evaluation, and troubleshooting. It provides:
@@ -50,6 +56,20 @@ pip install arize-phoenix
50
56
 
51
57
  Phoenix container images are available via [Docker Hub](https://hub.docker.com/r/arizephoenix/phoenix) and can be deployed using Docker or Kubernetes.
52
58
 
59
+ ## Packages
60
+
61
+ The `arize-phoenix` package includes the entire Phoenix platfom. However if you have deployed the Phoenix platform, there are light-weight Python sub-packages and TypeScript packages that can be used in conjunction with the platfrom.
62
+
63
+ ### Subpackages
64
+
65
+ | Package | Language | Description |
66
+ | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
67
+ | [arize-phoenix-otel](https://github.com/Arize-ai/phoenix/tree/main/packages/phoenix-otel) | Python [![PyPI Version](https://img.shields.io/pypi/v/arize-phoenix-otel)](https://pypi.org/project/arize-phoenix-otel/) | Provides a lightweight wrapper around OpenTelemetry primitives with Phoenix-aware defaults |
68
+ | [arize-phoenix-client](https://github.com/Arize-ai/phoenix/tree/main/packages/phoenix-client) | Python [![PyPI Version](https://img.shields.io/pypi/v/arize-phoenix-client)](https://pypi.org/project/arize-phoenix-client/) | Lightweight client for interacting with the Phoenix server via its OpenAPI REST interface |
69
+ | [arize-phoenix-evals](https://github.com/Arize-ai/phoenix/tree/main/packages/phoenix-evals) | Python [![PyPI Version](https://img.shields.io/pypi/v/arize-phoenix-evals)](https://pypi.org/project/arize-phoenix-evals/) | Tooling to evaluate LLM applications including RAG relevance, answer relevance, and more |
70
+ | [@arizeai/phoenix-client](https://github.com/Arize-ai/phoenix/tree/main/js/packages/phoenix-client) | JavaScript [![NPM Version](https://img.shields.io/npm/v/%40arizeai%2Fphoenix-client)](https://www.npmjs.com/package/@arizeai/phoenix-client) | Client for the Arize Phoenix API |
71
+ | [@arizeai/phoenix-mcp](https://github.com/Arize-ai/phoenix/tree/main/js/packages/phoenix-mcp) | JavaScript [![NPM Version](https://img.shields.io/npm/v/%40arizeai%2Fphoenix-mcp)](https://www.npmjs.com/package/@arizeai/phoenix-mcp) | MCP server implementation for Arize Phoenix providing unified interface to Phoenix's capabilities |
72
+
53
73
  ## Tracing Integrations
54
74
 
55
75
  Phoenix is built on top of OpenTelemetry and is vendor, language, and framework agnostic. For details about tracing integrations and example applications, see the [OpenInference](https://github.com/Arize-ai/openinference) project.
@@ -209,7 +209,11 @@ ENV_PHOENIX_SMTP_VALIDATE_CERTS = "PHOENIX_SMTP_VALIDATE_CERTS"
209
209
  """
210
210
  Whether to validate SMTP server certificates. Defaults to true.
211
211
  """
212
-
212
+ ENV_PHOENIX_ALLOWED_ORIGINS = "PHOENIX_ALLOWED_ORIGINS"
213
+ """
214
+ List of allowed origins for CORS. Defaults to None.
215
+ When set to None, CORS is disabled.
216
+ """
213
217
  # API extension settings
214
218
  ENV_PHOENIX_FASTAPI_MIDDLEWARE_PATHS = "PHOENIX_FASTAPI_MIDDLEWARE_PATHS"
215
219
  ENV_PHOENIX_GQL_EXTENSION_PATHS = "PHOENIX_GQL_EXTENSION_PATHS"
@@ -1049,4 +1053,16 @@ def get_env_disable_migrations() -> bool:
1049
1053
  DEFAULT_PROJECT_NAME = "default"
1050
1054
  _KUBERNETES_PHOENIX_PORT_PATTERN = re.compile(r"^tcp://\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}:\d+$")
1051
1055
 
1056
+
1057
+ def get_env_allowed_origins() -> Optional[list[str]]:
1058
+ """
1059
+ Gets the value of the PHOENIX_ALLOWED_ORIGINS environment variable.
1060
+ """
1061
+ allowed_origins = getenv(ENV_PHOENIX_ALLOWED_ORIGINS)
1062
+ if allowed_origins is None:
1063
+ return None
1064
+
1065
+ return allowed_origins.split(",")
1066
+
1067
+
1052
1068
  SKLEARN_VERSION = cast(tuple[int, int], tuple(map(int, version("scikit-learn").split(".", 2)[:2])))
@@ -9,6 +9,7 @@ from .evaluations import router as evaluations_router
9
9
  from .experiment_evaluations import router as experiment_evaluations_router
10
10
  from .experiment_runs import router as experiment_runs_router
11
11
  from .experiments import router as experiments_router
12
+ from .projects import router as projects_router
12
13
  from .prompts import router as prompts_router
13
14
  from .spans import router as spans_router
14
15
  from .traces import router as traces_router
@@ -63,4 +64,5 @@ def create_v1_router(authentication_enabled: bool) -> APIRouter:
63
64
  router.include_router(spans_router)
64
65
  router.include_router(evaluations_router)
65
66
  router.include_router(prompts_router)
67
+ router.include_router(projects_router)
66
68
  return router
@@ -0,0 +1,383 @@
1
+ from typing import Optional
2
+
3
+ from fastapi import APIRouter, HTTPException, Path, Query
4
+ from sqlalchemy import select
5
+ from starlette.requests import Request
6
+ from starlette.status import (
7
+ HTTP_204_NO_CONTENT,
8
+ HTTP_403_FORBIDDEN,
9
+ HTTP_404_NOT_FOUND,
10
+ HTTP_422_UNPROCESSABLE_ENTITY,
11
+ )
12
+ from strawberry.relay import GlobalID
13
+
14
+ from phoenix.config import DEFAULT_PROJECT_NAME
15
+ from phoenix.db import models
16
+ from phoenix.db.enums import UserRole
17
+ from phoenix.server.api.routers.v1.models import V1RoutesBaseModel
18
+ from phoenix.server.api.routers.v1.utils import (
19
+ PaginatedResponseBody,
20
+ ResponseBody,
21
+ add_errors_to_responses,
22
+ )
23
+ from phoenix.server.api.types.node import from_global_id_with_expected_type
24
+ from phoenix.server.api.types.Project import Project as ProjectNodeType
25
+
26
+ router = APIRouter(tags=["projects"])
27
+
28
+
29
+ class ProjectData(V1RoutesBaseModel):
30
+ name: str
31
+ description: Optional[str] = None
32
+
33
+
34
+ class Project(ProjectData):
35
+ id: str
36
+
37
+
38
+ class GetProjectsResponseBody(PaginatedResponseBody[Project]):
39
+ pass
40
+
41
+
42
+ class GetProjectResponseBody(ResponseBody[Project]):
43
+ pass
44
+
45
+
46
+ class CreateProjectRequestBody(V1RoutesBaseModel):
47
+ project: ProjectData
48
+
49
+
50
+ class CreateProjectResponseBody(ResponseBody[Project]):
51
+ pass
52
+
53
+
54
+ class UpdateProjectRequestBody(V1RoutesBaseModel):
55
+ project: ProjectData
56
+
57
+
58
+ class UpdateProjectResponseBody(ResponseBody[Project]):
59
+ pass
60
+
61
+
62
+ @router.get(
63
+ "/projects",
64
+ operation_id="getProjects",
65
+ summary="List all projects", # noqa: E501
66
+ description="Retrieve a paginated list of all projects in the system.", # noqa: E501
67
+ response_description="A list of projects with pagination information", # noqa: E501
68
+ responses=add_errors_to_responses(
69
+ [
70
+ HTTP_422_UNPROCESSABLE_ENTITY,
71
+ ]
72
+ ),
73
+ )
74
+ async def get_projects(
75
+ request: Request,
76
+ cursor: Optional[str] = Query(
77
+ default=None,
78
+ description="Cursor for pagination (base64-encoded project ID)",
79
+ ),
80
+ limit: int = Query(
81
+ default=100, description="The max number of projects to return at a time.", gt=0
82
+ ),
83
+ ) -> GetProjectsResponseBody:
84
+ """
85
+ Retrieve a paginated list of all projects in the system.
86
+
87
+ Args:
88
+ request (Request): The FastAPI request object.
89
+ cursor (Optional[str]): Pagination cursor (base64-encoded project ID).
90
+ limit (int): Maximum number of projects to return per request.
91
+
92
+ Returns:
93
+ GetProjectsResponseBody: Response containing a list of projects and pagination information.
94
+
95
+ Raises:
96
+ HTTPException: If the cursor format is invalid.
97
+ """ # noqa: E501
98
+ async with request.app.state.db() as session:
99
+ stmt = select(models.Project).order_by(models.Project.id.desc())
100
+
101
+ if cursor:
102
+ try:
103
+ cursor_id = GlobalID.from_id(cursor).node_id
104
+ stmt = stmt.filter(models.Project.id <= int(cursor_id))
105
+ except ValueError:
106
+ raise HTTPException(
107
+ detail=f"Invalid cursor format: {cursor}",
108
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
109
+ )
110
+
111
+ stmt = stmt.limit(limit + 1)
112
+ result = await session.execute(stmt)
113
+ orm_projects = result.scalars().all()
114
+
115
+ if not orm_projects:
116
+ return GetProjectsResponseBody(next_cursor=None, data=[])
117
+
118
+ next_cursor = None
119
+ if len(orm_projects) == limit + 1:
120
+ last_project = orm_projects[-1]
121
+ next_cursor = str(GlobalID(ProjectNodeType.__name__, str(last_project.id)))
122
+ orm_projects = orm_projects[:-1]
123
+
124
+ projects = [_project_from_orm_project(orm_project) for orm_project in orm_projects]
125
+ return GetProjectsResponseBody(next_cursor=next_cursor, data=projects)
126
+
127
+
128
+ @router.get(
129
+ "/projects/{project_id}",
130
+ operation_id="getProject",
131
+ summary="Get project by ID", # noqa: E501
132
+ description="Retrieve a specific project using its unique identifier.", # noqa: E501
133
+ response_description="The requested project", # noqa: E501
134
+ responses=add_errors_to_responses(
135
+ [
136
+ HTTP_404_NOT_FOUND,
137
+ HTTP_422_UNPROCESSABLE_ENTITY,
138
+ ]
139
+ ),
140
+ )
141
+ async def get_project(
142
+ request: Request,
143
+ project_id: str = Path(description="The ID of the project."),
144
+ ) -> GetProjectResponseBody:
145
+ """
146
+ Retrieve a specific project by its ID.
147
+
148
+ Args:
149
+ request (Request): The FastAPI request object.
150
+ project_id (str): The ID of the project to retrieve.
151
+
152
+ Returns:
153
+ GetProjectResponseBody: Response containing the requested project.
154
+
155
+ Raises:
156
+ HTTPException: If the project ID is invalid or the project is not found.
157
+ """ # noqa: E501
158
+ async with request.app.state.db() as session:
159
+ try:
160
+ id_ = from_global_id_with_expected_type(
161
+ GlobalID.from_id(project_id),
162
+ ProjectNodeType.__name__,
163
+ )
164
+ project = await session.get(models.Project, id_)
165
+ except ValueError:
166
+ raise HTTPException(
167
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
168
+ detail=f"Invalid project ID format: {project_id}",
169
+ )
170
+
171
+ if project is None:
172
+ raise HTTPException(
173
+ status_code=HTTP_404_NOT_FOUND,
174
+ detail=f"Project with ID {project_id} not found",
175
+ )
176
+
177
+ data = _project_from_orm_project(project)
178
+ return GetProjectResponseBody(data=data)
179
+
180
+
181
+ @router.post(
182
+ "/projects",
183
+ operation_id="createProject",
184
+ summary="Create a new project", # noqa: E501
185
+ description="Create a new project with the specified configuration.", # noqa: E501
186
+ response_description="The newly created project", # noqa: E501
187
+ responses=add_errors_to_responses(
188
+ [
189
+ HTTP_422_UNPROCESSABLE_ENTITY,
190
+ ]
191
+ ),
192
+ )
193
+ async def create_project(
194
+ request: Request,
195
+ request_body: CreateProjectRequestBody,
196
+ ) -> CreateProjectResponseBody:
197
+ """
198
+ Create a new project.
199
+
200
+ Args:
201
+ request (Request): The FastAPI request object.
202
+ request_body (CreateProjectRequestBody): The request body containing project data.
203
+
204
+ Returns:
205
+ CreateProjectResponseBody: Response containing the created project.
206
+
207
+ Raises:
208
+ HTTPException: If any validation error occurs.
209
+ """
210
+ project = request_body.project
211
+ async with request.app.state.db() as session:
212
+ project_orm = models.Project(
213
+ name=project.name,
214
+ description=project.description,
215
+ )
216
+ session.add(project_orm)
217
+ await session.flush()
218
+ data = _project_from_orm_project(project_orm)
219
+ return CreateProjectResponseBody(data=data)
220
+
221
+
222
+ @router.put(
223
+ "/projects/{project_id}",
224
+ operation_id="updateProject",
225
+ summary="Update a project", # noqa: E501
226
+ description="Update an existing project with new configuration. Project names cannot be changed.", # noqa: E501
227
+ response_description="The updated project", # noqa: E501
228
+ responses=add_errors_to_responses(
229
+ [
230
+ HTTP_403_FORBIDDEN,
231
+ HTTP_404_NOT_FOUND,
232
+ HTTP_422_UNPROCESSABLE_ENTITY,
233
+ ]
234
+ ),
235
+ )
236
+ async def update_project(
237
+ request: Request,
238
+ request_body: UpdateProjectRequestBody,
239
+ project_id: str = Path(description="The ID of the project to update."),
240
+ ) -> UpdateProjectResponseBody:
241
+ """
242
+ Update an existing project.
243
+
244
+ Args:
245
+ request (Request): The FastAPI request object.
246
+ request_body (UpdateProjectRequestBody): The request body containing updated project data.
247
+ project_id (str): The ID of the project to update.
248
+
249
+ Returns:
250
+ UpdateProjectResponseBody: Response containing the updated project.
251
+
252
+ Raises:
253
+ HTTPException: If the project ID is invalid, the project is not found, or the name is changed.
254
+ """ # noqa: E501
255
+ if request.app.state.authentication_enabled:
256
+ async with request.app.state.db() as session:
257
+ # Check if the user is an admin
258
+ stmt = (
259
+ select(models.UserRole.name)
260
+ .join(models.User)
261
+ .where(models.User.id == int(request.user.identity))
262
+ )
263
+ role_name = await session.scalar(stmt)
264
+ if role_name != UserRole.ADMIN.value:
265
+ raise HTTPException(
266
+ status_code=HTTP_403_FORBIDDEN,
267
+ detail="Only admins can update projects",
268
+ )
269
+ async with request.app.state.db() as session:
270
+ try:
271
+ id_ = from_global_id_with_expected_type(
272
+ GlobalID.from_id(project_id),
273
+ ProjectNodeType.__name__,
274
+ )
275
+ project_orm = await session.get(models.Project, id_)
276
+ except ValueError:
277
+ raise HTTPException(
278
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
279
+ detail=f"Invalid project ID format: {project_id}",
280
+ )
281
+
282
+ if project_orm is None:
283
+ raise HTTPException(
284
+ status_code=HTTP_404_NOT_FOUND,
285
+ detail=f"Project with ID {project_id} not found",
286
+ )
287
+
288
+ # Prevent changing the project name
289
+ if project_orm.name != request_body.project.name:
290
+ raise HTTPException(
291
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
292
+ detail="Project names cannot be changed",
293
+ )
294
+
295
+ # Only update the description
296
+ project_orm.description = request_body.project.description
297
+
298
+ data = _project_from_orm_project(project_orm)
299
+ return UpdateProjectResponseBody(data=data)
300
+
301
+
302
+ @router.delete(
303
+ "/projects/{project_id}",
304
+ operation_id="deleteProject",
305
+ summary="Delete a project", # noqa: E501
306
+ description="Delete an existing project and all its associated data.", # noqa: E501
307
+ response_description="No content returned on successful deletion", # noqa: E501
308
+ status_code=HTTP_204_NO_CONTENT,
309
+ responses=add_errors_to_responses(
310
+ [
311
+ HTTP_403_FORBIDDEN,
312
+ HTTP_404_NOT_FOUND,
313
+ HTTP_422_UNPROCESSABLE_ENTITY,
314
+ ]
315
+ ),
316
+ )
317
+ async def delete_project(
318
+ request: Request,
319
+ project_id: str = Path(description="The ID of the project to delete."),
320
+ ) -> None:
321
+ """
322
+ Delete an existing project.
323
+
324
+ Args:
325
+ request (Request): The FastAPI request object.
326
+ project_id (str): The ID of the project to delete.
327
+
328
+ Returns:
329
+ None: Returns a 204 No Content response on success.
330
+
331
+ Raises:
332
+ HTTPException: If the project ID is invalid, the project is not found, or it's the default project.
333
+ """ # noqa: E501
334
+ if request.app.state.authentication_enabled:
335
+ async with request.app.state.db() as session:
336
+ # Check if the user is an admin
337
+ stmt = (
338
+ select(models.UserRole.name)
339
+ .join(models.User)
340
+ .where(models.User.id == int(request.user.identity))
341
+ )
342
+ role_name = await session.scalar(stmt)
343
+ if role_name != UserRole.ADMIN.value:
344
+ raise HTTPException(
345
+ status_code=HTTP_403_FORBIDDEN,
346
+ detail="Only admins can delete projects",
347
+ )
348
+ async with request.app.state.db() as session:
349
+ try:
350
+ id_ = from_global_id_with_expected_type(
351
+ GlobalID.from_id(project_id),
352
+ ProjectNodeType.__name__,
353
+ )
354
+ project = await session.get(models.Project, id_)
355
+ except ValueError:
356
+ raise HTTPException(
357
+ status_code=HTTP_422_UNPROCESSABLE_ENTITY,
358
+ detail=f"Invalid project ID format: {project_id}",
359
+ )
360
+
361
+ if project is None:
362
+ raise HTTPException(
363
+ status_code=HTTP_404_NOT_FOUND,
364
+ detail=f"Project with ID {project_id} not found",
365
+ )
366
+
367
+ # The default project must not be deleted - it's forbidden
368
+ if project.name == DEFAULT_PROJECT_NAME:
369
+ raise HTTPException(
370
+ status_code=HTTP_403_FORBIDDEN,
371
+ detail="The default project cannot be deleted",
372
+ )
373
+
374
+ await session.delete(project)
375
+ return None
376
+
377
+
378
+ def _project_from_orm_project(orm_project: models.Project) -> Project:
379
+ return Project(
380
+ id=str(GlobalID(ProjectNodeType.__name__, str(orm_project.id))),
381
+ name=orm_project.name,
382
+ description=orm_project.description,
383
+ )
@@ -24,6 +24,7 @@ from urllib.parse import urlparse
24
24
 
25
25
  import strawberry
26
26
  from fastapi import APIRouter, Depends, FastAPI
27
+ from fastapi.middleware.cors import CORSMiddleware
27
28
  from fastapi.middleware.gzip import GZipMiddleware
28
29
  from fastapi.utils import is_body_allowed_for_status_code
29
30
  from grpc.aio import ServerInterceptor
@@ -765,6 +766,7 @@ def create_app(
765
766
  email_sender: Optional[EmailSender] = None,
766
767
  oauth2_client_configs: Optional[list[OAuth2ClientConfig]] = None,
767
768
  bulk_inserter_factory: Optional[Callable[..., BulkInserter]] = None,
769
+ allowed_origins: Optional[list[str]] = None,
768
770
  ) -> FastAPI:
769
771
  if model.embedding_dimensions:
770
772
  try:
@@ -948,6 +950,14 @@ def create_app(
948
950
  FastAPIInstrumentor().instrument(tracer_provider=tracer_provider)
949
951
  FastAPIInstrumentor.instrument_app(app, tracer_provider=tracer_provider)
950
952
  shutdown_callbacks_list.append(FastAPIInstrumentor().uninstrument)
953
+ if allowed_origins:
954
+ app.add_middleware(
955
+ CORSMiddleware,
956
+ allow_origins=allowed_origins,
957
+ allow_credentials=True,
958
+ allow_methods=["*"],
959
+ allow_headers=["*"],
960
+ )
951
961
  return app
952
962
 
953
963
 
@@ -16,6 +16,7 @@ import phoenix.trace.v1 as pb
16
16
  from phoenix.config import (
17
17
  EXPORT_DIR,
18
18
  get_env_access_token_expiry,
19
+ get_env_allowed_origins,
19
20
  get_env_auth_settings,
20
21
  get_env_database_connection_str,
21
22
  get_env_database_schema,
@@ -98,6 +99,7 @@ _WELCOME_MESSAGE = Environment(loader=BaseLoader()).from_string("""
98
99
  | Phoenix UI: {{ ui_path }}
99
100
  | Authentication: {{ auth_enabled }}
100
101
  | Websockets: {{ websockets_enabled }}
102
+ {%- if allowed_origins %}\n| Allowed Origins: {{ allowed_origins }}{% endif %}
101
103
  | Log traces:
102
104
  | - gRPC: {{ grpc_path }}
103
105
  | - HTTP: {{ http_path }}
@@ -359,6 +361,8 @@ def main() -> None:
359
361
  if enable_websockets is None:
360
362
  enable_websockets = True
361
363
 
364
+ allowed_origins = get_env_allowed_origins()
365
+
362
366
  # Print information about the server
363
367
  root_path = urljoin(f"http://{host}:{port}", host_root_path)
364
368
  msg = _WELCOME_MESSAGE.render(
@@ -370,6 +374,7 @@ def main() -> None:
370
374
  schema=get_env_database_schema(),
371
375
  auth_enabled=authentication_enabled,
372
376
  websockets_enabled=enable_websockets,
377
+ allowed_origins=allowed_origins,
373
378
  )
374
379
  if sys.platform.startswith("win"):
375
380
  msg = codecs.encode(msg, "ascii", errors="ignore").decode("ascii").strip()
@@ -419,6 +424,7 @@ def main() -> None:
419
424
  scaffolder_config=scaffolder_config,
420
425
  email_sender=email_sender,
421
426
  oauth2_client_configs=get_env_oauth2_settings(),
427
+ allowed_origins=allowed_origins,
422
428
  )
423
429
  server = Server(config=Config(app, host=host, port=port, root_path=host_root_path)) # type: ignore
424
430
  Thread(target=_write_pid_file_when_ready, args=(server,), daemon=True).start()