arize-phoenix 8.32.1__tar.gz → 9.0.1__tar.gz

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

Potentially problematic release.


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

Files changed (409) hide show
  1. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/PKG-INFO +5 -5
  2. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/README.md +1 -1
  3. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/pyproject.toml +3 -3
  4. arize_phoenix-9.0.1/src/phoenix/db/constants.py +1 -0
  5. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/facilitator.py +55 -0
  6. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/insertion/document_annotation.py +31 -13
  7. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/insertion/evaluation.py +15 -3
  8. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/insertion/helpers.py +2 -1
  9. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/insertion/span_annotation.py +26 -9
  10. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/insertion/trace_annotation.py +25 -9
  11. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/insertion/types.py +7 -0
  12. arize_phoenix-9.0.1/src/phoenix/db/migrations/versions/2f9d1a65945f_annotation_config_migration.py +322 -0
  13. arize_phoenix-9.0.1/src/phoenix/db/migrations/versions/8a3764fe7f1a_change_jsonb_to_json_for_prompts.py +76 -0
  14. arize_phoenix-9.0.1/src/phoenix/db/migrations/versions/bb8139330879_create_project_trace_retention_policies_table.py +77 -0
  15. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/models.py +151 -10
  16. arize_phoenix-9.0.1/src/phoenix/db/types/annotation_configs.py +97 -0
  17. arize_phoenix-9.0.1/src/phoenix/db/types/db_models.py +41 -0
  18. arize_phoenix-9.0.1/src/phoenix/db/types/trace_retention.py +267 -0
  19. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/experiments/functions.py +5 -1
  20. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/auth.py +9 -0
  21. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/context.py +5 -0
  22. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/__init__.py +4 -0
  23. arize_phoenix-9.0.1/src/phoenix/server/api/dataloaders/annotation_summaries.py +318 -0
  24. arize_phoenix-9.0.1/src/phoenix/server/api/dataloaders/project_ids_by_trace_retention_policy_id.py +42 -0
  25. arize_phoenix-9.0.1/src/phoenix/server/api/dataloaders/trace_retention_policy_id_by_project_id.py +34 -0
  26. arize_phoenix-9.0.1/src/phoenix/server/api/helpers/annotations.py +9 -0
  27. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/helpers/prompts/models.py +34 -67
  28. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +9 -0
  29. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +3 -0
  30. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +3 -0
  31. arize_phoenix-9.0.1/src/phoenix/server/api/input_types/SpanAnnotationFilter.py +67 -0
  32. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/mutations/__init__.py +6 -0
  33. arize_phoenix-9.0.1/src/phoenix/server/api/mutations/annotation_config_mutations.py +413 -0
  34. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/mutations/dataset_mutations.py +62 -39
  35. arize_phoenix-9.0.1/src/phoenix/server/api/mutations/project_trace_retention_policy_mutations.py +245 -0
  36. arize_phoenix-9.0.1/src/phoenix/server/api/mutations/span_annotations_mutations.py +330 -0
  37. arize_phoenix-9.0.1/src/phoenix/server/api/mutations/trace_annotations_mutations.py +256 -0
  38. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/queries.py +86 -0
  39. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/v1/__init__.py +4 -0
  40. arize_phoenix-9.0.1/src/phoenix/server/api/routers/v1/annotation_configs.py +449 -0
  41. arize_phoenix-9.0.1/src/phoenix/server/api/routers/v1/annotations.py +161 -0
  42. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/v1/evaluations.py +6 -0
  43. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/v1/projects.py +1 -50
  44. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/v1/spans.py +35 -8
  45. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/v1/traces.py +22 -13
  46. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/v1/utils.py +60 -0
  47. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Annotation.py +7 -0
  48. arize_phoenix-9.0.1/src/phoenix/server/api/types/AnnotationConfig.py +124 -0
  49. arize_phoenix-9.0.1/src/phoenix/server/api/types/AnnotationSource.py +9 -0
  50. arize_phoenix-9.0.1/src/phoenix/server/api/types/AnnotationSummary.py +69 -0
  51. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/AnnotatorKind.py +1 -0
  52. arize_phoenix-9.0.1/src/phoenix/server/api/types/CronExpression.py +15 -0
  53. arize_phoenix-9.0.1/src/phoenix/server/api/types/Evaluation.py +39 -0
  54. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Project.py +50 -2
  55. arize_phoenix-9.0.1/src/phoenix/server/api/types/ProjectTraceRetentionPolicy.py +110 -0
  56. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Span.py +78 -0
  57. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/SpanAnnotation.py +24 -0
  58. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Trace.py +2 -2
  59. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/TraceAnnotation.py +23 -0
  60. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/app.py +20 -0
  61. arize_phoenix-9.0.1/src/phoenix/server/retention.py +76 -0
  62. arize_phoenix-9.0.1/src/phoenix/server/static/.vite/manifest.json +87 -0
  63. arize_phoenix-9.0.1/src/phoenix/server/static/assets/components-B2MWTXnm.js +4326 -0
  64. arize_phoenix-8.32.1/src/phoenix/server/static/assets/index-B0CbpsxD.js → arize_phoenix-9.0.1/src/phoenix/server/static/assets/index-Bfvpea_-.js +10 -10
  65. arize_phoenix-9.0.1/src/phoenix/server/static/assets/pages-CZ2vKu8H.js +7268 -0
  66. arize_phoenix-9.0.1/src/phoenix/server/static/assets/vendor-BRDkBC5J.js +903 -0
  67. arize_phoenix-8.32.1/src/phoenix/server/static/assets/vendor-arizeai-CxXYQNUl.js → arize_phoenix-9.0.1/src/phoenix/server/static/assets/vendor-arizeai-BvTqp_W8.js +3 -3
  68. arize_phoenix-8.32.1/src/phoenix/server/static/assets/vendor-codemirror-B0NIFPOL.js → arize_phoenix-9.0.1/src/phoenix/server/static/assets/vendor-codemirror-COt9UfW7.js +1 -1
  69. arize_phoenix-8.32.1/src/phoenix/server/static/assets/vendor-recharts-CrrDFWK1.js → arize_phoenix-9.0.1/src/phoenix/server/static/assets/vendor-recharts-BoHX9Hvs.js +2 -2
  70. arize_phoenix-8.32.1/src/phoenix/server/static/assets/vendor-shiki-C5bJ-RPf.js → arize_phoenix-9.0.1/src/phoenix/server/static/assets/vendor-shiki-Cw1dsDAz.js +1 -1
  71. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/dsl/filter.py +25 -5
  72. arize_phoenix-9.0.1/src/phoenix/utilities/__init__.py +18 -0
  73. arize_phoenix-9.0.1/src/phoenix/version.py +1 -0
  74. arize_phoenix-8.32.1/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -139
  75. arize_phoenix-8.32.1/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -128
  76. arize_phoenix-8.32.1/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -127
  77. arize_phoenix-8.32.1/src/phoenix/server/api/types/AnnotationSummary.py +0 -55
  78. arize_phoenix-8.32.1/src/phoenix/server/api/types/Evaluation.py +0 -65
  79. arize_phoenix-8.32.1/src/phoenix/server/static/.vite/manifest.json +0 -87
  80. arize_phoenix-8.32.1/src/phoenix/server/static/assets/components-x-gKFJ8C.js +0 -3414
  81. arize_phoenix-8.32.1/src/phoenix/server/static/assets/pages-BU4VdyeH.js +0 -5867
  82. arize_phoenix-8.32.1/src/phoenix/server/static/assets/vendor-BfhM_F1u.js +0 -902
  83. arize_phoenix-8.32.1/src/phoenix/utilities/__init__.py +0 -0
  84. arize_phoenix-8.32.1/src/phoenix/version.py +0 -1
  85. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/.gitignore +0 -0
  86. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/IP_NOTICE +0 -0
  87. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/LICENSE +0 -0
  88. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/__init__.py +0 -0
  89. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/auth.py +0 -0
  90. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/config.py +0 -0
  91. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/core/__init__.py +0 -0
  92. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/core/embedding_dimension.py +0 -0
  93. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/core/model.py +0 -0
  94. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/core/model_schema.py +0 -0
  95. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/core/model_schema_adapter.py +0 -0
  96. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/datetime_utils.py +0 -0
  97. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/README.md +0 -0
  98. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/__init__.py +0 -0
  99. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/alembic.ini +0 -0
  100. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/bulk_inserter.py +0 -0
  101. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/engines.py +0 -0
  102. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/enums.py +0 -0
  103. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/helpers.py +0 -0
  104. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/insertion/__init__.py +0 -0
  105. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/insertion/constants.py +0 -0
  106. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/insertion/dataset.py +0 -0
  107. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/insertion/span.py +0 -0
  108. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/migrate.py +0 -0
  109. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/migrations/__init__.py +0 -0
  110. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/migrations/data_migration_scripts/__init__.py +0 -0
  111. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +0 -0
  112. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/migrations/env.py +0 -0
  113. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/migrations/script.py.mako +0 -0
  114. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  115. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
  116. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +0 -0
  117. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/migrations/versions/bc8fea3c2bc8_add_prompt_tables.py +0 -0
  118. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
  119. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  120. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/pg_config.py +0 -0
  121. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/types/__init__.py +0 -0
  122. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/types/identifier.py +0 -0
  123. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/db/types/model_provider.py +0 -0
  124. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/exceptions.py +0 -0
  125. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/experiments/__init__.py +0 -0
  126. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  127. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/experiments/evaluators/base.py +0 -0
  128. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
  129. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
  130. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/experiments/evaluators/utils.py +0 -0
  131. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/experiments/tracing.py +0 -0
  132. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/experiments/types.py +0 -0
  133. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/experiments/utils.py +0 -0
  134. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/inferences/__init__.py +0 -0
  135. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/inferences/errors.py +0 -0
  136. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/inferences/fixtures.py +0 -0
  137. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/inferences/inferences.py +0 -0
  138. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/inferences/schema.py +0 -0
  139. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/inferences/validation.py +0 -0
  140. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/logging/__init__.py +0 -0
  141. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/logging/_config.py +0 -0
  142. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/logging/_filter.py +0 -0
  143. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/logging/_formatter.py +0 -0
  144. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/metrics/README.md +0 -0
  145. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/metrics/__init__.py +0 -0
  146. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/metrics/binning.py +0 -0
  147. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/metrics/metrics.py +0 -0
  148. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/metrics/mixins.py +0 -0
  149. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  150. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/metrics/timeseries.py +0 -0
  151. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/metrics/wrappers.py +0 -0
  152. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/pointcloud/__init__.py +0 -0
  153. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/pointcloud/clustering.py +0 -0
  154. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/pointcloud/pointcloud.py +0 -0
  155. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/pointcloud/projectors.py +0 -0
  156. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  157. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/py.typed +0 -0
  158. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/__init__.py +0 -0
  159. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/README.md +0 -0
  160. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/__init__.py +0 -0
  161. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
  162. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  163. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
  164. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
  165. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
  166. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
  167. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
  168. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
  169. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
  170. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
  171. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
  172. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
  173. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
  174. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
  175. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
  176. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/num_child_spans.py +0 -0
  177. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/num_spans_per_trace.py +0 -0
  178. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
  179. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/prompt_version_sequence_number.py +0 -0
  180. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
  181. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/session_io.py +0 -0
  182. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/session_num_traces.py +0 -0
  183. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/session_num_traces_with_error.py +0 -0
  184. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/session_token_usages.py +0 -0
  185. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +0 -0
  186. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
  187. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/span_by_id.py +0 -0
  188. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
  189. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
  190. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
  191. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/table_fields.py +0 -0
  192. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
  193. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/trace_by_trace_ids.py +0 -0
  194. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/trace_root_spans.py +0 -0
  195. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/user_roles.py +0 -0
  196. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/dataloaders/users.py +0 -0
  197. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/exceptions.py +0 -0
  198. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/helpers/__init__.py +0 -0
  199. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
  200. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/helpers/experiment_run_filters.py +0 -0
  201. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/helpers/playground_clients.py +0 -0
  202. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/helpers/playground_registry.py +0 -0
  203. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/helpers/playground_spans.py +0 -0
  204. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/helpers/prompts/__init__.py +0 -0
  205. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/helpers/prompts/conversions/__init__.py +0 -0
  206. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/helpers/prompts/conversions/anthropic.py +0 -0
  207. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/helpers/prompts/conversions/openai.py +0 -0
  208. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
  209. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
  210. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/ChatCompletionInput.py +0 -0
  211. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -0
  212. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  213. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  214. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  215. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  216. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  217. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  218. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  219. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  220. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
  221. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
  222. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  223. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
  224. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  225. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  226. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/GenerativeModelInput.py +0 -0
  227. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  228. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/InvocationParameters.py +0 -0
  229. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
  230. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  231. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  232. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/ProjectSessionSort.py +0 -0
  233. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/PromptTemplateOptions.py +0 -0
  234. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/PromptVersionInput.py +0 -0
  235. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  236. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  237. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  238. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  239. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
  240. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/input_types/__init__.py +0 -0
  241. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/interceptor.py +0 -0
  242. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/mutations/api_key_mutations.py +0 -0
  243. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/mutations/chat_mutations.py +0 -0
  244. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
  245. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
  246. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
  247. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/mutations/prompt_label_mutations.py +0 -0
  248. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/mutations/prompt_mutations.py +0 -0
  249. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/mutations/prompt_version_tag_mutations.py +0 -0
  250. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/mutations/trace_mutations.py +0 -0
  251. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
  252. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/openapi/__init__.py +0 -0
  253. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/openapi/main.py +0 -0
  254. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/openapi/schema.py +0 -0
  255. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/__init__.py +0 -0
  256. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/auth.py +0 -0
  257. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/embeddings.py +0 -0
  258. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/oauth2.py +0 -0
  259. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/utils.py +0 -0
  260. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/v1/datasets.py +0 -0
  261. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
  262. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
  263. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/v1/experiments.py +0 -0
  264. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/v1/models.py +0 -0
  265. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/routers/v1/prompts.py +0 -0
  266. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/schema.py +0 -0
  267. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/subscriptions.py +0 -0
  268. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/ApiKey.py +0 -0
  269. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/AuthMethod.py +0 -0
  270. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
  271. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +0 -0
  272. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Cluster.py +0 -0
  273. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  274. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  275. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Dataset.py +0 -0
  276. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  277. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  278. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  279. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  280. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Dimension.py +0 -0
  281. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  282. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  283. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/DimensionType.py +0 -0
  284. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  285. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  286. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  287. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  288. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  289. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  290. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Event.py +0 -0
  291. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  292. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  293. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Experiment.py +0 -0
  294. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  295. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
  296. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  297. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  298. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  299. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Functionality.py +0 -0
  300. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
  301. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/GenerativeProvider.py +0 -0
  302. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Identifier.py +0 -0
  303. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Inferences.py +0 -0
  304. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/InferencesRole.py +0 -0
  305. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  306. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/MimeType.py +0 -0
  307. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Model.py +0 -0
  308. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/NumericRange.py +0 -0
  309. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  310. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/ProjectSession.py +0 -0
  311. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Prompt.py +0 -0
  312. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/PromptLabel.py +0 -0
  313. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  314. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/PromptVersion.py +0 -0
  315. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/PromptVersionTag.py +0 -0
  316. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/PromptVersionTemplate.py +0 -0
  317. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/ResponseFormat.py +0 -0
  318. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Retrieval.py +0 -0
  319. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  320. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/Segments.py +0 -0
  321. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/SortDir.py +0 -0
  322. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/SpanIOValue.py +0 -0
  323. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
  324. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  325. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/TokenUsage.py +0 -0
  326. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/ToolDefinition.py +0 -0
  327. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  328. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/User.py +0 -0
  329. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/UserApiKey.py +0 -0
  330. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/UserRole.py +0 -0
  331. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  332. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  333. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/__init__.py +0 -0
  334. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/node.py +0 -0
  335. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/types/pagination.py +0 -0
  336. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/api/utils.py +0 -0
  337. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/authorization.py +0 -0
  338. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/bearer_auth.py +0 -0
  339. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/dml_event.py +0 -0
  340. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/dml_event_handler.py +0 -0
  341. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/email/__init__.py +0 -0
  342. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/email/sender.py +0 -0
  343. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/email/templates/__init__.py +0 -0
  344. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/email/templates/password_reset.html +0 -0
  345. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/email/templates/welcome.html +0 -0
  346. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/email/types.py +0 -0
  347. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/grpc_server.py +0 -0
  348. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/jwt_store.py +0 -0
  349. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/main.py +0 -0
  350. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/middleware/__init__.py +0 -0
  351. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/middleware/gzip.py +0 -0
  352. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/oauth2.py +0 -0
  353. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/openapi/__init__.py +0 -0
  354. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/prometheus.py +0 -0
  355. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/rate_limiters.py +0 -0
  356. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  357. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  358. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  359. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  360. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  361. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  362. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  363. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  364. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/static/assets/vendor-Cg6lcjUC.css +0 -0
  365. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/static/assets/vendor-three-C5WAXd5r.js +0 -0
  366. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/static/favicon.ico +0 -0
  367. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/static/modernizr.js +0 -0
  368. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/telemetry.py +0 -0
  369. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/templates/__init__.py +0 -0
  370. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/templates/index.html +0 -0
  371. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/thread_server.py +0 -0
  372. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/server/types.py +0 -0
  373. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/services.py +0 -0
  374. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/session/__init__.py +0 -0
  375. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/session/client.py +0 -0
  376. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/session/data_extractor.py +0 -0
  377. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/session/evaluation.py +0 -0
  378. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/session/session.py +0 -0
  379. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/settings.py +0 -0
  380. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/__init__.py +0 -0
  381. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/attributes.py +0 -0
  382. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/dsl/README.md +0 -0
  383. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/dsl/__init__.py +0 -0
  384. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/dsl/helpers.py +0 -0
  385. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/dsl/query.py +0 -0
  386. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/errors.py +0 -0
  387. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/evaluation_conventions.py +0 -0
  388. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/exporter.py +0 -0
  389. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/fixtures.py +0 -0
  390. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/otel.py +0 -0
  391. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/projects.py +0 -0
  392. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/schemas.py +0 -0
  393. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/span_evaluations.py +0 -0
  394. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/span_json_decoder.py +0 -0
  395. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/span_json_encoder.py +0 -0
  396. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/trace_dataset.py +0 -0
  397. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/utils.py +0 -0
  398. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/v1/__init__.py +0 -0
  399. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  400. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  401. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/utilities/client.py +0 -0
  402. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/utilities/deprecation.py +0 -0
  403. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/utilities/error_handling.py +0 -0
  404. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/utilities/json.py +0 -0
  405. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/utilities/logging.py +0 -0
  406. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/utilities/project.py +0 -0
  407. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/utilities/re.py +0 -0
  408. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/src/phoenix/utilities/span_store.py +0 -0
  409. {arize_phoenix-8.32.1 → arize_phoenix-9.0.1}/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.32.1
