arize-phoenix 11.4.0__tar.gz → 11.5.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 (445) hide show
  1. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/PKG-INFO +2 -2
  2. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/config.py +51 -2
  3. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/auth.py +1 -1
  4. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/queries.py +34 -22
  5. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/v1/annotation_configs.py +4 -1
  6. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/v1/datasets.py +3 -1
  7. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/v1/evaluations.py +3 -1
  8. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +3 -1
  9. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/v1/experiments.py +3 -1
  10. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/v1/projects.py +4 -1
  11. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/v1/prompts.py +4 -1
  12. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/v1/spans.py +4 -1
  13. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/v1/traces.py +4 -1
  14. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/v1/users.py +2 -2
  15. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/app.py +41 -2
  16. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/authorization.py +9 -0
  17. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/bearer_auth.py +18 -15
  18. arize_phoenix-11.5.0/src/phoenix/server/daemons/db_disk_usage_monitor.py +209 -0
  19. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/email/sender.py +25 -0
  20. arize_phoenix-11.5.0/src/phoenix/server/email/templates/db_disk_usage_notification.html +16 -0
  21. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/email/types.py +11 -0
  22. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/grpc_server.py +3 -3
  23. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/prometheus.py +22 -0
  24. arize_phoenix-11.5.0/src/phoenix/server/static/.vite/manifest.json +87 -0
  25. arize_phoenix-11.4.0/src/phoenix/server/static/assets/components-CVcMbu2U.js → arize_phoenix-11.5.0/src/phoenix/server/static/assets/components-Bwf6zNbg.js +175 -176
  26. arize_phoenix-11.4.0/src/phoenix/server/static/assets/index-Dz7I-Hpn.js → arize_phoenix-11.5.0/src/phoenix/server/static/assets/index-Bfg9uQ43.js +2 -2
  27. arize_phoenix-11.4.0/src/phoenix/server/static/assets/pages-QK2o2V7x.js → arize_phoenix-11.5.0/src/phoenix/server/static/assets/pages-BCR8hW_l.js +426 -421
  28. arize_phoenix-11.4.0/src/phoenix/server/static/assets/vendor-pg5m6BWE.js → arize_phoenix-11.5.0/src/phoenix/server/static/assets/vendor-DRWIRkSJ.js +1 -1
  29. arize_phoenix-11.4.0/src/phoenix/server/static/assets/vendor-arizeai-BwMsgSAG.js → arize_phoenix-11.5.0/src/phoenix/server/static/assets/vendor-arizeai-DUhQaeau.js +1 -1
  30. arize_phoenix-11.4.0/src/phoenix/server/static/assets/vendor-codemirror-BwSDEu2g.js → arize_phoenix-11.5.0/src/phoenix/server/static/assets/vendor-codemirror-D_6Q6Auv.js +1 -1
  31. arize_phoenix-11.4.0/src/phoenix/server/static/assets/vendor-recharts-SW3HwAtG.js → arize_phoenix-11.5.0/src/phoenix/server/static/assets/vendor-recharts-BNBwj7vz.js +1 -1
  32. arize_phoenix-11.4.0/src/phoenix/server/static/assets/vendor-shiki-BsdYoDvs.js → arize_phoenix-11.5.0/src/phoenix/server/static/assets/vendor-shiki-k1qj_XjP.js +1 -1
  33. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/types.py +7 -0
  34. arize_phoenix-11.5.0/src/phoenix/version.py +1 -0
  35. arize_phoenix-11.4.0/src/phoenix/server/static/.vite/manifest.json +0 -87
  36. arize_phoenix-11.4.0/src/phoenix/version.py +0 -1
  37. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/.gitignore +0 -0
  38. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/IP_NOTICE +0 -0
  39. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/LICENSE +0 -0
  40. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/README.md +0 -0
  41. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/pyproject.toml +1 -1
  42. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/__init__.py +0 -0
  43. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/auth.py +0 -0
  44. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/core/__init__.py +0 -0
  45. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/core/embedding_dimension.py +0 -0
  46. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/core/model.py +0 -0
  47. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/core/model_schema.py +0 -0
  48. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/core/model_schema_adapter.py +0 -0
  49. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/datetime_utils.py +0 -0
  50. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/README.md +0 -0
  51. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/__init__.py +0 -0
  52. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/alembic.ini +0 -0
  53. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/bulk_inserter.py +0 -0
  54. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/constants.py +0 -0
  55. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/engines.py +0 -0
  56. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/enums.py +0 -0
  57. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/facilitator.py +0 -0
  58. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/helpers.py +0 -0
  59. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/insertion/__init__.py +0 -0
  60. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/insertion/constants.py +0 -0
  61. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/insertion/dataset.py +0 -0
  62. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
  63. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/insertion/evaluation.py +0 -0
  64. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/insertion/helpers.py +0 -0
  65. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/insertion/span.py +0 -0
  66. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
  67. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
  68. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/insertion/types.py +0 -0
  69. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrate.py +0 -0
  70. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/__init__.py +0 -0
  71. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/data_migration_scripts/__init__.py +0 -0
  72. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +0 -0
  73. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/env.py +0 -0
  74. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/script.py.mako +0 -0
  75. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  76. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/versions/2f9d1a65945f_annotation_config_migration.py +0 -0
  77. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
  78. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +0 -0
  79. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/versions/6a88424799fe_update_users_with_auth_method.py +0 -0
  80. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/versions/8a3764fe7f1a_change_jsonb_to_json_for_prompts.py +0 -0
  81. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/versions/a20694b15f82_cost.py +0 -0
  82. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/versions/bb8139330879_create_project_trace_retention_policies_table.py +0 -0
  83. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/versions/bc8fea3c2bc8_add_prompt_tables.py +0 -0
  84. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
  85. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  86. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/models.py +0 -0
  87. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/pg_config.py +0 -0
  88. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/types/__init__.py +0 -0
  89. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/types/annotation_configs.py +0 -0
  90. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/types/db_models.py +0 -0
  91. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/types/identifier.py +0 -0
  92. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/types/model_provider.py +0 -0
  93. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/types/token_price_customization.py +0 -0
  94. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/db/types/trace_retention.py +0 -0
  95. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/exceptions.py +0 -0
  96. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/experiments/__init__.py +0 -0
  97. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  98. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/experiments/evaluators/base.py +0 -0
  99. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
  100. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
  101. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
  102. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/experiments/functions.py +0 -0
  103. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/experiments/tracing.py +0 -0
  104. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/experiments/types.py +0 -0
  105. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/experiments/utils.py +0 -0
  106. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/inferences/__init__.py +0 -0
  107. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/inferences/errors.py +0 -0
  108. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/inferences/fixtures.py +0 -0
  109. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/inferences/inferences.py +0 -0
  110. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/inferences/schema.py +0 -0
  111. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/inferences/validation.py +0 -0
  112. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/logging/__init__.py +0 -0
  113. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/logging/_config.py +0 -0
  114. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/logging/_filter.py +0 -0
  115. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/logging/_formatter.py +0 -0
  116. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/metrics/README.md +0 -0
  117. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/metrics/__init__.py +0 -0
  118. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/metrics/binning.py +0 -0
  119. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/metrics/metrics.py +0 -0
  120. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/metrics/mixins.py +0 -0
  121. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  122. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/metrics/timeseries.py +0 -0
  123. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/metrics/wrappers.py +0 -0
  124. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/pointcloud/__init__.py +0 -0
  125. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/pointcloud/clustering.py +0 -0
  126. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
  127. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/pointcloud/projectors.py +0 -0
  128. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  129. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/py.typed +0 -0
  130. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/__init__.py +0 -0
  131. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/README.md +0 -0
  132. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/__init__.py +0 -0
  133. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/context.py +0 -0
  134. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
  135. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/annotation_configs_by_project.py +0 -0
  136. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
  137. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
  138. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  139. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
  140. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
  141. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
  142. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
  143. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
  144. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
  145. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
  146. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
  147. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
  148. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
  149. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
  150. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/last_used_times_by_generative_model_id.py +0 -0
  151. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
  152. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
  153. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/num_child_spans.py +0 -0
  154. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/num_spans_per_trace.py +0 -0
  155. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
  156. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/project_ids_by_trace_retention_policy_id.py +0 -0
  157. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/prompt_version_sequence_number.py +0 -0
  158. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
  159. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/session_io.py +0 -0
  160. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/session_num_traces.py +0 -0
  161. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/session_num_traces_with_error.py +0 -0
  162. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/session_token_usages.py +0 -0
  163. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +0 -0
  164. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
  165. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_by_id.py +0 -0
  166. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_cost_by_span.py +0 -0
  167. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_generative_model.py +0 -0
  168. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_project_session.py +0 -0
  169. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_span.py +0 -0
  170. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_trace.py +0 -0
  171. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_cost_details_by_span_cost.py +0 -0
  172. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_experiment.py +0 -0
  173. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_experiment_run.py +0 -0
  174. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_generative_model.py +0 -0
  175. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_project.py +0 -0
  176. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_project_session.py +0 -0
  177. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_trace.py +0 -0
  178. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_costs.py +0 -0
  179. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
  180. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
  181. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
  182. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/table_fields.py +0 -0
  183. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
  184. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/trace_by_trace_ids.py +0 -0
  185. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/trace_retention_policy_id_by_project_id.py +0 -0
  186. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/trace_root_spans.py +0 -0
  187. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/types.py +0 -0
  188. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/user_roles.py +0 -0
  189. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/dataloaders/users.py +0 -0
  190. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/exceptions.py +0 -0
  191. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
  192. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/helpers/annotations.py +0 -0
  193. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
  194. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/helpers/experiment_run_filters.py +0 -0
  195. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/helpers/playground_clients.py +0 -0
  196. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/helpers/playground_registry.py +0 -0
  197. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/helpers/playground_spans.py +0 -0
  198. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/helpers/prompts/__init__.py +0 -0
  199. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/helpers/prompts/conversions/__init__.py +0 -0
  200. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/helpers/prompts/conversions/anthropic.py +0 -0
  201. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/helpers/prompts/conversions/aws.py +0 -0
  202. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/helpers/prompts/conversions/openai.py +0 -0
  203. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/helpers/prompts/models.py +0 -0
  204. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
  205. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
  206. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/ChatCompletionInput.py +0 -0
  207. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -0
  208. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  209. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  210. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  211. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  212. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
  213. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
  214. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  215. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  216. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/DatasetFilter.py +0 -0
  217. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  218. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  219. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
  220. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
  221. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  222. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
  223. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  224. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  225. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/GenerativeCredentialInput.py +0 -0
  226. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/GenerativeModelInput.py +0 -0
  227. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  228. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/InvocationParameters.py +0 -0
  229. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
  230. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
  231. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  232. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  233. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/ProjectFilter.py +0 -0
  234. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/ProjectSessionSort.py +0 -0
  235. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/ProjectSort.py +0 -0
  236. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/PromptTemplateOptions.py +0 -0
  237. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/PromptVersionInput.py +0 -0
  238. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/SpanAnnotationFilter.py +0 -0
  239. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  240. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  241. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  242. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  243. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
  244. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
  245. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/interceptor.py +0 -0
  246. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
  247. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/annotation_config_mutations.py +0 -0
  248. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/api_key_mutations.py +0 -0
  249. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/chat_mutations.py +0 -0
  250. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
  251. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
  252. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
  253. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/model_mutations.py +0 -0
  254. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
  255. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/project_trace_retention_policy_mutations.py +0 -0
  256. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/prompt_label_mutations.py +0 -0
  257. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/prompt_mutations.py +0 -0
  258. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/prompt_version_tag_mutations.py +0 -0
  259. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
  260. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
  261. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/trace_mutations.py +0 -0
  262. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
  263. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
  264. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/openapi/main.py +0 -0
  265. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/openapi/schema.py +0 -0
  266. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/__init__.py +0 -0
  267. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/auth.py +0 -0
  268. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/embeddings.py +0 -0
  269. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/oauth2.py +0 -0
  270. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/utils.py +0 -0
  271. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/v1/__init__.py +0 -0
  272. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/v1/annotations.py +0 -0
  273. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
  274. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/v1/models.py +0 -0
  275. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
  276. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/schema.py +0 -0
  277. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/subscriptions.py +0 -0
  278. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Annotation.py +0 -0
  279. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/AnnotationConfig.py +0 -0
  280. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/AnnotationSource.py +0 -0
  281. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
  282. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
  283. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
  284. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/AuthMethod.py +0 -0
  285. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
  286. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +0 -0
  287. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Cluster.py +0 -0
  288. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/CostBreakdown.py +0 -0
  289. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  290. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/CronExpression.py +0 -0
  291. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  292. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Dataset.py +0 -0
  293. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  294. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  295. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  296. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  297. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Dimension.py +0 -0
  298. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  299. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  300. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
  301. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  302. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  303. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  304. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  305. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  306. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
  307. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  308. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Event.py +0 -0
  309. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  310. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  311. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Experiment.py +0 -0
  312. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  313. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
  314. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  315. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  316. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  317. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Functionality.py +0 -0
  318. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
  319. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/GenerativeProvider.py +0 -0
  320. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Identifier.py +0 -0
  321. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/InferenceModel.py +0 -0
  322. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Inferences.py +0 -0
  323. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
  324. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  325. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/MimeType.py +0 -0
  326. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ModelInterface.py +0 -0
  327. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
  328. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  329. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/PlaygroundModel.py +0 -0
  330. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Project.py +0 -0
  331. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ProjectSession.py +0 -0
  332. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ProjectTraceRetentionPolicy.py +0 -0
  333. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Prompt.py +0 -0
  334. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/PromptLabel.py +0 -0
  335. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  336. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/PromptVersion.py +0 -0
  337. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/PromptVersionTag.py +0 -0
  338. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/PromptVersionTemplate.py +0 -0
  339. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ResponseFormat.py +0 -0
  340. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
  341. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  342. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Segments.py +0 -0
  343. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/SortDir.py +0 -0
  344. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Span.py +0 -0
  345. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
  346. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/SpanCostDetailSummaryEntry.py +0 -0
  347. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/SpanCostSummary.py +0 -0
  348. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/SpanIOValue.py +0 -0
  349. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
  350. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  351. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/TokenCountPromptDetails.py +0 -0
  352. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/TokenPrice.py +0 -0
  353. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/TokenUsage.py +0 -0
  354. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ToolDefinition.py +0 -0
  355. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/Trace.py +0 -0
  356. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
  357. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  358. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/User.py +0 -0
  359. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
  360. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/UserRole.py +0 -0
  361. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  362. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  363. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/__init__.py +0 -0
  364. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/node.py +0 -0
  365. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/types/pagination.py +0 -0
  366. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/api/utils.py +0 -0
  367. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/cost_tracking/__init__.py +0 -0
  368. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/cost_tracking/cost_details_calculator.py +0 -0
  369. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/cost_tracking/cost_model_lookup.py +0 -0
  370. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/cost_tracking/helpers.py +0 -0
  371. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/cost_tracking/model_cost_manifest.json +0 -0
  372. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/cost_tracking/regex_specificity.py +0 -0
  373. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/cost_tracking/token_cost_calculator.py +0 -0
  374. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/daemons/__init__.py +0 -0
  375. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/daemons/generative_model_store.py +0 -0
  376. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/daemons/span_cost_calculator.py +0 -0
  377. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/dml_event.py +0 -0
  378. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/dml_event_handler.py +0 -0
  379. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/email/__init__.py +0 -0
  380. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/email/templates/__init__.py +0 -0
  381. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/email/templates/password_reset.html +0 -0
  382. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/email/templates/welcome.html +0 -0
  383. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/jwt_store.py +0 -0
  384. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/main.py +0 -0
  385. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/middleware/__init__.py +0 -0
  386. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/middleware/gzip.py +0 -0
  387. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/oauth2.py +0 -0
  388. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/openapi/__init__.py +0 -0
  389. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/rate_limiters.py +0 -0
  390. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/retention.py +0 -0
  391. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  392. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  393. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  394. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  395. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  396. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  397. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  398. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  399. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/static/assets/vendor-WIZid84E.css +0 -0
  400. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/static/assets/vendor-three-C5WAXd5r.js +0 -0
  401. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/static/favicon.ico +0 -0
  402. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/static/modernizr.js +0 -0
  403. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/telemetry.py +0 -0
  404. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/templates/__init__.py +0 -0
  405. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/templates/index.html +0 -0
  406. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/server/thread_server.py +0 -0
  407. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/services.py +0 -0
  408. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/session/__init__.py +0 -0
  409. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/session/client.py +0 -0
  410. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/session/data_extractor.py +0 -0
  411. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/session/evaluation.py +0 -0
  412. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/session/session.py +0 -0
  413. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/settings.py +0 -0
  414. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/__init__.py +0 -0
  415. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/attributes.py +0 -0
  416. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/dsl/README.md +0 -0
  417. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/dsl/__init__.py +0 -0
  418. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/dsl/filter.py +0 -0
  419. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/dsl/helpers.py +0 -0
  420. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/dsl/query.py +0 -0
  421. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/errors.py +0 -0
  422. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
  423. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/exporter.py +0 -0
  424. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/fixtures.py +0 -0
  425. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/otel.py +0 -0
  426. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/projects.py +0 -0
  427. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/schemas.py +0 -0
  428. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/span_evaluations.py +0 -0
  429. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/span_json_decoder.py +0 -0
  430. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/span_json_encoder.py +0 -0
  431. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/trace_dataset.py +0 -0
  432. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/utils.py +0 -0
  433. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/v1/__init__.py +0 -0
  434. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  435. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  436. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/utilities/__init__.py +0 -0
  437. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/utilities/client.py +0 -0
  438. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/utilities/deprecation.py +0 -0
  439. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/utilities/error_handling.py +0 -0
  440. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/utilities/json.py +0 -0
  441. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/utilities/logging.py +0 -0
  442. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/utilities/project.py +0 -0
  443. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/utilities/re.py +0 -0
  444. {arize_phoenix-11.4.0 → arize_phoenix-11.5.0}/src/phoenix/utilities/span_store.py +0 -0
  445. {arize_phoenix-11.4.0 → arize_phoenix-11.5.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: 11.4.0
3
+ Version: 11.5.0
4
4
  Summary: AI Observability and Evaluation
5
5
  Project-URL: Documentation, https://arize.com/docs/phoenix/
6
6
  Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
@@ -39,6 +39,7 @@ Requires-Dist: opentelemetry-proto>=1.12.0
39
39
  Requires-Dist: opentelemetry-sdk
40
40
  Requires-Dist: opentelemetry-semantic-conventions
41
41
  Requires-Dist: pandas>=1.0
42
+ Requires-Dist: prometheus-client
42
43
  Requires-Dist: protobuf<6.0,>=4.25.8
43
44
  Requires-Dist: psutil
44
45
  Requires-Dist: pyarrow
@@ -96,7 +97,6 @@ Requires-Dist: pandas-stubs==2.2.2.240603; extra == 'dev'
96
97
  Requires-Dist: pandas>=1.0; extra == 'dev'
97
98
  Requires-Dist: portpicker; extra == 'dev'
98
99
  Requires-Dist: pre-commit; extra == 'dev'
99
- Requires-Dist: prometheus-client; extra == 'dev'
100
100
  Requires-Dist: psycopg[binary,pool]; extra == 'dev'
101
101
  Requires-Dist: pytest-asyncio; extra == 'dev'
102
102
  Requires-Dist: pytest-cov; extra == 'dev'
@@ -106,7 +106,24 @@ ENV_PHOENIX_DATABASE_ALLOCATED_STORAGE_CAPACITY_GIBIBYTES = (
106
106
  )
107
107
  """
108
108
  The allocated storage capacity for the Phoenix database in gibibytes (2^30 bytes). Use float for
109
- fractional value. This is currently used only by the UI for informational displays.
109
+ fractional value.
110
+ """
111
+ ENV_PHOENIX_DATABASE_USAGE_EMAIL_WARNING_THRESHOLD_PERCENTAGE = (
112
+ "PHOENIX_DATABASE_USAGE_EMAIL_WARNING_THRESHOLD_PERCENTAGE"
113
+ )
114
+ """
115
+ The percentage of the allocated storage capacity that, when exceeded, triggers a email notifications
116
+ to admin users with valid email addresses. Must be specified in conjunction with allocated storage
117
+ capacity. This is a percentage value between 0 and 100. This setting is ignored if SMTP is not
118
+ configured.
119
+ """
120
+ ENV_PHOENIX_DATABASE_USAGE_INSERTION_BLOCKING_THRESHOLD_PERCENTAGE = (
121
+ "PHOENIX_DATABASE_USAGE_INSERTION_BLOCKING_THRESHOLD_PERCENTAGE"
122
+ )
123
+ """
124
+ The percentage of the allocated storage capacity that blocks insertions and updates of database
125
+ records when exceeded. Deletions are not blocked. Must be specified in conjunction with allocated
126
+ storage capacity. This is a percentage value between 0 and 100.
110
127
  """
111
128
  ENV_PHOENIX_ENABLE_PROMETHEUS = "PHOENIX_ENABLE_PROMETHEUS"
112
129
  """
@@ -1312,7 +1329,36 @@ def get_env_database_schema() -> Optional[str]:
1312
1329
 
1313
1330
 
1314
1331
  def get_env_database_allocated_storage_capacity_gibibytes() -> Optional[float]:
1315
- return _float_val(ENV_PHOENIX_DATABASE_ALLOCATED_STORAGE_CAPACITY_GIBIBYTES)
1332
+ ans = _float_val(ENV_PHOENIX_DATABASE_ALLOCATED_STORAGE_CAPACITY_GIBIBYTES)
1333
+ if ans is not None and ans <= 0:
1334
+ raise ValueError(
1335
+ f"Invalid value for environment variable "
1336
+ f"{ENV_PHOENIX_DATABASE_ALLOCATED_STORAGE_CAPACITY_GIBIBYTES}: "
1337
+ f"{ans}. Value must be a positive number."
1338
+ )
1339
+ return ans
1340
+
1341
+
1342
+ def get_env_database_usage_email_warning_threshold_percentage() -> Optional[float]:
1343
+ ans = _float_val(ENV_PHOENIX_DATABASE_USAGE_EMAIL_WARNING_THRESHOLD_PERCENTAGE)
1344
+ if ans is not None and not (0 <= ans <= 100):
1345
+ raise ValueError(
1346
+ f"Invalid value for environment variable "
1347
+ f"{ENV_PHOENIX_DATABASE_USAGE_EMAIL_WARNING_THRESHOLD_PERCENTAGE}: "
1348
+ f"{ans}. Value must be a percentage between 0 and 100."
1349
+ )
1350
+ return ans
1351
+
1352
+
1353
+ def get_env_database_usage_insertion_blocking_threshold_percentage() -> Optional[float]:
1354
+ ans = _float_val(ENV_PHOENIX_DATABASE_USAGE_INSERTION_BLOCKING_THRESHOLD_PERCENTAGE)
1355
+ if ans is not None and not (0 <= ans <= 100):
1356
+ raise ValueError(
1357
+ f"Invalid value for environment variable "
1358
+ f"{ENV_PHOENIX_DATABASE_USAGE_INSERTION_BLOCKING_THRESHOLD_PERCENTAGE}: "
1359
+ f"{ans}. Value must be a percentage between 0 and 100."
1360
+ )
1361
+ return ans
1316
1362
 
1317
1363
 
1318
1364
  def get_env_enable_prometheus() -> bool:
@@ -1558,6 +1604,9 @@ def verify_server_environment_variables() -> None:
1558
1604
  get_env_root_url()
1559
1605
  get_env_phoenix_secret()
1560
1606
  get_env_phoenix_admin_secret()
1607
+ get_env_database_allocated_storage_capacity_gibibytes()
1608
+ get_env_database_usage_email_warning_threshold_percentage()
1609
+ get_env_database_usage_insertion_blocking_threshold_percentage()
1561
1610
 
1562
1611
  # Notify users about deprecated environment variables if they are being used.
1563
1612
  if os.getenv("PHOENIX_ENABLE_WEBSOCKETS") is not None:
@@ -29,7 +29,7 @@ class IsLocked(Authorization):
29
29
  message = "Operations that write or modify data are locked"
30
30
 
31
31
  def has_permission(self, source: Any, info: Info, **kwargs: Any) -> bool:
32
- return not info.context.locked
32
+ return not info.context.db.should_not_insert_or_update
33
33
 
34
34
 
35
35
  MSG_ADMIN_ONLY = "Only admin can perform this action"
@@ -25,7 +25,7 @@ from phoenix.db.helpers import SupportedSQLDialect, exclude_experiment_projects
25
25
  from phoenix.pointcloud.clustering import Hdbscan
26
26
  from phoenix.server.api.auth import MSG_ADMIN_ONLY, IsAdmin
27
27
  from phoenix.server.api.context import Context
28
- from phoenix.server.api.exceptions import NotFound, Unauthorized
28
+ from phoenix.server.api.exceptions import BadRequest, NotFound, Unauthorized
29
29
  from phoenix.server.api.helpers import ensure_list
30
30
  from phoenix.server.api.helpers.experiment_run_filters import (
31
31
  ExperimentRunFilterConditionSyntaxError,
@@ -62,7 +62,13 @@ from phoenix.server.api.types.GenerativeProvider import GenerativeProvider, Gene
62
62
  from phoenix.server.api.types.InferenceModel import InferenceModel
63
63
  from phoenix.server.api.types.InferencesRole import AncillaryInferencesRole, InferencesRole
64
64
  from phoenix.server.api.types.node import from_global_id, from_global_id_with_expected_type
65
- from phoenix.server.api.types.pagination import ConnectionArgs, CursorString, connection_from_list
65
+ from phoenix.server.api.types.pagination import (
66
+ ConnectionArgs,
67
+ Cursor,
68
+ CursorString,
69
+ connection_from_cursors_and_nodes,
70
+ connection_from_list,
71
+ )
66
72
  from phoenix.server.api.types.PlaygroundModel import PlaygroundModel
67
73
  from phoenix.server.api.types.Project import Project
68
74
  from phoenix.server.api.types.ProjectSession import ProjectSession, to_gql_project_session
@@ -349,7 +355,10 @@ class Query:
349
355
  for experiment_id in experiment_ids
350
356
  ]
351
357
  if len(set(experiment_ids_)) != len(experiment_ids_):
352
- raise ValueError("Experiment IDs must be unique.")
358
+ raise BadRequest("Experiment IDs must be unique.")
359
+
360
+ cursor = Cursor.from_string(after) if after else None
361
+ page_size = first or 50
353
362
 
354
363
  async with info.context.db() as session:
355
364
  validation_result = (
@@ -371,13 +380,13 @@ class Query:
371
380
  )
372
381
  ).first()
373
382
  if validation_result is None:
374
- raise ValueError("No experiments could be found for input IDs.")
383
+ raise NotFound("No experiments could be found for input IDs.")
375
384
 
376
385
  num_datasets, dataset_id, version_id, num_resolved_experiment_ids = validation_result
377
386
  if num_datasets != 1:
378
- raise ValueError("Experiments must belong to the same dataset.")
387
+ raise BadRequest("Experiments must belong to the same dataset.")
379
388
  if num_resolved_experiment_ids != len(experiment_ids_):
380
- raise ValueError("Unable to resolve one or more experiment IDs.")
389
+ raise NotFound("Unable to resolve one or more experiment IDs.")
381
390
 
382
391
  revision_ids = (
383
392
  select(func.max(models.DatasetExampleRevision.id))
@@ -407,7 +416,10 @@ class Query:
407
416
  ),
408
417
  )
409
418
  .order_by(models.DatasetExample.id.desc())
419
+ .limit(page_size + 1)
410
420
  )
421
+ if cursor is not None:
422
+ examples_query = examples_query.where(models.DatasetExample.id < cursor.rowid)
411
423
 
412
424
  if filter_condition:
413
425
  examples_query = update_examples_query_with_filter_condition(
@@ -417,6 +429,8 @@ class Query:
417
429
  )
418
430
 
419
431
  examples = (await session.scalars(examples_query)).all()
432
+ has_next_page = len(examples) > page_size
433
+ examples = examples[:page_size]
420
434
 
421
435
  ExampleID: TypeAlias = int
422
436
  ExperimentID: TypeAlias = int
@@ -437,7 +451,7 @@ class Query:
437
451
  ):
438
452
  runs[run.dataset_example_id][run.experiment_id].append(run)
439
453
 
440
- experiment_comparisons = []
454
+ cursors_and_nodes = []
441
455
  for example in examples:
442
456
  run_comparison_items = []
443
457
  for experiment_id in experiment_ids_:
@@ -452,23 +466,21 @@ class Query:
452
466
  ],
453
467
  )
454
468
  )
455
- experiment_comparisons.append(
456
- ExperimentComparison(
469
+ experiment_comparison = ExperimentComparison(
470
+ id_attr=example.id,
471
+ example=DatasetExample(
457
472
  id_attr=example.id,
458
- example=DatasetExample(
459
- id_attr=example.id,
460
- created_at=example.created_at,
461
- version_id=version_id,
462
- ),
463
- run_comparison_items=run_comparison_items,
464
- )
473
+ created_at=example.created_at,
474
+ version_id=version_id,
475
+ ),
476
+ run_comparison_items=run_comparison_items,
465
477
  )
466
- return connection_from_list(
467
- data=experiment_comparisons,
468
- args=ConnectionArgs(
469
- first=first,
470
- after=after if isinstance(after, CursorString) else None,
471
- ),
478
+ cursors_and_nodes.append((Cursor(rowid=example.id), experiment_comparison))
479
+
480
+ return connection_from_cursors_and_nodes(
481
+ cursors_and_nodes=cursors_and_nodes,
482
+ has_previous_page=False,
483
+ has_next_page=has_next_page,
472
484
  )
473
485
 
474
486
  @strawberry.field
@@ -1,7 +1,7 @@
1
1
  import logging
2
2
  from typing import Annotated, List, Literal, Optional, Union
3
3
 
4
- from fastapi import APIRouter, HTTPException, Path, Query
4
+ from fastapi import APIRouter, Depends, HTTPException, Path, Query
5
5
  from pydantic import Field, RootModel
6
6
  from sqlalchemy import delete, select
7
7
  from sqlalchemy.exc import IntegrityError as PostgreSQLIntegrityError
@@ -44,6 +44,7 @@ from phoenix.server.api.types.AnnotationConfig import (
44
44
  from phoenix.server.api.types.AnnotationConfig import (
45
45
  FreeformAnnotationConfig as FreeformAnnotationConfigType,
46
46
  )
47
+ from phoenix.server.authorization import is_not_locked
47
48
 
48
49
  logger = logging.getLogger(__name__)
49
50
 
@@ -268,6 +269,7 @@ async def get_annotation_config_by_name_or_id(
268
269
 
269
270
  @router.post(
270
271
  "/annotation_configs",
272
+ dependencies=[Depends(is_not_locked)],
271
273
  summary="Create an annotation configuration",
272
274
  )
273
275
  async def create_annotation_config(
@@ -302,6 +304,7 @@ async def create_annotation_config(
302
304
 
303
305
  @router.put(
304
306
  "/annotation_configs/{config_id}",
307
+ dependencies=[Depends(is_not_locked)],
305
308
  summary="Update an annotation configuration",
306
309
  )
307
310
  async def update_annotation_config(
@@ -15,7 +15,7 @@ from typing import Any, Optional, Union, cast
15
15
 
16
16
  import pandas as pd
17
17
  import pyarrow as pa
18
- from fastapi import APIRouter, BackgroundTasks, HTTPException, Path, Query
18
+ from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Path, Query
19
19
  from fastapi.responses import PlainTextResponse, StreamingResponse
20
20
  from sqlalchemy import and_, delete, func, select
21
21
  from sqlalchemy.ext.asyncio import AsyncSession
@@ -47,6 +47,7 @@ from phoenix.server.api.types.DatasetExample import DatasetExample as DatasetExa
47
47
  from phoenix.server.api.types.DatasetVersion import DatasetVersion as DatasetVersionNodeType
48
48
  from phoenix.server.api.types.node import from_global_id_with_expected_type
49
49
  from phoenix.server.api.utils import delete_projects, delete_traces
50
+ from phoenix.server.authorization import is_not_locked
50
51
  from phoenix.server.dml_event import DatasetInsertEvent
51
52
 
52
53
  from .models import V1RoutesBaseModel
@@ -326,6 +327,7 @@ class UploadDatasetResponseBody(ResponseBody[UploadDatasetData]):
326
327
 
327
328
  @router.post(
328
329
  "/datasets/upload",
330
+ dependencies=[Depends(is_not_locked)],
329
331
  operation_id="uploadDataset",
330
332
  summary="Upload dataset from JSON, CSV, or PyArrow",
331
333
  responses=add_errors_to_responses(
@@ -5,7 +5,7 @@ from typing import Any, Iterator, Optional, Union, cast
5
5
 
6
6
  import pandas as pd
7
7
  import pyarrow as pa
8
- from fastapi import APIRouter, Header, HTTPException, Query
8
+ from fastapi import APIRouter, Depends, Header, HTTPException, Query
9
9
  from google.protobuf.message import DecodeError
10
10
  from pandas import DataFrame
11
11
  from sqlalchemy import select
@@ -28,6 +28,7 @@ from phoenix.db import models
28
28
  from phoenix.db.insertion.types import Precursors
29
29
  from phoenix.exceptions import PhoenixEvaluationNameIsMissing
30
30
  from phoenix.server.api.routers.utils import table_to_bytes
31
+ from phoenix.server.authorization import is_not_locked
31
32
  from phoenix.server.types import DbSessionFactory
32
33
  from phoenix.trace.span_evaluations import (
33
34
  DocumentEvaluations,
@@ -45,6 +46,7 @@ router = APIRouter(tags=["traces"], include_in_schema=True)
45
46
 
46
47
  @router.post(
47
48
  "/evaluations",
49
+ dependencies=[Depends(is_not_locked)],
48
50
  operation_id="addEvaluations",
49
51
  summary="Add span, trace, or document evaluations",
50
52
  status_code=HTTP_204_NO_CONTENT,
@@ -1,7 +1,7 @@
1
1
  from datetime import datetime
2
2
  from typing import Any, Optional
3
3
 
4
- from fastapi import APIRouter, HTTPException
4
+ from fastapi import APIRouter, Depends, HTTPException
5
5
  from pydantic import Field
6
6
  from sqlalchemy import select
7
7
  from sqlalchemy.exc import IntegrityError as PostgreSQLIntegrityError
@@ -13,6 +13,7 @@ from strawberry.relay import GlobalID
13
13
  from phoenix.db import models
14
14
  from phoenix.db.models import ExperimentRunOutput
15
15
  from phoenix.server.api.types.node import from_global_id_with_expected_type
16
+ from phoenix.server.authorization import is_not_locked
16
17
  from phoenix.server.dml_event import ExperimentRunInsertEvent
17
18
 
18
19
  from .models import V1RoutesBaseModel
@@ -52,6 +53,7 @@ class CreateExperimentRunResponseBody(ResponseBody[CreateExperimentRunResponseBo
52
53
 
53
54
  @router.post(
54
55
  "/experiments/{experiment_id}/runs",
56
+ dependencies=[Depends(is_not_locked)],
55
57
  operation_id="createExperimentRun",
56
58
  summary="Create run for an experiment",
57
59
  response_description="Experiment run created successfully",
@@ -4,7 +4,7 @@ from random import getrandbits
4
4
  from typing import Any, Optional
5
5
 
6
6
  import pandas as pd
7
- from fastapi import APIRouter, HTTPException, Path, Response
7
+ from fastapi import APIRouter, Depends, HTTPException, Path, Response
8
8
  from pydantic import Field
9
9
  from sqlalchemy import and_, func, select
10
10
  from sqlalchemy.ext.asyncio import AsyncSession
@@ -18,6 +18,7 @@ from phoenix.db import models
18
18
  from phoenix.db.helpers import SupportedSQLDialect
19
19
  from phoenix.db.insertion.helpers import insert_on_conflict
20
20
  from phoenix.server.api.types.node import from_global_id_with_expected_type
21
+ from phoenix.server.authorization import is_not_locked
21
22
  from phoenix.server.dml_event import ExperimentInsertEvent
22
23
 
23
24
  from .models import V1RoutesBaseModel
@@ -86,6 +87,7 @@ class CreateExperimentResponseBody(ResponseBody[Experiment]):
86
87
 
87
88
  @router.post(
88
89
  "/datasets/{dataset_id}/experiments",
90
+ dependencies=[Depends(is_not_locked)],
89
91
  operation_id="createExperiment",
90
92
  summary="Create experiment on a dataset",
91
93
  responses=add_errors_to_responses(
@@ -1,6 +1,6 @@
1
1
  from typing import Optional
2
2
 
3
- from fastapi import APIRouter, HTTPException, Path, Query
3
+ from fastapi import APIRouter, Depends, HTTPException, Path, Query
4
4
  from pydantic import Field
5
5
  from sqlalchemy import select
6
6
  from starlette.requests import Request
@@ -23,6 +23,7 @@ from phoenix.server.api.routers.v1.utils import (
23
23
  add_errors_to_responses,
24
24
  )
25
25
  from phoenix.server.api.types.Project import Project as ProjectNodeType
26
+ from phoenix.server.authorization import is_not_locked
26
27
 
27
28
  router = APIRouter(tags=["projects"])
28
29
 
@@ -173,6 +174,7 @@ async def get_project(
173
174
 
174
175
  @router.post(
175
176
  "/projects",
177
+ dependencies=[Depends(is_not_locked)],
176
178
  operation_id="createProject",
177
179
  summary="Create a new project", # noqa: E501
178
180
  description="Create a new project with the specified configuration.", # noqa: E501
@@ -213,6 +215,7 @@ async def create_project(
213
215
 
214
216
  @router.put(
215
217
  "/projects/{project_identifier}",
218
+ dependencies=[Depends(is_not_locked)],
216
219
  operation_id="updateProject",
217
220
  summary="Update a project by ID or name", # noqa: E501
218
221
  description="Update an existing project with new configuration. Project names cannot be changed. The project identifier is either project ID or project name. Note: When using a project name as the identifier, it cannot contain slash (/), question mark (?), or pound sign (#) characters.", # noqa: E501
@@ -1,7 +1,7 @@
1
1
  import logging
2
2
  from typing import Any, Optional, Union
3
3
 
4
- from fastapi import APIRouter, HTTPException, Path, Query
4
+ from fastapi import APIRouter, Depends, HTTPException, Path, Query
5
5
  from pydantic import ValidationError, model_validator
6
6
  from sqlalchemy import select
7
7
  from sqlalchemy.sql import Select
@@ -33,6 +33,7 @@ from phoenix.server.api.types.node import from_global_id_with_expected_type
33
33
  from phoenix.server.api.types.Prompt import Prompt as PromptNodeType
34
34
  from phoenix.server.api.types.PromptVersion import PromptVersion as PromptVersionNodeType
35
35
  from phoenix.server.api.types.PromptVersionTag import PromptVersionTag as PromptVersionTagNodeType
36
+ from phoenix.server.authorization import is_not_locked
36
37
  from phoenix.server.bearer_auth import PhoenixUser
37
38
 
38
39
  logger = logging.getLogger(__name__)
@@ -393,6 +394,7 @@ async def get_prompt_version_by_latest(
393
394
 
394
395
  @router.post(
395
396
  "/prompts",
397
+ dependencies=[Depends(is_not_locked)],
396
398
  operation_id="postPromptVersion",
397
399
  summary="Create a new prompt",
398
400
  description="Create a new prompt and its initial version. A prompt can have multiple versions.",
@@ -602,6 +604,7 @@ async def list_prompt_version_tags(
602
604
 
603
605
  @router.post(
604
606
  "/prompt_versions/{prompt_version_id}/tags",
607
+ dependencies=[Depends(is_not_locked)],
605
608
  operation_id="createPromptVersionTag",
606
609
  summary="Add tag to prompt version",
607
610
  description="Add a new tag to a specific prompt version. Tags help identify and categorize "
@@ -8,7 +8,7 @@ from secrets import token_urlsafe
8
8
  from typing import Annotated, Any, Literal, Optional, Union
9
9
 
10
10
  import pandas as pd
11
- from fastapi import APIRouter, Header, HTTPException, Path, Query
11
+ from fastapi import APIRouter, Depends, Header, HTTPException, Path, Query
12
12
  from pydantic import BaseModel, Field
13
13
  from sqlalchemy import select
14
14
  from starlette.requests import Request
@@ -28,6 +28,7 @@ from phoenix.db.helpers import SupportedSQLDialect
28
28
  from phoenix.db.insertion.helpers import as_kv, insert_on_conflict
29
29
  from phoenix.db.insertion.types import Precursors
30
30
  from phoenix.server.api.routers.utils import df_to_bytes
31
+ from phoenix.server.authorization import is_not_locked
31
32
  from phoenix.server.bearer_auth import PhoenixUser
32
33
  from phoenix.server.dml_event import SpanAnnotationInsertEvent
33
34
  from phoenix.trace.attributes import flatten
@@ -907,6 +908,7 @@ class AnnotateSpansResponseBody(ResponseBody[list[InsertedSpanAnnotation]]):
907
908
 
908
909
  @router.post(
909
910
  "/span_annotations",
911
+ dependencies=[Depends(is_not_locked)],
910
912
  operation_id="annotateSpans",
911
913
  summary="Create span annotations",
912
914
  responses=add_errors_to_responses(
@@ -990,6 +992,7 @@ class CreateSpansResponseBody(V1RoutesBaseModel):
990
992
 
991
993
  @router.post(
992
994
  "/projects/{project_identifier}/spans",
995
+ dependencies=[Depends(is_not_locked)],
993
996
  operation_id="createSpans",
994
997
  summary="Create spans",
995
998
  description=(
@@ -2,7 +2,7 @@ import gzip
2
2
  import zlib
3
3
  from typing import Any, Literal, Optional
4
4
 
5
- from fastapi import APIRouter, BackgroundTasks, Header, HTTPException, Query
5
+ from fastapi import APIRouter, BackgroundTasks, Depends, Header, HTTPException, Query
6
6
  from google.protobuf.message import DecodeError
7
7
  from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import (
8
8
  ExportTraceServiceRequest,
@@ -24,6 +24,7 @@ from strawberry.relay import GlobalID
24
24
  from phoenix.db import models
25
25
  from phoenix.db.insertion.helpers import as_kv
26
26
  from phoenix.db.insertion.types import Precursors
27
+ from phoenix.server.authorization import is_not_locked
27
28
  from phoenix.server.bearer_auth import PhoenixUser
28
29
  from phoenix.server.dml_event import TraceAnnotationInsertEvent
29
30
  from phoenix.trace.otel import decode_otlp_span
@@ -37,6 +38,7 @@ router = APIRouter(tags=["traces"])
37
38
 
38
39
  @router.post(
39
40
  "/traces",
41
+ dependencies=[Depends(is_not_locked)],
40
42
  operation_id="addTraces",
41
43
  summary="Send traces",
42
44
  responses=add_errors_to_responses(
@@ -160,6 +162,7 @@ class AnnotateTracesResponseBody(ResponseBody[list[InsertedTraceAnnotation]]):
160
162
 
161
163
  @router.post(
162
164
  "/trace_annotations",
165
+ dependencies=[Depends(is_not_locked)],
163
166
  operation_id="annotateTraces",
164
167
  summary="Create trace annotations",
165
168
  responses=add_errors_to_responses(
@@ -43,7 +43,7 @@ from phoenix.server.api.routers.v1.utils import (
43
43
  add_errors_to_responses,
44
44
  )
45
45
  from phoenix.server.api.types.node import from_global_id_with_expected_type
46
- from phoenix.server.authorization import require_admin
46
+ from phoenix.server.authorization import is_not_locked, require_admin
47
47
 
48
48
  logger = logging.getLogger(__name__)
49
49
 
@@ -194,7 +194,7 @@ async def list_users(
194
194
  HTTP_422_UNPROCESSABLE_ENTITY,
195
195
  ]
196
196
  ),
197
- dependencies=[Depends(require_admin)],
197
+ dependencies=[Depends(require_admin), Depends(is_not_locked)],
198
198
  response_model_by_alias=True,
199
199
  response_model_exclude_unset=True,
200
200
  response_model_exclude_defaults=True,
@@ -16,17 +16,20 @@ from typing import (
16
16
  Any,
17
17
  NamedTuple,
18
18
  Optional,
19
+ Protocol,
19
20
  TypedDict,
20
21
  Union,
21
22
  cast,
22
23
  )
23
24
  from urllib.parse import urlparse
24
25
 
26
+ import grpc
25
27
  import strawberry
26
28
  from fastapi import APIRouter, Depends, FastAPI
27
29
  from fastapi.middleware.cors import CORSMiddleware
28
30
  from fastapi.utils import is_body_allowed_for_status_code
29
31
  from grpc.aio import ServerInterceptor
32
+ from grpc_interceptor import AsyncServerInterceptor
30
33
  from sqlalchemy import select
31
34
  from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_sessionmaker
32
35
  from starlette.datastructures import URL, Secret
@@ -44,7 +47,7 @@ from starlette.types import Scope, StatefulLifespan
44
47
  from strawberry.extensions import SchemaExtension
45
48
  from strawberry.fastapi import GraphQLRouter
46
49
  from strawberry.subscriptions import GRAPHQL_TRANSPORT_WS_PROTOCOL
47
- from typing_extensions import TypeAlias
50
+ from typing_extensions import TypeAlias, override
48
51
 
49
52
  import phoenix.trace.v1 as pb
50
53
  from phoenix.config import (
@@ -134,6 +137,7 @@ from phoenix.server.api.routers import (
134
137
  from phoenix.server.api.routers.v1 import REST_API_VERSION
135
138
  from phoenix.server.api.schema import build_graphql_schema
136
139
  from phoenix.server.bearer_auth import BearerTokenAuthBackend, is_authenticated
140
+ from phoenix.server.daemons.db_disk_usage_monitor import DbDiskUsageMonitor
137
141
  from phoenix.server.daemons.generative_model_store import GenerativeModelStore
138
142
  from phoenix.server.daemons.span_cost_calculator import SpanCostCalculator
139
143
  from phoenix.server.dml_event import DmlEvent
@@ -523,6 +527,7 @@ def _lifespan(
523
527
  trace_data_sweeper: Optional[TraceDataSweeper],
524
528
  span_cost_calculator: SpanCostCalculator,
525
529
  generative_model_store: GenerativeModelStore,
530
+ db_disk_usage_monitor: DbDiskUsageMonitor,
526
531
  token_store: Optional[TokenStore] = None,
527
532
  tracer_provider: Optional["TracerProvider"] = None,
528
533
  enable_prometheus: bool = False,
@@ -530,6 +535,7 @@ def _lifespan(
530
535
  shutdown_callbacks: Iterable[_Callback] = (),
531
536
  read_only: bool = False,
532
537
  scaffolder_config: Optional[ScaffolderConfig] = None,
538
+ grpc_interceptors: Iterable[AsyncServerInterceptor] = (),
533
539
  ) -> StatefulLifespan[FastAPI]:
534
540
  @contextlib.asynccontextmanager
535
541
  async def lifespan(_: FastAPI) -> AsyncIterator[dict[str, Any]]:
@@ -551,7 +557,7 @@ def _lifespan(
551
557
  tracer_provider=tracer_provider,
552
558
  enable_prometheus=enable_prometheus,
553
559
  token_store=token_store,
554
- interceptors=user_grpc_interceptors(),
560
+ interceptors=user_grpc_interceptors() + list(grpc_interceptors),
555
561
  )
556
562
  await stack.enter_async_context(grpc_server)
557
563
  await stack.enter_async_context(dml_event_handler)
@@ -559,6 +565,7 @@ def _lifespan(
559
565
  await stack.enter_async_context(trace_data_sweeper)
560
566
  await stack.enter_async_context(span_cost_calculator)
561
567
  await stack.enter_async_context(generative_model_store)
568
+ await stack.enter_async_context(db_disk_usage_monitor)
562
569
  if scaffolder_config:
563
570
  scaffolder = Scaffolder(
564
571
  config=scaffolder_config,
@@ -826,6 +833,34 @@ async def plain_text_http_exception_handler(request: Request, exc: HTTPException
826
833
  return PlainTextResponse(str(exc.detail), status_code=exc.status_code, headers=headers)
827
834
 
828
835
 
836
+ class _HasDbStatus(Protocol):
837
+ @property
838
+ def should_not_insert_or_update(self) -> bool: ...
839
+
840
+
841
+ class DbDiskUsageInterceptor(AsyncServerInterceptor):
842
+ def __init__(self, db: _HasDbStatus) -> None:
843
+ self._db = db
844
+
845
+ @override
846
+ async def intercept(
847
+ self,
848
+ method: Callable[[Any, grpc.aio.ServicerContext], Awaitable[Any]],
849
+ request_or_iterator: Any,
850
+ context: grpc.aio.ServicerContext,
851
+ method_name: str,
852
+ ) -> Any:
853
+ if (
854
+ method_name.endswith("trace.v1.TraceService/Export")
855
+ and self._db.should_not_insert_or_update
856
+ ):
857
+ await context.abort(
858
+ grpc.StatusCode.RESOURCE_EXHAUSTED,
859
+ "Database disk usage threshold exceeded",
860
+ )
861
+ return await method(request_or_iterator, context)
862
+
863
+
829
864
  def create_app(
830
865
  db: DbSessionFactory,
831
866
  export_path: Path,
@@ -971,6 +1006,8 @@ def create_app(
971
1006
  from phoenix.server.prometheus import PrometheusMiddleware
972
1007
 
973
1008
  middlewares.append(Middleware(PrometheusMiddleware))
1009
+ grpc_interceptors: list[AsyncServerInterceptor] = []
1010
+ grpc_interceptors.append(DbDiskUsageInterceptor(db))
974
1011
  app = FastAPI(
975
1012
  title="Arize-Phoenix REST API",
976
1013
  version=REST_API_VERSION,
@@ -982,6 +1019,8 @@ def create_app(
982
1019
  trace_data_sweeper=trace_data_sweeper,
983
1020
  span_cost_calculator=span_cost_calculator,
984
1021
  generative_model_store=generative_model_store,
1022
+ db_disk_usage_monitor=DbDiskUsageMonitor(db, email_sender),
1023
+ grpc_interceptors=grpc_interceptors,
985
1024
  token_store=token_store,
986
1025
  tracer_provider=tracer_provider,
987
1026
  enable_prometheus=enable_prometheus,
@@ -51,3 +51,12 @@ def require_admin(request: Request) -> None:
51
51
  status_code=fastapi_status.HTTP_403_FORBIDDEN,
52
52
  detail="Only admin or system users can perform this action.",
53
53
  )
54
+
55
+
56
+ def is_not_locked(request: Request) -> None:
57
+ if request.app.state.db.should_not_insert_or_update:
58
+ raise HTTPException(
59
+ status_code=fastapi_status.HTTP_507_INSUFFICIENT_STORAGE,
60
+ detail="Operations that insert or update database "
61
+ "records are currently not allowed.",
62
+ )