arize-phoenix 5.11.0__tar.gz → 6.0.0__tar.gz

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

Potentially problematic release.


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

Files changed (333) hide show
  1. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/PKG-INFO +1 -1
  2. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +2 -2
  3. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/helpers/dataset_helpers.py +77 -40
  4. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/helpers/playground_clients.py +40 -78
  5. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/helpers/playground_spans.py +2 -1
  6. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/mutations/chat_mutations.py +9 -4
  7. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/mutations/dataset_mutations.py +10 -30
  8. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/routers/v1/evaluations.py +1 -1
  9. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/subscriptions.py +52 -13
  10. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/Span.py +12 -49
  11. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/TemplateLanguage.py +1 -0
  12. arize_phoenix-6.0.0/src/phoenix/server/static/.vite/manifest.json +78 -0
  13. arize_phoenix-5.11.0/src/phoenix/server/static/assets/components-C_HASv83.js → arize_phoenix-6.0.0/src/phoenix/server/static/assets/components-Bo-xjXoV.js +144 -144
  14. arize_phoenix-6.0.0/src/phoenix/server/static/assets/index-i2KbnOZd.js +101 -0
  15. arize_phoenix-5.11.0/src/phoenix/server/static/assets/pages-DYHcAdjT.js → arize_phoenix-6.0.0/src/phoenix/server/static/assets/pages-BfYVoiUE.js +326 -299
  16. arize_phoenix-5.11.0/src/phoenix/server/static/assets/vendor-BCxsh5i3.js → arize_phoenix-6.0.0/src/phoenix/server/static/assets/vendor-UNccFYqq.js +2 -2
  17. arize_phoenix-5.11.0/src/phoenix/server/static/assets/vendor-arizeai-C2CDZgMz.js → arize_phoenix-6.0.0/src/phoenix/server/static/assets/vendor-arizeai-gSIqhzZY.js +9 -9
  18. arize_phoenix-5.11.0/src/phoenix/server/static/assets/vendor-codemirror-DYbtnCTn.js → arize_phoenix-6.0.0/src/phoenix/server/static/assets/vendor-codemirror-fSYjW3f-.js +1 -1
  19. arize_phoenix-5.11.0/src/phoenix/server/static/assets/vendor-recharts-P6W8G0Mb.js → arize_phoenix-6.0.0/src/phoenix/server/static/assets/vendor-recharts-CVVyA2X0.js +1 -1
  20. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/utilities/template_formatters.py +18 -0
  21. arize_phoenix-6.0.0/src/phoenix/version.py +1 -0
  22. arize_phoenix-5.11.0/src/phoenix/server/static/.vite/manifest.json +0 -78
  23. arize_phoenix-5.11.0/src/phoenix/server/static/assets/index-D7UiCRtr.js +0 -101
  24. arize_phoenix-5.11.0/src/phoenix/version.py +0 -1
  25. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/.gitignore +0 -0
  26. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/IP_NOTICE +0 -0
  27. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/LICENSE +0 -0
  28. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/README.md +0 -0
  29. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/pyproject.toml +0 -0
  30. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/__init__.py +0 -0
  31. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/auth.py +0 -0
  32. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/config.py +0 -0
  33. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/core/__init__.py +0 -0
  34. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/core/embedding_dimension.py +0 -0
  35. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/core/model.py +0 -0
  36. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/core/model_schema.py +0 -0
  37. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/core/model_schema_adapter.py +0 -0
  38. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/datetime_utils.py +0 -0
  39. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/README.md +0 -0
  40. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/__init__.py +0 -0
  41. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/alembic.ini +0 -0
  42. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/bulk_inserter.py +0 -0
  43. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/engines.py +0 -0
  44. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/enums.py +0 -0
  45. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/facilitator.py +0 -0
  46. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/helpers.py +0 -0
  47. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/insertion/__init__.py +0 -0
  48. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/insertion/constants.py +0 -0
  49. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/insertion/dataset.py +0 -0
  50. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
  51. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/insertion/evaluation.py +0 -0
  52. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/insertion/helpers.py +0 -0
  53. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/insertion/span.py +0 -0
  54. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
  55. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
  56. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/insertion/types.py +0 -0
  57. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/migrate.py +0 -0
  58. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/migrations/__init__.py +0 -0
  59. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/migrations/env.py +0 -0
  60. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/migrations/script.py.mako +0 -0
  61. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  62. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
  63. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
  64. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  65. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/db/models.py +0 -0
  66. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/exceptions.py +0 -0
  67. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/experiments/__init__.py +0 -0
  68. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  69. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/experiments/evaluators/base.py +0 -0
  70. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
  71. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
  72. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/experiments/functions.py +0 -0
  73. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/experiments/tracing.py +0 -0
  74. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/experiments/types.py +0 -0
  75. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/experiments/utils.py +0 -0
  76. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/inferences/__init__.py +0 -0
  77. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/inferences/errors.py +0 -0
  78. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/inferences/fixtures.py +0 -0
  79. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/inferences/inferences.py +0 -0
  80. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/inferences/schema.py +0 -0
  81. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/inferences/validation.py +0 -0
  82. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/logging/__init__.py +0 -0
  83. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/logging/_config.py +0 -0
  84. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/logging/_filter.py +0 -0
  85. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/logging/_formatter.py +0 -0
  86. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/metrics/README.md +0 -0
  87. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/metrics/__init__.py +0 -0
  88. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/metrics/binning.py +0 -0
  89. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/metrics/metrics.py +0 -0
  90. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/metrics/mixins.py +0 -0
  91. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  92. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/metrics/timeseries.py +0 -0
  93. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/metrics/wrappers.py +0 -0
  94. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/pointcloud/__init__.py +0 -0
  95. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/pointcloud/clustering.py +0 -0
  96. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
  97. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/pointcloud/projectors.py +0 -0
  98. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  99. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/py.typed +0 -0
  100. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/__init__.py +0 -0
  101. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/README.md +0 -0
  102. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/__init__.py +0 -0
  103. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/auth.py +0 -0
  104. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/context.py +0 -0
  105. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
  106. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
  107. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
  108. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  109. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
  110. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
  111. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
  112. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
  113. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
  114. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
  115. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
  116. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
  117. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
  118. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
  119. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
  120. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
  121. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
  122. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
  123. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
  124. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
  125. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
  126. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
  127. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
  128. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
  129. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/trace_row_ids.py +0 -0
  130. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/user_roles.py +0 -0
  131. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/dataloaders/users.py +0 -0
  132. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/exceptions.py +0 -0
  133. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
  134. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/helpers/playground_registry.py +0 -0
  135. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
  136. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
  137. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/ChatCompletionInput.py +0 -0
  138. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -0
  139. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  140. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  141. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  142. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  143. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
  144. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
  145. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  146. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  147. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  148. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  149. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
  150. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
  151. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  152. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
  153. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  154. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  155. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/GenerativeModelInput.py +0 -0
  156. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  157. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/InvocationParameters.py +0 -0
  158. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
  159. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
  160. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  161. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  162. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  163. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  164. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/TemplateOptions.py +0 -0
  165. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  166. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  167. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
  168. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
  169. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/interceptor.py +0 -0
  170. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
  171. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/mutations/api_key_mutations.py +0 -0
  172. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
  173. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
  174. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
  175. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
  176. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
  177. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
  178. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
  179. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/openapi/main.py +0 -0
  180. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/openapi/schema.py +0 -0
  181. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/queries.py +0 -0
  182. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/routers/__init__.py +0 -0
  183. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/routers/auth.py +0 -0
  184. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/routers/embeddings.py +0 -0
  185. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/routers/oauth2.py +0 -0
  186. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/routers/utils.py +0 -0
  187. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/routers/v1/__init__.py +0 -0
  188. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/routers/v1/datasets.py +0 -0
  189. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
  190. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
  191. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/routers/v1/experiments.py +0 -0
  192. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/routers/v1/pydantic_compat.py +0 -0
  193. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/routers/v1/spans.py +0 -0
  194. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/routers/v1/traces.py +0 -0
  195. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
  196. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/schema.py +0 -0
  197. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/Annotation.py +0 -0
  198. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
  199. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
  200. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
  201. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/AuthMethod.py +0 -0
  202. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
  203. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +0 -0
  204. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/Cluster.py +0 -0
  205. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  206. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  207. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/Dataset.py +0 -0
  208. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  209. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  210. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  211. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  212. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/Dimension.py +0 -0
  213. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  214. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  215. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
  216. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  217. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  218. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  219. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  220. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  221. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
  222. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  223. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/Event.py +0 -0
  224. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  225. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  226. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/Experiment.py +0 -0
  227. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  228. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
  229. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  230. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  231. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  232. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/Functionality.py +0 -0
  233. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
  234. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/GenerativeProvider.py +0 -0
  235. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/Inferences.py +0 -0
  236. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
  237. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  238. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/MimeType.py +0 -0
  239. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/Model.py +0 -0
  240. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
  241. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  242. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/Project.py +0 -0
  243. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  244. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
  245. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  246. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/Segments.py +0 -0
  247. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/SortDir.py +0 -0
  248. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
  249. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
  250. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  251. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/Trace.py +0 -0
  252. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
  253. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  254. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/User.py +0 -0
  255. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
  256. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/UserRole.py +0 -0
  257. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  258. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  259. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/__init__.py +0 -0
  260. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/node.py +0 -0
  261. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/types/pagination.py +0 -0
  262. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/api/utils.py +0 -0
  263. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/app.py +0 -0
  264. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/bearer_auth.py +0 -0
  265. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/dml_event.py +0 -0
  266. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/dml_event_handler.py +0 -0
  267. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/email/__init__.py +0 -0
  268. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/email/sender.py +0 -0
  269. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/email/templates/__init__.py +0 -0
  270. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/email/templates/password_reset.html +0 -0
  271. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/email/types.py +0 -0
  272. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/grpc_server.py +0 -0
  273. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/jwt_store.py +0 -0
  274. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/main.py +0 -0
  275. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/oauth2.py +0 -0
  276. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/openapi/__init__.py +0 -0
  277. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/prometheus.py +0 -0
  278. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/rate_limiters.py +0 -0
  279. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  280. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  281. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  282. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  283. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  284. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  285. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  286. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  287. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/static/assets/vendor-DxkFTwjz.css +0 -0
  288. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/static/assets/vendor-three-DwGkEfCM.js +0 -0
  289. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/static/favicon.ico +0 -0
  290. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/static/modernizr.js +0 -0
  291. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/telemetry.py +0 -0
  292. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/templates/__init__.py +0 -0
  293. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/templates/index.html +0 -0
  294. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/thread_server.py +0 -0
  295. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/server/types.py +0 -0
  296. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/services.py +0 -0
  297. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/session/__init__.py +0 -0
  298. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/session/client.py +0 -0
  299. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/session/data_extractor.py +0 -0
  300. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/session/evaluation.py +0 -0
  301. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/session/session.py +0 -0
  302. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/settings.py +0 -0
  303. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/__init__.py +0 -0
  304. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/attributes.py +0 -0
  305. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/dsl/README.md +0 -0
  306. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/dsl/__init__.py +0 -0
  307. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/dsl/filter.py +0 -0
  308. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/dsl/helpers.py +0 -0
  309. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/dsl/query.py +0 -0
  310. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/errors.py +0 -0
  311. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
  312. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/exporter.py +0 -0
  313. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/fixtures.py +0 -0
  314. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/otel.py +0 -0
  315. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/projects.py +0 -0
  316. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/schemas.py +0 -0
  317. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/span_evaluations.py +0 -0
  318. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/span_json_decoder.py +0 -0
  319. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/span_json_encoder.py +0 -0
  320. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/trace_dataset.py +0 -0
  321. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/utils.py +0 -0
  322. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/v1/__init__.py +0 -0
  323. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  324. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  325. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/utilities/__init__.py +0 -0
  326. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/utilities/client.py +0 -0
  327. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/utilities/deprecation.py +0 -0
  328. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/utilities/error_handling.py +0 -0
  329. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/utilities/json.py +0 -0
  330. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/utilities/logging.py +0 -0
  331. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/utilities/project.py +0 -0
  332. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/utilities/re.py +0 -0
  333. {arize_phoenix-5.11.0 → arize_phoenix-6.0.0}/src/phoenix/utilities/span_store.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arize-phoenix
