arize-phoenix 8.8.0__tar.gz → 8.10.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 (374) hide show
  1. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/PKG-INFO +4 -4
  2. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/pyproject.toml +3 -3
  3. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/config.py +11 -0
  4. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/experiments/types.py +2 -0
  5. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/helpers/playground_clients.py +30 -2
  6. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/helpers/prompts/models.py +23 -2
  7. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/InvocationParameters.py +1 -0
  8. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/mutations/__init__.py +3 -1
  9. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/mutations/prompt_label_mutations.py +6 -5
  10. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/mutations/prompt_mutations.py +6 -5
  11. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/mutations/prompt_version_tag_mutations.py +3 -2
  12. arize_phoenix-8.10.0/src/phoenix/server/api/mutations/trace_mutations.py +74 -0
  13. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/queries.py +14 -1
  14. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/v1/experiments.py +103 -2
  15. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/v1/prompts.py +14 -2
  16. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/app.py +1 -1
  17. arize_phoenix-8.10.0/src/phoenix/server/static/.vite/manifest.json +87 -0
  18. arize_phoenix-8.8.0/src/phoenix/server/static/assets/components-Cvwn-4Sk.js → arize_phoenix-8.10.0/src/phoenix/server/static/assets/components-CVzKofML.js +245 -238
  19. arize_phoenix-8.8.0/src/phoenix/server/static/assets/index-Cxmc6_pQ.js → arize_phoenix-8.10.0/src/phoenix/server/static/assets/index-Ctff7oin.js +1 -1
  20. arize_phoenix-8.8.0/src/phoenix/server/static/assets/pages-DLMdDkgQ.js → arize_phoenix-8.10.0/src/phoenix/server/static/assets/pages-CVFLHgre.js +349 -340
  21. arize_phoenix-8.8.0/src/phoenix/server/static/assets/vendor-yn6w6Ozi.js → arize_phoenix-8.10.0/src/phoenix/server/static/assets/vendor-VJCVsFqd.js +161 -161
  22. arize_phoenix-8.8.0/src/phoenix/server/static/assets/vendor-arizeai-DoGO67dU.js → arize_phoenix-8.10.0/src/phoenix/server/static/assets/vendor-arizeai-BiZagY4a.js +22 -22
  23. arize_phoenix-8.8.0/src/phoenix/server/static/assets/vendor-codemirror-BLdSYxpm.js → arize_phoenix-8.10.0/src/phoenix/server/static/assets/vendor-codemirror-0mUqu36F.js +11 -11
  24. arize_phoenix-8.8.0/src/phoenix/server/static/assets/vendor-recharts-CjOpOw1c.js → arize_phoenix-8.10.0/src/phoenix/server/static/assets/vendor-recharts-CfKQSOmq.js +1 -1
  25. arize_phoenix-8.8.0/src/phoenix/server/static/assets/vendor-shiki-BwTCxCQY.js → arize_phoenix-8.10.0/src/phoenix/server/static/assets/vendor-shiki-BsgMOuir.js +1 -1
  26. arize_phoenix-8.10.0/src/phoenix/version.py +1 -0
  27. arize_phoenix-8.8.0/src/phoenix/server/static/.vite/manifest.json +0 -87
  28. arize_phoenix-8.8.0/src/phoenix/version.py +0 -1
  29. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/.gitignore +0 -0
  30. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/IP_NOTICE +0 -0
  31. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/LICENSE +0 -0
  32. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/README.md +0 -0
  33. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/__init__.py +0 -0
  34. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/auth.py +0 -0
  35. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/core/__init__.py +0 -0
  36. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/core/embedding_dimension.py +0 -0
  37. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/core/model.py +0 -0
  38. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/core/model_schema.py +0 -0
  39. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/core/model_schema_adapter.py +0 -0
  40. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/datetime_utils.py +0 -0
  41. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/README.md +0 -0
  42. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/__init__.py +0 -0
  43. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/alembic.ini +0 -0
  44. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/bulk_inserter.py +0 -0
  45. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/engines.py +0 -0
  46. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/enums.py +0 -0
  47. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/facilitator.py +0 -0
  48. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/helpers.py +0 -0
  49. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/insertion/__init__.py +0 -0
  50. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/insertion/constants.py +0 -0
  51. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/insertion/dataset.py +0 -0
  52. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
  53. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/insertion/evaluation.py +0 -0
  54. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/insertion/helpers.py +0 -0
  55. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/insertion/span.py +0 -0
  56. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
  57. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
  58. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/insertion/types.py +0 -0
  59. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/migrate.py +0 -0
  60. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/migrations/__init__.py +0 -0
  61. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/migrations/data_migration_scripts/__init__.py +0 -0
  62. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +0 -0
  63. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/migrations/env.py +0 -0
  64. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/migrations/script.py.mako +0 -0
  65. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  66. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
  67. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +0 -0
  68. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/migrations/versions/bc8fea3c2bc8_add_prompt_tables.py +0 -0
  69. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
  70. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  71. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/models.py +0 -0
  72. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/types/__init__.py +0 -0
  73. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/types/identifier.py +0 -0
  74. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/db/types/model_provider.py +0 -0
  75. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/exceptions.py +0 -0
  76. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/experiments/__init__.py +0 -0
  77. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  78. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/experiments/evaluators/base.py +0 -0
  79. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
  80. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
  81. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
  82. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/experiments/functions.py +0 -0
  83. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/experiments/tracing.py +0 -0
  84. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/experiments/utils.py +0 -0
  85. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/inferences/__init__.py +0 -0
  86. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/inferences/errors.py +0 -0
  87. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/inferences/fixtures.py +0 -0
  88. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/inferences/inferences.py +0 -0
  89. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/inferences/schema.py +0 -0
  90. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/inferences/validation.py +0 -0
  91. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/logging/__init__.py +0 -0
  92. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/logging/_config.py +0 -0
  93. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/logging/_filter.py +0 -0
  94. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/logging/_formatter.py +0 -0
  95. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/metrics/README.md +0 -0
  96. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/metrics/__init__.py +0 -0
  97. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/metrics/binning.py +0 -0
  98. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/metrics/metrics.py +0 -0
  99. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/metrics/mixins.py +0 -0
  100. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  101. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/metrics/timeseries.py +0 -0
  102. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/metrics/wrappers.py +0 -0
  103. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/pointcloud/__init__.py +0 -0
  104. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/pointcloud/clustering.py +0 -0
  105. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
  106. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/pointcloud/projectors.py +0 -0
  107. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  108. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/py.typed +0 -0
  109. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/__init__.py +0 -0
  110. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/README.md +0 -0
  111. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/__init__.py +0 -0
  112. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/auth.py +0 -0
  113. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/context.py +0 -0
  114. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
  115. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
  116. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
  117. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  118. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
  119. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
  120. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
  121. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
  122. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
  123. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
  124. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
  125. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
  126. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
  127. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
  128. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
  129. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
  130. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
  131. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/num_child_spans.py +0 -0
  132. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/num_spans_per_trace.py +0 -0
  133. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
  134. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/prompt_version_sequence_number.py +0 -0
  135. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
  136. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/session_io.py +0 -0
  137. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/session_num_traces.py +0 -0
  138. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/session_num_traces_with_error.py +0 -0
  139. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/session_token_usages.py +0 -0
  140. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +0 -0
  141. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
  142. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/span_by_id.py +0 -0
  143. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
  144. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
  145. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
  146. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/table_fields.py +0 -0
  147. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
  148. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/trace_by_trace_ids.py +0 -0
  149. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/trace_root_spans.py +0 -0
  150. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/user_roles.py +0 -0
  151. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/dataloaders/users.py +0 -0
  152. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/exceptions.py +0 -0
  153. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
  154. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
  155. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/helpers/experiment_run_filters.py +0 -0
  156. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/helpers/playground_registry.py +0 -0
  157. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/helpers/playground_spans.py +0 -0
  158. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/helpers/prompts/__init__.py +0 -0
  159. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/helpers/prompts/conversions/__init__.py +0 -0
  160. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/helpers/prompts/conversions/anthropic.py +0 -0
  161. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/helpers/prompts/conversions/openai.py +0 -0
  162. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
  163. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
  164. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/ChatCompletionInput.py +0 -0
  165. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -0
  166. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  167. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  168. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  169. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  170. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
  171. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
  172. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  173. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  174. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  175. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  176. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
  177. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
  178. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  179. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
  180. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  181. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  182. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/GenerativeModelInput.py +0 -0
  183. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  184. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
  185. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
  186. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  187. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  188. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/ProjectSessionSort.py +0 -0
  189. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/PromptTemplateOptions.py +0 -0
  190. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/PromptVersionInput.py +0 -0
  191. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  192. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  193. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  194. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  195. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
  196. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
  197. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/interceptor.py +0 -0
  198. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/mutations/api_key_mutations.py +0 -0
  199. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/mutations/chat_mutations.py +0 -0
  200. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
  201. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
  202. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
  203. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
  204. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
  205. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
  206. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
  207. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
  208. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/openapi/main.py +0 -0
  209. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/openapi/schema.py +0 -0
  210. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/__init__.py +0 -0
  211. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/auth.py +0 -0
  212. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/embeddings.py +0 -0
  213. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/oauth2.py +0 -0
  214. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/utils.py +0 -0
  215. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/v1/__init__.py +0 -0
  216. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/v1/datasets.py +0 -0
  217. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/v1/evaluations.py +0 -0
  218. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
  219. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
  220. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/v1/models.py +0 -0
  221. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/v1/spans.py +0 -0
  222. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/v1/traces.py +0 -0
  223. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
  224. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/schema.py +0 -0
  225. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/subscriptions.py +0 -0
  226. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Annotation.py +0 -0
  227. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
  228. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
  229. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
  230. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/AuthMethod.py +0 -0
  231. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
  232. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +0 -0
  233. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Cluster.py +0 -0
  234. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  235. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  236. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Dataset.py +0 -0
  237. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  238. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  239. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  240. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  241. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Dimension.py +0 -0
  242. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  243. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  244. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
  245. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  246. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  247. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  248. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  249. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  250. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
  251. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  252. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Event.py +0 -0
  253. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  254. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  255. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Experiment.py +0 -0
  256. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  257. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
  258. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  259. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  260. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  261. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Functionality.py +0 -0
  262. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
  263. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/GenerativeProvider.py +0 -0
  264. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Identifier.py +0 -0
  265. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Inferences.py +0 -0
  266. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
  267. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  268. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/MimeType.py +0 -0
  269. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Model.py +0 -0
  270. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
  271. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  272. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Project.py +0 -0
  273. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/ProjectSession.py +0 -0
  274. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Prompt.py +0 -0
  275. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/PromptLabel.py +0 -0
  276. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  277. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/PromptVersion.py +0 -0
  278. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/PromptVersionTag.py +0 -0
  279. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/PromptVersionTemplate.py +0 -0
  280. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/ResponseFormat.py +0 -0
  281. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
  282. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  283. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Segments.py +0 -0
  284. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/SortDir.py +0 -0
  285. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Span.py +0 -0
  286. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
  287. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/SpanIOValue.py +0 -0
  288. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
  289. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  290. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/TokenUsage.py +0 -0
  291. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/ToolDefinition.py +0 -0
  292. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/Trace.py +0 -0
  293. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
  294. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  295. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/User.py +0 -0
  296. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
  297. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/UserRole.py +0 -0
  298. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  299. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  300. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/__init__.py +0 -0
  301. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/node.py +0 -0
  302. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/types/pagination.py +0 -0
  303. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/api/utils.py +0 -0
  304. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/bearer_auth.py +0 -0
  305. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/dml_event.py +0 -0
  306. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/dml_event_handler.py +0 -0
  307. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/email/__init__.py +0 -0
  308. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/email/sender.py +0 -0
  309. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/email/templates/__init__.py +0 -0
  310. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/email/templates/password_reset.html +0 -0
  311. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/email/types.py +0 -0
  312. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/grpc_server.py +0 -0
  313. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/jwt_store.py +0 -0
  314. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/main.py +0 -0
  315. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/oauth2.py +0 -0
  316. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/openapi/__init__.py +0 -0
  317. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/prometheus.py +0 -0
  318. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/rate_limiters.py +0 -0
  319. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  320. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  321. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  322. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  323. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  324. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  325. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  326. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  327. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/static/assets/vendor-Cg6lcjUC.css +0 -0
  328. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/static/assets/vendor-three-C-AGeJYv.js +0 -0
  329. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/static/favicon.ico +0 -0
  330. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/static/modernizr.js +0 -0
  331. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/telemetry.py +0 -0
  332. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/templates/__init__.py +0 -0
  333. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/templates/index.html +0 -0
  334. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/thread_server.py +0 -0
  335. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/server/types.py +0 -0
  336. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/services.py +0 -0
  337. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/session/__init__.py +0 -0
  338. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/session/client.py +0 -0
  339. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/session/data_extractor.py +0 -0
  340. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/session/evaluation.py +0 -0
  341. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/session/session.py +0 -0
  342. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/settings.py +0 -0
  343. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/__init__.py +0 -0
  344. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/attributes.py +0 -0
  345. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/dsl/README.md +0 -0
  346. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/dsl/__init__.py +0 -0
  347. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/dsl/filter.py +0 -0
  348. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/dsl/helpers.py +0 -0
  349. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/dsl/query.py +0 -0
  350. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/errors.py +0 -0
  351. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
  352. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/exporter.py +0 -0
  353. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/fixtures.py +0 -0
  354. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/otel.py +0 -0
  355. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/projects.py +0 -0
  356. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/schemas.py +0 -0
  357. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/span_evaluations.py +0 -0
  358. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/span_json_decoder.py +0 -0
  359. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/span_json_encoder.py +0 -0
  360. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/trace_dataset.py +0 -0
  361. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/utils.py +0 -0
  362. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/v1/__init__.py +0 -0
  363. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  364. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  365. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/utilities/__init__.py +0 -0
  366. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/utilities/client.py +0 -0
  367. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/utilities/deprecation.py +0 -0
  368. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/utilities/error_handling.py +0 -0
  369. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/utilities/json.py +0 -0
  370. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/utilities/logging.py +0 -0
  371. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/utilities/project.py +0 -0
  372. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/utilities/re.py +0 -0
  373. {arize_phoenix-8.8.0 → arize_phoenix-8.10.0}/src/phoenix/utilities/span_store.py +0 -0
  374. {arize_phoenix-8.8.0 → arize_phoenix-8.10.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: 8.8.0
3
+ Version: 8.10.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
@@ -48,7 +48,7 @@ Requires-Dist: scipy
48
48
  Requires-Dist: sqlalchemy[asyncio]<3,>=2.0.4
49
49
  Requires-Dist: sqlean-py>=3.45.1
50
50
  Requires-Dist: starlette
51
- Requires-Dist: strawberry-graphql==0.253.1
51
+ Requires-Dist: strawberry-graphql>=0.262.0
52
52
  Requires-Dist: tqdm
53
53
  Requires-Dist: typing-extensions>=4.6
54
54
  Requires-Dist: uvicorn
@@ -69,7 +69,7 @@ Requires-Dist: opentelemetry-sdk; extra == 'container'
69
69
  Requires-Dist: opentelemetry-semantic-conventions; extra == 'container'
70
70
  Requires-Dist: prometheus-client; extra == 'container'
71
71
  Requires-Dist: py-grpc-prometheus; extra == 'container'
72
- Requires-Dist: strawberry-graphql[opentelemetry]==0.253.1; extra == 'container'
72
+ Requires-Dist: strawberry-graphql[opentelemetry]==0.262.0; extra == 'container'
73
73
  Requires-Dist: umap-learn; extra == 'container'
74
74
  Requires-Dist: uvloop; (platform_system != 'Windows') and extra == 'container'
75
75
  Provides-Extra: dev
@@ -100,7 +100,7 @@ Requires-Dist: pytest-postgresql; extra == 'dev'
100
100
  Requires-Dist: pytest-xdist; extra == 'dev'
101
101
  Requires-Dist: pytest==8.3.3; extra == 'dev'
102
102
  Requires-Dist: ruff==0.6.9; extra == 'dev'
103
- Requires-Dist: strawberry-graphql[debug-server,opentelemetry]==0.253.1; extra == 'dev'
103
+ Requires-Dist: strawberry-graphql[debug-server,opentelemetry]==0.262.0; extra == 'dev'
104
104
  Requires-Dist: tabulate; extra == 'dev'
105
105
  Requires-Dist: tox-uv==1.11.3; extra == 'dev'
106
106
  Requires-Dist: tox==4.18.1; extra == 'dev'
@@ -29,7 +29,7 @@ dependencies = [
29
29
  "starlette",
30
30
  "uvicorn",
31
31
  "psutil",
32
- "strawberry-graphql==0.253.1", # need to pin version because we're monkey-patching
32
+ "strawberry-graphql>=0.262.0", # resolve security vulnerability https://github.com/Arize-ai/phoenix/security/dependabot/45
33
33
  "pyarrow",
34
34
  "typing-extensions>=4.6",
35
35
  "scipy",
@@ -88,7 +88,7 @@ dev = [
88
88
  "pytest-postgresql",
89
89
  "asyncpg",
90
90
  "psycopg[binary,pool]",
91
- "strawberry-graphql[debug-server,opentelemetry]==0.253.1", # need to pin version because we're monkey-patching
91
+ "strawberry-graphql[debug-server,opentelemetry]==0.262.0", # need to pin version because we're monkey-patching
92
92
  "pre-commit",
93
93
  "arize[AutoEmbeddings, LLM_Evaluation]",
94
94
  "llama-index>=0.10.3",
@@ -135,7 +135,7 @@ container = [
135
135
  "opentelemetry-instrumentation-sqlalchemy",
136
136
  "opentelemetry-instrumentation-grpc",
137
137
  "py-grpc-prometheus",
138
- "strawberry-graphql[opentelemetry]==0.253.1", # need to pin version because we're monkey-patching
138
+ "strawberry-graphql[opentelemetry]==0.262.0", # need to pin version because we're monkey-patching
139
139
  "uvloop; platform_system != 'Windows'",
140
140
  "fast-hdbscan>=0.2.0",
141
141
  "numba>=0.60.0", # https://github.com/astral-sh/uv/issues/6281
@@ -86,6 +86,13 @@ ENV_PHOENIX_SQL_DATABASE_SCHEMA = "PHOENIX_SQL_DATABASE_SCHEMA"
86
86
  The schema to use for the PostgresSQL database. (This is ignored for SQLite.)
87
87
  See e.g. https://www.postgresql.org/docs/current/ddl-schemas.html
88
88
  """
89
+ ENV_PHOENIX_DATABASE_ALLOCATED_STORAGE_CAPACITY_GIBIBYTES = (
90
+ "PHOENIX_DATABASE_ALLOCATED_STORAGE_CAPACITY_GIBIBYTES"
91
+ )
92
+ """
93
+ The allocated storage capacity for the Phoenix database in gibibytes (2^30 bytes). Use float for
94
+ fractional value. This is currently used only by the UI for informational displays.
95
+ """
89
96
  ENV_PHOENIX_ENABLE_PROMETHEUS = "PHOENIX_ENABLE_PROMETHEUS"
90
97
  """
91
98
  Whether to enable Prometheus. Defaults to false.
@@ -690,6 +697,10 @@ def get_env_database_schema() -> Optional[str]:
690
697
  return getenv(ENV_PHOENIX_SQL_DATABASE_SCHEMA)
691
698
 
692
699
 
700
+ def get_env_database_allocated_storage_capacity_gibibytes() -> Optional[float]:
701
+ return _float_val(ENV_PHOENIX_DATABASE_ALLOCATED_STORAGE_CAPACITY_GIBIBYTES)
702
+
703
+
693
704
  def get_env_enable_prometheus() -> bool:
694
705
  if (enable_promotheus := getenv(ENV_PHOENIX_ENABLE_PROMETHEUS)) is None or (
695
706
  enable_promotheus_lower := enable_promotheus.lower()
@@ -282,6 +282,8 @@ class ExperimentEvaluationRun:
282
282
  ExperimentTask: TypeAlias = Union[
283
283
  Callable[[Example], TaskOutput],
284
284
  Callable[[Example], Awaitable[TaskOutput]],
285
+ Callable[..., JSONSerializable],
286
+ Callable[..., Awaitable[JSONSerializable]],
285
287
  ]
286
288
 
287
289
 
@@ -761,6 +761,13 @@ class AnthropicStreamingClient(PlaygroundStreamingClient):
761
761
  import anthropic.types as anthropic_types
762
762
 
763
763
  anthropic_messages, system_prompt = self._build_anthropic_messages(messages)
764
+ if (
765
+ "thinking" in invocation_parameters
766
+ and isinstance(invocation_parameters, dict)
767
+ and "type" in invocation_parameters["thinking"]
768
+ and invocation_parameters["thinking"]["type"] == "enabled"
769
+ ):
770
+ invocation_parameters.pop("top_p", None)
764
771
  anthropic_params = {
765
772
  "messages": anthropic_messages,
766
773
  "model": self.model_name,
@@ -810,9 +817,9 @@ class AnthropicStreamingClient(PlaygroundStreamingClient):
810
817
  elif isinstance(event, anthropic_streaming._types.CitationEvent):
811
818
  raise NotImplementedError
812
819
  elif isinstance(event, anthropic_streaming._types.ThinkingEvent):
813
- raise NotImplementedError
820
+ pass
814
821
  elif isinstance(event, anthropic_streaming._types.SignatureEvent):
815
- raise NotImplementedError
822
+ pass
816
823
  else:
817
824
  assert_never(event)
818
825
 
@@ -862,6 +869,27 @@ class AnthropicStreamingClient(PlaygroundStreamingClient):
862
869
  return content
863
870
 
864
871
 
872
+ @register_llm_client(
873
+ provider_key=GenerativeProviderKey.ANTHROPIC,
874
+ model_names=[
875
+ "claude-3-7-sonnet-latest",
876
+ "claude-3-7-sonnet-20250219",
877
+ ],
878
+ )
879
+ class AnthropicReasoningStreamingClient(AnthropicStreamingClient):
880
+ @classmethod
881
+ def supported_invocation_parameters(cls) -> list[InvocationParameter]:
882
+ invocation_params = super().supported_invocation_parameters()
883
+ invocation_params.append(
884
+ JSONInvocationParameter(
885
+ invocation_name="thinking",
886
+ canonical_name=CanonicalParameterName.ANTHROPIC_EXTENDED_THINKING,
887
+ label="Thinking Budget",
888
+ )
889
+ )
890
+ return invocation_params
891
+
892
+
865
893
  @register_llm_client(
866
894
  provider_key=GenerativeProviderKey.GOOGLE,
867
895
  model_names=[
@@ -3,8 +3,8 @@ from __future__ import annotations
3
3
  from enum import Enum
4
4
  from typing import Any, Literal, Mapping, Optional, Union
5
5
 
6
- from pydantic import BaseModel, ConfigDict, Field, RootModel
7
- from typing_extensions import Annotated, TypeAlias, TypeGuard, assert_never
6
+ from pydantic import BaseModel, ConfigDict, Field, RootModel, model_validator
7
+ from typing_extensions import Annotated, Self, TypeAlias, TypeGuard, assert_never
8
8
 
9
9
  from phoenix.db.types.model_provider import ModelProvider
10
10
  from phoenix.server.api.helpers.prompts.conversions.anthropic import AnthropicToolChoiceConversion
@@ -370,11 +370,32 @@ class PromptAzureOpenAIInvocationParameters(PromptModel):
370
370
  azure_openai: PromptAzureOpenAIInvocationParametersContent
371
371
 
372
372
 
373
+ class PromptAnthropicThinkingConfigDisabled(PromptModel):
374
+ type: Literal["disabled"]
375
+
376
+
377
+ class PromptAnthropicThinkingConfigEnabled(PromptModel):
378
+ type: Literal["enabled"]
379
+ budget_tokens: int = Field(..., ge=1024)
380
+
381
+
373
382
  class PromptAnthropicInvocationParametersContent(PromptModel):
374
383
  max_tokens: int
375
384
  temperature: float = UNDEFINED
376
385
  top_p: float = UNDEFINED
377
386
  stop_sequences: list[str] = UNDEFINED
387
+ thinking: Annotated[
388
+ Union[PromptAnthropicThinkingConfigDisabled, PromptAnthropicThinkingConfigEnabled],
389
+ Field(..., discriminator="type"),
390
+ ] = UNDEFINED
391
+
392
+ @model_validator(mode="after")
393
+ def check_thinking_budget_tokens_lt_max_tokens(self) -> Self:
394
+ if self.thinking is UNDEFINED:
395
+ return self
396
+ if self.thinking.type == "enabled" and self.thinking.budget_tokens >= self.max_tokens:
397
+ raise ValueError("The thinking budget must be less than max tokens.")
398
+ return self
378
399
 
379
400
 
380
401
  class PromptAnthropicInvocationParameters(PromptModel):
@@ -16,6 +16,7 @@ class CanonicalParameterName(str, Enum):
16
16
  TOOL_CHOICE = "tool_choice"
17
17
  RESPONSE_FORMAT = "response_format"
18
18
  REASONING_EFFORT = "reasoning_effort"
19
+ ANTHROPIC_EXTENDED_THINKING = "anthropic_extended_thinking"
19
20
 
20
21
 
21
22
  @strawberry.enum
@@ -13,12 +13,14 @@ from phoenix.server.api.mutations.prompt_mutations import PromptMutationMixin
13
13
  from phoenix.server.api.mutations.prompt_version_tag_mutations import PromptVersionTagMutationMixin
14
14
  from phoenix.server.api.mutations.span_annotations_mutations import SpanAnnotationMutationMixin
15
15
  from phoenix.server.api.mutations.trace_annotations_mutations import TraceAnnotationMutationMixin
16
+ from phoenix.server.api.mutations.trace_mutations import TraceMutationMixin
16
17
  from phoenix.server.api.mutations.user_mutations import UserMutationMixin
17
18
 
18
19
 
19
20
  @strawberry.type
20
21
  class Mutation(
21
22
  ApiKeyMutationMixin,
23
+ ChatCompletionMutationMixin,
22
24
  DatasetMutationMixin,
23
25
  ExperimentMutationMixin,
24
26
  ExportEventsMutationMixin,
@@ -28,7 +30,7 @@ class Mutation(
28
30
  PromptLabelMutationMixin,
29
31
  SpanAnnotationMutationMixin,
30
32
  TraceAnnotationMutationMixin,
33
+ TraceMutationMixin,
31
34
  UserMutationMixin,
32
- ChatCompletionMutationMixin,
33
35
  ):
34
36
  pass
@@ -11,6 +11,7 @@ from strawberry.types import Info
11
11
 
12
12
  from phoenix.db import models
13
13
  from phoenix.db.types.identifier import Identifier as IdentifierModel
14
+ from phoenix.server.api.auth import IsLocked, IsNotReadOnly
14
15
  from phoenix.server.api.context import Context
15
16
  from phoenix.server.api.exceptions import Conflict, NotFound
16
17
  from phoenix.server.api.queries import Query
@@ -58,7 +59,7 @@ class PromptLabelMutationPayload:
58
59
 
59
60
  @strawberry.type
60
61
  class PromptLabelMutationMixin:
61
- @strawberry.mutation
62
+ @strawberry.mutation(permission_classes=[IsNotReadOnly, IsLocked]) # type: ignore
62
63
  async def create_prompt_label(
63
64
  self, info: Info[Context, None], input: CreatePromptLabelInput
64
65
  ) -> PromptLabelMutationPayload:
@@ -77,7 +78,7 @@ class PromptLabelMutationMixin:
77
78
  query=Query(),
78
79
  )
79
80
 
80
- @strawberry.mutation
81
+ @strawberry.mutation(permission_classes=[IsNotReadOnly, IsLocked]) # type: ignore
81
82
  async def patch_prompt_label(
82
83
  self, info: Info[Context, None], input: PatchPromptLabelInput
83
84
  ) -> PromptLabelMutationPayload:
@@ -106,7 +107,7 @@ class PromptLabelMutationMixin:
106
107
  query=Query(),
107
108
  )
108
109
 
109
- @strawberry.mutation
110
+ @strawberry.mutation(permission_classes=[IsNotReadOnly]) # type: ignore
110
111
  async def delete_prompt_label(
111
112
  self, info: Info[Context, None], input: DeletePromptLabelInput
112
113
  ) -> PromptLabelMutationPayload:
@@ -130,7 +131,7 @@ class PromptLabelMutationMixin:
130
131
  query=Query(),
131
132
  )
132
133
 
133
- @strawberry.mutation
134
+ @strawberry.mutation(permission_classes=[IsNotReadOnly, IsLocked]) # type: ignore
134
135
  async def set_prompt_label(
135
136
  self, info: Info[Context, None], input: SetPromptLabelInput
136
137
  ) -> PromptLabelMutationPayload:
@@ -160,7 +161,7 @@ class PromptLabelMutationMixin:
160
161
  query=Query(),
161
162
  )
162
163
 
163
- @strawberry.mutation
164
+ @strawberry.mutation(permission_classes=[IsNotReadOnly]) # type: ignore
164
165
  async def unset_prompt_label(
165
166
  self, info: Info[Context, None], input: UnsetPromptLabelInput
166
167
  ) -> PromptLabelMutationPayload:
@@ -13,6 +13,7 @@ from strawberry.types import Info
13
13
  from phoenix.db import models
14
14
  from phoenix.db.types.identifier import Identifier as IdentifierModel
15
15
  from phoenix.db.types.model_provider import ModelProvider
16
+ from phoenix.server.api.auth import IsLocked, IsNotReadOnly
16
17
  from phoenix.server.api.context import Context
17
18
  from phoenix.server.api.exceptions import BadRequest, Conflict, NotFound
18
19
  from phoenix.server.api.helpers.prompts.models import (
@@ -74,7 +75,7 @@ class DeletePromptMutationPayload:
74
75
 
75
76
  @strawberry.type
76
77
  class PromptMutationMixin:
77
- @strawberry.mutation
78
+ @strawberry.mutation(permission_classes=[IsNotReadOnly, IsLocked]) # type: ignore
78
79
  async def create_chat_prompt(
79
80
  self, info: Info[Context, None], input: CreateChatPromptInput
80
81
  ) -> Prompt:
@@ -141,7 +142,7 @@ class PromptMutationMixin:
141
142
  raise Conflict(f"A prompt named '{input.name}' already exists")
142
143
  return to_gql_prompt_from_orm(prompt)
143
144
 
144
- @strawberry.mutation
145
+ @strawberry.mutation(permission_classes=[IsNotReadOnly, IsLocked]) # type: ignore
145
146
  async def create_chat_prompt_version(
146
147
  self,
147
148
  info: Info[Context, None],
@@ -219,7 +220,7 @@ class PromptMutationMixin:
219
220
 
220
221
  return to_gql_prompt_from_orm(prompt)
221
222
 
222
- @strawberry.mutation
223
+ @strawberry.mutation(permission_classes=[IsNotReadOnly]) # type: ignore
223
224
  async def delete_prompt(
224
225
  self, info: Info[Context, None], input: DeletePromptInput
225
226
  ) -> DeletePromptMutationPayload:
@@ -236,7 +237,7 @@ class PromptMutationMixin:
236
237
  await session.commit()
237
238
  return DeletePromptMutationPayload(query=Query())
238
239
 
239
- @strawberry.mutation
240
+ @strawberry.mutation(permission_classes=[IsNotReadOnly, IsLocked]) # type: ignore
240
241
  async def clone_prompt(self, info: Info[Context, None], input: ClonePromptInput) -> Prompt:
241
242
  prompt_id = from_global_id_with_expected_type(
242
243
  global_id=input.prompt_id, expected_type_name=Prompt.__name__
@@ -289,7 +290,7 @@ class PromptMutationMixin:
289
290
  raise Conflict(f"A prompt named '{input.name}' already exists")
290
291
  return to_gql_prompt_from_orm(new_prompt)
291
292
 
292
- @strawberry.mutation
293
+ @strawberry.mutation(permission_classes=[IsNotReadOnly, IsLocked]) # type: ignore
293
294
  async def patch_prompt(self, info: Info[Context, None], input: PatchPromptInput) -> Prompt:
294
295
  prompt_id = from_global_id_with_expected_type(
295
296
  global_id=input.prompt_id, expected_type_name=Prompt.__name__
@@ -10,6 +10,7 @@ from strawberry.types import Info
10
10
 
11
11
  from phoenix.db import models
12
12
  from phoenix.db.types.identifier import Identifier as IdentifierModel
13
+ from phoenix.server.api.auth import IsLocked, IsNotReadOnly
13
14
  from phoenix.server.api.context import Context
14
15
  from phoenix.server.api.exceptions import BadRequest, Conflict, NotFound
15
16
  from phoenix.server.api.queries import Query
@@ -41,7 +42,7 @@ class PromptVersionTagMutationPayload:
41
42
 
42
43
  @strawberry.type
43
44
  class PromptVersionTagMutationMixin:
44
- @strawberry.mutation
45
+ @strawberry.mutation(permission_classes=[IsNotReadOnly]) # type: ignore
45
46
  async def delete_prompt_version_tag(
46
47
  self, info: Info[Context, None], input: DeletePromptVersionTagInput
47
48
  ) -> PromptVersionTagMutationPayload:
@@ -77,7 +78,7 @@ class PromptVersionTagMutationMixin:
77
78
  prompt_version_tag=None, query=Query(), prompt=to_gql_prompt_from_orm(prompt)
78
79
  )
79
80
 
80
- @strawberry.mutation
81
+ @strawberry.mutation(permission_classes=[IsNotReadOnly, IsLocked]) # type: ignore
81
82
  async def set_prompt_version_tag(
82
83
  self, info: Info[Context, None], input: SetPromptVersionTagInput
83
84
  ) -> PromptVersionTagMutationPayload:
@@ -0,0 +1,74 @@
1
+ import strawberry
2
+ from sqlalchemy import and_, delete, not_, select
3
+ from sqlalchemy.orm import load_only
4
+ from sqlalchemy.sql import literal
5
+ from strawberry.relay import GlobalID
6
+ from strawberry.types import Info
7
+
8
+ from phoenix.db import models
9
+ from phoenix.server.api.auth import IsNotReadOnly
10
+ from phoenix.server.api.context import Context
11
+ from phoenix.server.api.exceptions import BadRequest
12
+ from phoenix.server.api.queries import Query
13
+ from phoenix.server.api.types.node import from_global_id_with_expected_type
14
+ from phoenix.server.dml_event import SpanDeleteEvent
15
+
16
+
17
+ @strawberry.type
18
+ class TraceMutationMixin:
19
+ @strawberry.mutation(permission_classes=[IsNotReadOnly]) # type: ignore
20
+ async def delete_traces(
21
+ self,
22
+ info: Info[Context, None],
23
+ trace_ids: list[GlobalID],
24
+ ) -> Query:
25
+ if not trace_ids:
26
+ raise BadRequest("Must provide at least one trace ID to delete")
27
+ trace_ids = list(set(trace_ids))
28
+ try:
29
+ trace_rowids = [
30
+ from_global_id_with_expected_type(global_id=id, expected_type_name="Trace")
31
+ for id in trace_ids
32
+ ]
33
+ except ValueError as error:
34
+ raise BadRequest(str(error))
35
+ async with info.context.db() as session:
36
+ traces = (
37
+ await session.scalars(
38
+ delete(models.Trace)
39
+ .where(models.Trace.id.in_(trace_rowids))
40
+ .returning(models.Trace)
41
+ .options(
42
+ load_only(models.Trace.project_rowid, models.Trace.project_session_rowid)
43
+ )
44
+ )
45
+ ).all()
46
+ if len(traces) < len(trace_rowids):
47
+ await session.rollback()
48
+ raise BadRequest("Invalid trace IDs provided")
49
+ project_ids = tuple(set(trace.project_rowid for trace in traces))
50
+ if len(project_ids) > 1:
51
+ await session.rollback()
52
+ raise BadRequest("Cannot delete traces from multiple projects")
53
+ session_ids = set(
54
+ session_id
55
+ for trace in traces
56
+ if (session_id := trace.project_session_rowid) is not None
57
+ )
58
+ if session_ids:
59
+ await session.execute(
60
+ delete(models.ProjectSession).where(
61
+ and_(
62
+ models.ProjectSession.id.in_(session_ids),
63
+ not_(
64
+ select(literal(1))
65
+ .where(
66
+ models.Trace.project_session_rowid == models.ProjectSession.id
67
+ )
68
+ .exists()
69
+ ),
70
+ )
71
+ )
72
+ )
73
+ info.context.event_queue.put(SpanDeleteEvent(project_ids))
74
+ return Query()
@@ -13,7 +13,11 @@ from strawberry.relay import Connection, GlobalID, Node
13
13
  from strawberry.types import Info
14
14
  from typing_extensions import Annotated, TypeAlias, assert_never
15
15
 
16
- from phoenix.config import ENV_PHOENIX_SQL_DATABASE_SCHEMA, getenv
16
+ from phoenix.config import (
17
+ ENV_PHOENIX_SQL_DATABASE_SCHEMA,
18
+ get_env_database_allocated_storage_capacity_gibibytes,
19
+ getenv,
20
+ )
17
21
  from phoenix.db import enums, models
18
22
  from phoenix.db.helpers import SupportedSQLDialect
19
23
  from phoenix.db.models import DatasetExample as OrmExample
@@ -789,6 +793,15 @@ class Query:
789
793
  clustered_events=clustered_events,
790
794
  )
791
795
 
796
+ @strawberry.field(
797
+ description="The allocated storage capacity of the database in bytes. "
798
+ "Return None if this information is unavailable.",
799
+ ) # type: ignore
800
+ async def db_storage_capacity_bytes(self) -> Optional[float]:
801
+ if gibibytes := get_env_database_allocated_storage_capacity_gibibytes():
802
+ return gibibytes * 2**30
803
+ return None
804
+
792
805
  @strawberry.field
793
806
  async def db_table_stats(
794
807
  self,
@@ -1,11 +1,13 @@
1
+ import json
1
2
  from datetime import datetime
2
3
  from random import getrandbits
3
4
  from typing import Any, Optional
4
5
 
5
- from fastapi import APIRouter, HTTPException, Path
6
+ from fastapi import APIRouter, HTTPException, Path, Response
6
7
  from pydantic import Field
7
- from sqlalchemy import select
8
+ from sqlalchemy import and_, func, select
8
9
  from starlette.requests import Request
10
+ from starlette.responses import PlainTextResponse
9
11
  from starlette.status import HTTP_404_NOT_FOUND
10
12
  from strawberry.relay import GlobalID
11
13
 
@@ -306,3 +308,102 @@ async def list_experiments(
306
308
  ]
307
309
 
308
310
  return ListExperimentsResponseBody(data=data)
311
+
312
+
313
+ @router.get(
314
+ "/experiments/{experiment_id}/json",
315
+ operation_id="getExperimentJSON",
316
+ summary="Download experiment runs as a JSON file",
317
+ response_class=PlainTextResponse,
318
+ responses=add_errors_to_responses(
319
+ [
320
+ {"status_code": HTTP_404_NOT_FOUND, "description": "Experiment not found"},
321
+ ]
322
+ ),
323
+ )
324
+ async def get_experiment_jsonl(
325
+ request: Request,
326
+ response: Response,
327
+ experiment_id: str = Path(..., title="Experiment ID"),
328
+ ) -> str:
329
+ experiment_globalid = GlobalID.from_id(experiment_id)
330
+ try:
331
+ experiment_rowid = from_global_id_with_expected_type(experiment_globalid, "Experiment")
332
+ except ValueError:
333
+ raise HTTPException(
334
+ detail=f"Experiment with ID {experiment_globalid} does not exist",
335
+ status_code=HTTP_404_NOT_FOUND,
336
+ )
337
+
338
+ async with request.app.state.db() as session:
339
+ experiment = await session.get(models.Experiment, experiment_rowid)
340
+ if not experiment:
341
+ raise HTTPException(
342
+ detail=f"Experiment with ID {experiment_globalid} does not exist",
343
+ status_code=HTTP_404_NOT_FOUND,
344
+ )
345
+ revision_ids = (
346
+ select(func.max(models.DatasetExampleRevision.id))
347
+ .join(
348
+ models.DatasetExample,
349
+ models.DatasetExample.id == models.DatasetExampleRevision.dataset_example_id,
350
+ )
351
+ .where(
352
+ and_(
353
+ models.DatasetExampleRevision.dataset_version_id
354
+ <= experiment.dataset_version_id,
355
+ models.DatasetExample.dataset_id == experiment.dataset_id,
356
+ )
357
+ )
358
+ .group_by(models.DatasetExampleRevision.dataset_example_id)
359
+ .scalar_subquery()
360
+ )
361
+ runs_and_revisions = (
362
+ await session.execute(
363
+ select(models.ExperimentRun, models.DatasetExampleRevision)
364
+ .join(
365
+ models.DatasetExample,
366
+ models.DatasetExample.id == models.ExperimentRun.dataset_example_id,
367
+ )
368
+ .join(
369
+ models.DatasetExampleRevision,
370
+ and_(
371
+ models.DatasetExample.id
372
+ == models.DatasetExampleRevision.dataset_example_id,
373
+ models.DatasetExampleRevision.id.in_(revision_ids),
374
+ models.DatasetExampleRevision.revision_kind != "DELETE",
375
+ ),
376
+ )
377
+ .where(models.ExperimentRun.experiment_id == experiment_rowid)
378
+ .order_by(
379
+ models.ExperimentRun.dataset_example_id, models.ExperimentRun.repetition_number
380
+ )
381
+ )
382
+ ).all()
383
+ if not runs_and_revisions:
384
+ raise HTTPException(
385
+ detail=f"Experiment with ID {experiment_globalid} has no runs",
386
+ status_code=HTTP_404_NOT_FOUND,
387
+ )
388
+ records = []
389
+ for run, revision in runs_and_revisions:
390
+ record = {
391
+ "example_id": str(
392
+ GlobalID(models.DatasetExample.__name__, str(run.dataset_example_id))
393
+ ),
394
+ "repetition_number": run.repetition_number,
395
+ "input": revision.input,
396
+ "reference_output": revision.output,
397
+ "output": run.output,
398
+ "error": run.error,
399
+ "latency_ms": run.latency_ms,
400
+ "start_time": run.start_time.isoformat(),
401
+ "end_time": run.end_time.isoformat(),
402
+ "trace_id": run.trace_id,
403
+ "prompt_token_count": run.prompt_token_count,
404
+ "completion_token_count": run.completion_token_count,
405
+ }
406
+ records.append(record)
407
+
408
+ response.headers["content-disposition"] = f'attachment; filename="{experiment.name}.json"'
409
+ return json.dumps(records, ensure_ascii=False, indent=2)
@@ -2,13 +2,13 @@ import logging
2
2
  from typing import Any, Optional, Union
3
3
 
4
4
  from fastapi import APIRouter, HTTPException, Path, Query
5
- from pydantic import ValidationError
5
+ from pydantic import ValidationError, model_validator
6
6
  from sqlalchemy import select
7
7
  from sqlalchemy.sql import Select
8
8
  from starlette.requests import Request
9
9
  from starlette.status import HTTP_404_NOT_FOUND, HTTP_422_UNPROCESSABLE_ENTITY
10
10
  from strawberry.relay import GlobalID
11
- from typing_extensions import TypeAlias, assert_never
11
+ from typing_extensions import Self, TypeAlias, assert_never
12
12
 
13
13
  from phoenix.db import models
14
14
  from phoenix.db.types.identifier import Identifier
@@ -52,6 +52,18 @@ class PromptVersionData(V1RoutesBaseModel):
52
52
  tools: Optional[PromptTools] = None
53
53
  response_format: Optional[PromptResponseFormat] = None
54
54
 
55
+ @model_validator(mode="after")
56
+ def check_template_type_match(self) -> Self:
57
+ if self.template_type is PromptTemplateType.CHAT:
58
+ if self.template.type == "chat":
59
+ return self
60
+ elif self.template_type is PromptTemplateType.STRING:
61
+ if self.template.type == "string":
62
+ return self
63
+ else:
64
+ assert_never(self.template_type)
65
+ raise ValueError("Template type does not match template")
66
+
55
67
 
56
68
  class PromptVersion(PromptVersionData):
57
69
  id: str
@@ -549,7 +549,7 @@ def create_graphql_router(
549
549
  read_only: bool = False,
550
550
  secret: Optional[str] = None,
551
551
  token_store: Optional[TokenStore] = None,
552
- ) -> GraphQLRouter: # type: ignore[type-arg]
552
+ ) -> GraphQLRouter[Context, None]:
553
553
  """Creates the GraphQL router.
554
554
 
555
555
  Args: