arize-phoenix 11.4.0__tar.gz → 11.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of arize-phoenix might be problematic. Click here for more details.

Files changed (445) hide show
  1. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/PKG-INFO +2 -2
  2. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/config.py +51 -2
  3. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/auth.py +1 -1
  4. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/queries.py +52 -44
  5. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/v1/annotation_configs.py +4 -1
  6. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/v1/datasets.py +3 -1
  7. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/v1/evaluations.py +3 -1
  8. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +3 -1
  9. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/v1/experiments.py +3 -1
  10. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/v1/projects.py +4 -1
  11. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/v1/prompts.py +4 -1
  12. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/v1/spans.py +6 -3
  13. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/v1/traces.py +4 -1
  14. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/v1/users.py +2 -2
  15. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Span.py +0 -99
  16. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/app.py +47 -12
  17. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/authorization.py +9 -0
  18. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/bearer_auth.py +18 -15
  19. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/cost_tracking/cost_model_lookup.py +1 -1
  20. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/cost_tracking/model_cost_manifest.json +107 -107
  21. arize_phoenix-11.6.0/src/phoenix/server/daemons/db_disk_usage_monitor.py +215 -0
  22. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/email/sender.py +25 -0
  23. arize_phoenix-11.6.0/src/phoenix/server/email/templates/db_disk_usage_notification.html +16 -0
  24. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/email/types.py +11 -0
  25. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/grpc_server.py +3 -3
  26. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/prometheus.py +22 -0
  27. arize_phoenix-11.6.0/src/phoenix/server/static/.vite/manifest.json +87 -0
  28. arize_phoenix-11.4.0/src/phoenix/server/static/assets/components-CVcMbu2U.js → arize_phoenix-11.6.0/src/phoenix/server/static/assets/components-mOUBHJ12.js +297 -298
  29. arize_phoenix-11.4.0/src/phoenix/server/static/assets/index-Dz7I-Hpn.js → arize_phoenix-11.6.0/src/phoenix/server/static/assets/index-CQ_A6K_M.js +2 -2
  30. arize_phoenix-11.4.0/src/phoenix/server/static/assets/pages-QK2o2V7x.js → arize_phoenix-11.6.0/src/phoenix/server/static/assets/pages-CCsLkNZY.js +517 -498
  31. arize_phoenix-11.4.0/src/phoenix/server/static/assets/vendor-pg5m6BWE.js → arize_phoenix-11.6.0/src/phoenix/server/static/assets/vendor-DRWIRkSJ.js +1 -1
  32. arize_phoenix-11.4.0/src/phoenix/server/static/assets/vendor-arizeai-BwMsgSAG.js → arize_phoenix-11.6.0/src/phoenix/server/static/assets/vendor-arizeai-DUhQaeau.js +1 -1
  33. arize_phoenix-11.4.0/src/phoenix/server/static/assets/vendor-codemirror-BwSDEu2g.js → arize_phoenix-11.6.0/src/phoenix/server/static/assets/vendor-codemirror-D_6Q6Auv.js +1 -1
  34. arize_phoenix-11.4.0/src/phoenix/server/static/assets/vendor-recharts-SW3HwAtG.js → arize_phoenix-11.6.0/src/phoenix/server/static/assets/vendor-recharts-BNBwj7vz.js +1 -1
  35. arize_phoenix-11.4.0/src/phoenix/server/static/assets/vendor-shiki-BsdYoDvs.js → arize_phoenix-11.6.0/src/phoenix/server/static/assets/vendor-shiki-k1qj_XjP.js +1 -1
  36. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/types.py +11 -2
  37. arize_phoenix-11.6.0/src/phoenix/version.py +1 -0
  38. arize_phoenix-11.4.0/src/phoenix/server/static/.vite/manifest.json +0 -87
  39. arize_phoenix-11.4.0/src/phoenix/version.py +0 -1
  40. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/.gitignore +0 -0
  41. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/IP_NOTICE +0 -0
  42. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/LICENSE +0 -0
  43. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/README.md +0 -0
  44. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/pyproject.toml +1 -1
  45. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/__init__.py +0 -0
  46. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/auth.py +0 -0
  47. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/core/__init__.py +0 -0
  48. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/core/embedding_dimension.py +0 -0
  49. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/core/model.py +0 -0
  50. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/core/model_schema.py +0 -0
  51. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/core/model_schema_adapter.py +0 -0
  52. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/datetime_utils.py +0 -0
  53. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/README.md +0 -0
  54. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/__init__.py +0 -0
  55. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/alembic.ini +0 -0
  56. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/bulk_inserter.py +0 -0
  57. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/constants.py +0 -0
  58. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/engines.py +0 -0
  59. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/enums.py +0 -0
  60. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/facilitator.py +0 -0
  61. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/helpers.py +0 -0
  62. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/insertion/__init__.py +0 -0
  63. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/insertion/constants.py +0 -0
  64. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/insertion/dataset.py +0 -0
  65. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
  66. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/insertion/evaluation.py +0 -0
  67. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/insertion/helpers.py +0 -0
  68. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/insertion/span.py +0 -0
  69. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
  70. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
  71. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/insertion/types.py +0 -0
  72. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrate.py +0 -0
  73. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/__init__.py +0 -0
  74. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/data_migration_scripts/__init__.py +0 -0
  75. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +0 -0
  76. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/env.py +0 -0
  77. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/script.py.mako +0 -0
  78. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  79. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/versions/2f9d1a65945f_annotation_config_migration.py +0 -0
  80. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
  81. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +0 -0
  82. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/versions/6a88424799fe_update_users_with_auth_method.py +0 -0
  83. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/versions/8a3764fe7f1a_change_jsonb_to_json_for_prompts.py +0 -0
  84. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/versions/a20694b15f82_cost.py +0 -0
  85. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/versions/bb8139330879_create_project_trace_retention_policies_table.py +0 -0
  86. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/versions/bc8fea3c2bc8_add_prompt_tables.py +0 -0
  87. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
  88. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  89. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/models.py +0 -0
  90. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/pg_config.py +0 -0
  91. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/types/__init__.py +0 -0
  92. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/types/annotation_configs.py +0 -0
  93. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/types/db_models.py +0 -0
  94. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/types/identifier.py +0 -0
  95. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/types/model_provider.py +0 -0
  96. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/types/token_price_customization.py +0 -0
  97. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/db/types/trace_retention.py +0 -0
  98. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/exceptions.py +0 -0
  99. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/experiments/__init__.py +0 -0
  100. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  101. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/experiments/evaluators/base.py +0 -0
  102. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
  103. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
  104. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
  105. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/experiments/functions.py +0 -0
  106. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/experiments/tracing.py +0 -0
  107. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/experiments/types.py +0 -0
  108. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/experiments/utils.py +0 -0
  109. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/inferences/__init__.py +0 -0
  110. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/inferences/errors.py +0 -0
  111. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/inferences/fixtures.py +0 -0
  112. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/inferences/inferences.py +0 -0
  113. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/inferences/schema.py +0 -0
  114. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/inferences/validation.py +0 -0
  115. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/logging/__init__.py +0 -0
  116. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/logging/_config.py +0 -0
  117. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/logging/_filter.py +0 -0
  118. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/logging/_formatter.py +0 -0
  119. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/metrics/README.md +0 -0
  120. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/metrics/__init__.py +0 -0
  121. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/metrics/binning.py +0 -0
  122. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/metrics/metrics.py +0 -0
  123. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/metrics/mixins.py +0 -0
  124. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  125. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/metrics/timeseries.py +0 -0
  126. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/metrics/wrappers.py +0 -0
  127. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/pointcloud/__init__.py +0 -0
  128. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/pointcloud/clustering.py +0 -0
  129. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
  130. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/pointcloud/projectors.py +0 -0
  131. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  132. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/py.typed +0 -0
  133. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/__init__.py +0 -0
  134. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/README.md +0 -0
  135. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/__init__.py +0 -0
  136. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/context.py +0 -0
  137. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
  138. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/annotation_configs_by_project.py +0 -0
  139. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
  140. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
  141. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  142. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
  143. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
  144. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
  145. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
  146. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
  147. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
  148. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
  149. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
  150. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
  151. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
  152. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
  153. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/last_used_times_by_generative_model_id.py +0 -0
  154. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
  155. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
  156. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/num_child_spans.py +0 -0
  157. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/num_spans_per_trace.py +0 -0
  158. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
  159. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/project_ids_by_trace_retention_policy_id.py +0 -0
  160. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/prompt_version_sequence_number.py +0 -0
  161. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
  162. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/session_io.py +0 -0
  163. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/session_num_traces.py +0 -0
  164. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/session_num_traces_with_error.py +0 -0
  165. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/session_token_usages.py +0 -0
  166. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +0 -0
  167. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
  168. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_by_id.py +0 -0
  169. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_cost_by_span.py +0 -0
  170. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_generative_model.py +0 -0
  171. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_project_session.py +0 -0
  172. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_span.py +0 -0
  173. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_trace.py +0 -0
  174. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_cost_details_by_span_cost.py +0 -0
  175. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_experiment.py +0 -0
  176. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_experiment_run.py +0 -0
  177. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_generative_model.py +0 -0
  178. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_project.py +0 -0
  179. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_project_session.py +0 -0
  180. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_trace.py +0 -0
  181. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_costs.py +0 -0
  182. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
  183. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
  184. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
  185. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/table_fields.py +0 -0
  186. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
  187. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/trace_by_trace_ids.py +0 -0
  188. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/trace_retention_policy_id_by_project_id.py +0 -0
  189. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/trace_root_spans.py +0 -0
  190. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/types.py +0 -0
  191. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/user_roles.py +0 -0
  192. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/dataloaders/users.py +0 -0
  193. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/exceptions.py +0 -0
  194. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
  195. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/helpers/annotations.py +0 -0
  196. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
  197. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/helpers/experiment_run_filters.py +0 -0
  198. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/helpers/playground_clients.py +0 -0
  199. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/helpers/playground_registry.py +0 -0
  200. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/helpers/playground_spans.py +0 -0
  201. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/helpers/prompts/__init__.py +0 -0
  202. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/helpers/prompts/conversions/__init__.py +0 -0
  203. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/helpers/prompts/conversions/anthropic.py +0 -0
  204. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/helpers/prompts/conversions/aws.py +0 -0
  205. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/helpers/prompts/conversions/openai.py +0 -0
  206. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/helpers/prompts/models.py +0 -0
  207. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
  208. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
  209. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/ChatCompletionInput.py +0 -0
  210. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -0
  211. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  212. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  213. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  214. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  215. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
  216. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
  217. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  218. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  219. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/DatasetFilter.py +0 -0
  220. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  221. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  222. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
  223. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
  224. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  225. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
  226. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  227. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  228. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/GenerativeCredentialInput.py +0 -0
  229. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/GenerativeModelInput.py +0 -0
  230. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  231. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/InvocationParameters.py +0 -0
  232. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
  233. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
  234. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  235. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  236. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/ProjectFilter.py +0 -0
  237. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/ProjectSessionSort.py +0 -0
  238. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/ProjectSort.py +0 -0
  239. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/PromptTemplateOptions.py +0 -0
  240. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/PromptVersionInput.py +0 -0
  241. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/SpanAnnotationFilter.py +0 -0
  242. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  243. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  244. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  245. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  246. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
  247. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
  248. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/interceptor.py +0 -0
  249. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
  250. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/annotation_config_mutations.py +0 -0
  251. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/api_key_mutations.py +0 -0
  252. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/chat_mutations.py +0 -0
  253. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
  254. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
  255. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
  256. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/model_mutations.py +0 -0
  257. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
  258. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/project_trace_retention_policy_mutations.py +0 -0
  259. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/prompt_label_mutations.py +0 -0
  260. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/prompt_mutations.py +0 -0
  261. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/prompt_version_tag_mutations.py +0 -0
  262. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
  263. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
  264. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/trace_mutations.py +0 -0
  265. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
  266. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
  267. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/openapi/main.py +0 -0
  268. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/openapi/schema.py +0 -0
  269. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/__init__.py +0 -0
  270. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/auth.py +0 -0
  271. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/embeddings.py +0 -0
  272. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/oauth2.py +0 -0
  273. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/utils.py +0 -0
  274. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/v1/__init__.py +0 -0
  275. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/v1/annotations.py +0 -0
  276. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
  277. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/v1/models.py +0 -0
  278. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
  279. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/schema.py +0 -0
  280. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/subscriptions.py +0 -0
  281. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Annotation.py +0 -0
  282. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/AnnotationConfig.py +0 -0
  283. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/AnnotationSource.py +0 -0
  284. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
  285. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
  286. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
  287. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/AuthMethod.py +0 -0
  288. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
  289. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +0 -0
  290. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Cluster.py +0 -0
  291. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/CostBreakdown.py +0 -0
  292. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  293. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/CronExpression.py +0 -0
  294. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  295. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Dataset.py +0 -0
  296. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  297. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  298. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  299. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  300. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Dimension.py +0 -0
  301. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  302. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  303. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
  304. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  305. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  306. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  307. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  308. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  309. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
  310. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  311. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Event.py +0 -0
  312. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  313. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  314. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Experiment.py +0 -0
  315. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  316. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
  317. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  318. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  319. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  320. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Functionality.py +0 -0
  321. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
  322. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/GenerativeProvider.py +0 -0
  323. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Identifier.py +0 -0
  324. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/InferenceModel.py +0 -0
  325. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Inferences.py +0 -0
  326. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
  327. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  328. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/MimeType.py +0 -0
  329. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ModelInterface.py +0 -0
  330. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
  331. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  332. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/PlaygroundModel.py +0 -0
  333. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Project.py +0 -0
  334. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ProjectSession.py +0 -0
  335. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ProjectTraceRetentionPolicy.py +0 -0
  336. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Prompt.py +0 -0
  337. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/PromptLabel.py +0 -0
  338. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  339. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/PromptVersion.py +0 -0
  340. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/PromptVersionTag.py +0 -0
  341. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/PromptVersionTemplate.py +0 -0
  342. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ResponseFormat.py +0 -0
  343. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
  344. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  345. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Segments.py +0 -0
  346. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/SortDir.py +0 -0
  347. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
  348. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/SpanCostDetailSummaryEntry.py +0 -0
  349. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/SpanCostSummary.py +0 -0
  350. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/SpanIOValue.py +0 -0
  351. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
  352. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  353. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/TokenCountPromptDetails.py +0 -0
  354. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/TokenPrice.py +0 -0
  355. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/TokenUsage.py +0 -0
  356. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ToolDefinition.py +0 -0
  357. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/Trace.py +0 -0
  358. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
  359. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  360. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/User.py +0 -0
  361. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
  362. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/UserRole.py +0 -0
  363. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  364. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  365. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/__init__.py +0 -0
  366. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/node.py +0 -0
  367. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/types/pagination.py +0 -0
  368. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/api/utils.py +0 -0
  369. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/cost_tracking/__init__.py +0 -0
  370. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/cost_tracking/cost_details_calculator.py +0 -0
  371. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/cost_tracking/helpers.py +0 -0
  372. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/cost_tracking/regex_specificity.py +0 -0
  373. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/cost_tracking/token_cost_calculator.py +0 -0
  374. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/daemons/__init__.py +0 -0
  375. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/daemons/generative_model_store.py +0 -0
  376. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/daemons/span_cost_calculator.py +0 -0
  377. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/dml_event.py +0 -0
  378. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/dml_event_handler.py +0 -0
  379. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/email/__init__.py +0 -0
  380. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/email/templates/__init__.py +0 -0
  381. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/email/templates/password_reset.html +0 -0
  382. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/email/templates/welcome.html +0 -0
  383. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/jwt_store.py +0 -0
  384. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/main.py +0 -0
  385. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/middleware/__init__.py +0 -0
  386. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/middleware/gzip.py +0 -0
  387. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/oauth2.py +0 -0
  388. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/openapi/__init__.py +0 -0
  389. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/rate_limiters.py +0 -0
  390. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/retention.py +0 -0
  391. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  392. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  393. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  394. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  395. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  396. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  397. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  398. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  399. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/static/assets/vendor-WIZid84E.css +0 -0
  400. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/static/assets/vendor-three-C5WAXd5r.js +0 -0
  401. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/static/favicon.ico +0 -0
  402. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/static/modernizr.js +0 -0
  403. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/telemetry.py +0 -0
  404. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/templates/__init__.py +0 -0
  405. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/templates/index.html +0 -0
  406. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/server/thread_server.py +0 -0
  407. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/services.py +0 -0
  408. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/session/__init__.py +0 -0
  409. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/session/client.py +0 -0
  410. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/session/data_extractor.py +0 -0
  411. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/session/evaluation.py +0 -0
  412. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/session/session.py +0 -0
  413. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/settings.py +0 -0
  414. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/__init__.py +0 -0
  415. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/attributes.py +0 -0
  416. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/dsl/README.md +0 -0
  417. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/dsl/__init__.py +0 -0
  418. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/dsl/filter.py +0 -0
  419. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/dsl/helpers.py +0 -0
  420. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/dsl/query.py +0 -0
  421. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/errors.py +0 -0
  422. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
  423. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/exporter.py +0 -0
  424. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/fixtures.py +0 -0
  425. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/otel.py +0 -0
  426. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/projects.py +0 -0
  427. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/schemas.py +0 -0
  428. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/span_evaluations.py +0 -0
  429. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/span_json_decoder.py +0 -0
  430. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/span_json_encoder.py +0 -0
  431. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/trace_dataset.py +0 -0
  432. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/utils.py +0 -0
  433. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/v1/__init__.py +0 -0
  434. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  435. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  436. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/utilities/__init__.py +0 -0
  437. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/utilities/client.py +0 -0
  438. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/utilities/deprecation.py +0 -0
  439. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/utilities/error_handling.py +0 -0
  440. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/utilities/json.py +0 -0
  441. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/utilities/logging.py +0 -0
  442. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/utilities/project.py +0 -0
  443. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/utilities/re.py +0 -0
  444. {arize_phoenix-11.4.0 → arize_phoenix-11.6.0}/src/phoenix/utilities/span_store.py +0 -0
  445. {arize_phoenix-11.4.0 → arize_phoenix-11.6.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.6.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
@@ -329,27 +335,22 @@ class Query:
329
335
  async def compare_experiments(
330
336
  self,
331
337
  info: Info[Context, None],
332
- experiment_ids: list[GlobalID],
338
+ baseline_experiment_id: GlobalID,
339
+ compare_experiment_ids: list[GlobalID],
333
340
  first: Optional[int] = 50,
334
341
  after: Optional[CursorString] = UNSET,
335
342
  filter_condition: Optional[str] = UNSET,
336
343
  ) -> Connection[ExperimentComparison]:
337
- # Handle empty experiment_ids gracefully
338
- if not experiment_ids:
339
- return connection_from_list(
340
- data=[],
341
- args=ConnectionArgs(
342
- first=first,
343
- after=after if isinstance(after, CursorString) else None,
344
- ),
345
- )
346
-
347
- experiment_ids_ = [
344
+ if baseline_experiment_id in compare_experiment_ids:
345
+ raise BadRequest("Compare experiment IDs cannot contain the baseline experiment ID")
346
+ if len(set(compare_experiment_ids)) < len(compare_experiment_ids):
347
+ raise BadRequest("Compare experiment IDs must be unique")
348
+ experiment_ids = [
348
349
  from_global_id_with_expected_type(experiment_id, models.Experiment.__name__)
349
- for experiment_id in experiment_ids
350
+ for experiment_id in (baseline_experiment_id, *compare_experiment_ids)
350
351
  ]
351
- if len(set(experiment_ids_)) != len(experiment_ids_):
352
- raise ValueError("Experiment IDs must be unique.")
352
+ cursor = Cursor.from_string(after) if after else None
353
+ page_size = first or 50
353
354
 
354
355
  async with info.context.db() as session:
355
356
  validation_result = (
@@ -366,18 +367,18 @@ class Query:
366
367
  models.Experiment.dataset_version_id == models.DatasetVersion.id,
367
368
  )
368
369
  .where(
369
- models.Experiment.id.in_(experiment_ids_),
370
+ models.Experiment.id.in_(experiment_ids),
370
371
  )
371
372
  )
372
373
  ).first()