3
- Version: 5.11.0
3
+ Version: 6.0.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
@@ -232,7 +232,7 @@ class RelevanceEvaluator(LLMEvaluator):
232
232
  "query. First, explain step-by-step why you think the text is or is not relevant. "
233
233
  "Then provide a single word label; 'true' if the text is relevant or 'false' if the text "
234
234
  "is not relevant. "
235
- "Here is an example template for your reponse:\n\n"
235
+ "Here is an example template for your response:\n\n"
236
236
  "CRITERIA: the response is 'relevant' to the query\n"
237
237
  "QUERY: *text that contains a query*\n"
238
238
  "RESPONSE: *a response that may or may not be relevant to the query*\n"
@@ -367,7 +367,7 @@ class LLMRelationalEvaluator(LLMEvaluator):
367
367
  "First, explain step-by-step why you think the response '{relation}' the reference. "
368
368
  "Then provide a single word label; 'true' if the response '{relation}' the reference or "
369
369
  "'false' if the text is not '{relation}' to the reference. "
370
- "Here is an example template for your reponse:\n\n"
370
+ "Here is an example template for your response:\n\n"
371
371
  "CRITERIA: the response '{relation}' the reference\n"
372
372
  "REFERENCE: *text that contains a reference*\n"
373
373
  "RESPONSE: *a response that may or may not be '{relation}' to the reference*\n"
