arize-phoenix 4.22.1__tar.gz → 4.24.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.
Files changed (306) hide show
  1. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/PKG-INFO +2 -2
  2. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/examples/manually-instrumented-chatbot/frontend/requirements.txt +1 -1
  3. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/pyproject.toml +1 -1
  4. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/migrations/future_versions/cd164e83824f_users_and_tokens.py +1 -1
  5. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/models.py +4 -0
  6. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/experiments/functions.py +8 -0
  7. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/mutations/dataset_mutations.py +52 -12
  8. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/queries.py +104 -0
  9. arize_phoenix-4.24.0/src/phoenix/server/api/types/ApiKey.py +16 -0
  10. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/Span.py +20 -2
  11. arize_phoenix-4.24.0/src/phoenix/server/api/types/SystemApiKey.py +9 -0
  12. arize_phoenix-4.24.0/src/phoenix/server/api/types/User.py +16 -0
  13. arize_phoenix-4.24.0/src/phoenix/server/api/types/UserApiKey.py +11 -0
  14. arize_phoenix-4.24.0/src/phoenix/server/api/types/UserRole.py +8 -0
  15. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/app.py +5 -0
  16. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/main.py +12 -0
  17. arize_phoenix-4.24.0/src/phoenix/server/static/.vite/manifest.json +78 -0
  18. arize_phoenix-4.22.1/src/phoenix/server/static/assets/components-BC3-LP_a.js → arize_phoenix-4.24.0/src/phoenix/server/static/assets/components-DzA9gIHT.js +48 -48
  19. arize_phoenix-4.24.0/src/phoenix/server/static/assets/index-BuTlV4Gk.js +100 -0
  20. arize_phoenix-4.22.1/src/phoenix/server/static/assets/pages--n2933VW.js → arize_phoenix-4.24.0/src/phoenix/server/static/assets/pages-DzkUGFGV.js +230 -203
  21. arize_phoenix-4.22.1/src/phoenix/server/static/assets/vendor-BMWfu6zp.js → arize_phoenix-4.24.0/src/phoenix/server/static/assets/vendor-CIqy43_9.js +1 -1
  22. arize_phoenix-4.22.1/src/phoenix/server/static/assets/vendor-arizeai-Sj74jm5V.js → arize_phoenix-4.24.0/src/phoenix/server/static/assets/vendor-arizeai-B1YgcWL8.js +1 -1
  23. arize_phoenix-4.22.1/src/phoenix/server/static/assets/vendor-codemirror-DO3VqEcD.js → arize_phoenix-4.24.0/src/phoenix/server/static/assets/vendor-codemirror-_bcwCA1C.js +1 -1
  24. arize_phoenix-4.22.1/src/phoenix/server/static/assets/vendor-recharts-BGN0SxgJ.js → arize_phoenix-4.24.0/src/phoenix/server/static/assets/vendor-recharts-C3pM_Wlg.js +1 -1
  25. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/templates/index.html +2 -1
  26. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/session/session.py +1 -0
  27. arize_phoenix-4.24.0/src/phoenix/version.py +1 -0
  28. arize_phoenix-4.22.1/src/phoenix/server/static/.vite/manifest.json +0 -78
  29. arize_phoenix-4.22.1/src/phoenix/server/static/assets/index-BjJvafYL.js +0 -100
  30. arize_phoenix-4.22.1/src/phoenix/version.py +0 -1
  31. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/.gitignore +0 -0
  32. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/IP_NOTICE +0 -0
  33. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/LICENSE +0 -0
  34. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/README.md +0 -0
  35. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/examples/manually-instrumented-chatbot/chat-service/chat/__init__.py +0 -0
  36. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/examples/manually-instrumented-chatbot/chat-service/chat/app.py +0 -0
  37. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/examples/manually-instrumented-chatbot/chat-service/chat/types.py +0 -0
  38. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/examples/manually-instrumented-chatbot/frontend/Dockerfile +0 -0
  39. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/examples/manually-instrumented-chatbot/frontend/Makefile +0 -0
  40. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/examples/manually-instrumented-chatbot/frontend/__init__.py +0 -0
  41. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/examples/manually-instrumented-chatbot/frontend/pyproject.toml +0 -0
  42. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/examples/manually-instrumented-chatbot/frontend/schema.json +0 -0
  43. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/__init__.py +0 -0
  44. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/config.py +0 -0
  45. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/core/__init__.py +0 -0
  46. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/core/embedding_dimension.py +0 -0
  47. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/core/model.py +0 -0
  48. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/core/model_schema.py +0 -0
  49. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/core/model_schema_adapter.py +0 -0
  50. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/datetime_utils.py +0 -0
  51. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/README.md +0 -0
  52. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/__init__.py +0 -0
  53. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/alembic.ini +0 -0
  54. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/bulk_inserter.py +0 -0
  55. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/engines.py +0 -0
  56. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/helpers.py +0 -0
  57. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/insertion/__init__.py +0 -0
  58. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/insertion/constants.py +0 -0
  59. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/insertion/dataset.py +0 -0
  60. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
  61. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/insertion/evaluation.py +0 -0
  62. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/insertion/helpers.py +0 -0
  63. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/insertion/span.py +0 -0
  64. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
  65. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
  66. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/insertion/types.py +0 -0
  67. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/migrate.py +0 -0
  68. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/migrations/__init__.py +0 -0
  69. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/migrations/env.py +0 -0
  70. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/migrations/future_versions/README.md +0 -0
  71. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/migrations/script.py.mako +0 -0
  72. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/migrations/versions/.gitignore +0 -0
  73. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  74. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
  75. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  76. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/exceptions.py +0 -0
  77. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/experiments/__init__.py +0 -0
  78. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  79. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/experiments/evaluators/base.py +0 -0
  80. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
  81. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
  82. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
  83. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/experiments/tracing.py +0 -0
  84. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/experiments/types.py +0 -0
  85. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/experiments/utils.py +0 -0
  86. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/inferences/__init__.py +0 -0
  87. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/inferences/errors.py +0 -0
  88. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/inferences/fixtures.py +0 -0
  89. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/inferences/inferences.py +0 -0
  90. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/inferences/schema.py +0 -0
  91. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/inferences/validation.py +0 -0
  92. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/metrics/README.md +0 -0
  93. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/metrics/__init__.py +0 -0
  94. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/metrics/binning.py +0 -0
  95. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/metrics/metrics.py +0 -0
  96. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/metrics/mixins.py +0 -0
  97. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  98. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/metrics/timeseries.py +0 -0
  99. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/metrics/wrappers.py +0 -0
  100. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/pointcloud/__init__.py +0 -0
  101. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/pointcloud/clustering.py +0 -0
  102. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
  103. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/pointcloud/projectors.py +0 -0
  104. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  105. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/py.typed +0 -0
  106. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/__init__.py +0 -0
  107. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/__init__.py +0 -0
  108. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/context.py +0 -0
  109. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
  110. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
  111. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
  112. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  113. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
  114. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
  115. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
  116. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
  117. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
  118. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
  119. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
  120. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
  121. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
  122. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
  123. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
  124. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
  125. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
  126. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
  127. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
  128. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
  129. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
  130. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
  131. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
  132. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/dataloaders/trace_row_ids.py +0 -0
  133. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
  134. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
  135. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
  136. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
  137. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  138. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  139. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  140. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  141. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
  142. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
  143. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  144. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  145. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  146. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  147. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
  148. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
  149. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  150. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
  151. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  152. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  153. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  154. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
  155. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
  156. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  157. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  158. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  159. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  160. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  161. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  162. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
  163. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/interceptor.py +0 -0
  164. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
  165. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/mutations/auth.py +0 -0
  166. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
  167. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
  168. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
  169. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
  170. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
  171. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
  172. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/openapi/main.py +0 -0
  173. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/openapi/schema.py +0 -0
  174. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/routers/__init__.py +0 -0
  175. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/routers/utils.py +0 -0
  176. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/routers/v1/__init__.py +0 -0
  177. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/routers/v1/datasets.py +0 -0
  178. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/routers/v1/evaluations.py +0 -0
  179. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
  180. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
  181. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/routers/v1/experiments.py +0 -0
  182. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/routers/v1/pydantic_compat.py +0 -0
  183. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/routers/v1/spans.py +0 -0
  184. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/routers/v1/traces.py +0 -0
  185. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
  186. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/schema.py +0 -0
  187. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/Annotation.py +0 -0
  188. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
  189. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
  190. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/Cluster.py +0 -0
  191. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  192. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  193. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/Dataset.py +0 -0
  194. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  195. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  196. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  197. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  198. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/Dimension.py +0 -0
  199. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  200. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  201. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
  202. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  203. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  204. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  205. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  206. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  207. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
  208. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  209. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/Event.py +0 -0
  210. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  211. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  212. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/Experiment.py +0 -0
  213. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  214. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
  215. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  216. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  217. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  218. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/Functionality.py +0 -0
  219. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/Inferences.py +0 -0
  220. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
  221. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  222. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/MimeType.py +0 -0
  223. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/Model.py +0 -0
  224. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
  225. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  226. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/Project.py +0 -0
  227. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  228. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
  229. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  230. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/Segments.py +0 -0
  231. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/SortDir.py +0 -0
  232. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
  233. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  234. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/Trace.py +0 -0
  235. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
  236. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  237. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  238. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  239. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/__init__.py +0 -0
  240. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/node.py +0 -0
  241. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/types/pagination.py +0 -0
  242. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/api/utils.py +0 -0
  243. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/dml_event.py +0 -0
  244. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/dml_event_handler.py +0 -0
  245. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/grpc_server.py +0 -0
  246. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/openapi/__init__.py +0 -0
  247. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/prometheus.py +0 -0
  248. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  249. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  250. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  251. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  252. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  253. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  254. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  255. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  256. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/static/assets/vendor-DxkFTwjz.css +0 -0
  257. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/static/assets/vendor-three-DwGkEfCM.js +0 -0
  258. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/static/favicon.ico +0 -0
  259. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/static/modernizr.js +0 -0
  260. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/telemetry.py +0 -0
  261. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/templates/__init__.py +0 -0
  262. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/thread_server.py +0 -0
  263. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/server/types.py +0 -0
  264. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/services.py +0 -0
  265. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/session/__init__.py +0 -0
  266. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/session/client.py +0 -0
  267. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/session/data_extractor.py +0 -0
  268. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/session/evaluation.py +0 -0
  269. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/settings.py +0 -0
  270. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/__init__.py +0 -0
  271. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/attributes.py +0 -0
  272. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/dsl/README.md +0 -0
  273. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/dsl/__init__.py +0 -0
  274. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/dsl/filter.py +0 -0
  275. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/dsl/helpers.py +0 -0
  276. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/dsl/query.py +0 -0
  277. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/errors.py +0 -0
  278. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
  279. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/exporter.py +0 -0
  280. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/fixtures.py +0 -0
  281. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/langchain/__init__.py +0 -0
  282. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/langchain/instrumentor.py +0 -0
  283. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/llama_index/__init__.py +0 -0
  284. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/llama_index/callback.py +0 -0
  285. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/openai/__init__.py +0 -0
  286. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/openai/instrumentor.py +0 -0
  287. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/otel.py +0 -0
  288. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/projects.py +0 -0
  289. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/schemas.py +0 -0
  290. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/span_evaluations.py +0 -0
  291. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/span_json_decoder.py +0 -0
  292. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/span_json_encoder.py +0 -0
  293. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/trace_dataset.py +0 -0
  294. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/utils.py +0 -0
  295. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/v1/__init__.py +0 -0
  296. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  297. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  298. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/utilities/__init__.py +0 -0
  299. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/utilities/client.py +0 -0
  300. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/utilities/deprecation.py +0 -0
  301. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/utilities/error_handling.py +0 -0
  302. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/utilities/json.py +0 -0
  303. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/utilities/logging.py +0 -0
  304. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/utilities/project.py +0 -0
  305. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/utilities/re.py +0 -0
  306. {arize_phoenix-4.22.1 → arize_phoenix-4.24.0}/src/phoenix/utilities/span_store.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arize-phoenix