373
374
  if validation_result is None:
374
- raise ValueError("No experiments could be found for input IDs.")
375
+ raise NotFound("No experiments could be found for input IDs.")
375
376
 
376
377
  num_datasets, dataset_id, version_id, num_resolved_experiment_ids = validation_result
377
378
  if num_datasets != 1:
378
- raise ValueError("Experiments must belong to the same dataset.")
379
- if num_resolved_experiment_ids != len(experiment_ids_):
380
- raise ValueError("Unable to resolve one or more experiment IDs.")
379
+ raise BadRequest("Experiments must belong to the same dataset.")
380
+ if num_resolved_experiment_ids != len(experiment_ids):
381
+ raise NotFound("Unable to resolve one or more experiment IDs.")
381
382
 
382
383
  revision_ids = (
383
384
  select(func.max(models.DatasetExampleRevision.id))
@@ -407,16 +408,21 @@ class Query:
407
408
  ),
408
409
  )
409
410
  .order_by(models.DatasetExample.id.desc())
411
+ .limit(page_size + 1)
410
412
  )
413
+ if cursor is not None:
414
+ examples_query = examples_query.where(models.DatasetExample.id < cursor.rowid)
411
415
 
412
416
  if filter_condition:
413
417
  examples_query = update_examples_query_with_filter_condition(
414
418
  query=examples_query,
415
419
  filter_condition=filter_condition,
416
- experiment_ids=experiment_ids_,
420
+ experiment_ids=experiment_ids,
417
421
  )