@@ -1,54 +1,43 @@
1
1
  import json
2
2
  from collections.abc import Mapping
3
- from typing import Any, Literal, Optional, Protocol
3
+ from typing import Any, Literal, Optional
4
4
 
5
5
  from openinference.semconv.trace import (
6
6
  MessageAttributes,
7
7
  OpenInferenceMimeTypeValues,
8
8
  OpenInferenceSpanKindValues,
9
+ SpanAttributes,
9
10
  ToolCallAttributes,
10
11
  )
11
12
 
13
+ from phoenix.db.models import Span
12
14
  from phoenix.trace.attributes import get_attribute_value
13
15
 
14
16
 
15
- class HasSpanIO(Protocol):
16
- """
17
- An interface that contains the information needed to extract dataset example
18
- input and output values from a span.
19
- """
20
-
21
- span_kind: Optional[str]
22
- input_value: Any
23
- input_mime_type: Optional[str]
24
- output_value: Any
25
- output_mime_type: Optional[str]
26
- llm_prompt_template_variables: Any
27
- llm_input_messages: Any
28
- llm_output_messages: Any
29
- retrieval_documents: Any
30
-
31
-
32
- def get_dataset_example_input(span: HasSpanIO) -> dict[str, Any]:
17
+ def get_dataset_example_input(span: Span) -> dict[str, Any]:
33
18
  """
34
19
  Extracts the input value from a span and returns it as a dictionary. Input
35
20
  values from LLM spans are extracted from the input messages and prompt
36
21
  template variables (if present). For other span kinds, the input is
37
22
  extracted from the input value and input mime type attributes.
38
23
  """
39
- input_value = span.input_value
40
- input_mime_type = span.input_mime_type
41
- if span.span_kind == OpenInferenceSpanKindValues.LLM.value:
24
+ span_kind = span.span_kind
25
+ attributes = span.attributes
26
+ input_value = get_attribute_value(attributes, INPUT_VALUE)
27
+ input_mime_type = get_attribute_value(attributes, INPUT_MIME_TYPE)
28
+ prompt_template_variables = get_attribute_value(attributes, LLM_PROMPT_TEMPLATE_VARIABLES)
29
+ input_messages = get_attribute_value(attributes, LLM_INPUT_MESSAGES)
30
+ if span_kind == LLM:
42
31
  return _get_llm_span_input(
43
- input_messages=span.llm_input_messages,
32
+ input_messages=input_messages,
44
33
  input_value=input_value,
45
34
  input_mime_type=input_mime_type,
46
- prompt_template_variables=span.llm_prompt_template_variables,
35
+ prompt_template_variables=prompt_template_variables,
47
36
  )
