arize-phoenix 5.9.0__tar.gz → 5.10.0__tar.gz

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

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.9.0 → arize_phoenix-5.10.0}/PKG-INFO +1 -1
  2. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/config.py +16 -2
  3. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/helpers/playground_clients.py +44 -6
  4. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/helpers/playground_spans.py +34 -8
  5. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/routers/oauth2.py +55 -23
  6. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/subscriptions.py +1 -1
  7. arize_phoenix-5.10.0/src/phoenix/server/api/types/GenerativeProvider.py +85 -0
  8. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/Span.py +4 -5
  9. arize_phoenix-5.10.0/src/phoenix/server/static/.vite/manifest.json +78 -0
  10. arize_phoenix-5.9.0/src/phoenix/server/static/assets/components-DU-8CYbi.js → arize_phoenix-5.10.0/src/phoenix/server/static/assets/components-BXIz9ZO8.js +124 -124
  11. arize_phoenix-5.9.0/src/phoenix/server/static/assets/index-D9E16vvV.js → arize_phoenix-5.10.0/src/phoenix/server/static/assets/index-DTut7g1y.js +2 -2
  12. arize_phoenix-5.9.0/src/phoenix/server/static/assets/pages-t09OI1rC.js → arize_phoenix-5.10.0/src/phoenix/server/static/assets/pages-B8FpJuXu.js +291 -263
  13. arize_phoenix-5.9.0/src/phoenix/server/static/assets/vendor-D04tenE6.js → arize_phoenix-5.10.0/src/phoenix/server/static/assets/vendor-BX8_Znqy.js +146 -146
  14. arize_phoenix-5.9.0/src/phoenix/server/static/assets/vendor-arizeai-D3NxMQw0.js → arize_phoenix-5.10.0/src/phoenix/server/static/assets/vendor-arizeai-CtHir-Ua.js +1 -1
  15. arize_phoenix-5.9.0/src/phoenix/server/static/assets/vendor-codemirror-XTiZSlqq.js → arize_phoenix-5.10.0/src/phoenix/server/static/assets/vendor-codemirror-DLlGiguX.js +2 -2
  16. arize_phoenix-5.9.0/src/phoenix/server/static/assets/vendor-recharts-p0L0neVs.js → arize_phoenix-5.10.0/src/phoenix/server/static/assets/vendor-recharts-CJRple0d.js +1 -1
  17. arize_phoenix-5.10.0/src/phoenix/version.py +1 -0
  18. arize_phoenix-5.9.0/src/phoenix/server/api/types/GenerativeProvider.py +0 -41
  19. arize_phoenix-5.9.0/src/phoenix/server/static/.vite/manifest.json +0 -78
  20. arize_phoenix-5.9.0/src/phoenix/version.py +0 -1
  21. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/.gitignore +0 -0
  22. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/IP_NOTICE +0 -0
  23. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/LICENSE +0 -0
  24. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/README.md +0 -0
  25. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/pyproject.toml +0 -0
  26. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/__init__.py +0 -0
  27. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/auth.py +0 -0
  28. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/core/__init__.py +0 -0
  29. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/core/embedding_dimension.py +0 -0
  30. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/core/model.py +0 -0
  31. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/core/model_schema.py +0 -0
  32. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/core/model_schema_adapter.py +0 -0
  33. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/datetime_utils.py +0 -0
  34. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/README.md +0 -0
  35. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/__init__.py +0 -0
  36. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/alembic.ini +0 -0
  37. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/bulk_inserter.py +0 -0
  38. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/engines.py +0 -0
  39. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/enums.py +0 -0
  40. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/facilitator.py +0 -0
  41. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/helpers.py +0 -0
  42. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/insertion/__init__.py +0 -0
  43. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/insertion/constants.py +0 -0
  44. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/insertion/dataset.py +0 -0
  45. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
  46. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/insertion/evaluation.py +0 -0
  47. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/insertion/helpers.py +0 -0
  48. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/insertion/span.py +0 -0
  49. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
  50. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
  51. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/insertion/types.py +0 -0
  52. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/migrate.py +0 -0
  53. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/migrations/__init__.py +0 -0
  54. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/migrations/env.py +0 -0
  55. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/migrations/script.py.mako +0 -0
  56. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  57. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
  58. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
  59. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  60. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/db/models.py +0 -0
  61. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/exceptions.py +0 -0
  62. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/experiments/__init__.py +0 -0
  63. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  64. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/experiments/evaluators/base.py +0 -0
  65. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
  66. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
  67. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
  68. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/experiments/functions.py +0 -0
  69. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/experiments/tracing.py +0 -0
  70. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/experiments/types.py +0 -0
  71. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/experiments/utils.py +0 -0
  72. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/inferences/__init__.py +0 -0
  73. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/inferences/errors.py +0 -0
  74. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/inferences/fixtures.py +0 -0
  75. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/inferences/inferences.py +0 -0
  76. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/inferences/schema.py +0 -0
  77. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/inferences/validation.py +0 -0
  78. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/logging/__init__.py +0 -0
  79. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/logging/_config.py +0 -0
  80. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/logging/_filter.py +0 -0
  81. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/logging/_formatter.py +0 -0
  82. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/metrics/README.md +0 -0
  83. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/metrics/__init__.py +0 -0
  84. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/metrics/binning.py +0 -0
  85. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/metrics/metrics.py +0 -0
  86. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/metrics/mixins.py +0 -0
  87. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  88. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/metrics/timeseries.py +0 -0
  89. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/metrics/wrappers.py +0 -0
  90. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/pointcloud/__init__.py +0 -0
  91. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/pointcloud/clustering.py +0 -0
  92. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
  93. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/pointcloud/projectors.py +0 -0
  94. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  95. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/py.typed +0 -0
  96. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/__init__.py +0 -0
  97. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/README.md +0 -0
  98. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/__init__.py +0 -0
  99. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/auth.py +0 -0
  100. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/context.py +0 -0
  101. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
  102. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
  103. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
  104. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  105. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
  106. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
  107. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
  108. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
  109. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
  110. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
  111. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
  112. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
  113. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
  114. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
  115. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
  116. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
  117. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
  118. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
  119. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
  120. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
  121. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
  122. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
  123. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
  124. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
  125. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/trace_row_ids.py +0 -0
  126. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/user_roles.py +0 -0
  127. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/dataloaders/users.py +0 -0
  128. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/exceptions.py +0 -0
  129. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
  130. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
  131. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/helpers/playground_registry.py +0 -0
  132. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
  133. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
  134. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/ChatCompletionInput.py +0 -0
  135. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -0
  136. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  137. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  138. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  139. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  140. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
  141. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
  142. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  143. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  144. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  145. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  146. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
  147. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
  148. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  149. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
  150. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  151. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  152. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/GenerativeModelInput.py +0 -0
  153. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  154. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/InvocationParameters.py +0 -0
  155. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
  156. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
  157. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  158. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  159. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  160. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  161. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/TemplateOptions.py +0 -0
  162. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  163. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  164. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
  165. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
  166. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/interceptor.py +0 -0
  167. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
  168. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/mutations/api_key_mutations.py +0 -0
  169. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/mutations/chat_mutations.py +0 -0
  170. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
  171. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
  172. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
  173. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
  174. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
  175. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
  176. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
  177. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
  178. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/openapi/main.py +0 -0
  179. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/openapi/schema.py +0 -0
  180. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/queries.py +0 -0
  181. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/routers/__init__.py +0 -0
  182. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/routers/auth.py +0 -0
  183. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/routers/embeddings.py +0 -0
  184. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/routers/utils.py +0 -0
  185. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/routers/v1/__init__.py +0 -0
  186. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/routers/v1/datasets.py +0 -0
  187. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/routers/v1/evaluations.py +0 -0
  188. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
  189. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
  190. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/routers/v1/experiments.py +0 -0
  191. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/routers/v1/pydantic_compat.py +0 -0
  192. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/routers/v1/spans.py +0 -0
  193. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/routers/v1/traces.py +0 -0
  194. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
  195. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/schema.py +0 -0
  196. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/Annotation.py +0 -0
  197. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
  198. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
  199. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
  200. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/AuthMethod.py +0 -0
  201. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
  202. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +0 -0
  203. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/Cluster.py +0 -0
  204. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  205. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  206. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/Dataset.py +0 -0
  207. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  208. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  209. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  210. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  211. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/Dimension.py +0 -0
  212. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  213. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  214. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
  215. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  216. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  217. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  218. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  219. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  220. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
  221. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  222. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/Event.py +0 -0
  223. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  224. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  225. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/Experiment.py +0 -0
  226. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  227. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
  228. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  229. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  230. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  231. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/Functionality.py +0 -0
  232. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
  233. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/Inferences.py +0 -0
  234. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
  235. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  236. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/MimeType.py +0 -0
  237. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/Model.py +0 -0
  238. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
  239. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  240. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/Project.py +0 -0
  241. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  242. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
  243. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  244. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/Segments.py +0 -0
  245. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/SortDir.py +0 -0
  246. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
  247. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
  248. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/TemplateLanguage.py +0 -0
  249. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  250. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/Trace.py +0 -0
  251. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
  252. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  253. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/User.py +0 -0
  254. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
  255. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/UserRole.py +0 -0
  256. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  257. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  258. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/__init__.py +0 -0
  259. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/node.py +0 -0
  260. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/types/pagination.py +0 -0
  261. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/api/utils.py +0 -0
  262. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/app.py +0 -0
  263. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/bearer_auth.py +0 -0
  264. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/dml_event.py +0 -0
  265. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/dml_event_handler.py +0 -0
  266. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/email/__init__.py +0 -0
  267. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/email/sender.py +0 -0
  268. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/email/templates/__init__.py +0 -0
  269. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/email/templates/password_reset.html +0 -0
  270. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/email/types.py +0 -0
  271. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/grpc_server.py +0 -0
  272. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/jwt_store.py +0 -0
  273. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/main.py +0 -0
  274. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/oauth2.py +0 -0
  275. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/openapi/__init__.py +0 -0
  276. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/prometheus.py +0 -0
  277. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/rate_limiters.py +0 -0
  278. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  279. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  280. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  281. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  282. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  283. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  284. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  285. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  286. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/static/assets/vendor-DxkFTwjz.css +0 -0
  287. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/static/assets/vendor-three-DwGkEfCM.js +0 -0
  288. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/static/favicon.ico +0 -0
  289. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/static/modernizr.js +0 -0
  290. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/telemetry.py +0 -0
  291. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/templates/__init__.py +0 -0
  292. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/templates/index.html +0 -0
  293. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/thread_server.py +0 -0
  294. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/server/types.py +0 -0
  295. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/services.py +0 -0
  296. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/session/__init__.py +0 -0
  297. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/session/client.py +0 -0
  298. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/session/data_extractor.py +0 -0
  299. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/session/evaluation.py +0 -0
  300. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/session/session.py +0 -0
  301. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/settings.py +0 -0
  302. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/__init__.py +0 -0
  303. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/attributes.py +0 -0
  304. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/dsl/README.md +0 -0
  305. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/dsl/__init__.py +0 -0
  306. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/dsl/filter.py +0 -0
  307. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/dsl/helpers.py +0 -0
  308. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/dsl/query.py +0 -0
  309. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/errors.py +0 -0
  310. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
  311. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/exporter.py +0 -0
  312. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/fixtures.py +0 -0
  313. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/otel.py +0 -0
  314. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/projects.py +0 -0
  315. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/schemas.py +0 -0
  316. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/span_evaluations.py +0 -0
  317. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/span_json_decoder.py +0 -0
  318. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/span_json_encoder.py +0 -0
  319. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/trace_dataset.py +0 -0
  320. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/utils.py +0 -0
  321. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/v1/__init__.py +0 -0
  322. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  323. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  324. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/utilities/__init__.py +0 -0
  325. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/utilities/client.py +0 -0
  326. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/utilities/deprecation.py +0 -0
  327. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/utilities/error_handling.py +0 -0
  328. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/utilities/json.py +0 -0
  329. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/utilities/logging.py +0 -0
  330. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/utilities/project.py +0 -0
  331. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/utilities/re.py +0 -0
  332. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/utilities/span_store.py +0 -0
  333. {arize_phoenix-5.9.0 → arize_phoenix-5.10.0}/src/phoenix/utilities/template_formatters.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arize-phoenix