418
422
 
419
423
  examples = (await session.scalars(examples_query)).all()
424
+ has_next_page = len(examples) > page_size
425
+ examples = examples[:page_size]
420
426
 
421
427
  ExampleID: TypeAlias = int
422
428
  ExperimentID: TypeAlias = int
@@ -430,17 +436,20 @@ class Query:
430
436
  models.ExperimentRun.dataset_example_id.in_(
431
437
  example.id for example in examples
432
438
  ),
433
- models.ExperimentRun.experiment_id.in_(experiment_ids_),
439
+ models.ExperimentRun.experiment_id.in_(experiment_ids),
434
440
  )
435
441
  )
436
442
  .options(joinedload(models.ExperimentRun.trace).load_only(models.Trace.trace_id))
443
+ .order_by(
444
+ models.ExperimentRun.repetition_number.asc()
445
+ ) # repetitions are not currently implemented, but this ensures that the repetitions will be properly ordered once implemented # noqa: E501
437
446
  ):
438
447
  runs[run.dataset_example_id][run.experiment_id].append(run)
439
448
 
440
- experiment_comparisons = []
449
+ cursors_and_nodes = []
441
450
  for example in examples:
442
451
  run_comparison_items = []
443
- for experiment_id in experiment_ids_:
452
+ for experiment_id in experiment_ids:
444
453
  run_comparison_items.append(
445
454
  RunComparisonItem(
446
455
  experiment_id=GlobalID(Experiment.__name__, str(experiment_id)),
@@ -452,23 +461,21 @@ class Query:
452
461
  ],
453
462
  )