48
37
  return _get_generic_io_value(io_value=input_value, mime_type=input_mime_type, kind="input")
49
38
 
50
39
 
51
- def get_dataset_example_output(span: HasSpanIO) -> dict[str, Any]:
40
+ def get_dataset_example_output(span: Span) -> dict[str, Any]:
52
41
  """
53
42
  Extracts the output value from a span and returns it as a dictionary. Output
54
43
  values from LLM spans are extracted from the output messages (if present).
@@ -56,18 +45,21 @@ def get_dataset_example_output(span: HasSpanIO) -> dict[str, Any]:
56
45
  present). For other span kinds, the output is extracted from the output
57
46
  value and output mime type attributes.
58
47
  """
59
-
60
- output_value = span.output_value
61
- output_mime_type = span.output_mime_type
62
- if (span_kind := span.span_kind) == OpenInferenceSpanKindValues.LLM.value:
48
+ span_kind = span.span_kind
49
+ attributes = span.attributes
50
+ output_value = get_attribute_value(attributes, OUTPUT_VALUE)
51
+ output_mime_type = get_attribute_value(attributes, OUTPUT_MIME_TYPE)
52
+ output_messages = get_attribute_value(attributes, LLM_OUTPUT_MESSAGES)
53
+ retrieval_documents = get_attribute_value(attributes, RETRIEVAL_DOCUMENTS)
54
+ if span_kind == LLM:
63
55
  return _get_llm_span_output(
64
- output_messages=span.llm_output_messages,
56
+ output_messages=output_messages,
65
57
  output_value=output_value,
66
58
  output_mime_type=output_mime_type,
67
59
  )
68
60
  if span_kind == OpenInferenceSpanKindValues.RETRIEVER.value:
69
61
  return _get_retriever_span_output(
70
- retrieval_documents=span.retrieval_documents,
62
+ retrieval_documents=retrieval_documents,
71
63
  output_value=output_value,
72
64
  output_mime_type=output_mime_type,
73
65
  )
