arize-phoenix 11.16.1__tar.gz → 11.18.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 (455) hide show
  1. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/PKG-INFO +2 -2
  2. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/README.md +1 -1
  3. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/auth.py +12 -0
  4. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/config.py +21 -1
  5. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/facilitator.py +4 -1
  6. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/user_mutations.py +7 -3
  7. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/queries.py +4 -4
  8. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/auth.py +13 -3
  9. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/oauth2.py +6 -5
  10. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/v1/traces.py +36 -15
  11. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/v1/users.py +3 -0
  12. arize_phoenix-11.18.0/src/phoenix/server/static/.vite/manifest.json +93 -0
  13. arize_phoenix-11.16.1/src/phoenix/server/static/assets/components-CK8hwrPx.js → arize_phoenix-11.18.0/src/phoenix/server/static/assets/components-B1Ec5V_g.js +453 -331
  14. arize_phoenix-11.16.1/src/phoenix/server/static/assets/index-UY6kXBX7.js → arize_phoenix-11.18.0/src/phoenix/server/static/assets/index-DYx39hbu.js +2 -2
  15. arize_phoenix-11.16.1/src/phoenix/server/static/assets/pages-D8Hgmz1V.js → arize_phoenix-11.18.0/src/phoenix/server/static/assets/pages-B77OHHSB.js +552 -514
  16. arize_phoenix-11.18.0/src/phoenix/server/static/assets/vendor-BbqekBfb.js +905 -0
  17. arize_phoenix-11.18.0/src/phoenix/server/static/assets/vendor-arizeai-CEwHhYfL.js +168 -0
  18. arize_phoenix-11.18.0/src/phoenix/server/static/assets/vendor-codemirror-CHApHLLJ.js +25 -0
  19. arize_phoenix-11.16.1/src/phoenix/server/static/assets/vendor-recharts-Cu431IpB.js → arize_phoenix-11.18.0/src/phoenix/server/static/assets/vendor-recharts-Bqf7C6Cm.js +6 -6
  20. arize_phoenix-11.18.0/src/phoenix/server/static/assets/vendor-shiki-BQ88Q1b1.js +5 -0
  21. arize_phoenix-11.16.1/src/phoenix/server/static/assets/vendor-three-C5WAXd5r.js → arize_phoenix-11.18.0/src/phoenix/server/static/assets/vendor-three-BLWp5bic.js +154 -154
  22. arize_phoenix-11.18.0/src/phoenix/version.py +1 -0
  23. arize_phoenix-11.16.1/src/phoenix/server/static/.vite/manifest.json +0 -87
  24. arize_phoenix-11.16.1/src/phoenix/server/static/assets/vendor-_6rG8OMg.js +0 -936
  25. arize_phoenix-11.16.1/src/phoenix/server/static/assets/vendor-arizeai-BznCmJFh.js +0 -168
  26. arize_phoenix-11.16.1/src/phoenix/server/static/assets/vendor-codemirror-29fWLPAy.js +0 -27
  27. arize_phoenix-11.16.1/src/phoenix/server/static/assets/vendor-shiki-Ce9e01lU.js +0 -5
  28. arize_phoenix-11.16.1/src/phoenix/version.py +0 -1
  29. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/.gitignore +0 -0
  30. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/IP_NOTICE +0 -0
  31. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/LICENSE +0 -0
  32. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/pyproject.toml +0 -0
  33. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/__init__.py +0 -0
  34. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/core/__init__.py +0 -0
  35. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/core/embedding_dimension.py +0 -0
  36. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/core/model.py +0 -0
  37. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/core/model_schema.py +0 -0
  38. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/core/model_schema_adapter.py +0 -0
  39. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/datetime_utils.py +0 -0
  40. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/README.md +0 -0
  41. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/__init__.py +0 -0
  42. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/alembic.ini +0 -0
  43. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/bulk_inserter.py +0 -0
  44. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/constants.py +0 -0
  45. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/engines.py +0 -0
  46. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/enums.py +0 -0
  47. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/helpers.py +0 -0
  48. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/insertion/__init__.py +0 -0
  49. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/insertion/constants.py +0 -0
  50. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/insertion/dataset.py +0 -0
  51. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
  52. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/insertion/evaluation.py +0 -0
  53. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/insertion/helpers.py +0 -0
  54. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/insertion/span.py +0 -0
  55. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
  56. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
  57. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/insertion/types.py +0 -0
  58. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrate.py +0 -0
  59. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/__init__.py +0 -0
  60. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/data_migration_scripts/__init__.py +0 -0
  61. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +0 -0
  62. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/env.py +0 -0
  63. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/script.py.mako +0 -0
  64. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  65. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/versions/2f9d1a65945f_annotation_config_migration.py +0 -0
  66. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
  67. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +0 -0
  68. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/versions/6a88424799fe_update_users_with_auth_method.py +0 -0
  69. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/versions/8a3764fe7f1a_change_jsonb_to_json_for_prompts.py +0 -0
  70. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/versions/a20694b15f82_cost.py +0 -0
  71. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/versions/bb8139330879_create_project_trace_retention_policies_table.py +0 -0
  72. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/versions/bc8fea3c2bc8_add_prompt_tables.py +0 -0
  73. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
  74. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  75. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/models.py +0 -0
  76. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/pg_config.py +0 -0
  77. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/types/__init__.py +0 -0
  78. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/types/annotation_configs.py +0 -0
  79. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/types/db_models.py +0 -0
  80. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/types/identifier.py +0 -0
  81. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/types/model_provider.py +0 -0
  82. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/types/token_price_customization.py +0 -0
  83. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/db/types/trace_retention.py +0 -0
  84. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/exceptions.py +0 -0
  85. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/experiments/__init__.py +0 -0
  86. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  87. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/experiments/evaluators/base.py +0 -0
  88. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
  89. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
  90. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
  91. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/experiments/functions.py +0 -0
  92. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/experiments/tracing.py +0 -0
  93. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/experiments/types.py +0 -0
  94. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/experiments/utils.py +0 -0
  95. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/inferences/__init__.py +0 -0
  96. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/inferences/errors.py +0 -0
  97. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/inferences/fixtures.py +0 -0
  98. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/inferences/inferences.py +0 -0
  99. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/inferences/schema.py +0 -0
  100. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/inferences/validation.py +0 -0
  101. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/logging/__init__.py +0 -0
  102. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/logging/_config.py +0 -0
  103. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/logging/_filter.py +0 -0
  104. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/logging/_formatter.py +0 -0
  105. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/metrics/README.md +0 -0
  106. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/metrics/__init__.py +0 -0
  107. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/metrics/binning.py +0 -0
  108. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/metrics/metrics.py +0 -0
  109. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/metrics/mixins.py +0 -0
  110. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  111. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/metrics/timeseries.py +0 -0
  112. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/metrics/wrappers.py +0 -0
  113. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/pointcloud/__init__.py +0 -0
  114. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/pointcloud/clustering.py +0 -0
  115. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
  116. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/pointcloud/projectors.py +0 -0
  117. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  118. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/py.typed +0 -0
  119. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/__init__.py +0 -0
  120. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/README.md +0 -0
  121. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/__init__.py +0 -0
  122. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/auth.py +0 -0
  123. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/context.py +0 -0
  124. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
  125. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/annotation_configs_by_project.py +0 -0
  126. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
  127. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
  128. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  129. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
  130. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
  131. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
  132. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
  133. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
  134. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
  135. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
  136. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
  137. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
  138. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
  139. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
  140. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/last_used_times_by_generative_model_id.py +0 -0
  141. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
  142. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
  143. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/num_child_spans.py +0 -0
  144. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/num_spans_per_trace.py +0 -0
  145. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
  146. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/project_ids_by_trace_retention_policy_id.py +0 -0
  147. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/prompt_version_sequence_number.py +0 -0
  148. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
  149. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/session_io.py +0 -0
  150. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/session_num_traces.py +0 -0
  151. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/session_num_traces_with_error.py +0 -0
  152. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/session_token_usages.py +0 -0
  153. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +0 -0
  154. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
  155. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_by_id.py +0 -0
  156. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_cost_by_span.py +0 -0
  157. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_generative_model.py +0 -0
  158. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_project_session.py +0 -0
  159. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_span.py +0 -0
  160. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_trace.py +0 -0
  161. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_cost_details_by_span_cost.py +0 -0
  162. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_experiment.py +0 -0
  163. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_experiment_run.py +0 -0
  164. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_generative_model.py +0 -0
  165. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_project.py +0 -0
  166. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_project_session.py +0 -0
  167. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_trace.py +0 -0
  168. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_costs.py +0 -0
  169. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
  170. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
  171. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
  172. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/table_fields.py +0 -0
  173. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
  174. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/trace_by_trace_ids.py +0 -0
  175. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/trace_retention_policy_id_by_project_id.py +0 -0
  176. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/trace_root_spans.py +0 -0
  177. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/types.py +0 -0
  178. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/user_roles.py +0 -0
  179. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/dataloaders/users.py +0 -0
  180. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/exceptions.py +0 -0
  181. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
  182. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/helpers/annotations.py +0 -0
  183. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
  184. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/helpers/experiment_run_filters.py +0 -0
  185. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/helpers/playground_clients.py +0 -0
  186. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/helpers/playground_registry.py +0 -0
  187. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/helpers/playground_spans.py +0 -0
  188. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/helpers/prompts/__init__.py +0 -0
  189. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/helpers/prompts/conversions/__init__.py +0 -0
  190. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/helpers/prompts/conversions/anthropic.py +0 -0
  191. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/helpers/prompts/conversions/aws.py +0 -0
  192. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/helpers/prompts/conversions/openai.py +0 -0
  193. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/helpers/prompts/models.py +0 -0
  194. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
  195. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
  196. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/ChatCompletionInput.py +0 -0
  197. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -0
  198. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  199. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  200. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  201. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  202. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/CreateProjectInput.py +0 -0
  203. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
  204. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
  205. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  206. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  207. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/DatasetFilter.py +0 -0
  208. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  209. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  210. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
  211. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
  212. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  213. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
  214. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  215. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  216. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/GenerativeCredentialInput.py +0 -0
  217. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/GenerativeModelInput.py +0 -0
  218. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  219. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/InvocationParameters.py +0 -0
  220. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
  221. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
  222. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  223. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  224. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/ProjectFilter.py +0 -0
  225. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/ProjectSessionSort.py +0 -0
  226. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/ProjectSort.py +0 -0
  227. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/PromptFilter.py +0 -0
  228. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/PromptTemplateOptions.py +0 -0
  229. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/PromptVersionInput.py +0 -0
  230. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/SpanAnnotationFilter.py +0 -0
  231. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  232. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  233. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/TimeBinConfig.py +0 -0
  234. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  235. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  236. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
  237. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
  238. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/interceptor.py +0 -0
  239. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
  240. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/annotation_config_mutations.py +0 -0
  241. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/api_key_mutations.py +0 -0
  242. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/chat_mutations.py +0 -0
  243. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
  244. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
  245. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
  246. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/model_mutations.py +0 -0
  247. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
  248. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/project_trace_retention_policy_mutations.py +0 -0
  249. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/prompt_label_mutations.py +0 -0
  250. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/prompt_mutations.py +0 -0
  251. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/prompt_version_tag_mutations.py +0 -0
  252. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
  253. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
  254. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/mutations/trace_mutations.py +0 -0
  255. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
  256. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/openapi/main.py +0 -0
  257. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/openapi/schema.py +0 -0
  258. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/__init__.py +0 -0
  259. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/embeddings.py +0 -0
  260. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/utils.py +0 -0
  261. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/v1/__init__.py +0 -0
  262. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/v1/annotation_configs.py +0 -0
  263. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/v1/annotations.py +0 -0
  264. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/v1/datasets.py +0 -0
  265. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/v1/evaluations.py +0 -0
  266. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
  267. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
  268. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/v1/experiments.py +0 -0
  269. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/v1/models.py +0 -0
  270. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/v1/projects.py +0 -0
  271. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/v1/prompts.py +0 -0
  272. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/v1/spans.py +0 -0
  273. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
  274. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/schema.py +0 -0
  275. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/subscriptions.py +0 -0
  276. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Annotation.py +0 -0
  277. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/AnnotationConfig.py +0 -0
  278. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/AnnotationSource.py +0 -0
  279. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
  280. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
  281. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
  282. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/AuthMethod.py +0 -0
  283. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
  284. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +0 -0
  285. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Cluster.py +0 -0
  286. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/CostBreakdown.py +0 -0
  287. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  288. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/CronExpression.py +0 -0
  289. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  290. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Dataset.py +0 -0
  291. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  292. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  293. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  294. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  295. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Dimension.py +0 -0
  296. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  297. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  298. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
  299. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  300. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  301. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  302. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  303. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  304. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
  305. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  306. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Event.py +0 -0
  307. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  308. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  309. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Experiment.py +0 -0
  310. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  311. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
  312. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  313. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  314. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  315. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Functionality.py +0 -0
  316. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
  317. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/GenerativeProvider.py +0 -0
  318. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Identifier.py +0 -0
  319. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/InferenceModel.py +0 -0
  320. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Inferences.py +0 -0
  321. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
  322. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  323. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/MimeType.py +0 -0
  324. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ModelInterface.py +0 -0
  325. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
  326. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  327. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/PlaygroundModel.py +0 -0
  328. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Project.py +0 -0
  329. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ProjectSession.py +0 -0
  330. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ProjectTraceRetentionPolicy.py +0 -0
  331. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Prompt.py +0 -0
  332. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/PromptLabel.py +0 -0
  333. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  334. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/PromptVersion.py +0 -0
  335. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/PromptVersionTag.py +0 -0
  336. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/PromptVersionTemplate.py +0 -0
  337. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ResponseFormat.py +0 -0
  338. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
  339. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  340. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Segments.py +0 -0
  341. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ServerStatus.py +0 -0
  342. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/SortDir.py +0 -0
  343. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Span.py +0 -0
  344. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
  345. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/SpanCostDetailSummaryEntry.py +0 -0
  346. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/SpanCostSummary.py +0 -0
  347. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/SpanIOValue.py +0 -0
  348. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
  349. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  350. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/TokenCountPromptDetails.py +0 -0
  351. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/TokenPrice.py +0 -0
  352. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/TokenUsage.py +0 -0
  353. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ToolDefinition.py +0 -0
  354. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/Trace.py +0 -0
  355. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
  356. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  357. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/User.py +0 -0
  358. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
  359. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/UserRole.py +0 -0
  360. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  361. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  362. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/__init__.py +0 -0
  363. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/node.py +0 -0
  364. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/types/pagination.py +0 -0
  365. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/api/utils.py +0 -0
  366. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/app.py +0 -0
  367. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/authorization.py +0 -0
  368. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/bearer_auth.py +0 -0
  369. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/cost_tracking/__init__.py +0 -0
  370. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/cost_tracking/cost_details_calculator.py +0 -0
  371. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/cost_tracking/cost_model_lookup.py +0 -0
  372. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/cost_tracking/helpers.py +0 -0
  373. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/cost_tracking/model_cost_manifest.json +0 -0
  374. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/cost_tracking/regex_specificity.py +0 -0
  375. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/cost_tracking/token_cost_calculator.py +0 -0
  376. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/daemons/__init__.py +0 -0
  377. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/daemons/db_disk_usage_monitor.py +0 -0
  378. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/daemons/generative_model_store.py +0 -0
  379. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/daemons/span_cost_calculator.py +0 -0
  380. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/dml_event.py +0 -0
  381. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/dml_event_handler.py +0 -0
  382. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/email/__init__.py +0 -0
  383. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/email/sender.py +0 -0
  384. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/email/templates/__init__.py +0 -0
  385. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/email/templates/db_disk_usage_notification.html +0 -0
  386. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/email/templates/password_reset.html +0 -0
  387. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/email/templates/welcome.html +0 -0
  388. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/email/types.py +0 -0
  389. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/experiments/__init__.py +0 -0
  390. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/experiments/utils.py +0 -0
  391. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/grpc_server.py +0 -0
  392. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/jwt_store.py +0 -0
  393. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/main.py +0 -0
  394. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/middleware/__init__.py +0 -0
  395. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/middleware/gzip.py +0 -0
  396. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/oauth2.py +0 -0
  397. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/openapi/__init__.py +0 -0
  398. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/prometheus.py +0 -0
  399. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/rate_limiters.py +0 -0
  400. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/retention.py +0 -0
  401. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  402. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  403. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  404. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  405. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  406. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  407. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  408. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  409. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/static/assets/vendor-CqDb5u4o.css +0 -0
  410. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/static/favicon.ico +0 -0
  411. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/static/modernizr.js +0 -0
  412. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/telemetry.py +0 -0
  413. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/templates/__init__.py +0 -0
  414. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/templates/index.html +0 -0
  415. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/thread_server.py +0 -0
  416. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/server/types.py +0 -0
  417. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/services.py +0 -0
  418. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/session/__init__.py +0 -0
  419. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/session/client.py +0 -0
  420. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/session/data_extractor.py +0 -0
  421. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/session/evaluation.py +0 -0
  422. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/session/session.py +0 -0
  423. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/settings.py +0 -0
  424. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/__init__.py +0 -0
  425. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/attributes.py +0 -0
  426. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/dsl/README.md +0 -0
  427. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/dsl/__init__.py +0 -0
  428. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/dsl/filter.py +0 -0
  429. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/dsl/helpers.py +0 -0
  430. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/dsl/query.py +0 -0
  431. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/errors.py +0 -0
  432. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
  433. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/exporter.py +0 -0
  434. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/fixtures.py +0 -0
  435. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/otel.py +0 -0
  436. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/projects.py +0 -0
  437. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/schemas.py +0 -0
  438. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/span_evaluations.py +0 -0
  439. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/span_json_decoder.py +0 -0
  440. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/span_json_encoder.py +0 -0
  441. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/trace_dataset.py +0 -0
  442. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/utils.py +0 -0
  443. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/v1/__init__.py +0 -0
  444. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  445. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  446. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/utilities/__init__.py +0 -0
  447. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/utilities/client.py +0 -0
  448. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/utilities/deprecation.py +0 -0
  449. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/utilities/error_handling.py +0 -0
  450. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/utilities/json.py +0 -0
  451. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/utilities/logging.py +0 -0
  452. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/utilities/project.py +0 -0
  453. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/utilities/re.py +0 -0
  454. {arize_phoenix-11.16.1 → arize_phoenix-11.18.0}/src/phoenix/utilities/span_store.py +0 -0
  455. {arize_phoenix-11.16.1 → arize_phoenix-11.18.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.16.1
3
+ Version: 11.18.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
@@ -191,7 +191,7 @@ Install Phoenix via `pip` or `conda`
191
191
  pip install arize-phoenix
192
192
  ```
193
193
 
194
- Phoenix container images are available via [Docker Hub](https://hub.docker.com/r/arizephoenix/phoenix) and can be deployed using Docker or Kubernetes.
194
+ Phoenix container images are available via [Docker Hub](https://hub.docker.com/r/arizephoenix/phoenix) and can be deployed using Docker or Kubernetes. Arize AI also provides cloud instances at [app.phoenix.arize.com](https://app.phoenix.arize.com/).
195
195
 
196
196
  ## Packages
197
197
 
@@ -58,7 +58,7 @@ Install Phoenix via `pip` or `conda`
58
58
  pip install arize-phoenix
59
59
  ```
60
60
 
61
- Phoenix container images are available via [Docker Hub](https://hub.docker.com/r/arizephoenix/phoenix) and can be deployed using Docker or Kubernetes.
61
+ Phoenix container images are available via [Docker Hub](https://hub.docker.com/r/arizephoenix/phoenix) and can be deployed using Docker or Kubernetes. Arize AI also provides cloud instances at [app.phoenix.arize.com](https://app.phoenix.arize.com/).
62
62
 
63
63
  ## Packages
64
64
 
@@ -47,6 +47,18 @@ def is_valid_password(*, password: Secret, salt: bytes, password_hash: bytes) ->
47
47
  return password_hash == compute_password_hash(password=password, salt=salt)
48
48
 
49
49
 
50
+ def sanitize_email(email: str) -> str:
51
+ """
52
+ Sanitizes an email address by trimming whitespace and converting to lowercase.
53
+
54
+ Args:
55
+ email (str): the email address to sanitize
56
+ Returns:
57
+ str: the sanitized email address
58
+ """
59
+ return email.strip().lower()
60
+
61
+
50
62
  def validate_email_format(email: str) -> None:
51
63
  """
52
64
  Checks that the email has a valid format.
@@ -333,6 +333,10 @@ Whether to verify client certificates for mutual TLS (mTLS) authentication.
333
333
  When set to true, clients must provide valid certificates signed by the CA specified in
334
334
  PHOENIX_TLS_CA_FILE.
335
335
  """
336
+ ENV_PHOENIX_DEFAULT_RETENTION_POLICY_DAYS = "PHOENIX_DEFAULT_RETENTION_POLICY_DAYS"
337
+ """
338
+ The default retention policy for traces in days.
339
+ """
336
340
 
337
341
 
338
342
  @dataclass(frozen=True)
@@ -494,6 +498,20 @@ def get_env_tls_verify_client() -> bool:
494
498
  return _bool_val(ENV_PHOENIX_TLS_VERIFY_CLIENT, False)
495
499
 
496
500
 
501
+ def get_env_default_retention_policy_days() -> int:
502
+ """
503
+ Returns the number of days for the default retention policy as set by the
504
+ PHOENIX_DEFAULT_RETENTION_POLICY_DAYS environment variable, defaulting to 0 if not set.
505
+
506
+ Returns:
507
+ int: Number of days for the default retention policy. Defaults to 0 if the environment variable is not set.
508
+ """ # noqa: E501
509
+ days = _int_val(ENV_PHOENIX_DEFAULT_RETENTION_POLICY_DAYS, 0)
510
+ if days < 0:
511
+ raise ValueError("PHOENIX_DEFAULT_RETENTION_POLICY_DAYS must be non-negative")
512
+ return days
513
+
514
+
497
515
  def get_env_tls_config() -> Optional[TLSConfig]:
498
516
  """
499
517
  Retrieves and validates TLS configuration from environment variables.
@@ -865,6 +883,8 @@ def get_env_admins() -> dict[str, str]:
865
883
  """
866
884
  if not (env_value := getenv(ENV_PHOENIX_ADMINS)):
867
885
  return {}
886
+ from phoenix.auth import sanitize_email
887
+
868
888
  usernames = set()
869
889
  emails = set()
870
890
  ans = {}
@@ -881,7 +901,7 @@ def get_env_admins() -> dict[str, str]:
881
901
  f"Expected format: 'username=email'"
882
902
  )
883
903
  username = pair[:last_equals_pos].strip()
884
- email_addr = pair[last_equals_pos + 1 :].strip()
904
+ email_addr = sanitize_email(pair[last_equals_pos + 1 :])
885
905
  try:
886
906
  email_addr = validate_email(email_addr, check_deliverability=False).normalized
887
907
  except EmailNotValidError:
@@ -28,6 +28,7 @@ from phoenix.auth import (
28
28
  from phoenix.config import (
29
29
  get_env_admins,
30
30
  get_env_default_admin_initial_password,
31
+ get_env_default_retention_policy_days,
31
32
  get_env_disable_basic_auth,
32
33
  )
33
34
  from phoenix.db import models
@@ -334,7 +335,9 @@ async def _ensure_default_project_trace_retention_policy(db: DbSessionFactory) -
334
335
  ):
335
336
  return
336
337
  cron_expression = TraceRetentionCronExpression(root="0 0 * * 0")
337
- rule = TraceRetentionRule(root=MaxDaysRule(max_days=0))
338
+ rule = TraceRetentionRule(
339
+ root=MaxDaysRule(max_days=get_env_default_retention_policy_days())
340
+ )
338
341
  await session.execute(
339
342
  sa.insert(models.ProjectTraceRetentionPolicy),
340
343
  [
@@ -21,6 +21,7 @@ from phoenix.auth import (
21
21
  PASSWORD_REQUIREMENTS,
22
22
  PHOENIX_ACCESS_TOKEN_COOKIE_NAME,
23
23
  PHOENIX_REFRESH_TOKEN_COOKIE_NAME,
24
+ sanitize_email,
24
25
  validate_email_format,
25
26
  validate_password_format,
26
27
  )
@@ -115,20 +116,23 @@ class UserMutationMixin:
115
116
  info: Info[Context, None],
116
117
  input: CreateUserInput,
117
118
  ) -> UserMutationPayload:
119
+ # Sanitize email by trimming and lowercasing
120
+ email = sanitize_email(input.email)
121
+
118
122
  user: models.User
119
123
  if input.auth_method is AuthMethod.OAUTH2:
120
124
  user = models.OAuth2User(
121
- email=input.email,
125
+ email=email,
122
126
  username=input.username,
123
127
  )
124
128
  else:
125
129
  assert input.password
126
- validate_email_format(input.email)
130
+ validate_email_format(email)
127
131
  validate_password_format(input.password)
128
132
  salt = secrets.token_bytes(DEFAULT_SECRET_LENGTH)
129
133
  password_hash = await info.context.hash_password(Secret(input.password), salt)
130
134
  user = models.LocalUser(
131
- email=input.email,
135
+ email=email,
132
136
  username=input.username,
133
137
  password_hash=password_hash,
134
138
  password_salt=salt,
@@ -338,19 +338,19 @@ class Query:
338
338
  async def compare_experiments(
339
339
  self,
340
340
  info: Info[Context, None],
341
- baseline_experiment_id: GlobalID,
341
+ base_experiment_id: GlobalID,
342
342
  compare_experiment_ids: list[GlobalID],
343
343
  first: Optional[int] = 50,
344
344
  after: Optional[CursorString] = UNSET,
345
345
  filter_condition: Optional[str] = UNSET,
346
346
  ) -> Connection[ExperimentComparison]:
347
- if baseline_experiment_id in compare_experiment_ids:
348
- raise BadRequest("Compare experiment IDs cannot contain the baseline experiment ID")
347
+ if base_experiment_id in compare_experiment_ids:
348
+ raise BadRequest("Compare experiment IDs cannot contain the base experiment ID")
349
349
  if len(set(compare_experiment_ids)) < len(compare_experiment_ids):
350
350
  raise BadRequest("Compare experiment IDs must be unique")
351
351
  experiment_ids = [
352
352
  from_global_id_with_expected_type(experiment_id, models.Experiment.__name__)
353
- for experiment_id in (baseline_experiment_id, *compare_experiment_ids)
353
+ for experiment_id in (base_experiment_id, *compare_experiment_ids)
354
354
  ]
355
355
  cursor = Cursor.from_string(after) if after else None
356
356
  page_size = first or 50
@@ -6,7 +6,7 @@ from pathlib import Path
6
6
  from urllib.parse import urlencode, urlparse, urlunparse
7
7
 
8
8
  from fastapi import APIRouter, Depends, HTTPException, Request, Response
9
- from sqlalchemy import select
9
+ from sqlalchemy import func, select
10
10
  from sqlalchemy.orm import joinedload
11
11
  from starlette.status import (
12
12
  HTTP_204_NO_CONTENT,
@@ -29,6 +29,7 @@ from phoenix.auth import (
29
29
  delete_oauth2_state_cookie,
30
30
  delete_refresh_token_cookie,
31
31
  is_valid_password,
32
+ sanitize_email,
32
33
  set_access_token_cookie,
33
34
  set_refresh_token_cookie,
34
35
  validate_password_format,
@@ -87,9 +88,14 @@ async def login(request: Request) -> Response:
87
88
  if not email or not password:
88
89
  raise HTTPException(status_code=HTTP_401_UNAUTHORIZED, detail="Email and password required")
89
90
 
91
+ # Sanitize email by trimming and lowercasing
92
+ email = sanitize_email(email)
93
+
90
94
  async with request.app.state.db() as session:
91
95
  user = await session.scalar(
92
- select(models.User).filter_by(email=email).options(joinedload(models.User.role))
96
+ select(models.User)
97
+ .where(func.lower(models.User.email) == email)
98
+ .options(joinedload(models.User.role))
93
99
  )
94
100
  if (
95
101
  user is None
@@ -207,6 +213,10 @@ async def initiate_password_reset(request: Request) -> Response:
207
213
  data = await request.json()
208
214
  if not (email := data.get("email")):
209
215
  raise MISSING_EMAIL
216
+
217
+ # Sanitize email by trimming and lowercasing
218
+ email = sanitize_email(email)
219
+
210
220
  sender: EmailSender = request.app.state.email_sender
211
221
  if sender is None:
212
222
  raise SMTP_UNAVAILABLE
@@ -214,7 +224,7 @@ async def initiate_password_reset(request: Request) -> Response:
214
224
  async with request.app.state.db() as session:
215
225
  user = await session.scalar(
216
226
  select(models.User)
217
- .filter_by(email=email)
227
+ .where(func.lower(models.User.email) == email)
218
228
  .options(
219
229
  joinedload(models.User.password_reset_token).load_only(models.PasswordResetToken.id)
220
230
  )
@@ -27,6 +27,7 @@ from phoenix.auth import (
27
27
  PHOENIX_OAUTH2_STATE_COOKIE_NAME,
28
28
  delete_oauth2_nonce_cookie,
29
29
  delete_oauth2_state_cookie,
30
+ sanitize_email,
30
31
  set_access_token_cookie,
31
32
  set_oauth2_nonce_cookie,
32
33
  set_oauth2_state_cookie,
@@ -217,7 +218,7 @@ class UserInfo:
217
218
  if not (idp_user_id := (self.idp_user_id or "").strip()):
218
219
  raise ValueError("idp_user_id cannot be empty")
219
220
  object.__setattr__(self, "idp_user_id", idp_user_id)
220
- if not (email := (self.email or "").strip()):
221
+ if not (email := sanitize_email(self.email or "")):
221
222
  raise ValueError("email cannot be empty")
222
223
  object.__setattr__(self, "email", email)
223
224
  if username := (self.username or "").strip():
@@ -356,7 +357,7 @@ async def _get_existing_oauth2_user(
356
357
  - User has a password set
357
358
  - User has mismatched OAuth2 credentials
358
359
  """ # noqa: E501
359
- if not (email := (user_info.email or "").strip()):
360
+ if not (email := sanitize_email(user_info.email or "")):
360
361
  raise ValueError("Email is required.")
361
362
  if not (oauth2_user_id := (user_info.idp_user_id or "").strip()):
362
363
  raise ValueError("OAuth2 user ID is required.")
@@ -370,7 +371,7 @@ async def _get_existing_oauth2_user(
370
371
  if email and email != user.email:
371
372
  user.email = email
372
373
  else:
373
- user = await session.scalar(stmt.filter_by(email=email))
374
+ user = await session.scalar(stmt.where(func.lower(models.User.email) == email))
374
375
  if user is None or not isinstance(user, models.OAuth2User):
375
376
  raise SignInNotAllowed("Sign in is not allowed.")
376
377
  # Case 1: Different OAuth2 client - update both client and user IDs
@@ -520,7 +521,7 @@ async def _email_and_username_exist(
520
521
  select(
521
522
  cast(
522
523
  func.coalesce(
523
- func.max(case((models.User.email == email, 1), else_=0)),
524
+ func.max(case((func.lower(models.User.email) == email, 1), else_=0)),
524
525
  0,
525
526
  ),
526
527
  Boolean,
@@ -532,7 +533,7 @@ async def _email_and_username_exist(
532
533
  ),
533
534
  Boolean,
534
535
  ).label("username_exists"),
535
- ).where(or_(models.User.email == email, models.User.username == username))
536
+ ).where(or_(func.lower(models.User.email) == email, models.User.username == username))
536
537
  )
537
538
  ).all()
538
539
  return email_exists, username_exists
@@ -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.api.types.node import from_global_id_with_expected_type
27
28
  from phoenix.server.authorization import is_not_locked
28
29
  from phoenix.server.bearer_auth import PhoenixUser
29
30
  from phoenix.server.dml_event import SpanDeleteEvent, TraceAnnotationInsertEvent
@@ -228,11 +229,13 @@ async def _add_spans(req: ExportTraceServiceRequest, state: State) -> None:
228
229
 
229
230
 
230
231
  @router.delete(
231
- "/traces/{trace_id}",
232
+ "/traces/{trace_identifier}",
232
233
  operation_id="deleteTrace",
233
- summary="Delete a trace by trace_id",
234
+ summary="Delete a trace by identifier",
234
235
  description=(
235
- "Delete an entire trace by its OpenTelemetry trace_id. "
236
+ "Delete an entire trace by its identifier. The identifier can be either:\n"
237
+ "1. A Relay node ID (base64-encoded)\n"
238
+ "2. An OpenTelemetry trace_id (hex string)\n\n"
236
239
  "This will permanently remove all spans in the trace and their associated data."
237
240
  ),
238
241
  responses=add_errors_to_responses([HTTP_404_NOT_FOUND]),
@@ -240,33 +243,51 @@ async def _add_spans(req: ExportTraceServiceRequest, state: State) -> None:
240
243
  )
241
244
  async def delete_trace(
242
245
  request: Request,
243
- trace_id: str = Path(description="The OpenTelemetry trace_id of the trace to delete"),
246
+ trace_identifier: str = Path(
247
+ description="The trace identifier: either a relay GlobalID or OpenTelemetry trace_id"
248
+ ),
244
249
  ) -> None:
245
250
  """
246
- Delete a trace by trace_id.
251
+ Delete a trace by identifier (relay GlobalID or OpenTelemetry trace_id).
247
252
 
248
253
  This endpoint will:
249
- 1. Find and delete the trace with the given trace_id (and all its spans via CASCADE)
250
- 2. Trigger cache invalidation events
251
- 3. Return 204 No Content on success
254
+ 1. Delete the trace by identifier (relay GlobalID or OpenTelemetry trace_id)
255
+ 2. Get project_id from the deletion for cache invalidation
256
+ 3. Trigger cache invalidation events
257
+ 4. Return 204 No Content on success
252
258
 
253
259
  Note: This deletes the entire trace, including all spans, which maintains data consistency
254
260
  and avoids orphaned spans or inconsistent cached cumulative fields.
255
261
  """
256
262
  async with request.app.state.db() as session:
257
- # Delete the trace directly and get project_id for cache invalidation
258
- delete_stmt = (
259
- delete(models.Trace)
260
- .where(models.Trace.trace_id == trace_id)
261
- .returning(models.Trace.project_rowid)
262
- )
263
+ # Try to parse as GlobalID first, then fall back to trace_id
264
+ try:
265
+ trace_rowid = from_global_id_with_expected_type(
266
+ GlobalID.from_id(trace_identifier),
267
+ "Trace",
268
+ )
269
+ # Delete by database rowid
270
+ delete_stmt = (
271
+ delete(models.Trace)
272
+ .where(models.Trace.id == trace_rowid)
273
+ .returning(models.Trace.project_rowid)
274
+ )
275
+ error_detail = f"Trace with relay ID '{trace_identifier}' not found"
276
+ except Exception:
277
+ # Delete by OpenTelemetry trace_id
278
+ delete_stmt = (
279
+ delete(models.Trace)
280
+ .where(models.Trace.trace_id == trace_identifier)
281
+ .returning(models.Trace.project_rowid)
282
+ )
283
+ error_detail = f"Trace with trace_id '{trace_identifier}' not found"
263
284
 
264
285
  project_id = await session.scalar(delete_stmt)
265
286
 
266
287
  if project_id is None:
267
288
  raise HTTPException(
268
289
  status_code=HTTP_404_NOT_FOUND,
269
- detail=f"Trace with trace_id '{trace_id}' not found",
290
+ detail=error_detail,
270
291
  )
271
292
 
272
293
  # Trigger cache invalidation event
@@ -31,6 +31,7 @@ from phoenix.auth import (
31
31
  DEFAULT_SYSTEM_EMAIL,
32
32
  DEFAULT_SYSTEM_USERNAME,
33
33
  compute_password_hash,
34
+ sanitize_email,
34
35
  validate_email_format,
35
36
  validate_password_format,
36
37
  )
@@ -205,6 +206,8 @@ async def create_user(
205
206
  ) -> CreateUserResponseBody:
206
207
  user_data = request_body.user
207
208
  email, username, role = user_data.email, user_data.username, user_data.role
209
+ # Sanitize email by trimming and lowercasing
210
+ email = sanitize_email(email)
208
211
  validate_email_format(email)
209
212
 
210
213
  # Prevent creation of SYSTEM users
@@ -0,0 +1,93 @@
1
+ {
2
+ "_components-B1Ec5V_g.js": {
3
+ "file": "assets/components-B1Ec5V_g.js",
4
+ "name": "components",
5
+ "imports": [
6
+ "_vendor-BbqekBfb.js",
7
+ "_pages-B77OHHSB.js",
8
+ "_vendor-arizeai-CEwHhYfL.js",
9
+ "_vendor-codemirror-CHApHLLJ.js",
10
+ "_vendor-three-BLWp5bic.js"
11
+ ]
12
+ },
13
+ "_pages-B77OHHSB.js": {
14
+ "file": "assets/pages-B77OHHSB.js",
15
+ "name": "pages",
16
+ "imports": [
17
+ "_vendor-BbqekBfb.js",
18
+ "_vendor-arizeai-CEwHhYfL.js",
19
+ "_components-B1Ec5V_g.js",
20
+ "_vendor-codemirror-CHApHLLJ.js",
21
+ "_vendor-recharts-Bqf7C6Cm.js"
22
+ ]
23
+ },
24
+ "_vendor-BbqekBfb.js": {
25
+ "file": "assets/vendor-BbqekBfb.js",
26
+ "name": "vendor",
27
+ "imports": [
28
+ "_vendor-three-BLWp5bic.js"
29
+ ],
30
+ "css": [
31
+ "assets/vendor-CqDb5u4o.css"
32
+ ]
33
+ },
34
+ "_vendor-CqDb5u4o.css": {
35
+ "file": "assets/vendor-CqDb5u4o.css",
36
+ "src": "_vendor-CqDb5u4o.css"
37
+ },
38
+ "_vendor-arizeai-CEwHhYfL.js": {
39
+ "file": "assets/vendor-arizeai-CEwHhYfL.js",
40
+ "name": "vendor-arizeai",
41
+ "imports": [
42
+ "_vendor-BbqekBfb.js"
43
+ ]
44
+ },
45
+ "_vendor-codemirror-CHApHLLJ.js": {
46
+ "file": "assets/vendor-codemirror-CHApHLLJ.js",
47
+ "name": "vendor-codemirror",
48
+ "imports": [
49
+ "_vendor-BbqekBfb.js",
50
+ "_vendor-shiki-BQ88Q1b1.js"
51
+ ],
52
+ "dynamicImports": [
53
+ "_vendor-shiki-BQ88Q1b1.js",
54
+ "_vendor-shiki-BQ88Q1b1.js",
55
+ "_vendor-shiki-BQ88Q1b1.js"
56
+ ]
57
+ },
58
+ "_vendor-recharts-Bqf7C6Cm.js": {
59
+ "file": "assets/vendor-recharts-Bqf7C6Cm.js",
60
+ "name": "vendor-recharts",
61
+ "imports": [
62
+ "_vendor-BbqekBfb.js"
63
+ ]
64
+ },
65
+ "_vendor-shiki-BQ88Q1b1.js": {
66
+ "file": "assets/vendor-shiki-BQ88Q1b1.js",
67
+ "name": "vendor-shiki",
68
+ "isDynamicEntry": true,
69
+ "imports": [
70
+ "_vendor-BbqekBfb.js"
71
+ ]
72
+ },
73
+ "_vendor-three-BLWp5bic.js": {
74
+ "file": "assets/vendor-three-BLWp5bic.js",
75
+ "name": "vendor-three"
76
+ },
77
+ "index.tsx": {
78
+ "file": "assets/index-DYx39hbu.js",
79
+ "name": "index",
80
+ "src": "index.tsx",
81
+ "isEntry": true,
82
+ "imports": [
83
+ "_vendor-BbqekBfb.js",
84
+ "_vendor-arizeai-CEwHhYfL.js",
85
+ "_pages-B77OHHSB.js",
86
+ "_components-B1Ec5V_g.js",
87
+ "_vendor-three-BLWp5bic.js",
88
+ "_vendor-codemirror-CHApHLLJ.js",
89
+ "_vendor-shiki-BQ88Q1b1.js",
90
+ "_vendor-recharts-Bqf7C6Cm.js"
91
+ ]
92
+ }
93
+ }