3
- Version: 4.22.1
3
+ Version: 4.24.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
@@ -80,7 +80,7 @@ Requires-Dist: jupyter; extra == 'dev'
80
80
  Requires-Dist: langchain>=0.0.334; extra == 'dev'
81
81
  Requires-Dist: litellm>=1.0.3; extra == 'dev'
82
82
  Requires-Dist: llama-index>=0.10.3; extra == 'dev'
83
- Requires-Dist: mypy==1.11.0; extra == 'dev'
83
+ Requires-Dist: mypy==1.11.1; extra == 'dev'
84
84
  Requires-Dist: nbqa; extra == 'dev'
85
85
  Requires-Dist: pandas-stubs==2.0.3.230814; (python_version < '3.9') and extra == 'dev'
86
86
  Requires-Dist: pandas-stubs==2.2.2.240603; (python_version >= '3.9') and extra == 'dev'
@@ -103,7 +103,7 @@ sniffio==1.3.1
103
103
  # via
104
104
  # anyio
105
105
  # httpx
106
- streamlit==1.33.0
106
+ streamlit==1.37.0
107
107
  tenacity==8.2.3
108
108
  # via streamlit
109
109
  toml==0.10.2
@@ -71,7 +71,7 @@ dev = [
71
71
  "jupyter",
72
72
  "nbqa",
73
73
  "ruff==0.5.4",
74
- "mypy==1.11.0",
74
+ "mypy==1.11.1",
75
75
  "pandas>=1.0",
76
76
  "tabulate", # used by DataFrame.to_markdown()
77
77
  "types-tabulate",
@@ -150,7 +150,7 @@ async def insert_roles_and_users(connection: AsyncConnection) -> None:
150
150
  user to the `users` table.
151
151
  """
152
152
  await connection.execute(
153
- insert(UserRole).values([{"role": "SYSTEM"}, {"role": "ADMIN"}, {"role": "GENERAL"}])
153
+ insert(UserRole).values([{"role": "SYSTEM"}, {"role": "ADMIN"}, {"role": "MEMBER"}])
154
154
  )
155
155
  system_user_role_id = sa.select(UserRole.id).where(UserRole.role == "SYSTEM").scalar_subquery()
156
156
  admin_user_role_id = sa.select(UserRole.id).where(UserRole.role == "ADMIN").scalar_subquery()
@@ -626,6 +626,7 @@ if ENABLE_AUTH:
626
626
  __tablename__ = "user_roles"
627
627
  id: Mapped[int] = mapped_column(primary_key=True)
628
628
  role: Mapped[str] = mapped_column(unique=True)
629
+ users: Mapped[List["User"]] = relationship("User", back_populates="role")
629
630
 
630
631
  class User(Base):
631
632
  __tablename__ = "users"
@@ -634,6 +635,7 @@ if ENABLE_AUTH:
634
635
  ForeignKey("user_roles.id"),
635
636
  index=True,
636
637
  )
638
+ role: Mapped["UserRole"] = relationship("UserRole", back_populates="users")
637
639
  username: Mapped[Optional[str]] = mapped_column(nullable=True, unique=True, index=True)
638
640
  email: Mapped[str] = mapped_column(nullable=False, unique=True, index=True)
639
641
  auth_method: Mapped[str] = mapped_column(
@@ -646,6 +648,7 @@ if ENABLE_AUTH:
646
648
  UtcTimeStamp, server_default=func.now(), onupdate=func.now()
647
649
  )
648
650
  deleted_at: Mapped[Optional[datetime]] = mapped_column(UtcTimeStamp)
651
+ api_keys: Mapped[List["APIKey"]] = relationship("APIKey", back_populates="user")
649
652
 
650
653
  class APIKey(Base):
651
654
  __tablename__ = "api_keys"
@@ -654,6 +657,7 @@ if ENABLE_AUTH:
654
657
  ForeignKey("users.id"),
655
658
  index=True,
656
659
  )
660
+ user: Mapped["User"] = relationship("User", back_populates="api_keys")
657
661
  name: Mapped[str]
658
662
  description: Mapped[Optional[str]]
659
663
  created_at: Mapped[datetime] = mapped_column(UtcTimeStamp, server_default=func.now())
@@ -108,6 +108,7 @@ def run_experiment(
108
108
  rate_limit_errors: Optional[RateLimitErrors] = None,
109
109
  dry_run: Union[bool, int] = False,
110
110
  print_summary: bool = True,
111
+ concurrency: int = 3,
111
112
  ) -> RanExperiment:
112
113
  """
113
114
  Runs an experiment using a given set of dataset of examples.
@@ -158,6 +159,9 @@ def run_experiment(
158
159
  examples of the given size. Defaults to False.
159
160
  print_summary (bool): Whether to print a summary of the experiment and evaluation results.
160
161
  Defaults to True.
162
+ concurrency (int): Specifies the concurrency for task execution. In order to enable
163
+ concurrent task execution, the task callable must be a coroutine function.
164
+ Defaults to 3.
161
165
 
162
166
  Returns:
163
167
  RanExperiment: The results of the experiment and evaluation. Additional evaluations can be
@@ -389,6 +393,7 @@ def run_experiment(
389
393
  exit_on_error=False,
390
394
  fallback_return_value=None,
391
395
  tqdm_bar_format=get_tqdm_progress_bar_formatter("running tasks"),
396
+ concurrency=concurrency,
392
397
  )
393
398
 
394
399
  test_cases = [
@@ -414,6 +419,7 @@ def run_experiment(
414
419
  dry_run=dry_run,
415
420
  print_summary=print_summary,
416
421
  rate_limit_errors=rate_limit_errors,
422
+ concurrency=concurrency,
417
423
  )
418
424
  if print_summary:
419
425
  print(ran_experiment)
@@ -427,6 +433,7 @@ def evaluate_experiment(
427
433
  dry_run: Union[bool, int] = False,
428
434
  print_summary: bool = True,
429
435
  rate_limit_errors: Optional[RateLimitErrors] = None,
436
+ concurrency: int = 3,
430
437
  ) -> RanExperiment:
431
438
  if not dry_run and _is_dry_run(experiment):
432
439
  dry_run = True
@@ -628,6 +635,7 @@ def evaluate_experiment(
628
635
  exit_on_error=False,
629
636
  fallback_return_value=None,
630
637
  tqdm_bar_format=get_tqdm_progress_bar_formatter("running experiment evaluations"),
638
+ concurrency=concurrency,
631
639
  )
632
640
  eval_runs, _execution_details = executor.run(evaluation_input)
633
641
  eval_summary = EvaluationSummary.from_eval_runs(
@@ -230,7 +230,7 @@ class DatasetMutationMixin:
230
230
  ) -> DatasetMutationPayload:
231
231
  dataset_id = input.dataset_id
232
232
  # Extract the span rowids from the input examples if they exist
233
- span_ids = span_ids = [example.span_id for example in input.examples if example.span_id]
233
+ span_ids = [example.span_id for example in input.examples if example.span_id]
234
234
  span_rowids = {
235
235
  from_global_id_with_expected_type(global_id=span_id, expected_type_name=Span.__name__)
236
236
  for span_id in set(span_ids)
@@ -260,6 +260,8 @@ class DatasetMutationMixin:
260
260
  )
261
261
  .returning(models.DatasetVersion.id)
262
262
  )
263
+
264
+ # Fetch spans and span annotations
263
265
  spans = (
264
266
  await session.execute(
265
267
  select(models.Span.id)
@@ -267,9 +269,36 @@ class DatasetMutationMixin:
267
269
  .where(models.Span.id.in_(span_rowids))
268
270
  )
269
271
  ).all()
270
- # Just validate that the number of spans matches the number of span_ids
271
- # to ensure that the span_ids are valid
272
- assert len(spans) == len(span_rowids)
272
+
273
+ span_annotations = (
274
+ await session.execute(
275
+ select(
276
+ models.SpanAnnotation.span_rowid,
277
+ models.SpanAnnotation.name,
278
+ models.SpanAnnotation.label,
279
+ models.SpanAnnotation.score,
280
+ models.SpanAnnotation.explanation,
281
+ models.SpanAnnotation.metadata_,
282
+ models.SpanAnnotation.annotator_kind,
283
+ )
284
+ .select_from(models.SpanAnnotation)
285
+ .where(models.SpanAnnotation.span_rowid.in_(span_rowids))
286
+ )
287
+ ).all()
288
+
289
+ span_annotations_by_span: Dict[int, Dict[Any, Any]] = {span.id: {} for span in spans}
290
+ for annotation in span_annotations:
291
+ span_id = annotation.span_rowid
292
+ if span_id not in span_annotations_by_span:
293
+ span_annotations_by_span[span_id] = dict()
294
+ span_annotations_by_span[span_id][annotation.name] = {
295
+ "label": annotation.label,
296
+ "score": annotation.score,
297
+ "explanation": annotation.explanation,
298
+ "metadata": annotation.metadata_,
299
+ "annotator_kind": annotation.annotator_kind,
300
+ }
301
+
273
302
  DatasetExample = models.DatasetExample
274
303
  dataset_example_rowids = (
275
304
  await session.scalars(
@@ -291,21 +320,32 @@ class DatasetMutationMixin:
291
320
  assert len(dataset_example_rowids) == len(input.examples)
292
321
  assert all(map(lambda id: isinstance(id, int), dataset_example_rowids))
293
322
  DatasetExampleRevision = models.DatasetExampleRevision
294
- await session.execute(
295
- insert(DatasetExampleRevision),
296
- [
323
+
324
+ dataset_example_revisions = []
325
+ for dataset_example_rowid, example in zip(dataset_example_rowids, input.examples):
326
+ span_annotation = {}
327
+ if example.span_id:
328
+ span_id = from_global_id_with_expected_type(
329
+ global_id=example.span_id,
330
+ expected_type_name=Span.__name__,
331
+ )
332
+ span_annotation = span_annotations_by_span.get(span_id, {})
333
+ dataset_example_revisions.append(
297
334
  {
298
335
  DatasetExampleRevision.dataset_example_id.key: dataset_example_rowid,
299
336
  DatasetExampleRevision.dataset_version_id.key: dataset_version_rowid,
300
337
  DatasetExampleRevision.input.key: example.input,
301
338
  DatasetExampleRevision.output.key: example.output,
302
- DatasetExampleRevision.metadata_.key: example.metadata,
339
+ DatasetExampleRevision.metadata_.key: {
340
+ **(example.metadata or {}),
341
+ "annotations": span_annotation,
342
+ },
303
343
  DatasetExampleRevision.revision_kind.key: "CREATE",
304
344
  }
305
- for dataset_example_rowid, example in zip(
306
- dataset_example_rowids, input.examples
307
- )
308
- ],
345
+ )
346
+ await session.execute(
347
+ insert(DatasetExampleRevision),
348
+ dataset_example_revisions,
309
349
  )
310
350
  info.context.event_queue.put(DatasetInsertEvent((dataset.id,)))
311
351
  return DatasetMutationPayload(dataset=to_gql_dataset(dataset))
@@ -66,11 +66,115 @@ from phoenix.server.api.types.pagination import (
66
66
  from phoenix.server.api.types.Project import Project
67
67
  from phoenix.server.api.types.SortDir import SortDir
68
68
  from phoenix.server.api.types.Span import Span, to_gql_span
69
+ from phoenix.server.api.types.SystemApiKey import SystemApiKey
69
70
  from phoenix.server.api.types.Trace import Trace
71
+ from phoenix.server.api.types.User import User
72
+ from phoenix.server.api.types.UserApiKey import UserApiKey
73
+ from phoenix.server.api.types.UserRole import UserRole
70
74
 
71
75
 
72
76
  @strawberry.type
73
77
  class Query:
78
+ @strawberry.field
79
+ async def users(
80
+ self,
81
+ info: Info[Context, None],
82
+ first: Optional[int] = 50,
83
+ last: Optional[int] = UNSET,
84
+ after: Optional[CursorString] = UNSET,
85
+ before: Optional[CursorString] = UNSET,
86
+ ) -> Connection[User]:
87
+ args = ConnectionArgs(
88
+ first=first,
89
+ after=after if isinstance(after, CursorString) else None,
90
+ last=last,
91
+ before=before if isinstance(before, CursorString) else None,
92
+ )
93
+ stmt = (
94
+ select(models.User)
95
+ .where(models.UserRole.role != "SYSTEM")
96
+ .order_by(models.User.email)
97
+ .options(joinedload(models.User.role))
98
+ )
99
+ async with info.context.db() as session:
100
+ users = await session.stream_scalars(stmt)
101
+ data = [
102
+ User(
103
+ id_attr=user.id,
104
+ email=user.email,
105
+ username=user.username,
106
+ created_at=user.created_at,
107
+ role=UserRole(
108
+ id_attr=user.role.id,
109
+ role=user.role.role,
110
+ ),
111
+ )
112
+ async for user in users
113
+ ]
114
+ return connection_from_list(data=data, args=args)
115
+
116
+ @strawberry.field
117
+ async def user_roles(
118
+ self,
119
+ info: Info[Context, None],
120
+ ) -> List[UserRole]:
121
+ async with info.context.db() as session:
122
+ roles = await session.scalars(
123
+ select(models.UserRole).where(models.UserRole.role != "SYSTEM")
124
+ )
125
+ return [
126
+ UserRole(
127
+ id_attr=role.id,
128
+ role=role.role,
129
+ )
130
+ for role in roles
131
+ ]
132
+
133
+ @strawberry.field
134
+ async def user_api_keys(self, info: Info[Context, None]) -> List[UserApiKey]:
135
+ # TODO(auth): add access control
136
+ stmt = (
137
+ select(models.APIKey)
138
+ .join(models.User)
139
+ .join(models.UserRole)
140
+ .where(models.UserRole.role != "SYSTEM")
141
+ )
142
+ async with info.context.db() as session:
143
+ api_keys = await session.scalars(stmt)
144
+ return [
145
+ UserApiKey(
146
+ id_attr=api_key.id,
147
+ user_id=api_key.user_id,
148
+ name=api_key.name,
149
+ description=api_key.description,
150
+ created_at=api_key.created_at,
151
+ expires_at=api_key.expires_at,
152
+ )
153
+ for api_key in api_keys
154
+ ]
155
+
156
+ @strawberry.field
157
+ async def system_api_keys(self, info: Info[Context, None]) -> List[SystemApiKey]:
158
+ # TODO(auth): add access control
159
+ stmt = (
160
+ select(models.APIKey)
161
+ .join(models.User)
162
+ .join(models.UserRole)
163
+ .where(models.UserRole.role == "SYSTEM")
164
+ )
165
+ async with info.context.db() as session:
166
+ api_keys = await session.scalars(stmt)
167
+ return [
168
+ SystemApiKey(
169
+ id_attr=api_key.id,
170
+ name=api_key.name,
171
+ description=api_key.description,
172
+ created_at=api_key.created_at,
173
+ expires_at=api_key.expires_at,
174
+ )
175
+ for api_key in api_keys
176
+ ]
177
+
74
178
  @strawberry.field
75
179
  async def projects(
76
180
  self,
@@ -0,0 +1,16 @@
1
+ from datetime import datetime
2
+ from typing import Optional
3
+
4
+ import strawberry
5
+
6
+
7
+ @strawberry.interface
8
+ class ApiKey:
9
+ name: str = strawberry.field(description="Name of the API key.")
10
+ description: Optional[str] = strawberry.field(description="Description of the API key.")
11
+ created_at: datetime = strawberry.field(
12
+ description="The date and time the API key was created."
13
+ )
14
+ expires_at: Optional[datetime] = strawberry.field(
15
+ description="The date and time the API key will expire."
16
+ )
@@ -232,7 +232,7 @@ class Span(Node):
232
232
  @strawberry.field(
233
233
  description="The span's attributes translated into an example revision for a dataset",
234
234
  ) # type: ignore
235
- def as_example_revision(self) -> SpanAsExampleRevision:
235
+ async def as_example_revision(self, info: Info[Context, None]) -> SpanAsExampleRevision:
236
236
  db_span = self.db_span
237
237
  attributes = db_span.attributes
238
238
  span_io = _SpanIO(
@@ -248,10 +248,28 @@ class Span(Node):
248
248
  llm_output_messages=get_attribute_value(attributes, LLM_OUTPUT_MESSAGES),
249
249
  retrieval_documents=get_attribute_value(attributes, RETRIEVAL_DOCUMENTS),
250
250
  )
251
+
252
+ # Fetch annotations associated with this span
253
+ span_annotations = await self.span_annotations(info)
254
+ annotations = dict()
255
+ for annotation in span_annotations:
256
+ annotations[annotation.name] = {
257
+ "label": annotation.label,
258
+ "score": annotation.score,
259
+ "explanation": annotation.explanation,
260
+ "metadata": annotation.metadata,
261
+ "annotator_kind": annotation.annotator_kind.value,
262
+ }
263
+ # Merge annotations into the metadata
264
+ metadata = {
265
+ **attributes,
266
+ "annotations": annotations,
267
+ }
268
+
251
269
  return SpanAsExampleRevision(
252
270
  input=get_dataset_example_input(span_io),
253
271
  output=get_dataset_example_output(span_io),
254
- metadata=attributes,
272
+ metadata=metadata,
255
273
  )
256
274
 
257
275
  @strawberry.field(description="The project that this span belongs to.") # type: ignore
@@ -0,0 +1,9 @@
1
+ import strawberry
2
+ from strawberry.relay import Node, NodeID
3
+
4
+ from .ApiKey import ApiKey
5
+
6
+
7
+ @strawberry.type
8
+ class SystemApiKey(ApiKey, Node):
9
+ id_attr: NodeID[int]
@@ -0,0 +1,16 @@
1
+ from datetime import datetime
2
+ from typing import Optional
3
+
4
+ import strawberry
5
+ from strawberry.relay import Node, NodeID
6
+
7
+ from .UserRole import UserRole
8
+
9
+
10
+ @strawberry.type
11
+ class User(Node):
12
+ id_attr: NodeID[int]
13
+ email: str
14
+ username: Optional[str]
15
+ created_at: datetime
16
+ role: UserRole
@@ -0,0 +1,11 @@
1
+ import strawberry
2
+ from strawberry import Private
3
+ from strawberry.relay.types import Node, NodeID
4
+
5
+ from .ApiKey import ApiKey
6
+
7
+
8
+ @strawberry.type
9
+ class UserApiKey(ApiKey, Node):
10
+ id_attr: NodeID[int]
11
+ user_id: Private[int]
@@ -0,0 +1,8 @@
1
+ import strawberry
2
+ from strawberry.relay import Node, NodeID
3
+
4
+
5
+ @strawberry.type
6
+ class UserRole(Node):
7
+ id_attr: NodeID[int]
8
+ role: str
@@ -115,6 +115,8 @@ class AppConfig(NamedTuple):
115
115
  n_samples: int
116
116
  is_development: bool
117
117
  web_manifest_path: Path
118
+ authentication_enabled: bool
119
+ """ Whether authentication is enabled """
118
120
 
119
121
 
120
122
  class Static(StaticFiles):
@@ -162,6 +164,7 @@ class Static(StaticFiles):
162
164
  "request": request,
163
165
  "is_development": self._app_config.is_development,
164
166
  "manifest": self._web_manifest,
167
+ "authentication_enabled": self._app_config.authentication_enabled,
165
168
  },
166
169
  )
167
170
  except Exception as e:
@@ -395,6 +398,7 @@ def create_app(
395
398
  db: DbSessionFactory,
396
399
  export_path: Path,
397
400
  model: Model,
401
+ authentication_enabled: bool,
398
402
  umap_params: UMAPParameters,
399
403
  corpus: Optional[Model] = None,
400
404
  debug: bool = False,
@@ -515,6 +519,7 @@ def create_app(
515
519
  n_neighbors=umap_params.n_neighbors,
516
520
  n_samples=umap_params.n_samples,
517
521
  is_development=dev,
522
+ authentication_enabled=authentication_enabled,
518
523
  web_manifest_path=SERVER_DIR / "static" / ".vite" / "manifest.json",
519
524
  ),
520
525
  ),
@@ -13,6 +13,7 @@ from uvicorn import Config, Server
13
13
  import phoenix.trace.v1 as pb
14
14
  from phoenix.config import (
15
15
  EXPORT_DIR,
16
+ get_auth_settings,
16
17
  get_env_database_connection_str,
17
18
  get_env_enable_prometheus,
18
19
  get_env_grpc_port,
@@ -80,6 +81,11 @@ _WELCOME_MESSAGE = """
80
81
  | Storage: {storage}
81
82
  """
82
83
 
84
+ _EXPERIMENTAL_WARNING = """
85
+ 🚨 WARNING: Phoenix is running in experimental mode. 🚨
86
+ | Authentication enabled: {auth_enabled}
87
+ """
88
+
83
89
 
84
90
  def _write_pid_file_when_ready(
85
91
  server: Server,
@@ -212,6 +218,8 @@ if __name__ == "__main__":
212
218
  reference_inferences,
213
219
  )
214
220
 
221
+ authentication_enabled, auth_secret = get_auth_settings()
222
+
215
223
  fixture_spans: List[Span] = []
216
224
  fixture_evals: List[pb.Evaluation] = []
217
225
  if trace_dataset_name is not None:
@@ -251,6 +259,7 @@ if __name__ == "__main__":
251
259
  db=factory,
252
260
  export_path=export_path,
253
261
  model=model,
262
+ authentication_enabled=authentication_enabled,
254
263
  umap_params=umap_params,
255
264
  corpus=None
256
265
  if corpus_inferences is None
@@ -278,5 +287,8 @@ if __name__ == "__main__":
278
287
  )
279
288
  )
280
289
 
290
+ if authentication_enabled:
291
+ print(_EXPERIMENTAL_WARNING.format(auth_enabled=authentication_enabled))
292
+
281
293
  # Start the server
282
294
  server.run()
@@ -0,0 +1,78 @@
1
+ {
2
+ "_components-DzA9gIHT.js": {
3
+ "file": "assets/components-DzA9gIHT.js",
4
+ "name": "components",
5
+ "imports": [
6
+ "_vendor-CIqy43_9.js",
7
+ "_vendor-arizeai-B1YgcWL8.js",
8
+ "_pages-DzkUGFGV.js",
9
+ "_vendor-three-DwGkEfCM.js",
10
+ "_vendor-codemirror-_bcwCA1C.js"
11
+ ]
12
+ },
13
+ "_pages-DzkUGFGV.js": {
14
+ "file": "assets/pages-DzkUGFGV.js",
15
+ "name": "pages",
16
+ "imports": [
17
+ "_vendor-CIqy43_9.js",
18
+ "_components-DzA9gIHT.js",
19
+ "_vendor-arizeai-B1YgcWL8.js",
20
+ "_vendor-recharts-C3pM_Wlg.js",
21
+ "_vendor-codemirror-_bcwCA1C.js"
22
+ ]
23
+ },
24
+ "_vendor-!~{003}~.js": {
25
+ "file": "assets/vendor-DxkFTwjz.css",
26
+ "src": "_vendor-!~{003}~.js"
27
+ },
28
+ "_vendor-CIqy43_9.js": {
29
+ "file": "assets/vendor-CIqy43_9.js",
30
+ "name": "vendor",
31
+ "imports": [
32
+ "_vendor-three-DwGkEfCM.js"
33
+ ],
34
+ "css": [
35
+ "assets/vendor-DxkFTwjz.css"
36
+ ]
37
+ },
38
+ "_vendor-arizeai-B1YgcWL8.js": {
39
+ "file": "assets/vendor-arizeai-B1YgcWL8.js",
40
+ "name": "vendor-arizeai",
41
+ "imports": [
42
+ "_vendor-CIqy43_9.js"
43
+ ]
44
+ },
45
+ "_vendor-codemirror-_bcwCA1C.js": {
46
+ "file": "assets/vendor-codemirror-_bcwCA1C.js",
47
+ "name": "vendor-codemirror",
48
+ "imports": [
49
+ "_vendor-CIqy43_9.js"
50
+ ]
51
+ },
52
+ "_vendor-recharts-C3pM_Wlg.js": {
53
+ "file": "assets/vendor-recharts-C3pM_Wlg.js",
54
+ "name": "vendor-recharts",
55
+ "imports": [
56
+ "_vendor-CIqy43_9.js"
57
+ ]
58
+ },
59
+ "_vendor-three-DwGkEfCM.js": {
60
+ "file": "assets/vendor-three-DwGkEfCM.js",
61
+ "name": "vendor-three"
62
+ },
63
+ "index.tsx": {
64
+ "file": "assets/index-BuTlV4Gk.js",
65
+ "name": "index",
66
+ "src": "index.tsx",
67
+ "isEntry": true,
68
+ "imports": [
69
+ "_vendor-CIqy43_9.js",
70
+ "_vendor-arizeai-B1YgcWL8.js",
71
+ "_pages-DzkUGFGV.js",
72
+ "_components-DzA9gIHT.js",
73
+ "_vendor-three-DwGkEfCM.js",
74
+ "_vendor-recharts-C3pM_Wlg.js",
75
+ "_vendor-codemirror-_bcwCA1C.js"
76
+ ]
77
+ }
78
+ }