@@ -90,8 +82,8 @@ def _get_llm_span_input(
90
82
  input["messages"] = messages
91
83
  if not input:
92
84
  input = _get_generic_io_value(io_value=input_value, mime_type=input_mime_type, kind="input")
93
- if prompt_template_variables:
94
- input = {**input, "prompt_template_variables": prompt_template_variables}
85
+ if prompt_template_variables_data := _safely_json_decode(prompt_template_variables):
86
+ input["prompt_template_variables"] = prompt_template_variables_data
95
87
  return input
96
88
 
97
89
 
@@ -118,7 +110,7 @@ def _get_retriever_span_output(
118
110
  Extracts the output value from a retriever span and returns it as a dictionary.
119
111
  The output is extracted from the retrieval documents (if present).
120
112
  """
121
- if retrieval_documents is not None:
113
+ if (retrieval_documents := _parse_retrieval_documents(retrieval_documents)) is not None:
122
114
  return {"documents": retrieval_documents}
123
115
  return _get_generic_io_value(io_value=output_value, mime_type=output_mime_type, kind="output")
124
116
 
@@ -130,12 +122,14 @@ def _get_generic_io_value(
130
122
  Makes a best-effort attempt to extract the input or output value from a span
131
123
  and returns it as a dictionary.
132
124
  """
133
- if mime_type == OpenInferenceMimeTypeValues.JSON.value:
134
- parsed_value = json.loads(io_value)
135
- if isinstance(parsed_value, dict):
136
- return parsed_value
125
+ if (
126
+ mime_type == OpenInferenceMimeTypeValues.JSON.value
127
+ and (io_value_data := _safely_json_decode(io_value)) is not None
128
+ ):
129
+ if isinstance(io_value_data, dict):
130
+ return io_value_data
137
131
  else:
138
- return {kind: parsed_value}
132
+ return {kind: io_value_data}
139
133
  if isinstance(io_value, str):
140
134
  return {kind: io_value}
141
135
  return {}
@@ -169,6 +163,35 @@ def _get_message(message: Mapping[str, Any]) -> dict[str, Any]:
169
163
  }
170
164
 
171
165
 
166
+ def _parse_retrieval_documents(retrieval_documents: Any) -> Optional[list[dict[str, Any]]]:
167
+ """
168
+ Safely un-nests a list of retrieval documents.
169
+
170
+ Example: [{"document": {"content": "..."}}] -> [{"content": "..."}]
171
+ """
172
+ if not isinstance(retrieval_documents, list):
173
+ return None
174
+ docs = []
175
+ for retrieval_doc in retrieval_documents:
176
+ if not isinstance(retrieval_doc, dict) or not (doc := retrieval_doc.get("document")):
177
+ return None
178
+ docs.append(doc)
179
+ return docs
180
+
181
+
182
+ def _safely_json_decode(value: Any) -> Any:
183
+ """
184
+ Safely decodes a JSON-encoded value.
185
+ """
186
+ if not isinstance(value, str):
187
+ return None
188
+ try:
189
+ return json.loads(value)
190
+ except json.JSONDecodeError:
191
+ return None
192
+
193
+
194
+ # MessageAttributes
172
195
  MESSAGE_CONTENT = MessageAttributes.MESSAGE_CONTENT
173
196
  MESSAGE_FUNCTION_CALL_ARGUMENTS_JSON = MessageAttributes.MESSAGE_FUNCTION_CALL_ARGUMENTS_JSON
174
197
  MESSAGE_FUNCTION_CALL_NAME = MessageAttributes.MESSAGE_FUNCTION_CALL_NAME
@@ -176,5 +199,19 @@ MESSAGE_NAME = MessageAttributes.MESSAGE_NAME
176
199
  MESSAGE_ROLE = MessageAttributes.MESSAGE_ROLE
177
200
  MESSAGE_TOOL_CALLS = MessageAttributes.MESSAGE_TOOL_CALLS
178
201
 
179
- TOOL_CALL_FUNCTION_NAME = ToolCallAttributes.TOOL_CALL_FUNCTION_NAME
202
+ # OpenInferenceSpanKindValues
203
+ LLM = OpenInferenceSpanKindValues.LLM.value
204
+
205
+ # SpanAttributes
206
+ INPUT_MIME_TYPE = SpanAttributes.INPUT_MIME_TYPE
207
+ INPUT_VALUE = SpanAttributes.INPUT_VALUE
208
+ LLM_INPUT_MESSAGES = SpanAttributes.LLM_INPUT_MESSAGES
209
+ LLM_OUTPUT_MESSAGES = SpanAttributes.LLM_OUTPUT_MESSAGES
210
+ LLM_PROMPT_TEMPLATE_VARIABLES = SpanAttributes.LLM_PROMPT_TEMPLATE_VARIABLES
211
+ OUTPUT_MIME_TYPE = SpanAttributes.OUTPUT_MIME_TYPE
212
+ OUTPUT_VALUE = SpanAttributes.OUTPUT_VALUE
213
+ RETRIEVAL_DOCUMENTS = SpanAttributes.RETRIEVAL_DOCUMENTS
214
+
215
+ # ToolCallAttributes
180
216
  TOOL_CALL_FUNCTION_ARGUMENTS_JSON = ToolCallAttributes.TOOL_CALL_FUNCTION_ARGUMENTS_JSON
217
+ TOOL_CALL_FUNCTION_NAME = ToolCallAttributes.TOOL_CALL_FUNCTION_NAME
@@ -131,8 +131,8 @@ class PlaygroundRateLimiter(RateLimiter, KeyedSingleton):
131
131
  await self._throttler.async_wait_until_ready()
132
132
  request_start_time = time.time()
133
133
  maybe_coroutine = fn(*args, **kwargs)
134
- if inspect.iscoroutine(maybe_coroutine):
135
- return await maybe_coroutine # type: ignore
134
+ if inspect.isawaitable(maybe_coroutine):
135
+ return await maybe_coroutine # type: ignore[no-any-return]
136
136
  else:
137
137
  return maybe_coroutine
138
138
  except self._rate_limit_error:
@@ -144,10 +144,11 @@ class PlaygroundRateLimiter(RateLimiter, KeyedSingleton):
144
144
  try:
145
145
  request_start_time = time.time()
146
146
  await self._throttler.async_wait_until_ready()
147
- if inspect.iscoroutinefunction(fn):
148
- return await fn(*args, **kwargs) # type: ignore
147
+ maybe_coroutine = fn(*args, **kwargs)
148
+ if inspect.isawaitable(maybe_coroutine):
149
+ return await maybe_coroutine # type: ignore[no-any-return]
149
150
  else:
150
- return fn(*args, **kwargs)
151
+ return maybe_coroutine
151
152
  except self._rate_limit_error:
152
153
  self._throttler.on_rate_limit_error(
153
154
  request_start_time, verbose=self._verbose
@@ -283,7 +284,7 @@ class OpenAIStreamingClient(PlaygroundStreamingClient):
283
284
  invocation_name="temperature",
284
285
  canonical_name=CanonicalParameterName.TEMPERATURE,
285
286
  label="Temperature",
286
- default_value=0.0,
287
+ default_value=1.0,
287
288
  min_value=0.0,
288
289
  max_value=2.0,
289
290
  ),
@@ -295,12 +296,14 @@ class OpenAIStreamingClient(PlaygroundStreamingClient):
295
296
  BoundedFloatInvocationParameter(
296
297
  invocation_name="frequency_penalty",
297
298
  label="Frequency Penalty",
299
+ default_value=0.0,
298
300
  min_value=-2.0,
299
301
  max_value=2.0,
300
302
  ),
301
303
  BoundedFloatInvocationParameter(
302
304
  invocation_name="presence_penalty",
303
305
  label="Presence Penalty",
306
+ default_value=0.0,
304
307
  min_value=-2.0,
305
308
  max_value=2.0,
306
309
  ),
@@ -313,6 +316,7 @@ class OpenAIStreamingClient(PlaygroundStreamingClient):
313
316
  invocation_name="top_p",
314
317
  canonical_name=CanonicalParameterName.TOP_P,
315
318
  label="Top P",
319
+ default_value=1.0,
316
320
  min_value=0.0,
317
321
  max_value=1.0,
318
322
  ),
@@ -345,7 +349,11 @@ class OpenAIStreamingClient(PlaygroundStreamingClient):
345
349
  from openai.types.chat import ChatCompletionStreamOptionsParam
346
350
 
347
351
  # Convert standard messages to OpenAI messages
348
- openai_messages = [self.to_openai_chat_completion_param(*message) for message in messages]
352
+ openai_messages = []
353
+ for message in messages:
354
+ openai_message = self.to_openai_chat_completion_param(*message)
355
+ if openai_message is not None:
356
+ openai_messages.append(openai_message)
349
357
  tool_call_ids: dict[int, str] = {}