3
- Version: 5.9.0
3
+ Version: 5.10.0
4
4
  Summary: AI Observability and Evaluation
5
5
  Project-URL: Documentation, https://docs.arize.com/phoenix/
6
6
  Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
@@ -424,7 +424,9 @@ class OAuth2ClientConfig:
424
424
  f"An OpenID Connect configuration URL must be set for the {idp_name} OAuth2 IDP "
425
425
  f"via the {oidc_config_url_env_var} environment variable"
426
426
  )
427
- if urlparse(oidc_config_url).scheme != "https":
427
+ parsed_oidc_config_url = urlparse(oidc_config_url)
428
+ is_local_oidc_config_url = parsed_oidc_config_url.hostname in ("localhost", "127.0.0.1")
429
+ if parsed_oidc_config_url.scheme != "https" and not is_local_oidc_config_url:
428
430
  raise ValueError(
429
431
  f"Server metadata URL for {idp_name} OAuth2 IDP "
430
432
  "must be a valid URL using the https protocol"
@@ -559,7 +561,19 @@ def get_env_host() -> str:
559
561
 
560
562
 
561
563
  def get_env_host_root_path() -> str:
562
- return os.getenv(ENV_PHOENIX_HOST_ROOT_PATH) or HOST_ROOT_PATH
564
+ if (host_root_path := os.getenv(ENV_PHOENIX_HOST_ROOT_PATH)) is None:
565
+ return HOST_ROOT_PATH
566
+ if not host_root_path.startswith("/"):
567
+ raise ValueError(
568
+ f"Invalid value for environment variable {ENV_PHOENIX_HOST_ROOT_PATH}: "
569
+ f"{host_root_path}. Value must start with '/'"
570
+ )
571
+ if host_root_path.endswith("/"):
572
+ raise ValueError(
573
+ f"Invalid value for environment variable {ENV_PHOENIX_HOST_ROOT_PATH}: "
574
+ f"{host_root_path}. Value cannot end with '/'"
575
+ )
576
+ return host_root_path
563
577
 
564
578
 
565
579
  def get_env_collector_endpoint() -> Optional[str]:
@@ -9,7 +9,11 @@ from functools import wraps
9
9
  from typing import TYPE_CHECKING, Any, Hashable, Mapping, Optional, Union
10
10
 
11
11
  from openinference.instrumentation import safe_json_dumps
12
- from openinference.semconv.trace import SpanAttributes
12
+ from openinference.semconv.trace import (
13
+ OpenInferenceLLMProviderValues,
14
+ OpenInferenceLLMSystemValues,
15
+ SpanAttributes,
16
+ )
13
17
  from strawberry import UNSET
14
18
  from strawberry.scalars import JSON as JSONScalarType
15
19
  from typing_extensions import TypeAlias, assert_never
@@ -44,7 +48,7 @@ from phoenix.server.api.types.ChatCompletionSubscriptionPayload import (
44
48
  from phoenix.server.api.types.GenerativeProvider import GenerativeProviderKey
45
49
 
46
50
  if TYPE_CHECKING:
47
- from anthropic.types import MessageParam
51
+ from anthropic.types import MessageParam, TextBlockParam, ToolResultBlockParam
48
52
  from google.generativeai.types import ContentType
49
53
  from openai.types import CompletionUsage
50
54
  from openai.types.chat import ChatCompletionMessageParam, ChatCompletionMessageToolCallParam
@@ -255,6 +259,8 @@ class OpenAIStreamingClient(PlaygroundStreamingClient):
255
259
  from openai import RateLimitError as OpenAIRateLimitError
256
260
 
257
261
  super().__init__(model=model, api_key=api_key)
262
+ self._attributes[LLM_PROVIDER] = OpenInferenceLLMProviderValues.OPENAI.value
263
+ self._attributes[LLM_SYSTEM] = OpenInferenceLLMSystemValues.OPENAI.value
258
264
  self.client = AsyncOpenAI(api_key=api_key)
259
265
  self.model_name = model.name
260
266
  self.rate_limiter = PlaygroundRateLimiter(model.provider_key, OpenAIRateLimitError)
@@ -610,6 +616,8 @@ class AzureOpenAIStreamingClient(OpenAIStreamingClient):
610
616
  from openai import AsyncAzureOpenAI
611
617
 
612
618
  super().__init__(model=model, api_key=api_key)
619
+ self._attributes[LLM_PROVIDER] = OpenInferenceLLMProviderValues.AZURE.value
620
+ self._attributes[LLM_SYSTEM] = OpenInferenceLLMSystemValues.OPENAI.value
613
621
  if model.endpoint is None or model.api_version is None:
614
622
  raise ValueError("endpoint and api_version are required for Azure OpenAI models")
615
623
  self.client = AsyncAzureOpenAI(
@@ -638,6 +646,8 @@ class AnthropicStreamingClient(PlaygroundStreamingClient):
638
646
  import anthropic
639
647
 
640
648
  super().__init__(model=model, api_key=api_key)
649
+ self._attributes[LLM_PROVIDER] = OpenInferenceLLMProviderValues.ANTHROPIC.value
650
+ self._attributes[LLM_SYSTEM] = OpenInferenceLLMSystemValues.ANTHROPIC.value
641
651
  self.client = anthropic.AsyncAnthropic(api_key=api_key)
642
652
  self.model_name = model.name
643
653
  self.rate_limiter = PlaygroundRateLimiter(model.provider_key, anthropic.RateLimitError)
@@ -693,7 +703,6 @@ class AnthropicStreamingClient(PlaygroundStreamingClient):
693
703
  import anthropic.types as anthropic_types
694
704
 
695
705
  anthropic_messages, system_prompt = self._build_anthropic_messages(messages)
696
-
697
706
  anthropic_params = {
698
707
  "messages": anthropic_messages,
699
708
  "model": self.model_name,
@@ -751,19 +760,44 @@ class AnthropicStreamingClient(PlaygroundStreamingClient):
751
760
  anthropic_messages: list["MessageParam"] = []
752
761
  system_prompt = ""
753
762
  for role, content, _tool_call_id, _tool_calls in messages:
763
+ tool_aware_content = self._anthropic_message_content(content, _tool_calls)
754
764
  if role == ChatCompletionMessageRole.USER:
755
- anthropic_messages.append({"role": "user", "content": content})
765
+ anthropic_messages.append({"role": "user", "content": tool_aware_content})
756
766
  elif role == ChatCompletionMessageRole.AI:
757
- anthropic_messages.append({"role": "assistant", "content": content})
767
+ anthropic_messages.append({"role": "assistant", "content": tool_aware_content})
758
768
  elif role == ChatCompletionMessageRole.SYSTEM:
759
769
  system_prompt += content + "\n"
760
770
  elif role == ChatCompletionMessageRole.TOOL:
761
- raise NotImplementedError
771
+ anthropic_messages.append(
772
+ {
773
+ "role": "user",
774
+ "content": [
775
+ {
776
+ "type": "tool_result",
777
+ "tool_use_id": _tool_call_id or "",
778
+ "content": content or "",
779
+ }
780
+ ],
781
+ }
782
+ )
762
783
  else:
763
784
  assert_never(role)
764
785
 
765
786
  return anthropic_messages, system_prompt
766
787
 
788
+ def _anthropic_message_content(
789
+ self, content: str, tool_calls: Optional[list[JSONScalarType]]
790
+ ) -> Union[str, list[Union["ToolResultBlockParam", "TextBlockParam"]]]:
791
+ if tool_calls:
792
+ # Anthropic combines tool calls and the reasoning text into a single message object
793
+ tool_use_content: list[Union["ToolResultBlockParam", "TextBlockParam"]] = []
794
+ if content:
795
+ tool_use_content.append({"type": "text", "text": content})
796
+ tool_use_content.extend(tool_calls)
797
+ return tool_use_content
798
+
799
+ return content
800
+
767
801
 
768
802
  @register_llm_client(
769
803
  provider_key=GenerativeProviderKey.GEMINI,
@@ -784,6 +818,8 @@ class GeminiStreamingClient(PlaygroundStreamingClient):
784
818
  import google.generativeai as google_genai
785
819
 
786
820
  super().__init__(model=model, api_key=api_key)
821
+ self._attributes[LLM_PROVIDER] = OpenInferenceLLMProviderValues.GOOGLE.value
822
+ self._attributes[LLM_SYSTEM] = OpenInferenceLLMSystemValues.VERTEXAI.value
787
823
  google_genai.configure(api_key=api_key)
788
824
  self.model_name = model.name
789
825
 
@@ -905,6 +941,8 @@ def initialize_playground_clients() -> None:
905
941
  pass
906
942
 
907
943
 
944
+ LLM_PROVIDER = SpanAttributes.LLM_PROVIDER
945
+ LLM_SYSTEM = SpanAttributes.LLM_SYSTEM
908
946
  LLM_TOKEN_COUNT_PROMPT = SpanAttributes.LLM_TOKEN_COUNT_PROMPT
909
947
  LLM_TOKEN_COUNT_COMPLETION = SpanAttributes.LLM_TOKEN_COUNT_COMPLETION
910
948
  LLM_TOKEN_COUNT_TOTAL = SpanAttributes.LLM_TOKEN_COUNT_TOTAL
@@ -330,20 +330,45 @@ def llm_input_messages(
330
330
  tuple[ChatCompletionMessageRole, str, Optional[str], Optional[list[JSONScalarType]]]
331
331
  ],
332
332
  ) -> Iterator[tuple[str, Any]]:
333
- for i, (role, content, _tool_call_id, tool_calls) in enumerate(messages):
333
+ for i, (role, content, tool_call_id, tool_calls) in enumerate(messages):
334
334
  yield f"{LLM_INPUT_MESSAGES}.{i}.{MESSAGE_ROLE}", role.value.lower()
335
335
  yield f"{LLM_INPUT_MESSAGES}.{i}.{MESSAGE_CONTENT}", content
336
+ if role == ChatCompletionMessageRole.TOOL and tool_call_id:
337
+ # Anthropic tool result spans
338
+ yield f"{LLM_INPUT_MESSAGES}.{i}.{MESSAGE_TOOL_CALL_ID}", tool_call_id
339
+
336
340
  if tool_calls is not None:
337
341
  for tool_call_index, tool_call in enumerate(tool_calls):
338
- yield (
339
- f"{LLM_INPUT_MESSAGES}.{i}.{MESSAGE_TOOL_CALLS}.{tool_call_index}.{TOOL_CALL_FUNCTION_NAME}",
340
- tool_call["function"]["name"],
341
- )
342
- if arguments := tool_call["function"]["arguments"]:
342
+ if tool_call.get("type") == "tool_use":
343
+ # Anthropic tool call spans
344
+ yield (
345
+ f"{LLM_INPUT_MESSAGES}.{i}.{MESSAGE_TOOL_CALLS}.{tool_call_index}.{TOOL_CALL_FUNCTION_NAME}",
346
+ tool_call["name"],
347
+ )
343
348
  yield (
344
349
  f"{LLM_INPUT_MESSAGES}.{i}.{MESSAGE_TOOL_CALLS}.{tool_call_index}.{TOOL_CALL_FUNCTION_ARGUMENTS_JSON}",
345
- safe_json_dumps(jsonify(arguments)),
350
+ safe_json_dumps(jsonify(tool_call["input"])),
346
351
  )
352
+ yield (
353
+ f"{LLM_INPUT_MESSAGES}.{i}.{MESSAGE_TOOL_CALLS}.{tool_call_index}.{TOOL_CALL_ID}",
354
+ tool_call["id"],
355
+ )
356
+ elif tool_call_function := tool_call.get("function"):
357
+ # OpenAI tool call spans
358
+ yield (
359
+ f"{LLM_INPUT_MESSAGES}.{i}.{MESSAGE_TOOL_CALLS}.{tool_call_index}.{TOOL_CALL_FUNCTION_NAME}",
360
+ tool_call_function["name"],
361
+ )
362
+ if arguments := tool_call_function["arguments"]:
363
+ yield (
364
+ f"{LLM_INPUT_MESSAGES}.{i}.{MESSAGE_TOOL_CALLS}.{tool_call_index}.{TOOL_CALL_FUNCTION_ARGUMENTS_JSON}",
365
+ safe_json_dumps(jsonify(arguments)),
366
+ )
367
+ if tool_call_id := tool_call.get("id"):
368
+ yield (
369
+ f"{LLM_INPUT_MESSAGES}.{i}.{MESSAGE_TOOL_CALLS}.{tool_call_index}.{TOOL_CALL_ID}",
370
+ tool_call_id,
371
+ )
347
372
 
348
373
 
349
374
  def _llm_output_messages(
@@ -418,5 +443,6 @@ MESSAGE_TOOL_CALLS = MessageAttributes.MESSAGE_TOOL_CALLS
418
443
 
419
444
  TOOL_CALL_FUNCTION_NAME = ToolCallAttributes.TOOL_CALL_FUNCTION_NAME
420
445
  TOOL_CALL_FUNCTION_ARGUMENTS_JSON = ToolCallAttributes.TOOL_CALL_FUNCTION_ARGUMENTS_JSON
421
-
446
+ TOOL_CALL_ID = ToolCallAttributes.TOOL_CALL_ID
447
+ MESSAGE_TOOL_CALL_ID = MessageAttributes.MESSAGE_TOOL_CALL_ID
422
448
  TOOL_JSON_SCHEMA = ToolAttributes.TOOL_JSON_SCHEMA
@@ -14,7 +14,7 @@ from sqlalchemy import Boolean, and_, case, cast, func, insert, or_, select, upd
14
14
  from sqlalchemy.ext.asyncio import AsyncSession
15
15
  from sqlalchemy.orm import joinedload
16
16
  from sqlean.dbapi2 import IntegrityError # type: ignore[import-untyped]
17
- from starlette.datastructures import URL
17
+ from starlette.datastructures import URL, URLPath
18
18
  from starlette.responses import RedirectResponse
19
19
  from starlette.routing import Router
20
20
  from starlette.status import HTTP_302_FOUND
@@ -86,8 +86,16 @@ async def login(
86
86
  if not isinstance(
87
87
  oauth2_client := request.app.state.oauth2_clients.get_client(idp_name), OAuth2Client
88
88
  ):
89
- return _redirect_to_login(error=f"Unknown IDP: {idp_name}.")
90
- origin_url = _get_origin_url(request)
89
+ return _redirect_to_login(request=request, error=f"Unknown IDP: {idp_name}.")
90
+ if (referer := request.headers.get("referer")) is not None:
91
+ # if the referer header is present, use it as the origin URL
92
+ parsed_url = urlparse(referer)
93
+ origin_url = _append_root_path_if_exists(
94
+ request=request, base_url=f"{parsed_url.scheme}://{parsed_url.netloc}"
95
+ )
96
+ else:
97
+ # fall back to the base url as the origin URL
98
+ origin_url = str(request.base_url)
91
99
  authorization_url_data = await oauth2_client.create_authorization_url(
92
100
  redirect_uri=_get_create_tokens_endpoint(
93
101
  request=request, origin_url=origin_url, idp_name=idp_name
@@ -124,22 +132,22 @@ async def create_tokens(
124
132
  ) -> RedirectResponse:
125
133
  secret = request.app.state.get_secret()
126
134
  if state != stored_state:
127
- return _redirect_to_login(error=_INVALID_OAUTH2_STATE_MESSAGE)
135
+ return _redirect_to_login(request=request, error=_INVALID_OAUTH2_STATE_MESSAGE)
128
136
  try:
129
137
  payload = _parse_state_payload(secret=secret, state=state)
130
138
  except JoseError:
131
- return _redirect_to_login(error=_INVALID_OAUTH2_STATE_MESSAGE)
139
+ return _redirect_to_login(request=request, error=_INVALID_OAUTH2_STATE_MESSAGE)
132
140
  if (return_url := payload.get("return_url")) is not None and not _is_relative_url(
133
141
  unquote(return_url)
134
142
  ):
135
- return _redirect_to_login(error="Attempting login with unsafe return URL.")
143
+ return _redirect_to_login(request=request, error="Attempting login with unsafe return URL.")
136
144
  assert isinstance(access_token_expiry := request.app.state.access_token_expiry, timedelta)
137
145
  assert isinstance(refresh_token_expiry := request.app.state.refresh_token_expiry, timedelta)
138
146
  token_store: TokenStore = request.app.state.get_token_store()
139
147
  if not isinstance(
140
148
  oauth2_client := request.app.state.oauth2_clients.get_client(idp_name), OAuth2Client
141
149
  ):
142
- return _redirect_to_login(error=f"Unknown IDP: {idp_name}.")
150
+ return _redirect_to_login(request=request, error=f"Unknown IDP: {idp_name}.")
143
151
  try:
144
152
  token_data = await oauth2_client.fetch_access_token(
145
153
  state=state,
@@ -149,11 +157,12 @@ async def create_tokens(
149
157
  ),
150
158
  )
151
159
  except OAuthError as error:
152
- return _redirect_to_login(error=str(error))
160
+ return _redirect_to_login(request=request, error=str(error))
153
161
  _validate_token_data(token_data)
154
162
  if "id_token" not in token_data:
155
163
  return _redirect_to_login(
156
- error=f"OAuth2 IDP {idp_name} does not appear to support OpenID Connect."
164
+ request=request,
165
+ error=f"OAuth2 IDP {idp_name} does not appear to support OpenID Connect.",
157
166
  )
158
167
  user_info = await oauth2_client.parse_id_token(token_data, nonce=stored_nonce)
159
168
  user_info = _parse_user_info(user_info)
@@ -165,14 +174,18 @@ async def create_tokens(
165
174
  user_info=user_info,
166
175
  )
167
176
  except EmailAlreadyInUse as error:
168
- return _redirect_to_login(error=str(error))
177
+ return _redirect_to_login(request=request, error=str(error))
169
178
  access_token, refresh_token = await create_access_and_refresh_tokens(
170
179
  user=user,
171
180
  token_store=token_store,
172
181
  access_token_expiry=access_token_expiry,
173
182
  refresh_token_expiry=refresh_token_expiry,
174
183
  )
175
- response = RedirectResponse(url=return_url or "/", status_code=HTTP_302_FOUND)
184
+ redirect_path = _prepend_root_path_if_exists(request=request, path=return_url or "/")
185
+ response = RedirectResponse(
186
+ url=redirect_path,
187
+ status_code=HTTP_302_FOUND,
188
+ )
176
189
  response = set_access_token_cookie(
177
190
  response=response, access_token=access_token, max_age=access_token_expiry
178
191
  )
@@ -352,17 +365,46 @@ class EmailAlreadyInUse(Exception):
352
365
  pass
353
366
 
354
367
 
355
- def _redirect_to_login(*, error: str) -> RedirectResponse:
368
+ def _redirect_to_login(*, request: Request, error: str) -> RedirectResponse:
356
369
  """
357
370
  Creates a RedirectResponse to the login page to display an error message.
358
371
  """
359
- url = URL("/login").include_query_params(error=error)
372
+ login_path = _prepend_root_path_if_exists(request=request, path="/login")
373
+ url = URL(login_path).include_query_params(error=error)
360
374
  response = RedirectResponse(url=url)
361
375
  response = delete_oauth2_state_cookie(response)
362
376
  response = delete_oauth2_nonce_cookie(response)
363
377
  return response
364
378
 
365
379
 
380
+ def _prepend_root_path_if_exists(*, request: Request, path: str) -> str:
381
+ """
382
+ If a root path is configured, prepends it to the input path.
383
+ """
384
+ if not path.startswith("/"):
385
+ raise ValueError("path must start with a forward slash")
386
+ root_path = _get_root_path(request=request)
387
+ if root_path.endswith("/"):
388
+ root_path = root_path.rstrip("/")
389
+ return root_path + path
390
+
391
+
392
+ def _append_root_path_if_exists(*, request: Request, base_url: str) -> str:
393
+ """
394
+ If a root path is configured, appends it to the input base url.
395
+ """
396
+ if not (root_path := _get_root_path(request=request)):
397
+ return base_url
398
+ return str(URLPath(root_path).make_absolute_url(base_url=base_url))
399
+
400
+
401
+ def _get_root_path(*, request: Request) -> str:
402
+ """
403
+ Gets the root path from the request.
404
+ """
405
+ return str(request.scope.get("root_path", ""))
406
+
407
+
366
408
  def _get_create_tokens_endpoint(*, request: Request, origin_url: str, idp_name: str) -> str:
367
409
  """
368
410
  Gets the endpoint for create tokens route.
@@ -427,16 +469,6 @@ def _with_random_suffix(string: str) -> str:
427
469
  return f"{string}-{randrange(10_000, 100_000)}"
428
470
 
429
471
 
430
- def _get_origin_url(request: Request) -> str:
431
- """
432
- Infers the origin URL from the request.
433
- """
434
- if (referer := request.headers.get("referer")) is None:
435
- return str(request.base_url)
436
- parsed_url = urlparse(referer)
437
- return f"{parsed_url.scheme}://{parsed_url.netloc}"
438
-
439
-
440
472
  def _is_oauth2_state_payload(maybe_state_payload: Any) -> TypeGuard[_OAuth2StatePayload]:
441
473
  """
442
474
  Determines whether the given object is an OAuth2 state payload.
@@ -127,7 +127,7 @@ class Subscription:
127
127
  ):
128
128
  span.add_response_chunk(chunk)
129
129
  yield chunk
130
- span.set_attributes(llm_client.attributes)
130
+ span.set_attributes(llm_client.attributes)
131
131
  if span.status_message is not None:
132
132
  yield ChatCompletionSubscriptionError(message=span.status_message)
133
133
  async with info.context.db() as session:
@@ -0,0 +1,85 @@
1
+ from enum import Enum
2
+ from typing import Any, ClassVar, Optional, Union
3
+
4
+ import strawberry
5
+ from openinference.semconv.trace import OpenInferenceLLMProviderValues, SpanAttributes
6
+
7
+ from phoenix.trace.attributes import get_attribute_value
8
+
9
+
10
+ @strawberry.enum
11
+ class GenerativeProviderKey(Enum):
12
+ OPENAI = "OpenAI"
13
+ ANTHROPIC = "Anthropic"
14
+ AZURE_OPENAI = "Azure OpenAI"
15
+ GEMINI = "Google AI Studio"
16
+
17
+
18
+ @strawberry.type
19
+ class GenerativeProvider:
20
+ name: str
21
+ key: GenerativeProviderKey
22
+
23
+ model_provider_to_model_prefix_map: ClassVar[dict[GenerativeProviderKey, list[str]]] = {
24
+ GenerativeProviderKey.AZURE_OPENAI: [],
25
+ GenerativeProviderKey.ANTHROPIC: ["claude"],
26
+ GenerativeProviderKey.OPENAI: ["gpt", "o1"],
27
+ GenerativeProviderKey.GEMINI: ["gemini"],
28
+ }
29
+
30
+ attribute_provider_to_generative_provider_map: ClassVar[dict[str, GenerativeProviderKey]] = {
31
+ OpenInferenceLLMProviderValues.OPENAI.value: GenerativeProviderKey.OPENAI,
32
+ OpenInferenceLLMProviderValues.ANTHROPIC.value: GenerativeProviderKey.ANTHROPIC,
33
+ OpenInferenceLLMProviderValues.AZURE.value: GenerativeProviderKey.AZURE_OPENAI,
34
+ OpenInferenceLLMProviderValues.GOOGLE.value: GenerativeProviderKey.GEMINI,
35
+ }
36
+
37
+ @strawberry.field
38
+ async def dependencies(self) -> list[str]:
39
+ from phoenix.server.api.helpers.playground_registry import (
40
+ PLAYGROUND_CLIENT_REGISTRY,
41
+ PROVIDER_DEFAULT,
42
+ )
43
+
44
+ default_client = PLAYGROUND_CLIENT_REGISTRY.get_client(self.key, PROVIDER_DEFAULT)
45
+ if default_client:
46
+ return [dependency.name for dependency in default_client.dependencies()]
47
+ return []
48
+
49
+ @strawberry.field
50
+ async def dependencies_installed(self) -> bool:
51
+ from phoenix.server.api.helpers.playground_registry import (
52
+ PLAYGROUND_CLIENT_REGISTRY,
53
+ PROVIDER_DEFAULT,
54
+ )
55
+
56
+ default_client = PLAYGROUND_CLIENT_REGISTRY.get_client(self.key, PROVIDER_DEFAULT)
57
+ if default_client:
58
+ return default_client.dependencies_are_installed()
59
+ return False
60
+
61
+ @classmethod
62
+ def _infer_model_provider_from_model_name(
63
+ cls,
64
+ model_name: str,
65
+ ) -> Union[GenerativeProviderKey, None]:
66
+ for provider, prefixes in cls.model_provider_to_model_prefix_map.items():
67
+ if any(prefix.lower() in model_name.lower() for prefix in prefixes):
68
+ return provider
69
+ return None
70
+
71
+ @classmethod
72
+ def get_model_provider_from_attributes(
73
+ cls,
74
+ attributes: dict[str, Any],
75
+ ) -> Union[GenerativeProviderKey, None]:
76
+ llm_provider: Optional[str] = get_attribute_value(attributes, SpanAttributes.LLM_PROVIDER)
77
+
78
+ if isinstance(llm_provider, str) and (
79
+ provider := cls.attribute_provider_to_generative_provider_map.get(llm_provider)
80
+ ):
81
+ return provider
82
+ llm_model = get_attribute_value(attributes, SpanAttributes.LLM_MODEL_NAME)
83
+ if isinstance(llm_model, str):
84
+ return cls._infer_model_provider_from_model_name(llm_model)
85
+ return None
@@ -25,7 +25,7 @@ from phoenix.server.api.input_types.SpanAnnotationSort import (
25
25
  SpanAnnotationColumn,
26
26
  SpanAnnotationSort,
27
27
  )
28
- from phoenix.server.api.types.GenerativeProvider import GenerativeProviderKey
28
+ from phoenix.server.api.types.GenerativeProvider import GenerativeProvider
29
29
  from phoenix.server.api.types.SortDir import SortDir
30
30
  from phoenix.server.api.types.SpanAnnotation import to_gql_span_annotation
31
31
  from phoenix.trace.attributes import get_attribute_value
@@ -300,10 +300,9 @@ class Span(Node):
300
300
 
301
301
  db_span = self.db_span
302
302
  attributes = db_span.attributes
303
- llm_provider: GenerativeProviderKey = (
304
- get_attribute_value(attributes, SpanAttributes.LLM_PROVIDER)
305
- or GenerativeProviderKey.OPENAI
306
- )
303
+ llm_provider = GenerativeProvider.get_model_provider_from_attributes(attributes)
304
+ if llm_provider is None:
305
+ return []
307
306
  llm_model = get_attribute_value(attributes, SpanAttributes.LLM_MODEL_NAME)
308
307
  invocation_parameters = get_attribute_value(
309
308
  attributes, SpanAttributes.LLM_INVOCATION_PARAMETERS
@@ -0,0 +1,78 @@
1
+ {
2
+ "_components-BXIz9ZO8.js": {
3
+ "file": "assets/components-BXIz9ZO8.js",
4
+ "name": "components",
5
+ "imports": [
6
+ "_vendor-BX8_Znqy.js",
7
+ "_pages-B8FpJuXu.js",
8
+ "_vendor-arizeai-CtHir-Ua.js",
9
+ "_vendor-codemirror-DLlGiguX.js",
10
+ "_vendor-three-DwGkEfCM.js"
11
+ ]
12
+ },
13
+ "_pages-B8FpJuXu.js": {
14
+ "file": "assets/pages-B8FpJuXu.js",
15
+ "name": "pages",
16
+ "imports": [
17
+ "_vendor-BX8_Znqy.js",
18
+ "_vendor-arizeai-CtHir-Ua.js",
19
+ "_components-BXIz9ZO8.js",
20
+ "_vendor-recharts-CJRple0d.js",
21
+ "_vendor-codemirror-DLlGiguX.js"
22
+ ]
23
+ },
24
+ "_vendor-!~{003}~.js": {
25
+ "file": "assets/vendor-DxkFTwjz.css",
26
+ "src": "_vendor-!~{003}~.js"
27
+ },
28
+ "_vendor-BX8_Znqy.js": {
29
+ "file": "assets/vendor-BX8_Znqy.js",
30
+ "name": "vendor",
31
+ "imports": [
32
+ "_vendor-three-DwGkEfCM.js"
33
+ ],
34
+ "css": [
35
+ "assets/vendor-DxkFTwjz.css"
36
+ ]
37
+ },
38
+ "_vendor-arizeai-CtHir-Ua.js": {
39
+ "file": "assets/vendor-arizeai-CtHir-Ua.js",
40
+ "name": "vendor-arizeai",
41
+ "imports": [
42
+ "_vendor-BX8_Znqy.js"
43
+ ]
44
+ },
45
+ "_vendor-codemirror-DLlGiguX.js": {
46
+ "file": "assets/vendor-codemirror-DLlGiguX.js",
47
+ "name": "vendor-codemirror",
48
+ "imports": [
49
+ "_vendor-BX8_Znqy.js"
50
+ ]
51
+ },
52
+ "_vendor-recharts-CJRple0d.js": {
53
+ "file": "assets/vendor-recharts-CJRple0d.js",
54
+ "name": "vendor-recharts",
55
+ "imports": [
56
+ "_vendor-BX8_Znqy.js"
57
+ ]
58
+ },
59
+ "_vendor-three-DwGkEfCM.js": {
60
+ "file": "assets/vendor-three-DwGkEfCM.js",
61
+ "name": "vendor-three"
62
+ },
63
+ "index.tsx": {
64
+ "file": "assets/index-DTut7g1y.js",
65
+ "name": "index",
66
+ "src": "index.tsx",
67
+ "isEntry": true,
68
+ "imports": [
69
+ "_vendor-BX8_Znqy.js",
70
+ "_vendor-arizeai-CtHir-Ua.js",
71
+ "_pages-B8FpJuXu.js",
72
+ "_components-BXIz9ZO8.js",
73
+ "_vendor-three-DwGkEfCM.js",
74
+ "_vendor-recharts-CJRple0d.js",
75
+ "_vendor-codemirror-DLlGiguX.js"
76
+ ]
77
+ }
78
+ }