3
+ Version: 9.0.1
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
@@ -49,7 +49,7 @@ Requires-Dist: scipy
49
49
  Requires-Dist: sqlalchemy[asyncio]<3,>=2.0.4
50
50
  Requires-Dist: sqlean-py>=3.45.1
51
51
  Requires-Dist: starlette>=0.46.0
52
- Requires-Dist: strawberry-graphql>=0.262.0
52
+ Requires-Dist: strawberry-graphql==0.267.0
53
53
  Requires-Dist: tqdm
54
54
  Requires-Dist: typing-extensions>=4.6
55
55
  Requires-Dist: uvicorn
@@ -71,7 +71,7 @@ Requires-Dist: opentelemetry-sdk; extra == 'container'
71
71
  Requires-Dist: opentelemetry-semantic-conventions; extra == 'container'
72
72
  Requires-Dist: prometheus-client; extra == 'container'
73
73
  Requires-Dist: py-grpc-prometheus; extra == 'container'
74
- Requires-Dist: strawberry-graphql[opentelemetry]==0.262.5; extra == 'container'
74
+ Requires-Dist: strawberry-graphql[opentelemetry]==0.267.0; extra == 'container'
75
75
  Requires-Dist: umap-learn; extra == 'container'
76
76
  Requires-Dist: uvloop; (platform_system != 'Windows') and extra == 'container'