350
358
  token_usage: Optional["CompletionUsage"] = None
351
359
  throttled_create = self.rate_limiter._alimit(self.client.chat.completions.create)
@@ -395,7 +403,7 @@ class OpenAIStreamingClient(PlaygroundStreamingClient):
395
403
  content: JSONScalarType,
396
404
  tool_call_id: Optional[str] = None,
397
405
  tool_calls: Optional[list[JSONScalarType]] = None,
398
- ) -> "ChatCompletionMessageParam":
406
+ ) -> Optional["ChatCompletionMessageParam"]:
399
407
  from openai.types.chat import (
400
408
  ChatCompletionAssistantMessageParam,
401
409
  ChatCompletionSystemMessageParam,
@@ -495,65 +503,7 @@ class OpenAIO1StreamingClient(OpenAIStreamingClient):
495
503
  ),
496
504
  ]
497
505
 
498
- async def chat_completion_create(
499
- self,
500
- messages: list[
501
- tuple[ChatCompletionMessageRole, str, Optional[str], Optional[list[JSONScalarType]]]
502
- ],
503
- tools: list[JSONScalarType],
504
- **invocation_parameters: Any,
505
- ) -> AsyncIterator[ChatCompletionChunk]:
506
- from openai import NOT_GIVEN
507
-
508
- # Convert standard messages to OpenAI messages
509
- unfiltered_openai_messages = [
510
- self.to_openai_o1_chat_completion_param(*message) for message in messages
511
- ]
512
-
513
- # filter out unsupported messages
514
- openai_messages: list[ChatCompletionMessageParam] = [
515
- message for message in unfiltered_openai_messages if message is not None
516
- ]
517
-
518
- tool_call_ids: dict[int, str] = {}
519
-
520
- throttled_create = self.rate_limiter._alimit(self.client.chat.completions.create)
521
- response = await throttled_create(
522
- messages=openai_messages,
523
- model=self.model_name,
524
- tools=tools or NOT_GIVEN,
525
- **invocation_parameters,
526
- )
527
-
528
- choice = response.choices[0]
529
- message = choice.message
530
- content = message.content
531
-
532
- text_chunk = TextChunk(content=content)
533
- yield text_chunk
534
-
535
- if (tool_calls := message.tool_calls) is not None:
536
- for tool_call_index, tool_call in enumerate(tool_calls):
537
- tool_call_id = (
538
- tool_call.id
539
- if tool_call.id is not None
540
- else tool_call_ids.get(tool_call_index, f"tool_call_{tool_call_index}")
541
- )
542
- tool_call_ids[tool_call_index] = tool_call_id
543
- if (function := tool_call.function) is not None:
544
- tool_call_chunk = ToolCallChunk(
545
- id=tool_call_id,
546
- function=FunctionCallChunk(
547
- name=function.name or "",
548
- arguments=function.arguments or "",
549
- ),
550
- )
551
- yield tool_call_chunk
552
-
553
- if (usage := response.usage) is not None:
554
- self._attributes.update(dict(self._llm_token_counts(usage)))
555
-
556
- def to_openai_o1_chat_completion_param(
506
+ def to_openai_chat_completion_param(
557
507
  self,
558
508
  role: ChatCompletionMessageRole,
559
509
  content: JSONScalarType,
@@ -625,6 +575,8 @@ class AzureOpenAIStreamingClient(OpenAIStreamingClient):
625
575
  super().__init__(model=model, api_key=api_key)
626
576
  self._attributes[LLM_PROVIDER] = OpenInferenceLLMProviderValues.AZURE.value
627
577
  self._attributes[LLM_SYSTEM] = OpenInferenceLLMSystemValues.OPENAI.value
578
+ if not (api_key := api_key or os.environ.get("AZURE_OPENAI_API_KEY")):
579
+ raise BadRequest("An Azure API key is required for Azure OpenAI models")
628
580
  if not (endpoint := model.endpoint or os.environ.get("AZURE_OPENAI_ENDPOINT")):
629
581
  raise BadRequest("An Azure endpoint is required for Azure OpenAI models")
630
582
  if not (api_version := model.api_version or os.environ.get("OPENAI_API_VERSION")):
@@ -640,8 +592,12 @@ class AzureOpenAIStreamingClient(OpenAIStreamingClient):
640
592
  provider_key=GenerativeProviderKey.ANTHROPIC,
641
593
  model_names=[
642
594
  PROVIDER_DEFAULT,
595
+ "claude-3-5-sonnet-latest",
596
+ "claude-3-5-haiku-latest",
597
+ "claude-3-5-sonnet-20241022",
598
+ "claude-3-5-haiku-20241022",
643
599
  "claude-3-5-sonnet-20240620",
644
- "claude-3-opus-20240229",
600
+ "claude-3-opus-latest",
645
601
  "claude-3-sonnet-20240229",
646
602
  "claude-3-haiku-20240307",
647
603
  ],
@@ -674,12 +630,14 @@ class AnthropicStreamingClient(PlaygroundStreamingClient):
674
630
  invocation_name="max_tokens",
675
631
  canonical_name=CanonicalParameterName.MAX_COMPLETION_TOKENS,
676
632
  label="Max Tokens",
633
+ default_value=1024,
677
634
  required=True,
678
635
  ),
679
636
  BoundedFloatInvocationParameter(
680
637
  invocation_name="temperature",
681
638
  canonical_name=CanonicalParameterName.TEMPERATURE,
682
639
  label="Temperature",
640
+ default_value=1.0,
683
641
  min_value=0.0,
684
642
  max_value=1.0,
685
643
  ),
@@ -692,6 +650,7 @@ class AnthropicStreamingClient(PlaygroundStreamingClient):
692
650
  invocation_name="top_p",
693
651
  canonical_name=CanonicalParameterName.TOP_P,
694
652
  label="Top P",
653
+ default_value=1.0,
695
654
  min_value=0.0,
696
655
  max_value=1.0,
697
656
  ),