454
463
  )
455
- experiment_comparisons.append(
456
- ExperimentComparison(
464
+ experiment_comparison = ExperimentComparison(
465
+ id_attr=example.id,
466
+ example=DatasetExample(
457
467
  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
- )
468
+ created_at=example.created_at,
469
+ version_id=version_id,
470
+ ),
471
+ run_comparison_items=run_comparison_items,
465
472
  )
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
- ),
473
+ cursors_and_nodes.append((Cursor(rowid=example.id), experiment_comparison))
474
+
475
+ return connection_from_cursors_and_nodes(
476
+ cursors_and_nodes=cursors_and_nodes,
477
+ has_previous_page=False, # set to false since we are only doing forward pagination (https://relay.dev/graphql/connections.htm#sec-undefined.PageInfo.Fields) # noqa: E501
478
+ has_next_page=has_next_page,
472
479
  )
473
480
 
474
481
  @strawberry.field
@@ -977,13 +984,14 @@ class Query:
977
984
  # stats = cast(Iterable[tuple[str, int]], await session.execute(stmt))
978
985
  # stats = _consolidate_sqlite_db_table_stats(stats)
979
986
  elif info.context.db.dialect is SupportedSQLDialect.POSTGRESQL:
980
- stmt = text(f"""\
987
+ nspname = getenv(ENV_PHOENIX_SQL_DATABASE_SCHEMA) or "public"
988
+ stmt = text("""\
981
989
  SELECT c.relname, pg_total_relation_size(c.oid)
982
990
  FROM pg_class as c
983
991
  INNER JOIN pg_namespace as n ON n.oid = c.relnamespace
984
992
  WHERE c.relkind = 'r'
985
- AND n.nspname = '{getenv(ENV_PHOENIX_SQL_DATABASE_SCHEMA) or "public"}';
986
- """)
993
+ AND n.nspname = :nspname;
994
+ """).bindparams(nspname=nspname)
987
995
  try:
988
996
  async with info.context.db() as session:
989
997
  stats = cast(Iterable[tuple[str, int]], await session.execute(stmt))
@@ -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
@@ -601,7 +602,7 @@ async def span_search_otlpv1(
601
602
  models.Trace.trace_id,
602
603
  )
603
604
  .join(models.Trace, onclause=models.Trace.id == models.Span.trace_rowid)
604
- .join(models.Project, onclause=models.Project.id == project_id)
605
+ .where(models.Trace.project_rowid == project_id)
605
606
  .order_by(*order_by)
606
607
  )
607
608
 
@@ -736,7 +737,7 @@ async def span_search(
736
737
  models.Trace.trace_id,
737
738
  )
738
739
  .join(models.Trace, onclause=models.Trace.id == models.Span.trace_rowid)
739
- .join(models.Project, onclause=models.Project.id == project_id)
740
+ .where(models.Trace.project_rowid == project_id)
740
741
  .order_by(*order_by)
741
742
  )
742
743
 
@@ -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,