77
77
  Provides-Extra: dev
@@ -102,7 +102,7 @@ Requires-Dist: pytest-postgresql; extra == 'dev'
102
102
  Requires-Dist: pytest-xdist; extra == 'dev'
103
103
  Requires-Dist: pytest==8.3.3; extra == 'dev'
104
104
  Requires-Dist: ruff==0.6.9; extra == 'dev'
105
- Requires-Dist: strawberry-graphql[debug-server,opentelemetry]==0.262.5; extra == 'dev'
105
+ Requires-Dist: strawberry-graphql[debug-server,opentelemetry]==0.267.0; extra == 'dev'
106
106
  Requires-Dist: tabulate; extra == 'dev'
107
107
  Requires-Dist: tox-uv==1.11.3; extra == 'dev'
108
108
  Requires-Dist: tox==4.18.1; extra == 'dev'
@@ -172,7 +172,7 @@ Phoenix is an open-source AI observability platform designed for experimentation
172
172
  - [**_Playground_**](https://docs.arize.com/phoenix/prompt-engineering/overview-prompts)- Optimize prompts, compare models, adjust parameters, and replay traced LLM calls.
173
173
  - [**_Prompt Management_**](https://docs.arize.com/phoenix/prompt-engineering/overview-prompts/prompt-management)- Manage and test prompt changes systematically using version control, tagging, and experimentation.
174
174
 
175
- Phoenix is vendor and language agnostic with out-of-the-box support for popular frameworks (🦙[LlamaIndex](https://docs.arize.com/phoenix/tracing/integrations-tracing/llamaindex), 🦜⛓[LangChain](https://docs.arize.com/phoenix/tracing/integrations-tracing/langchain), [Haystack](https://docs.arize.com/phoenix/tracing/integrations-tracing/haystack), 🧩[DSPy](https://docs.arize.com/phoenix/tracing/integrations-tracing/dspy), 🤗[smolagents](https://docs.arize.com/phoenix/tracing/integrations-tracing/hfsmolagents)) and LLM providers ([OpenAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/openai), [Bedrock](https://docs.arize.com/phoenix/tracing/integrations-tracing/bedrock), [MistralAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/mistralai), [VertexAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/vertexai), [LiteLLM](https://docs.arize.com/phoenix/tracing/integrations-tracing/litellm), and more). For details on auto-instrumentation, check out the [OpenInference](https://github.com/Arize-ai/openinference) project.
175
+ Phoenix is vendor and language agnostic with out-of-the-box support for popular frameworks (🦙[LlamaIndex](https://docs.arize.com/phoenix/tracing/integrations-tracing/llamaindex), 🦜⛓[LangChain](https://docs.arize.com/phoenix/tracing/integrations-tracing/langchain), [Haystack](https://docs.arize.com/phoenix/tracing/integrations-tracing/haystack), 🧩[DSPy](https://docs.arize.com/phoenix/tracing/integrations-tracing/dspy), 🤗[smolagents](https://docs.arize.com/phoenix/tracing/integrations-tracing/hfsmolagents)) and LLM providers ([OpenAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/openai), [Bedrock](https://docs.arize.com/phoenix/tracing/integrations-tracing/bedrock), [MistralAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/mistralai), [VertexAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/vertexai), [LiteLLM](https://docs.arize.com/phoenix/tracing/integrations-tracing/litellm), [Google GenAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/google-genai) and more). For details on auto-instrumentation, check out the [OpenInference](https://github.com/Arize-ai/openinference) project.
176
176
 
177
177
  Phoenix runs practically anywhere, including your local machine, a Jupyter notebook, a containerized deployment, or in the cloud.
178
178
 
@@ -42,7 +42,7 @@ Phoenix is an open-source AI observability platform designed for experimentation
42
42
  - [**_Playground_**](https://docs.arize.com/phoenix/prompt-engineering/overview-prompts)- Optimize prompts, compare models, adjust parameters, and replay traced LLM calls.
43
43
  - [**_Prompt Management_**](https://docs.arize.com/phoenix/prompt-engineering/overview-prompts/prompt-management)- Manage and test prompt changes systematically using version control, tagging, and experimentation.
44
44
 
45
- Phoenix is vendor and language agnostic with out-of-the-box support for popular frameworks (🦙[LlamaIndex](https://docs.arize.com/phoenix/tracing/integrations-tracing/llamaindex), 🦜⛓[LangChain](https://docs.arize.com/phoenix/tracing/integrations-tracing/langchain), [Haystack](https://docs.arize.com/phoenix/tracing/integrations-tracing/haystack), 🧩[DSPy](https://docs.arize.com/phoenix/tracing/integrations-tracing/dspy), 🤗[smolagents](https://docs.arize.com/phoenix/tracing/integrations-tracing/hfsmolagents)) and LLM providers ([OpenAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/openai), [Bedrock](https://docs.arize.com/phoenix/tracing/integrations-tracing/bedrock), [MistralAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/mistralai), [VertexAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/vertexai), [LiteLLM](https://docs.arize.com/phoenix/tracing/integrations-tracing/litellm), and more). For details on auto-instrumentation, check out the [OpenInference](https://github.com/Arize-ai/openinference) project.
45
+ Phoenix is vendor and language agnostic with out-of-the-box support for popular frameworks (🦙[LlamaIndex](https://docs.arize.com/phoenix/tracing/integrations-tracing/llamaindex), 🦜⛓[LangChain](https://docs.arize.com/phoenix/tracing/integrations-tracing/langchain), [Haystack](https://docs.arize.com/phoenix/tracing/integrations-tracing/haystack), 🧩[DSPy](https://docs.arize.com/phoenix/tracing/integrations-tracing/dspy), 🤗[smolagents](https://docs.arize.com/phoenix/tracing/integrations-tracing/hfsmolagents)) and LLM providers ([OpenAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/openai), [Bedrock](https://docs.arize.com/phoenix/tracing/integrations-tracing/bedrock), [MistralAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/mistralai), [VertexAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/vertexai), [LiteLLM](https://docs.arize.com/phoenix/tracing/integrations-tracing/litellm), [Google GenAI](https://docs.arize.com/phoenix/tracing/integrations-tracing/google-genai) and more). For details on auto-instrumentation, check out the [OpenInference](https://github.com/Arize-ai/openinference) project.
46
46
 
47
47
  Phoenix runs practically anywhere, including your local machine, a Jupyter notebook, a containerized deployment, or in the cloud.
48
48
 
@@ -29,7 +29,7 @@ dependencies = [
29
29
  "starlette>=0.46.0",
30
30
  "uvicorn",
31
31
  "psutil",
32
- "strawberry-graphql>=0.262.0", # resolve security vulnerability https://github.com/Arize-ai/phoenix/security/dependabot/45
32
+ "strawberry-graphql==0.267.0", # avoid this issue: https://github.com/strawberry-graphql/strawberry/issues/3854
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.262.5", # need to pin version because we're monkey-patching
91
+ "strawberry-graphql[debug-server,opentelemetry]==0.267.0", # avoid this issue: https://github.com/strawberry-graphql/strawberry/issues/3854
92
92
  "pre-commit",
93
93
  "arize[AutoEmbeddings, LLM_Evaluation]",
94
94
  "llama-index>=0.10.3",
@@ -137,7 +137,7 @@ container = [
137
137
  "opentelemetry-instrumentation-sqlalchemy",
138
138
  "opentelemetry-instrumentation-grpc",
139
139
  "py-grpc-prometheus",
140
- "strawberry-graphql[opentelemetry]==0.262.5", # need to pin version because we're monkey-patching
140
+ "strawberry-graphql[opentelemetry]==0.267.0", # avoid this issue: https://github.com/strawberry-graphql/strawberry/issues/3854
141
141
  "uvloop; platform_system != 'Windows'",
142
142
  "fast-hdbscan>=0.2.0",
143
143
  "numba>=0.60.0", # https://github.com/astral-sh/uv/issues/6281
@@ -0,0 +1 @@
1
+ DEFAULT_PROJECT_TRACE_RETENTION_POLICY_ID = 0
@@ -9,6 +9,7 @@ from typing import Optional
9
9
 
10
10
  from sqlalchemy import (
11
11
  distinct,
12
+ exists,
12
13
  insert,
13
14
  select,
14
15
  )
@@ -27,7 +28,13 @@ from phoenix.config import (
27
28
  get_env_default_admin_initial_password,
28
29
  )
29
30
  from phoenix.db import models
31
+ from phoenix.db.constants import DEFAULT_PROJECT_TRACE_RETENTION_POLICY_ID
30
32
  from phoenix.db.enums import COLUMN_ENUMS, UserRole
33
+ from phoenix.db.types.trace_retention import (
34
+ MaxDaysRule,
35
+ TraceRetentionCronExpression,
36
+ TraceRetentionRule,
37
+ )
31
38
  from phoenix.server.email.types import WelcomeEmailSender
32
39
  from phoenix.server.types import DbSessionFactory
33
40
 
@@ -57,6 +64,7 @@ class Facilitator:
57
64
  _ensure_user_roles,
58
65
  _get_system_user_id,
59
66
  partial(_ensure_admins, email_sender=self._email_sender),
67
+ _ensure_default_project_trace_retention_policy,
60
68
  ):
61
69
  await fn(self._db)
62
70
 
@@ -205,3 +213,50 @@ async def _ensure_admins(
205
213
  ):
206
214
  if isinstance(exc, Exception):
207
215
  logger.error(f"Failed to send welcome email: {exc}")
216
+
217
+
218
+ async def _ensure_default_project_trace_retention_policy(db: DbSessionFactory) -> None:
219
+ """
220
+ Ensures the default trace retention policy (id=1) exists in the database. Default policy
221
+ applies to all projects without a specific policy (i.e. foreign key is null).
222
+
223
+ This function checks for the presence of the default trace retention policy and
224
+ creates it if missing. The default trace retention policy:
225
+
226
+ - Has ID=0
227
+ - Is named "Default"
228
+ - Runs every Sunday at midnight UTC (cron: "0 0 * * 0")
229
+ - Retains traces indefinitely
230
+
231
+ If the default policy already exists, this function makes no changes.
232
+
233
+ Args:
234
+ db (DbSessionFactory): An async SQLAlchemy session factory.
235
+
236
+ Returns:
237
+ None
238
+ """
239
+ assert DEFAULT_PROJECT_TRACE_RETENTION_POLICY_ID == 0
240
+ async with db() as session:
241
+ if await session.scalar(
242
+ select(
243
+ exists().where(
244
+ models.ProjectTraceRetentionPolicy.id
245
+ == DEFAULT_PROJECT_TRACE_RETENTION_POLICY_ID
246
+ )
247
+ )
248
+ ):
249
+ return
250
+ cron_expression = TraceRetentionCronExpression(root="0 0 * * 0")
251
+ rule = TraceRetentionRule(root=MaxDaysRule(max_days=0))
252
+ await session.execute(
253
+ insert(models.ProjectTraceRetentionPolicy),
254
+ [
255
+ {
256
+ "id": DEFAULT_PROJECT_TRACE_RETENTION_POLICY_ID,
257
+ "name": "Default",
258
+ "cron_expression": cron_expression,
259
+ "rule": rule,
260
+ }
261
+ ],
262
+ )
@@ -24,9 +24,17 @@ _SpanRowId: TypeAlias = int
24
24
  _DocumentPosition: TypeAlias = int
25
25
  _AnnoRowId: TypeAlias = int
26
26
  _NumDocs: TypeAlias = int
27
+ _Identifier: TypeAlias = str
27
28
 
28
- _Key: TypeAlias = tuple[_Name, _SpanId, _DocumentPosition]
29
- _UniqueBy: TypeAlias = tuple[_Name, _SpanRowId, _DocumentPosition]
29
+
30
+ class _Key(NamedTuple):
31
+ annotation_name: _Name
32
+ annotation_identifier: _Identifier
33
+ span_id: _SpanId
34
+ document_position: _DocumentPosition
35
+
36
+
37
+ _UniqueBy: TypeAlias = tuple[_Name, _SpanRowId, _DocumentPosition, _Identifier]
30
38
  _Existing: TypeAlias = tuple[
31
39
  _SpanRowId,
32
40
  _SpanId,
@@ -34,6 +42,7 @@ _Existing: TypeAlias = tuple[
34
42
  Optional[_AnnoRowId],
35
43
  Optional[_Name],
36
44
  Optional[_DocumentPosition],
45
+ Optional[_Identifier],
37
46
  Optional[datetime],
38
47
  ]
39
48
 
@@ -46,7 +55,8 @@ class DocumentAnnotationQueueInserter(
46
55
  DocumentAnnotationDmlEvent,
47
56
  ],
48
57
  table=models.DocumentAnnotation,
49
- unique_by=("name", "span_rowid", "document_position"),
58
+ unique_by=("name", "span_rowid", "document_position", "identifier"),
59
+ constraint_name="uq_document_annotations_name_span_rowid_document_pos_identifier",
50
60
  ):
51
61
  async def _events(
52
62
  self,
@@ -77,12 +87,14 @@ class DocumentAnnotationQueueInserter(
77
87
  e.span_id: _SpanAttr(e.span_rowid, e.num_docs) for e in existing
78
88
  }
79
89
  existing_annos: Mapping[_Key, _AnnoAttr] = {
80
- (e.name, e.span_id, e.document_position): _AnnoAttr(e.span_rowid, e.id, e.updated_at)
90
+ _Key(
91
+ annotation_name=e.name,
92
+ annotation_identifier=e.identifier,
93
+ span_id=e.span_id,
94
+ document_position=e.document_position,
95
+ ): _AnnoAttr(e.span_rowid, e.id, e.updated_at)
81
96
  for e in existing
82
- if e.id is not None
83
- and e.name is not None
84
- and e.document_position is not None
85
- and e.updated_at is not None
97
+ if e.id is not None and e.name is not None and e.updated_at is not None
86
98
  }
87
99
 
88
100
  for p in parcels:
@@ -129,13 +141,13 @@ class DocumentAnnotationQueueInserter(
129
141
  anno = self.table
130
142
  span = (
131
143
  select(models.Span.id, models.Span.span_id, num_docs_col(self._db.dialect))
132
- .where(models.Span.span_id.in_({span_id for _, span_id, *_ in keys}))
144
+ .where(models.Span.span_id.in_({k.span_id for k in keys}))
133
145
  .cte()
134
146
  )
135
147
  onclause = and_(
136
148
  span.c.id == anno.span_rowid,
137
- anno.name.in_({name for name, *_ in keys}),
138
- tuple_(anno.name, span.c.span_id, anno.document_position).in_(keys),
149
+ anno.name.in_({k.annotation_name for k in keys}),
150
+ tuple_(anno.name, anno.identifier, span.c.span_id, anno.document_position).in_(keys),
139
151
  )
140
152
  return select(
141
153
  span.c.id.label("span_rowid"),
@@ -144,6 +156,7 @@ class DocumentAnnotationQueueInserter(
144
156
  anno.id,
145
157
  anno.name,
146
158
  anno.document_position,
159
+ anno.identifier,
147
160
  anno.updated_at,
148
161
  ).outerjoin_from(span, anno, onclause)
149
162
 
@@ -160,11 +173,16 @@ class _AnnoAttr(NamedTuple):
160
173
 
161
174
 
162
175
  def _key(p: Received[Precursors.DocumentAnnotation]) -> _Key:
163
- return p.item.obj.name, p.item.span_id, p.item.document_position
176
+ return _Key(
177
+ annotation_name=p.item.obj.name,
178
+ annotation_identifier=p.item.obj.identifier,
179
+ span_id=p.item.span_id,
180
+ document_position=p.item.document_position,
181
+ )
164
182
 
165
183
 
166
184
  def _unique_by(p: Received[Insertables.DocumentAnnotation]) -> _UniqueBy:
167
- return p.item.obj.name, p.item.span_rowid, p.item.document_position
185
+ return p.item.obj.name, p.item.span_rowid, p.item.document_position, p.item.identifier
168
186
 
169
187
 
170
188
  def _time(p: Received[Any]) -> datetime:
@@ -86,13 +86,15 @@ async def _insert_trace_evaluation(
86
86
  explanation=explanation,
87
87
  metadata_={}, # `metadata_` must match ORM
88
88
  annotator_kind="LLM",
89
+ identifier="",
90
+ source="API",
89
91
  )
90
92
  await session.execute(
91
93
  insert_on_conflict(
92
94
  values,
93
95
  dialect=dialect,
94
96
  table=models.TraceAnnotation,
95
- unique_by=("name", "trace_rowid"),
97
+ unique_by=("name", "trace_rowid", "identifier"),
96
98
  )
97
99
  )
98
100
  return TraceEvaluationInsertionEvent(project_rowid, evaluation_name)
@@ -128,13 +130,15 @@ async def _insert_span_evaluation(
128
130
  explanation=explanation,
129
131
  metadata_={}, # `metadata_` must match ORM
130
132
  annotator_kind="LLM",
133
+ identifier="",
134
+ source="API",
131
135
  )
132
136
  await session.execute(
133
137
  insert_on_conflict(
134
138
  values,
135
139
  dialect=dialect,
136
140
  table=models.SpanAnnotation,
137
- unique_by=("name", "span_rowid"),
141
+ unique_by=("name", "span_rowid", "identifier"),
138
142
  )
139
143
  )
140
144
  return SpanEvaluationInsertionEvent(project_rowid, evaluation_name)
@@ -179,13 +183,21 @@ async def _insert_document_evaluation(
179
183
  explanation=explanation,
180
184
  metadata_={}, # `metadata_` must match ORM
181
185
  annotator_kind="LLM",
186
+ identifier="",
187
+ source="API",
182
188
  )
183
189
  await session.execute(
184
190
  insert_on_conflict(
185
191
  values,
186
192
  dialect=dialect,
187
193
  table=models.DocumentAnnotation,
188
- unique_by=("name", "span_rowid", "document_position"),
194
+ unique_by=(
195
+ "name",
196
+ "span_rowid",
197
+ "document_position",
198
+ "identifier",
199
+ ),
200
+ constraint_name="uq_document_annotations_name_span_rowid_document_pos_identifier", # The name of the unique constraint is specified manually since the auto-generated name is longer than the Postgres limit of 63 characters # noqa: E501
189
201
  )
190
202
  )
191
203
  return DocumentEvaluationInsertionEvent(project_rowid, evaluation_name)
@@ -36,6 +36,7 @@ def insert_on_conflict(
36
36
  unique_by: Sequence[str],
37
37
  on_conflict: OnConflict = OnConflict.DO_UPDATE,
38
38
  set_: Optional[Mapping[str, Any]] = None,
39
+ constraint_name: Optional[str] = None,
39
40
  ) -> Insert:
40
41
  """
41
42
  Dialect specific insertion statement using ON CONFLICT DO syntax.
@@ -50,7 +51,7 @@ def insert_on_conflict(
50
51
  unique_records.append(v)
51
52
  seen.add(k)
52
53
  records = tuple(reversed(unique_records))
53
- constraint = "_".join(("uq", table.__tablename__, *unique_by))
54
+ constraint = constraint_name or "_".join(("uq", table.__tablename__, *unique_by))
54
55
  if dialect is SupportedSQLDialect.POSTGRESQL:
55
56
  stmt_postgresql = insert_postgresql(table).values(records)
56
57
  if on_conflict is OnConflict.DO_NOTHING:
@@ -21,15 +21,23 @@ from phoenix.server.dml_event import SpanAnnotationDmlEvent
21
21
  _Name: TypeAlias = str
22
22
  _SpanId: TypeAlias = str
23
23
  _SpanRowId: TypeAlias = int
24
+ _Identifier: TypeAlias = str
24
25
  _AnnoRowId: TypeAlias = int
25
26
 
26
- _Key: TypeAlias = tuple[_Name, _SpanId]
27
- _UniqueBy: TypeAlias = tuple[_Name, _SpanRowId]
27
+
28
+ class _Key(NamedTuple):
29
+ annotation_name: _Name
30
+ annotation_identifier: _Identifier
31
+ span_id: _SpanId
32
+
33
+
34
+ _UniqueBy: TypeAlias = tuple[_Name, _SpanRowId, _Identifier]
28
35
  _Existing: TypeAlias = tuple[
29
36
  _SpanRowId,
30
37
  _SpanId,
31
38
  Optional[_AnnoRowId],
32
39
  Optional[_Name],
40
+ Optional[_Identifier],
33
41
  Optional[datetime],
34
42
  ]
35
43
 
@@ -42,7 +50,7 @@ class SpanAnnotationQueueInserter(
42
50
  SpanAnnotationDmlEvent,
43
51
  ],
44
52
  table=models.SpanAnnotation,
45
- unique_by=("name", "span_rowid"),
53
+ unique_by=("name", "span_rowid", "identifier"),
46
54
  ):
47
55
  async def _events(
48
56
  self,
@@ -73,7 +81,11 @@ class SpanAnnotationQueueInserter(
73
81
  e.span_id: _SpanAttr(e.span_rowid) for e in existing
74
82
  }
75
83
  existing_annos: Mapping[_Key, _AnnoAttr] = {
76
- (e.name, e.span_id): _AnnoAttr(e.span_rowid, e.id, e.updated_at)
84
+ _Key(
85
+ annotation_name=e.name,
86
+ annotation_identifier=e.identifier,
87
+ span_id=e.span_id,
88
+ ): _AnnoAttr(e.span_rowid, e.id, e.updated_at)
77
89
  for e in existing
78
90
  if e.id is not None and e.name is not None and e.updated_at is not None
79
91
  }
@@ -119,19 +131,20 @@ class SpanAnnotationQueueInserter(
119
131
  anno = self.table
120
132
  span = (
121
133
  select(models.Span.id, models.Span.span_id)
122
- .where(models.Span.span_id.in_({span_id for _, span_id in keys}))
134
+ .where(models.Span.span_id.in_({k.span_id for k in keys}))
123
135
  .cte()
124
136
  )
125
137
  onclause = and_(
126
138
  span.c.id == anno.span_rowid,
127
- anno.name.in_({name for name, _ in keys}),
128
- tuple_(anno.name, span.c.span_id).in_(keys),
139
+ anno.name.in_({k.annotation_name for k in keys}),
140
+ tuple_(anno.name, anno.identifier, span.c.span_id).in_(keys),
129
141
  )
130
142
  return select(
131
143
  span.c.id.label("span_rowid"),
132
144
  span.c.span_id,
133
145
  anno.id,
134
146
  anno.name,
147
+ anno.identifier,
135
148
  anno.updated_at,
136
149
  ).outerjoin_from(span, anno, onclause)
137
150
 
@@ -147,11 +160,15 @@ class _AnnoAttr(NamedTuple):
147
160
 
148
161
 
149
162
  def _key(p: Received[Precursors.SpanAnnotation]) -> _Key:
150
- return p.item.obj.name, p.item.span_id
163
+ return _Key(
164
+ annotation_name=p.item.obj.name,
165
+ annotation_identifier=p.item.obj.identifier,
166
+ span_id=p.item.span_id,
167
+ )
151
168
 
152
169
 
153
170
  def _unique_by(p: Received[Insertables.SpanAnnotation]) -> _UniqueBy:
154
- return p.item.obj.name, p.item.span_rowid
171
+ return p.item.obj.name, p.item.span_rowid, p.item.identifier
155
172
 
156
173
 
157
174
  def _time(p: Received[Any]) -> datetime:
@@ -22,9 +22,16 @@ _Name: TypeAlias = str
22
22
  _TraceId: TypeAlias = str
23
23
  _TraceRowId: TypeAlias = int
24
24
  _AnnoRowId: TypeAlias = int
25
+ _Identifier: TypeAlias = str
25
26
 
26
- _Key: TypeAlias = tuple[_Name, _TraceId]
27
- _UniqueBy: TypeAlias = tuple[_Name, _TraceRowId]
27
+
28
+ class _Key(NamedTuple):
29
+ annotation_name: _Name
30
+ annotation_identifier: _Identifier
31
+ trace_id: _TraceId
32
+
33
+
34
+ _UniqueBy: TypeAlias = tuple[_Name, _TraceRowId, _Identifier]
28
35
  _Existing: TypeAlias = tuple[
29
36
  _TraceRowId,
30
37
  _TraceId,
@@ -42,7 +49,7 @@ class TraceAnnotationQueueInserter(
42
49
  TraceAnnotationDmlEvent,
43
50
  ],
44
51
  table=models.TraceAnnotation,
45
- unique_by=("name", "trace_rowid"),
52
+ unique_by=("name", "trace_rowid", "identifier"),
46
53
  ):
47
54
  async def _events(
48
55
  self,
@@ -73,7 +80,11 @@ class TraceAnnotationQueueInserter(
73
80
  e.trace_id: _TraceAttr(e.trace_rowid) for e in existing
74
81
  }
75
82
  existing_annos: Mapping[_Key, _AnnoAttr] = {
76
- (e.name, e.trace_id): _AnnoAttr(e.trace_rowid, e.id, e.updated_at)
83
+ _Key(
84
+ annotation_name=e.name,
85
+ annotation_identifier=e.identifier,
86
+ trace_id=e.trace_id,
87
+ ): _AnnoAttr(e.trace_rowid, e.id, e.updated_at)
77
88
  for e in existing
78
89
  if e.id is not None and e.name is not None and e.updated_at is not None
79
90
  }
@@ -119,19 +130,20 @@ class TraceAnnotationQueueInserter(
119
130
  anno = self.table
120
131
  trace = (
121
132
  select(models.Trace.id, models.Trace.trace_id)
122
- .where(models.Trace.trace_id.in_({trace_id for _, trace_id in keys}))
133
+ .where(models.Trace.trace_id.in_({k.trace_id for k in keys}))
123
134
  .cte()
124
135
  )
125
136
  onclause = and_(
126
137
  trace.c.id == anno.trace_rowid,
127
- anno.name.in_({name for name, _ in keys}),
128
- tuple_(anno.name, trace.c.trace_id).in_(keys),
138
+ anno.name.in_({k.annotation_name for k in keys}),
139
+ tuple_(anno.name, anno.identifier, trace.c.trace_id).in_(keys),
129
140
  )
130
141
  return select(
131
142
  trace.c.id.label("trace_rowid"),
132
143
  trace.c.trace_id,
133
144
  anno.id,
134
145
  anno.name,
146
+ anno.identifier,
135
147
  anno.updated_at,
136
148
  ).outerjoin_from(trace, anno, onclause)
137
149
 
@@ -147,11 +159,15 @@ class _AnnoAttr(NamedTuple):
147
159
 
148
160
 
149
161
  def _key(p: Received[Precursors.TraceAnnotation]) -> _Key:
150
- return p.item.obj.name, p.item.trace_id
162
+ return _Key(
163
+ annotation_name=p.item.obj.name,
164
+ annotation_identifier=p.item.obj.identifier,
165
+ trace_id=p.item.trace_id,
166
+ )
151
167
 
152
168
 
153
169
  def _unique_by(p: Received[Insertables.TraceAnnotation]) -> _UniqueBy:
154
- return p.item.obj.name, p.item.trace_rowid
170
+ return p.item.obj.name, p.item.trace_rowid, p.item.identifier
155
171
 
156
172
 
157
173
  def _time(p: Received[Any]) -> datetime:
@@ -50,14 +50,17 @@ class Postponed(Received[_AnyT]):
50
50
  class QueueInserter(ABC, Generic[_PrecursorT, _InsertableT, _RowT, _DmlEventT]):
51
51
  table: type[_RowT]
52
52
  unique_by: Sequence[str]
53
+ constraint_name: Optional[str] = None
53
54
 
54
55
  def __init_subclass__(
55
56
  cls,
56
57
  table: type[_RowT],
57
58
  unique_by: Sequence[str],
59
+ constraint_name: Optional[str] = None,
58
60
  ) -> None:
59
61
  cls.table = table
60
62
  cls.unique_by = unique_by
63
+ cls.constraint_name = constraint_name
61
64
 
62
65
  def __init__(
63
66
  self,
@@ -109,6 +112,7 @@ class QueueInserter(ABC, Generic[_PrecursorT, _InsertableT, _RowT, _DmlEventT]):
109
112
  *records,
110
113
  table=self.table,
111
114
  unique_by=self.unique_by,
115
+ constraint_name=self.constraint_name,
112
116
  dialect=self._db.dialect,
113
117
  )
114
118
 
@@ -219,6 +223,7 @@ class Insertables(ABC):
219
223
  @dataclass(frozen=True)
220
224
  class SpanAnnotation(Precursors.SpanAnnotation):
221
225
  span_rowid: int
226
+ identifier: str = ""
222
227
  id_: Optional[int] = None
223
228
 
224
229
  @property
@@ -232,6 +237,7 @@ class Insertables(ABC):
232
237
  @dataclass(frozen=True)
233
238
  class TraceAnnotation(Precursors.TraceAnnotation):
234
239
  trace_rowid: int
240
+ identifier: str = ""
235
241
  id_: Optional[int] = None
236
242
 
237
243
  @property
@@ -245,6 +251,7 @@ class Insertables(ABC):
245
251
  @dataclass(frozen=True)
246
252
  class DocumentAnnotation(Precursors.DocumentAnnotation):
247
253
  span_rowid: int
254
+ identifier: str = ""
248
255
  id_: Optional[int] = None
249
256
 
250
257
  @property