@@ -850,7 +809,7 @@ class GeminiStreamingClient(PlaygroundStreamingClient):
850
809
  invocation_name="temperature",
851
810
  canonical_name=CanonicalParameterName.TEMPERATURE,
852
811
  label="Temperature",
853
- default_value=0.0,
812
+ default_value=1.0,
854
813
  min_value=0.0,
855
814
  max_value=2.0,
856
815
  ),
@@ -860,35 +819,31 @@ class GeminiStreamingClient(PlaygroundStreamingClient):
860
819
  label="Max Output Tokens",
861
820
  ),
862
821
  StringListInvocationParameter(
863
- invocation_name="stop",
822
+ invocation_name="stop_sequences",
864
823
  canonical_name=CanonicalParameterName.STOP_SEQUENCES,
865
824
  label="Stop Sequences",
866
825
  ),
867
826
  FloatInvocationParameter(
868
827
  invocation_name="presence_penalty",
869
828
  label="Presence Penalty",
829
+ default_value=0.0,
870
830
  ),
871
831
  FloatInvocationParameter(
872
832
  invocation_name="frequency_penalty",
873
833
  label="Frequency Penalty",
834
+ default_value=0.0,
874
835
  ),
875
836
  BoundedFloatInvocationParameter(
876
837
  invocation_name="top_p",
877
838
  canonical_name=CanonicalParameterName.TOP_P,
878
839
  label="Top P",
840
+ default_value=1.0,
879
841
  min_value=0.0,
880
842
  max_value=1.0,
881
843
  ),
882
- BoundedFloatInvocationParameter(
844
+ IntInvocationParameter(
883
845
  invocation_name="top_k",
884
846
  label="Top K",
885
- min_value=0.0,
886
- max_value=1.0,
887
- ),
888
- IntInvocationParameter(
889
- invocation_name="seed",
890
- canonical_name=CanonicalParameterName.RANDOM_SEED,
891
- label="Seed",
892
847
  ),
893
848
  ]
894
849
 
@@ -923,6 +878,13 @@ class GeminiStreamingClient(PlaygroundStreamingClient):
923
878
  chat = client.start_chat(history=gemini_message_history)
924
879
  stream = await chat.send_message_async(**gemini_params)
925
880
  async for event in stream:
881
+ self._attributes.update(
882
+ {
883
+ LLM_TOKEN_COUNT_PROMPT: event.usage_metadata.prompt_token_count,
884
+ LLM_TOKEN_COUNT_COMPLETION: event.usage_metadata.candidates_token_count,
885
+ LLM_TOKEN_COUNT_TOTAL: event.usage_metadata.total_token_count,
886
+ }
887
+ )
926
888
  yield TextChunk(content=event.text)
927
889
 
