arize-phoenix 10.2.1__tar.gz → 10.3.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 (408) hide show
  1. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/PKG-INFO +8 -1
  2. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/README.md +7 -0
  3. arize_phoenix-10.3.0/src/phoenix/db/enums.py +10 -0
  4. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/facilitator.py +25 -33
  5. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/models.py +6 -1
  6. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/types/trace_retention.py +17 -10
  7. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/api_key_mutations.py +5 -4
  8. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/user_mutations.py +3 -11
  9. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/queries.py +5 -5
  10. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/oauth2.py +1 -4
  11. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/v1/__init__.py +2 -0
  12. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/v1/models.py +7 -0
  13. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/v1/projects.py +2 -3
  14. arize_phoenix-10.3.0/src/phoenix/server/api/routers/v1/users.py +346 -0
  15. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/bearer_auth.py +3 -4
  16. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/jwt_store.py +9 -9
  17. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/.vite/manifest.json +9 -9
  18. arize_phoenix-10.2.1/src/phoenix/server/static/assets/components-ClD3sHta.js → arize_phoenix-10.3.0/src/phoenix/server/static/assets/components-DVEsaeYg.js +2 -2
  19. arize_phoenix-10.2.1/src/phoenix/server/static/assets/index-CXawXHw0.js → arize_phoenix-10.3.0/src/phoenix/server/static/assets/index-cY-swWDK.js +2 -2
  20. arize_phoenix-10.2.1/src/phoenix/server/static/assets/pages-BFtNRfTL.js → arize_phoenix-10.3.0/src/phoenix/server/static/assets/pages-xeDsefDx.js +389 -389
  21. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/types.py +3 -2
  22. arize_phoenix-10.3.0/src/phoenix/version.py +1 -0
  23. arize_phoenix-10.2.1/src/phoenix/db/enums.py +0 -19
  24. arize_phoenix-10.2.1/src/phoenix/version.py +0 -1
  25. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/.gitignore +0 -0
  26. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/IP_NOTICE +0 -0
  27. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/LICENSE +0 -0
  28. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/pyproject.toml +0 -0
  29. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/__init__.py +0 -0
  30. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/auth.py +0 -0
  31. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/config.py +0 -0
  32. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/core/__init__.py +0 -0
  33. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/core/embedding_dimension.py +0 -0
  34. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/core/model.py +0 -0
  35. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/core/model_schema.py +0 -0
  36. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/core/model_schema_adapter.py +0 -0
  37. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/datetime_utils.py +0 -0
  38. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/README.md +0 -0
  39. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/__init__.py +0 -0
  40. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/alembic.ini +0 -0
  41. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/bulk_inserter.py +0 -0
  42. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/constants.py +0 -0
  43. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/engines.py +0 -0
  44. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/helpers.py +0 -0
  45. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/insertion/__init__.py +0 -0
  46. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/insertion/constants.py +0 -0
  47. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/insertion/dataset.py +0 -0
  48. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
  49. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/insertion/evaluation.py +0 -0
  50. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/insertion/helpers.py +0 -0
  51. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/insertion/span.py +0 -0
  52. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
  53. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
  54. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/insertion/types.py +0 -0
  55. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrate.py +0 -0
  56. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrations/__init__.py +0 -0
  57. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrations/data_migration_scripts/__init__.py +0 -0
  58. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +0 -0
  59. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrations/env.py +0 -0
  60. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrations/script.py.mako +0 -0
  61. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  62. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrations/versions/2f9d1a65945f_annotation_config_migration.py +0 -0
  63. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
  64. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +0 -0
  65. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrations/versions/6a88424799fe_update_users_with_auth_method.py +0 -0
  66. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrations/versions/8a3764fe7f1a_change_jsonb_to_json_for_prompts.py +0 -0
  67. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrations/versions/bb8139330879_create_project_trace_retention_policies_table.py +0 -0
  68. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrations/versions/bc8fea3c2bc8_add_prompt_tables.py +0 -0
  69. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
  70. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  71. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/pg_config.py +0 -0
  72. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/types/__init__.py +0 -0
  73. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/types/annotation_configs.py +0 -0
  74. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/types/db_models.py +0 -0
  75. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/types/identifier.py +0 -0
  76. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/db/types/model_provider.py +0 -0
  77. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/exceptions.py +0 -0
  78. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/experiments/__init__.py +0 -0
  79. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  80. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/experiments/evaluators/base.py +0 -0
  81. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
  82. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
  83. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
  84. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/experiments/functions.py +0 -0
  85. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/experiments/tracing.py +0 -0
  86. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/experiments/types.py +0 -0
  87. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/experiments/utils.py +0 -0
  88. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/inferences/__init__.py +0 -0
  89. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/inferences/errors.py +0 -0
  90. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/inferences/fixtures.py +0 -0
  91. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/inferences/inferences.py +0 -0
  92. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/inferences/schema.py +0 -0
  93. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/inferences/validation.py +0 -0
  94. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/logging/__init__.py +0 -0
  95. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/logging/_config.py +0 -0
  96. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/logging/_filter.py +0 -0
  97. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/logging/_formatter.py +0 -0
  98. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/metrics/README.md +0 -0
  99. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/metrics/__init__.py +0 -0
  100. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/metrics/binning.py +0 -0
  101. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/metrics/metrics.py +0 -0
  102. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/metrics/mixins.py +0 -0
  103. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  104. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/metrics/timeseries.py +0 -0
  105. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/metrics/wrappers.py +0 -0
  106. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/pointcloud/__init__.py +0 -0
  107. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/pointcloud/clustering.py +0 -0
  108. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
  109. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/pointcloud/projectors.py +0 -0
  110. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  111. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/py.typed +0 -0
  112. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/__init__.py +0 -0
  113. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/README.md +0 -0
  114. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/__init__.py +0 -0
  115. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/auth.py +0 -0
  116. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/context.py +0 -0
  117. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
  118. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
  119. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
  120. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  121. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
  122. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
  123. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
  124. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
  125. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
  126. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
  127. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
  128. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
  129. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
  130. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
  131. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
  132. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
  133. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
  134. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/num_child_spans.py +0 -0
  135. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/num_spans_per_trace.py +0 -0
  136. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
  137. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/project_ids_by_trace_retention_policy_id.py +0 -0
  138. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/prompt_version_sequence_number.py +0 -0
  139. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
  140. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/session_io.py +0 -0
  141. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/session_num_traces.py +0 -0
  142. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/session_num_traces_with_error.py +0 -0
  143. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/session_token_usages.py +0 -0
  144. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +0 -0
  145. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
  146. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/span_by_id.py +0 -0
  147. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
  148. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
  149. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
  150. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/table_fields.py +0 -0
  151. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
  152. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/trace_by_trace_ids.py +0 -0
  153. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/trace_retention_policy_id_by_project_id.py +0 -0
  154. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/trace_root_spans.py +0 -0
  155. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/user_roles.py +0 -0
  156. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/dataloaders/users.py +0 -0
  157. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/exceptions.py +0 -0
  158. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
  159. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/helpers/annotations.py +0 -0
  160. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
  161. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/helpers/experiment_run_filters.py +0 -0
  162. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/helpers/playground_clients.py +0 -0
  163. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/helpers/playground_registry.py +0 -0
  164. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/helpers/playground_spans.py +0 -0
  165. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/helpers/prompts/__init__.py +0 -0
  166. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/helpers/prompts/conversions/__init__.py +0 -0
  167. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/helpers/prompts/conversions/anthropic.py +0 -0
  168. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/helpers/prompts/conversions/openai.py +0 -0
  169. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/helpers/prompts/models.py +0 -0
  170. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
  171. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
  172. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/ChatCompletionInput.py +0 -0
  173. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -0
  174. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  175. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  176. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  177. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  178. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
  179. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
  180. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  181. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  182. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  183. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  184. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
  185. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
  186. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  187. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
  188. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  189. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  190. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/GenerativeModelInput.py +0 -0
  191. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  192. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/InvocationParameters.py +0 -0
  193. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
  194. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
  195. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  196. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  197. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/ProjectFilter.py +0 -0
  198. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/ProjectSessionSort.py +0 -0
  199. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/ProjectSort.py +0 -0
  200. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/PromptTemplateOptions.py +0 -0
  201. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/PromptVersionInput.py +0 -0
  202. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/SpanAnnotationFilter.py +0 -0
  203. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  204. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  205. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  206. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  207. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
  208. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
  209. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/interceptor.py +0 -0
  210. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
  211. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/annotation_config_mutations.py +0 -0
  212. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/chat_mutations.py +0 -0
  213. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
  214. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
  215. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
  216. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
  217. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/project_trace_retention_policy_mutations.py +0 -0
  218. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/prompt_label_mutations.py +0 -0
  219. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/prompt_mutations.py +0 -0
  220. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/prompt_version_tag_mutations.py +0 -0
  221. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
  222. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
  223. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/mutations/trace_mutations.py +0 -0
  224. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
  225. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/openapi/main.py +0 -0
  226. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/openapi/schema.py +0 -0
  227. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/__init__.py +0 -0
  228. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/auth.py +0 -0
  229. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/embeddings.py +0 -0
  230. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/utils.py +0 -0
  231. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/v1/annotation_configs.py +0 -0
  232. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/v1/annotations.py +0 -0
  233. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/v1/datasets.py +0 -0
  234. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/v1/evaluations.py +0 -0
  235. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
  236. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
  237. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/v1/experiments.py +0 -0
  238. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/v1/prompts.py +0 -0
  239. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/v1/spans.py +0 -0
  240. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/v1/traces.py +0 -0
  241. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
  242. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/schema.py +0 -0
  243. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/subscriptions.py +0 -0
  244. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Annotation.py +0 -0
  245. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/AnnotationConfig.py +0 -0
  246. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/AnnotationSource.py +0 -0
  247. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
  248. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
  249. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
  250. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/AuthMethod.py +0 -0
  251. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
  252. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +0 -0
  253. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Cluster.py +0 -0
  254. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  255. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/CronExpression.py +0 -0
  256. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  257. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Dataset.py +0 -0
  258. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  259. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  260. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  261. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  262. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Dimension.py +0 -0
  263. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  264. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  265. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
  266. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  267. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  268. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  269. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  270. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  271. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
  272. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  273. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Event.py +0 -0
  274. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  275. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  276. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Experiment.py +0 -0
  277. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  278. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
  279. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  280. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  281. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  282. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Functionality.py +0 -0
  283. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
  284. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/GenerativeProvider.py +0 -0
  285. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Identifier.py +0 -0
  286. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Inferences.py +0 -0
  287. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
  288. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  289. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/MimeType.py +0 -0
  290. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Model.py +0 -0
  291. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
  292. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  293. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Project.py +0 -0
  294. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/ProjectSession.py +0 -0
  295. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/ProjectTraceRetentionPolicy.py +0 -0
  296. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Prompt.py +0 -0
  297. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/PromptLabel.py +0 -0
  298. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  299. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/PromptVersion.py +0 -0
  300. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/PromptVersionTag.py +0 -0
  301. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/PromptVersionTemplate.py +0 -0
  302. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/ResponseFormat.py +0 -0
  303. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
  304. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  305. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Segments.py +0 -0
  306. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/SortDir.py +0 -0
  307. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Span.py +0 -0
  308. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
  309. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/SpanIOValue.py +0 -0
  310. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
  311. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  312. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/TokenCountPromptDetails.py +0 -0
  313. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/TokenUsage.py +0 -0
  314. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/ToolDefinition.py +0 -0
  315. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/Trace.py +0 -0
  316. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
  317. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  318. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/User.py +0 -0
  319. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
  320. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/UserRole.py +0 -0
  321. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  322. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  323. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/__init__.py +0 -0
  324. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/node.py +0 -0
  325. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/types/pagination.py +0 -0
  326. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/api/utils.py +0 -0
  327. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/app.py +0 -0
  328. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/authorization.py +0 -0
  329. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/cost_tracking/__init__.py +0 -0
  330. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/cost_tracking/cost_lookup.py +0 -0
  331. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/cost_tracking/model_cost_manifest.json +0 -0
  332. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/dml_event.py +0 -0
  333. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/dml_event_handler.py +0 -0
  334. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/email/__init__.py +0 -0
  335. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/email/sender.py +0 -0
  336. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/email/templates/__init__.py +0 -0
  337. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/email/templates/password_reset.html +0 -0
  338. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/email/templates/welcome.html +0 -0
  339. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/email/types.py +0 -0
  340. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/grpc_server.py +0 -0
  341. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/main.py +0 -0
  342. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/middleware/__init__.py +0 -0
  343. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/middleware/gzip.py +0 -0
  344. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/oauth2.py +0 -0
  345. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/openapi/__init__.py +0 -0
  346. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/prometheus.py +0 -0
  347. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/rate_limiters.py +0 -0
  348. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/retention.py +0 -0
  349. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  350. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  351. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  352. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  353. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  354. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  355. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  356. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  357. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/assets/vendor-DOUbLVp5.js +0 -0
  358. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/assets/vendor-WIZid84E.css +0 -0
  359. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/assets/vendor-arizeai-DHqMQzfV.js +0 -0
  360. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/assets/vendor-codemirror-DWdZV1Is.js +0 -0
  361. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/assets/vendor-recharts-BfHdRd1Y.js +0 -0
  362. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/assets/vendor-shiki-CHu75YVL.js +0 -0
  363. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/assets/vendor-three-C5WAXd5r.js +0 -0
  364. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/favicon.ico +0 -0
  365. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/static/modernizr.js +0 -0
  366. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/telemetry.py +0 -0
  367. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/templates/__init__.py +0 -0
  368. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/templates/index.html +0 -0
  369. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/server/thread_server.py +0 -0
  370. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/services.py +0 -0
  371. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/session/__init__.py +0 -0
  372. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/session/client.py +0 -0
  373. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/session/data_extractor.py +0 -0
  374. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/session/evaluation.py +0 -0
  375. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/session/session.py +0 -0
  376. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/settings.py +0 -0
  377. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/__init__.py +0 -0
  378. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/attributes.py +0 -0
  379. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/dsl/README.md +0 -0
  380. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/dsl/__init__.py +0 -0
  381. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/dsl/filter.py +0 -0
  382. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/dsl/helpers.py +0 -0
  383. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/dsl/query.py +0 -0
  384. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/errors.py +0 -0
  385. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
  386. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/exporter.py +0 -0
  387. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/fixtures.py +0 -0
  388. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/otel.py +0 -0
  389. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/projects.py +0 -0
  390. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/schemas.py +0 -0
  391. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/span_evaluations.py +0 -0
  392. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/span_json_decoder.py +0 -0
  393. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/span_json_encoder.py +0 -0
  394. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/trace_dataset.py +0 -0
  395. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/utils.py +0 -0
  396. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/v1/__init__.py +0 -0
  397. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  398. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  399. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/utilities/__init__.py +0 -0
  400. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/utilities/client.py +0 -0
  401. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/utilities/deprecation.py +0 -0
  402. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/utilities/error_handling.py +0 -0
  403. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/utilities/json.py +0 -0
  404. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/utilities/logging.py +0 -0
  405. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/utilities/project.py +0 -0
  406. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/utilities/re.py +0 -0
  407. {arize_phoenix-10.2.1 → arize_phoenix-10.3.0}/src/phoenix/utilities/span_store.py +0 -0
  408. {arize_phoenix-10.2.1 → arize_phoenix-10.3.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: 10.2.1
3
+ Version: 10.3.0
4
4
  Summary: AI Observability and Evaluation
5
5
  Project-URL: Documentation, https://docs.arize.com/phoenix/
6
6
  Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
@@ -158,6 +158,9 @@ Description-Content-Type: text/markdown
158
158
  <a target="_blank" href="https://hub.docker.com/r/arizephoenix/phoenix/tags">
159
159
  <img src="https://img.shields.io/docker/v/arizephoenix/phoenix?sort=semver&logo=docker&label=image&color=blue">
160
160
  </a>
161
+ <a target="_blank" href="https://hub.docker.com/r/arizephoenix/phoenix-helm">
162
+ <img src="https://img.shields.io/badge/Helm-blue?style=flat&logo=helm&labelColor=grey"/>
163
+ </a>
161
164
  <a target="_blank" href="https://github.com/Arize-ai/phoenix/tree/main/js/packages/phoenix-mcp">
162
165
  <img src="https://badge.mcpx.dev?status=on" title="MCP Enabled"/>
163
166
  </a>
@@ -226,6 +229,9 @@ Phoenix is built on top of OpenTelemetry and is vendor, language, and framework
226
229
  | [Smolagents](https://huggingface.co/docs/smolagents/en/tutorials/inspect_runs) | `openinference-instrumentation-smolagents` | [![PyPI Version](https://img.shields.io/pypi/v/openinference-instrumentation-smolagents.svg)](https://pypi.python.org/pypi/openinference-instrumentation-smolagents) |
227
230
  | [Agno](https://docs.arize.com/phoenix/tracing/integrations-tracing/agno) | `openinference-instrumentation-agno` | [![PyPI Version](https://img.shields.io/pypi/v/openinference-instrumentation-agno.svg)](https://pypi.python.org/pypi/openinference-instrumentation-agno) |
228
231
  | [MCP](https://docs.arize.com/phoenix/tracing/integrations-tracing/model-context-protocol-mcp) | `openinference-instrumentation-mcp` | [![PyPI Version](https://img.shields.io/pypi/v/openinference-instrumentation-mcp.svg)](https://pypi.python.org/pypi/openinference-instrumentation-mcp) |
232
+ | [Pydantic AI](https://docs.arize.com/phoenix/integrations/pydantic) | `openinference-instrumentation-pydantic-ai` | [![PyPI Version](https://img.shields.io/pypi/v/openinference-instrumentation-pydantic-ai.svg)](https://pypi.python.org/pypi/openinference-instrumentation-pydantic-ai) |
233
+ | [Autogen AgentChat](https://docs.arize.com/phoenix/integrations/frameworks/autogen/autogen-tracing) | `openinference-instrumentation-autogen-agentchat` | [![PyPI Version](https://img.shields.io/pypi/v/openinference-instrumentation-autogen-agentchat.svg)](https://pypi.python.org/pypi/openinference-instrumentation-autogen-agentchat) |
234
+ | [Portkey](https://docs.arize.com/phoenix/integrations/portkey) | `openinference-instrumentation-portkey` | [![PyPI Version](https://img.shields.io/pypi/v/openinference-instrumentation-portkey.svg)](https://pypi.python.org/pypi/openinference-instrumentation-portkey) |
229
235
 
230
236
  ### JavaScript Integrations
231
237
 
@@ -235,6 +241,7 @@ Phoenix is built on top of OpenTelemetry and is vendor, language, and framework
235
241
  | [LangChain.js](https://docs.arize.com/phoenix/tracing/integrations-tracing/langchain.js) | `@arizeai/openinference-instrumentation-langchain` | [![NPM Version](https://img.shields.io/npm/v/@arizeai/openinference-instrumentation-langchain.svg)](https://www.npmjs.com/package/@arizeai/openinference-instrumentation-langchain) |
236
242
  | [Vercel AI SDK](https://docs.arize.com/phoenix/tracing/integrations-tracing/vercel-ai-sdk) | `@arizeai/openinference-vercel` | [![NPM Version](https://img.shields.io/npm/v/@arizeai/openinference-vercel)](https://www.npmjs.com/package/@arizeai/openinference-vercel) |
237
243
  | [BeeAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/beeai) | `@arizeai/openinference-instrumentation-beeai` | [![NPM Version](https://img.shields.io/npm/v/@arizeai/openinference-vercel)](https://www.npmjs.com/package/@arizeai/openinference-instrumentation-beeai) |
244
+ | [Mastra](https://docs.arize.com/phoenix/integrations/mastra) | `@arizeai/openinference-mastra` | [![NPM Version](https://img.shields.io/npm/v/@arizeai/openinference-mastra.svg)](https://www.npmjs.com/package/@arizeai/openinference-mastra) |
238
245
 
239
246
  ### Platforms
240
247
 
@@ -28,6 +28,9 @@
28
28
  <a target="_blank" href="https://hub.docker.com/r/arizephoenix/phoenix/tags">
29
29
  <img src="https://img.shields.io/docker/v/arizephoenix/phoenix?sort=semver&logo=docker&label=image&color=blue">
30
30
  </a>
31
+ <a target="_blank" href="https://hub.docker.com/r/arizephoenix/phoenix-helm">
32
+ <img src="https://img.shields.io/badge/Helm-blue?style=flat&logo=helm&labelColor=grey"/>
33
+ </a>
31
34
  <a target="_blank" href="https://github.com/Arize-ai/phoenix/tree/main/js/packages/phoenix-mcp">
32
35
  <img src="https://badge.mcpx.dev?status=on" title="MCP Enabled"/>
33
36
  </a>
@@ -96,6 +99,9 @@ Phoenix is built on top of OpenTelemetry and is vendor, language, and framework
96
99
  | [Smolagents](https://huggingface.co/docs/smolagents/en/tutorials/inspect_runs) | `openinference-instrumentation-smolagents` | [![PyPI Version](https://img.shields.io/pypi/v/openinference-instrumentation-smolagents.svg)](https://pypi.python.org/pypi/openinference-instrumentation-smolagents) |
97
100
  | [Agno](https://docs.arize.com/phoenix/tracing/integrations-tracing/agno) | `openinference-instrumentation-agno` | [![PyPI Version](https://img.shields.io/pypi/v/openinference-instrumentation-agno.svg)](https://pypi.python.org/pypi/openinference-instrumentation-agno) |
98
101
  | [MCP](https://docs.arize.com/phoenix/tracing/integrations-tracing/model-context-protocol-mcp) | `openinference-instrumentation-mcp` | [![PyPI Version](https://img.shields.io/pypi/v/openinference-instrumentation-mcp.svg)](https://pypi.python.org/pypi/openinference-instrumentation-mcp) |
102
+ | [Pydantic AI](https://docs.arize.com/phoenix/integrations/pydantic) | `openinference-instrumentation-pydantic-ai` | [![PyPI Version](https://img.shields.io/pypi/v/openinference-instrumentation-pydantic-ai.svg)](https://pypi.python.org/pypi/openinference-instrumentation-pydantic-ai) |
103
+ | [Autogen AgentChat](https://docs.arize.com/phoenix/integrations/frameworks/autogen/autogen-tracing) | `openinference-instrumentation-autogen-agentchat` | [![PyPI Version](https://img.shields.io/pypi/v/openinference-instrumentation-autogen-agentchat.svg)](https://pypi.python.org/pypi/openinference-instrumentation-autogen-agentchat) |
104
+ | [Portkey](https://docs.arize.com/phoenix/integrations/portkey) | `openinference-instrumentation-portkey` | [![PyPI Version](https://img.shields.io/pypi/v/openinference-instrumentation-portkey.svg)](https://pypi.python.org/pypi/openinference-instrumentation-portkey) |
99
105
 
100
106
  ### JavaScript Integrations
101
107
 
@@ -105,6 +111,7 @@ Phoenix is built on top of OpenTelemetry and is vendor, language, and framework
105
111
  | [LangChain.js](https://docs.arize.com/phoenix/tracing/integrations-tracing/langchain.js) | `@arizeai/openinference-instrumentation-langchain` | [![NPM Version](https://img.shields.io/npm/v/@arizeai/openinference-instrumentation-langchain.svg)](https://www.npmjs.com/package/@arizeai/openinference-instrumentation-langchain) |
106
112
  | [Vercel AI SDK](https://docs.arize.com/phoenix/tracing/integrations-tracing/vercel-ai-sdk) | `@arizeai/openinference-vercel` | [![NPM Version](https://img.shields.io/npm/v/@arizeai/openinference-vercel)](https://www.npmjs.com/package/@arizeai/openinference-vercel) |
107
113
  | [BeeAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/beeai) | `@arizeai/openinference-instrumentation-beeai` | [![NPM Version](https://img.shields.io/npm/v/@arizeai/openinference-vercel)](https://www.npmjs.com/package/@arizeai/openinference-instrumentation-beeai) |
114
+ | [Mastra](https://docs.arize.com/phoenix/integrations/mastra) | `@arizeai/openinference-mastra` | [![NPM Version](https://img.shields.io/npm/v/@arizeai/openinference-mastra.svg)](https://www.npmjs.com/package/@arizeai/openinference-mastra) |
108
115
 
109
116
  ### Platforms
110
117
 
@@ -0,0 +1,10 @@
1
+ from sqlalchemy.orm import InstrumentedAttribute
2
+
3
+ from phoenix.db import models
4
+
5
+ __all__ = ["ENUM_COLUMNS"]
6
+
7
+
8
+ ENUM_COLUMNS: set[InstrumentedAttribute[str]] = {
9
+ models.UserRole.name,
10
+ }
@@ -7,12 +7,7 @@ from asyncio import gather
7
7
  from functools import partial
8
8
  from typing import Optional
9
9
 
10
- from sqlalchemy import (
11
- distinct,
12
- exists,
13
- insert,
14
- select,
15
- )
10
+ import sqlalchemy as sa
16
11
 
17
12
  from phoenix import config
18
13
  from phoenix.auth import (
@@ -30,7 +25,8 @@ from phoenix.config import (
30
25
  )
31
26
  from phoenix.db import models
32
27
  from phoenix.db.constants import DEFAULT_PROJECT_TRACE_RETENTION_POLICY_ID
33
- from phoenix.db.enums import COLUMN_ENUMS, UserRole
28
+ from phoenix.db.enums import ENUM_COLUMNS
29
+ from phoenix.db.models import UserRoleName
34
30
  from phoenix.db.types.trace_retention import (
35
31
  MaxDaysRule,
36
32
  TraceRetentionCronExpression,
@@ -76,18 +72,17 @@ async def _ensure_enums(db: DbSessionFactory) -> None:
76
72
  they will be added. If any values are present in the database but not in the enum, an error will
77
73
  be raised. This function is idempotent: it will not add duplicate values to the database.
78
74
  """
79
- for column, enum in COLUMN_ENUMS.items():
75
+ for column in ENUM_COLUMNS:
80
76
  table = column.class_
77
+ assert isinstance(column.type, sa.Enum)
81
78
  async with db() as session:
82
- existing = set(
83
- [_ async for _ in await session.stream_scalars(select(distinct(column)))]
84
- )
85
- expected = set(e.value for e in enum)
79
+ existing = set(await session.scalars(sa.select(column)))
80
+ expected = set(column.type.enums)
86
81
  if unexpected := existing - expected:
87
82
  raise ValueError(f"Unexpected values in {table.name}.{column.key}: {unexpected}")
88
83
  if not (missing := expected - existing):
89
84
  continue
90
- await session.execute(insert(table), [{column.key: v} for v in missing])
85
+ await session.execute(sa.insert(table), [{column.key: v} for v in missing])
91
86
 
92
87
 
93
88
  async def _ensure_user_roles(db: DbSessionFactory) -> None:
@@ -97,21 +92,22 @@ async def _ensure_user_roles(db: DbSessionFactory) -> None:
97
92
  the email "admin@localhost".
98
93
  """
99
94
  async with db() as session:
100
- role_ids = {
95
+ role_ids: dict[UserRoleName, int] = {
101
96
  name: id_
102
97
  async for name, id_ in await session.stream(
103
- select(models.UserRole.name, models.UserRole.id)
98
+ sa.select(models.UserRole.name, models.UserRole.id)
104
99
  )
105
100
  }
106
- existing_roles = [
101
+ existing_roles: list[UserRoleName] = [
107
102
  name
108
103
  async for name in await session.stream_scalars(
109
- select(distinct(models.UserRole.name)).join_from(models.User, models.UserRole)
104
+ sa.select(sa.distinct(models.UserRole.name)).join_from(models.User, models.UserRole)
110
105
  )
111
106
  ]
112
- if (system_role := UserRole.SYSTEM.value) not in existing_roles and (
113
- system_role_id := role_ids.get(system_role)
114
- ) is not None:
107
+ if (
108
+ "SYSTEM" not in existing_roles
109
+ and (system_role_id := role_ids.get("SYSTEM")) is not None
110
+ ):
115
111
  system_user = models.LocalUser(
116
112
  user_role_id=system_role_id,
117
113
  username=DEFAULT_SYSTEM_USERNAME,
@@ -121,9 +117,7 @@ async def _ensure_user_roles(db: DbSessionFactory) -> None:
121
117
  password_hash=secrets.token_bytes(DEFAULT_SECRET_LENGTH),
122
118
  )
123
119
  session.add(system_user)
124
- if (admin_role := UserRole.ADMIN.value) not in existing_roles and (
125
- admin_role_id := role_ids.get(admin_role)
126
- ) is not None:
120
+ if "ADMIN" not in existing_roles and (admin_role_id := role_ids.get("ADMIN")) is not None:
127
121
  salt = secrets.token_bytes(DEFAULT_SECRET_LENGTH)
128
122
  password = get_env_default_admin_initial_password()
129
123
  compute = partial(compute_password_hash, password=password, salt=salt)
@@ -147,9 +141,9 @@ async def _get_system_user_id(db: DbSessionFactory) -> None:
147
141
  """
148
142
  async with db() as session:
149
143
  system_user_id = await session.scalar(
150
- select(models.User.id)
144
+ sa.select(models.User.id)
151
145
  .join(models.UserRole)
152
- .where(models.UserRole.name == UserRole.SYSTEM.value)
146
+ .where(models.UserRole.name == "SYSTEM")
153
147
  .order_by(models.User.id)
154
148
  .limit(1)
155
149
  )
@@ -173,7 +167,7 @@ async def _ensure_admins(
173
167
  async with db() as session:
174
168
  existing_emails = set(
175
169
  await session.scalars(
176
- select(models.User.email).where(models.User.email.in_(admins.keys()))
170
+ sa.select(models.User.email).where(models.User.email.in_(admins.keys()))
177
171
  )
178
172
  )
179
173
  admins = {
@@ -183,7 +177,7 @@ async def _ensure_admins(
183
177
  return
184
178
  existing_usernames = set(
185
179
  await session.scalars(
186
- select(models.User.username).where(models.User.username.in_(admins.values()))
180
+ sa.select(models.User.username).where(models.User.username.in_(admins.values()))
187
181
  )
188
182
  )
189
183
  admins = {
@@ -193,9 +187,7 @@ async def _ensure_admins(
193
187
  }
194
188
  if not admins:
195
189
  return
196
- admin_role_id = await session.scalar(
197
- select(models.UserRole.id).filter_by(name=UserRole.ADMIN.value)
198
- )
190
+ admin_role_id = await session.scalar(sa.select(models.UserRole.id).filter_by(name="ADMIN"))
199
191
  assert admin_role_id is not None, "Admin role not found in database"
200
192
  user: models.User
201
193
  for email, username in admins.items():
@@ -248,8 +240,8 @@ async def _ensure_default_project_trace_retention_policy(db: DbSessionFactory) -
248
240
  assert DEFAULT_PROJECT_TRACE_RETENTION_POLICY_ID == 0
249
241
  async with db() as session:
250
242
  if await session.scalar(
251
- select(
252
- exists().where(
243
+ sa.select(
244
+ sa.exists().where(
253
245
  models.ProjectTraceRetentionPolicy.id
254
246
  == DEFAULT_PROJECT_TRACE_RETENTION_POLICY_ID
255
247
  )
@@ -259,7 +251,7 @@ async def _ensure_default_project_trace_retention_policy(db: DbSessionFactory) -
259
251
  cron_expression = TraceRetentionCronExpression(root="0 0 * * 0")
260
252
  rule = TraceRetentionRule(root=MaxDaysRule(max_days=0))
261
253
  await session.execute(
262
- insert(models.ProjectTraceRetentionPolicy),
254
+ sa.insert(models.ProjectTraceRetentionPolicy),
263
255
  [
264
256
  {
265
257
  "id": DEFAULT_PROJECT_TRACE_RETENTION_POLICY_ID,
@@ -146,6 +146,7 @@ def render_values_w_union(
146
146
  return compiler.process(subquery, from_linter=from_linter, **kw)
147
147
 
148
148
 
149
+ UserRoleName: TypeAlias = Literal["SYSTEM", "ADMIN", "MEMBER"]
149
150
  AuthMethod: TypeAlias = Literal["LOCAL", "OAUTH2"]
150
151
 
151
152
 
@@ -1132,7 +1133,7 @@ class ExperimentRunAnnotation(Base):
1132
1133
 
1133
1134
  class UserRole(Base):
1134
1135
  __tablename__ = "user_roles"
1135
- name: Mapped[str] = mapped_column(unique=True, index=True)
1136
+ name: Mapped[UserRoleName] = mapped_column(unique=True, index=True)
1136
1137
  users: Mapped[list["User"]] = relationship("User", back_populates="role")
1137
1138
 
1138
1139
 
@@ -1231,6 +1232,8 @@ class OAuth2User(User):
1231
1232
  *,
1232
1233
  email: str,
1233
1234
  username: str,
1235
+ oauth2_client_id: Optional[str] = None,
1236
+ oauth2_user_id: Optional[str] = None,
1234
1237
  user_role_id: Optional[int] = None,
1235
1238
  ) -> None:
1236
1239
  super().__init__(
@@ -1239,6 +1242,8 @@ class OAuth2User(User):
1239
1242
  user_role_id=user_role_id,
1240
1243
  reset_password=False,
1241
1244
  auth_method="OAUTH2",
1245
+ oauth2_client_id=oauth2_client_id,
1246
+ oauth2_user_id=oauth2_user_id,
1242
1247
  )
1243
1248
 
1244
1249
 
@@ -5,6 +5,7 @@ from typing import Annotated, Iterable, Literal, Optional, Union
5
5
 
6
6
  import sqlalchemy as sa
7
7
  from pydantic import AfterValidator, BaseModel, Field, RootModel
8
+ from sqlalchemy import func
8
9
  from sqlalchemy.ext.asyncio import AsyncSession
9
10
 
10
11
  from phoenix.utilities import hour_of_week
@@ -25,19 +26,25 @@ class _MaxDays(BaseModel):
25
26
  class _MaxCount(BaseModel):
26
27
  max_count: Annotated[int, Field(ge=0)]
27
28
 
28
- @property
29
- def max_count_filter(self) -> sa.ColumnElement[bool]:
29
+ def max_count_filter(
30
+ self,
31
+ project_rowids: Union[Iterable[int], sa.ScalarSelect[int]],
32
+ ) -> sa.ColumnElement[bool]:
30
33
  if self.max_count <= 0:
31
34
  return sa.literal(False)
32
35
  from phoenix.db.models import Trace
33
36
 
34
- return Trace.start_time < (
35
- sa.select(Trace.start_time)
36
- .order_by(Trace.start_time.desc())
37
- .offset(self.max_count - 1)
38
- .limit(1)
39
- .scalar_subquery()
37
+ ranked = (
38
+ sa.select(
39
+ Trace.id,
40
+ func.row_number()
41
+ .over(partition_by=Trace.project_rowid, order_by=Trace.start_time.desc())
42
+ .label("rn"),
43
+ )
44
+ .where(Trace.project_rowid.in_(project_rowids))
45
+ .cte("ranked")
40
46
  )
47
+ return Trace.id.in_(sa.select(ranked.c.id).where(ranked.c.rn > self.max_count))
41
48
 
42
49
 
43
50
  class MaxDaysRule(_MaxDays, BaseModel):
@@ -82,7 +89,7 @@ class MaxCountRule(_MaxCount, BaseModel):
82
89
  stmt = (
83
90
  sa.delete(Trace)
84
91
  .where(Trace.project_rowid.in_(project_rowids))
85
- .where(self.max_count_filter)
92
+ .where(self.max_count_filter(project_rowids))
86
93
  .returning(Trace.project_rowid)
87
94
  )
88
95
  return set(await session.scalars(stmt))
@@ -106,7 +113,7 @@ class MaxDaysOrCountRule(_MaxDays, _MaxCount, BaseModel):
106
113
  stmt = (
107
114
  sa.delete(Trace)
108
115
  .where(Trace.project_rowid.in_(project_rowids))
109
- .where(sa.or_(self.max_days_filter, self.max_count_filter))
116
+ .where(sa.or_(self.max_days_filter, self.max_count_filter(project_rowids)))
110
117
  .returning(Trace.project_rowid)
111
118
  )
112
119
  return set(await session.scalars(stmt))
@@ -7,7 +7,8 @@ from strawberry import UNSET
7
7
  from strawberry.relay import GlobalID
8
8
  from strawberry.types import Info
9
9
 
10
- from phoenix.db import enums, models
10
+ from phoenix.db import models
11
+ from phoenix.db.models import UserRoleName
11
12
  from phoenix.server.api.auth import IsAdmin, IsLocked, IsNotReadOnly
12
13
  from phoenix.server.api.context import Context
13
14
  from phoenix.server.api.exceptions import Unauthorized
@@ -65,13 +66,13 @@ class ApiKeyMutationMixin:
65
66
  self, info: Info[Context, None], input: CreateApiKeyInput
66
67
  ) -> CreateSystemApiKeyMutationPayload:
67
68
  assert (token_store := info.context.token_store) is not None
68
- user_role = enums.UserRole.SYSTEM
69
+ user_role: UserRoleName = "SYSTEM"
69
70
  async with info.context.db() as session:
70
71
  # Get the system user - note this could be pushed into a dataloader
71
72
  system_user = await session.scalar(
72
73
  select(models.User)
73
74
  .join(models.UserRole) # Join User with UserRole
74
- .where(models.UserRole.name == user_role.value) # Filter where role is SYSTEM
75
+ .where(models.UserRole.name == user_role) # Filter where role is SYSTEM
75
76
  .order_by(models.User.id)
76
77
  .limit(1)
77
78
  )
@@ -117,7 +118,7 @@ class ApiKeyMutationMixin:
117
118
  issued_at=issued_at,
118
119
  expiration_time=input.expires_at or None,
119
120
  attributes=ApiKeyAttributes(
120
- user_role=enums.UserRole.MEMBER,
121
+ user_role="ADMIN" if user.is_admin else "MEMBER",
121
122
  name=input.name,
122
123
  description=input.description,
123
124
  ),
@@ -25,7 +25,7 @@ from phoenix.auth import (
25
25
  validate_password_format,
26
26
  )
27
27
  from phoenix.config import get_env_disable_basic_auth
28
- from phoenix.db import enums, models
28
+ from phoenix.db import models
29
29
  from phoenix.server.api.auth import IsAdmin, IsLocked, IsNotReadOnly
30
30
  from phoenix.server.api.context import Context
31
31
  from phoenix.server.api.exceptions import BadRequest, Conflict, NotFound, Unauthorized
@@ -256,16 +256,8 @@ class UserMutationMixin:
256
256
  set(input.user_ids),
257
257
  )
258
258
  )
259
- system_user_role_id = (
260
- select(models.UserRole.id)
261
- .where(models.UserRole.name == enums.UserRole.SYSTEM.value)
262
- .scalar_subquery()
263
- )
264
- admin_user_role_id = (
265
- select(models.UserRole.id)
266
- .where(models.UserRole.name == enums.UserRole.ADMIN.value)
267
- .scalar_subquery()
268
- )
259
+ system_user_role_id = select(models.UserRole.id).filter_by(name="SYSTEM").scalar_subquery()
260
+ admin_user_role_id = select(models.UserRole.id).filter_by(name="ADMIN").scalar_subquery()
269
261
  default_admin_user_id = (
270
262
  select(models.User.id)
271
263
  .where(
@@ -18,7 +18,7 @@ from phoenix.config import (
18
18
  get_env_database_allocated_storage_capacity_gibibytes,
19
19
  getenv,
20
20
  )
21
- from phoenix.db import enums, models
21
+ from phoenix.db import models
22
22
  from phoenix.db.constants import DEFAULT_PROJECT_TRACE_RETENTION_POLICY_ID
23
23
  from phoenix.db.helpers import SupportedSQLDialect, exclude_experiment_projects
24
24
  from phoenix.db.models import DatasetExample as OrmExample
@@ -165,7 +165,7 @@ class Query:
165
165
  stmt = (
166
166
  select(models.User)
167
167
  .join(models.UserRole)
168
- .where(models.UserRole.name != enums.UserRole.SYSTEM.value)
168
+ .where(models.UserRole.name != "SYSTEM")
169
169
  .order_by(models.User.email)
170
170
  .options(joinedload(models.User.role))
171
171
  )
@@ -181,7 +181,7 @@ class Query:
181
181
  ) -> list[UserRole]:
182
182
  async with info.context.db() as session:
183
183
  roles = await session.scalars(
184
- select(models.UserRole).where(models.UserRole.name != enums.UserRole.SYSTEM.value)
184
+ select(models.UserRole).where(models.UserRole.name != "SYSTEM")
185
185
  )
186
186
  return [
187
187
  UserRole(
@@ -197,7 +197,7 @@ class Query:
197
197
  select(models.ApiKey)
198
198
  .join(models.User)
199
199
  .join(models.UserRole)
200
- .where(models.UserRole.name != enums.UserRole.SYSTEM.value)
200
+ .where(models.UserRole.name != "SYSTEM")
201
201
  )
202
202
  async with info.context.db() as session:
203
203
  api_keys = await session.scalars(stmt)
@@ -209,7 +209,7 @@ class Query:
209
209
  select(models.ApiKey)
210
210
  .join(models.User)
211
211
  .join(models.UserRole)
212
- .where(models.UserRole.name == enums.UserRole.SYSTEM.value)
212
+ .where(models.UserRole.name == "SYSTEM")
213
213
  )
214
214
  async with info.context.db() as session:
215
215
  api_keys = await session.scalars(stmt)
@@ -37,7 +37,6 @@ from phoenix.config import (
37
37
  get_env_disable_rate_limit,
38
38
  )
39
39
  from phoenix.db import models
40
- from phoenix.db.enums import UserRole
41
40
  from phoenix.server.bearer_auth import create_access_and_refresh_tokens
42
41
  from phoenix.server.oauth2 import OAuth2Client
43
42
  from phoenix.server.rate_limiters import (
@@ -457,9 +456,7 @@ async def _create_user(
457
456
  if email_exists:
458
457
  raise EmailAlreadyInUse(f"An account for {email} is already in use.")
459
458
  member_role_id = (
460
- select(models.UserRole.id)
461
- .where(models.UserRole.name == UserRole.MEMBER.value)
462
- .scalar_subquery()
459
+ select(models.UserRole.id).where(models.UserRole.name == "MEMBER").scalar_subquery()
463
460
  )
464
461
  user_id = await session.scalar(
465
462
  insert(models.User)
@@ -15,6 +15,7 @@ from .projects import router as projects_router
15
15
  from .prompts import router as prompts_router
16
16
  from .spans import router as spans_router
17
17
  from .traces import router as traces_router
18
+ from .users import router as users_router
18
19
  from .utils import add_errors_to_responses
19
20
 
20
21
  REST_API_VERSION = "1.0"
@@ -69,4 +70,5 @@ def create_v1_router(authentication_enabled: bool) -> APIRouter:
69
70
  router.include_router(evaluations_router)
70
71
  router.include_router(prompts_router)
71
72
  router.include_router(projects_router)
73
+ router.include_router(users_router)
72
74
  return router
@@ -1,7 +1,10 @@
1
1
  from datetime import datetime
2
+ from typing import Any
2
3
 
3
4
  from pydantic import BaseModel, ConfigDict
4
5
 
6
+ from phoenix.db.types.db_models import UNDEFINED
7
+
5
8
 
6
9
  def datetime_encoder(dt: datetime) -> str:
7
10
  """
@@ -43,3 +46,7 @@ class V1RoutesBaseModel(BaseModel):
43
46
  []
44
47
  ), # suppress warnings about protected namespaces starting with `model_` on pydantic 2.9
45
48
  )
49
+
50
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
51
+ kwargs = {k: v for k, v in kwargs.items() if v is not UNDEFINED}
52
+ super().__init__(*args, **kwargs)
@@ -14,7 +14,6 @@ from strawberry.relay import GlobalID
14
14
 
15
15
  from phoenix.config import DEFAULT_PROJECT_NAME
16
16
  from phoenix.db import models
17
- from phoenix.db.enums import UserRole
18
17
  from phoenix.db.helpers import exclude_experiment_projects
19
18
  from phoenix.server.api.routers.v1.models import V1RoutesBaseModel
20
19
  from phoenix.server.api.routers.v1.utils import (
@@ -257,7 +256,7 @@ async def update_project(
257
256
  .where(models.User.id == int(request.user.identity))
258
257
  )
259
258
  role_name = await session.scalar(stmt)
260
- if role_name != UserRole.ADMIN.value:
259
+ if role_name != "ADMIN":
261
260
  raise HTTPException(
262
261
  status_code=HTTP_403_FORBIDDEN,
263
262
  detail="Only admins can update projects",
@@ -317,7 +316,7 @@ async def delete_project(
317
316
  .where(models.User.id == int(request.user.identity))
318
317
  )
319
318
  role_name = await session.scalar(stmt)
320
- if role_name != UserRole.ADMIN.value:
319
+ if role_name != "ADMIN":
321
320
  raise HTTPException(
322
321
  status_code=HTTP_403_FORBIDDEN,
323
322
  detail="Only admins can delete projects",