928
890
  def _build_gemini_messages(
@@ -31,6 +31,7 @@ from typing_extensions import Self, TypeAlias, assert_never
31
31
 
32
32
  from phoenix.datetime_utils import local_now, normalize_datetime
33
33
  from phoenix.db import models
34
+ from phoenix.server.api.helpers.dataset_helpers import get_dataset_example_output
34
35
  from phoenix.server.api.input_types.ChatCompletionInput import (
35
36
  ChatCompletionInput,
36
37
  ChatCompletionOverDatasetInput,
@@ -220,7 +221,7 @@ def get_db_experiment_run(
220
221
  dataset_example_id=example_id,
221
222
  trace_id=db_trace.trace_id,
222
223
  output=models.ExperimentRunOutput(
223
- task_output=get_attribute_value(db_span.attributes, LLM_OUTPUT_MESSAGES),
224
+ task_output=get_dataset_example_output(db_span),
224
225
  ),
225
226
  repetition_number=1,
226
227
  start_time=db_span.start_time,
@@ -25,8 +25,10 @@ from typing_extensions import assert_never
25
25
  from phoenix.datetime_utils import local_now, normalize_datetime
26
26
  from phoenix.db import models
27
27
  from phoenix.db.helpers import get_dataset_example_revisions
28
+ from phoenix.server.api.auth import IsNotReadOnly
28
29
  from phoenix.server.api.context import Context
29
30
  from phoenix.server.api.exceptions import BadRequest, CustomGraphQLError, NotFound
31
+ from phoenix.server.api.helpers.dataset_helpers import get_dataset_example_output
30
32
  from phoenix.server.api.helpers.playground_clients import (
31
33
  PlaygroundStreamingClient,
32
34
  initialize_playground_clients,
@@ -61,12 +63,13 @@ from phoenix.server.api.types.node import from_global_id_with_expected_type
61
63
  from phoenix.server.api.types.Span import Span, to_gql_span
62
64
  from phoenix.server.api.types.TemplateLanguage import TemplateLanguage
63
65
  from phoenix.server.dml_event import SpanInsertEvent
64
- from phoenix.trace.attributes import get_attribute_value, unflatten
66
+ from phoenix.trace.attributes import unflatten
65
67
  from phoenix.trace.schemas import SpanException
66
68
  from phoenix.utilities.json import jsonify
67
69
  from phoenix.utilities.template_formatters import (
68
70
  FStringTemplateFormatter,
69
71
  MustacheTemplateFormatter,
72
+ NoOpFormatter,
70
73
  TemplateFormatter,
71
74
  )
72
75
 
@@ -117,7 +120,7 @@ class ChatCompletionOverDatasetMutationPayload:
117
120
 
118
121
  @strawberry.type
119
122
  class ChatCompletionMutationMixin:
120
- @strawberry.mutation
123
+ @strawberry.mutation(permission_classes=[IsNotReadOnly]) # type: ignore
121
124
  @classmethod
122
125
  async def chat_completion_over_dataset(
123
126
  cls,
@@ -242,7 +245,7 @@ class ChatCompletionMutationMixin:
242
245
  dataset_example_id=revision.dataset_example_id,
243
246
  trace_id=str(result.span.context.trace_id),
244
247
  output=models.ExperimentRunOutput(
245
- task_output=get_attribute_value(db_span.attributes, LLM_OUTPUT_MESSAGES),
248
+ task_output=get_dataset_example_output(db_span),
246
249
  ),
247
250
  prompt_token_count=db_span.cumulative_llm_token_count_prompt,
248
251
  completion_token_count=db_span.cumulative_llm_token_count_completion,
@@ -272,7 +275,7 @@ class ChatCompletionMutationMixin:
272
275
  payload.examples.append(example_payload)
273
276
  return payload
274
277
 
275
- @strawberry.mutation
278
+ @strawberry.mutation(permission_classes=[IsNotReadOnly]) # type: ignore
276
279
  @classmethod
277
280
  async def chat_completion(
278
281
  cls, info: Info[Context, None], input: ChatCompletionInput
@@ -481,6 +484,8 @@ def _template_formatter(template_language: TemplateLanguage) -> TemplateFormatte
481
484
  return MustacheTemplateFormatter()
482
485
  if template_language is TemplateLanguage.F_STRING:
483
486
  return FStringTemplateFormatter()
487
+ if template_language is TemplateLanguage.NONE:
488
+ return NoOpFormatter()
484
489
  assert_never(template_language)
485
490
 
486
491
 
@@ -136,23 +136,7 @@ class DatasetMutationMixin:
136
136
  .returning(models.DatasetVersion.id)
137
137
  )
138
138
  spans = (
139
- await session.execute(
140
- select(
141
- models.Span.id,
142
- models.Span.span_kind,
143
- models.Span.attributes,
144
- _span_attribute(INPUT_MIME_TYPE),
145
- _span_attribute(INPUT_VALUE),
146
- _span_attribute(OUTPUT_MIME_TYPE),
147
- _span_attribute(OUTPUT_VALUE),
148
- _span_attribute(LLM_PROMPT_TEMPLATE_VARIABLES),
149
- _span_attribute(LLM_INPUT_MESSAGES),
150
- _span_attribute(LLM_OUTPUT_MESSAGES),
151
- _span_attribute(RETRIEVAL_DOCUMENTS),
152
- )
153
- .select_from(models.Span)
154
- .where(models.Span.id.in_(span_rowids))
155
- )
139
+ await session.scalars(select(models.Span).where(models.Span.id.in_(span_rowids)))
156
140
  ).all()
157
141
  if missing_span_rowids := span_rowids - {span.id for span in spans}:
158
142
  raise ValueError(
@@ -160,18 +144,10 @@ class DatasetMutationMixin:
160
144
  ) # todo: implement error handling types https://github.com/Arize-ai/phoenix/issues/3221
161
145
 
162
146
  span_annotations = (
163
- await session.execute(
164
- select(
165
- models.SpanAnnotation.span_rowid,
166
- models.SpanAnnotation.name,
167
- models.SpanAnnotation.label,
168
- models.SpanAnnotation.score,
169
- models.SpanAnnotation.explanation,
170
- models.SpanAnnotation.metadata_,
171
- models.SpanAnnotation.annotator_kind,
147
+ await session.scalars(
148
+ select(models.SpanAnnotation).where(
149
+ models.SpanAnnotation.span_rowid.in_(span_rowids)
172
150
  )
173
- .select_from(models.SpanAnnotation)
174
- .where(models.SpanAnnotation.span_rowid.in_(span_rowids))
175
151
  )
176
152
  ).all()
177
153
 
@@ -214,8 +190,12 @@ class DatasetMutationMixin:
214
190
  DatasetExampleRevision.input.key: get_dataset_example_input(span),
215
191
  DatasetExampleRevision.output.key: get_dataset_example_output(span),
216
192
  DatasetExampleRevision.metadata_.key: {
217
- **span.attributes,
218
- "annotations": span_annotations_by_span[span.id],
193
+ "span_kind": span.span_kind,
194
+ **(
195
+ {"annotations": annotations}
196
+ if (annotations := span_annotations_by_span[span.id])
197
+ else {}
198
+ ),
219
199
  },
220
200
  DatasetExampleRevision.revision_kind.key: "CREATE",
221
201
  }
@@ -40,7 +40,7 @@ from .utils import add_errors_to_responses
40
40
 
41
41
  EvaluationName: TypeAlias = str
42
42
 
43
- router = APIRouter(tags=["traces"], include_in_schema=False)
43
+ router = APIRouter(tags=["traces"], include_in_schema=True)
44
44
 
45
45
 
46
46
  @router.post(