arize-phoenix 3.14.1__tar.gz → 3.15.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 (181) hide show
  1. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/PKG-INFO +1 -1
  2. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/config.py +30 -1
  3. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/core/project.py +8 -0
  4. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/core/traces.py +20 -4
  5. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/routers/evaluation_handler.py +3 -2
  6. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/routers/span_handler.py +1 -1
  7. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/routers/trace_handler.py +1 -1
  8. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/schema.py +27 -5
  9. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/Span.py +1 -1
  10. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/app.py +1 -1
  11. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/main.py +4 -22
  12. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/static/index.js +452 -432
  13. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/session/client.py +52 -11
  14. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/session/session.py +9 -0
  15. arize_phoenix-3.15.0/src/phoenix/storage/span_store/__init__.py +23 -0
  16. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/__init__.py +8 -1
  17. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/dsl/helpers.py +10 -4
  18. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/langchain/instrumentor.py +2 -1
  19. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/llama_index/callback.py +2 -1
  20. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/openai/instrumentor.py +2 -1
  21. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/projects.py +13 -3
  22. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/span_json_encoder.py +8 -0
  23. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/utilities/project.py +1 -1
  24. arize_phoenix-3.15.0/src/phoenix/utilities/span_store.py +23 -0
  25. arize_phoenix-3.15.0/src/phoenix/version.py +1 -0
  26. arize_phoenix-3.14.1/src/phoenix/storage/spanstore/__init__.py +0 -9
  27. arize_phoenix-3.14.1/src/phoenix/version.py +0 -1
  28. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/.gitignore +0 -0
  29. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/IP_NOTICE +0 -0
  30. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/LICENSE +0 -0
  31. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/README.md +0 -0
  32. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/pyproject.toml +0 -0
  33. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/__init__.py +0 -0
  34. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/core/__init__.py +0 -0
  35. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/core/embedding_dimension.py +0 -0
  36. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/core/model.py +0 -0
  37. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/core/model_schema.py +0 -0
  38. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/core/model_schema_adapter.py +0 -0
  39. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/datasets/__init__.py +0 -0
  40. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/datasets/dataset.py +0 -0
  41. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/datasets/errors.py +0 -0
  42. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/datasets/fixtures.py +0 -0
  43. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/datasets/schema.py +0 -0
  44. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/datasets/validation.py +0 -0
  45. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/datetime_utils.py +0 -0
  46. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/exceptions.py +0 -0
  47. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/__init__.py +0 -0
  48. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/__init__.py +0 -0
  49. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/evaluators.py +0 -0
  50. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/functions/__init__.py +0 -0
  51. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/functions/classify.py +0 -0
  52. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/functions/executor.py +0 -0
  53. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/functions/generate.py +0 -0
  54. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/functions/processing.py +0 -0
  55. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/models/__init__.py +0 -0
  56. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/models/anthropic.py +0 -0
  57. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/models/base.py +0 -0
  58. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/models/bedrock.py +0 -0
  59. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/models/litellm.py +0 -0
  60. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/models/openai.py +0 -0
  61. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/models/rate_limiters.py +0 -0
  62. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/models/vertex.py +0 -0
  63. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/models/vertexai.py +0 -0
  64. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/retrievals.py +0 -0
  65. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/templates/__init__.py +0 -0
  66. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/templates/default_templates.py +0 -0
  67. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/templates/template.py +0 -0
  68. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/utils/__init__.py +0 -0
  69. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/experimental/evals/utils/threads.py +0 -0
  70. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/metrics/README.md +0 -0
  71. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/metrics/__init__.py +0 -0
  72. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/metrics/binning.py +0 -0
  73. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/metrics/metrics.py +0 -0
  74. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/metrics/mixins.py +0 -0
  75. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  76. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/metrics/timeseries.py +0 -0
  77. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/metrics/wrappers.py +0 -0
  78. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/pointcloud/__init__.py +0 -0
  79. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/pointcloud/clustering.py +0 -0
  80. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
  81. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/pointcloud/projectors.py +0 -0
  82. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  83. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/py.typed +0 -0
  84. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/__init__.py +0 -0
  85. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/__init__.py +0 -0
  86. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/context.py +0 -0
  87. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/helpers.py +0 -0
  88. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  89. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  90. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  91. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  92. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  93. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  94. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  95. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  96. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  97. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
  98. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/interceptor.py +0 -0
  99. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/routers/__init__.py +0 -0
  100. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/routers/utils.py +0 -0
  101. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/Cluster.py +0 -0
  102. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  103. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/Dataset.py +0 -0
  104. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/DatasetRole.py +0 -0
  105. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  106. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/Dimension.py +0 -0
  107. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  108. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  109. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
  110. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  111. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  112. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  113. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  114. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  115. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
  116. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  117. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/Event.py +0 -0
  118. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  119. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/ExportEventsMutation.py +0 -0
  120. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  121. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/Functionality.py +0 -0
  122. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/MimeType.py +0 -0
  123. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/Model.py +0 -0
  124. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
  125. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  126. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/Project.py +0 -0
  127. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  128. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
  129. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  130. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/Segments.py +0 -0
  131. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/SortDir.py +0 -0
  132. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  133. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  134. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  135. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  136. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/__init__.py +0 -0
  137. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/node.py +0 -0
  138. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/api/types/pagination.py +0 -0
  139. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  140. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  141. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  142. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  143. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  144. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  145. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  146. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  147. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/static/favicon.ico +0 -0
  148. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/static/index.css +0 -0
  149. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/static/modernizr.js +0 -0
  150. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/templates/__init__.py +0 -0
  151. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/templates/index.html +0 -0
  152. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/server/thread_server.py +0 -0
  153. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/services.py +0 -0
  154. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/session/__init__.py +0 -0
  155. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/session/data_extractor.py +0 -0
  156. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/session/evaluation.py +0 -0
  157. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/storage/__init__.py +0 -0
  158. {arize_phoenix-3.14.1/src/phoenix/storage/spanstore → arize_phoenix-3.15.0/src/phoenix/storage/span_store}/text_file.py +0 -0
  159. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/dsl/__init__.py +0 -0
  160. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/dsl/filter.py +0 -0
  161. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/dsl/missing.py +0 -0
  162. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/dsl/query.py +0 -0
  163. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/errors.py +0 -0
  164. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
  165. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/exporter.py +0 -0
  166. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/fixtures.py +0 -0
  167. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/langchain/__init__.py +0 -0
  168. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/llama_index/__init__.py +0 -0
  169. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/openai/__init__.py +0 -0
  170. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/otel.py +0 -0
  171. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/schemas.py +0 -0
  172. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/span_evaluations.py +0 -0
  173. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/span_json_decoder.py +0 -0
  174. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/trace_dataset.py +0 -0
  175. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/utils.py +0 -0
  176. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/v1/__init__.py +0 -0
  177. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  178. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  179. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/utilities/__init__.py +0 -0
  180. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/utilities/error_handling.py +0 -0
  181. {arize_phoenix-3.14.1 → arize_phoenix-3.15.0}/src/phoenix/utilities/logging.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: arize-phoenix
3
- Version: 3.14.1
3
+ Version: 3.15.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
@@ -1,5 +1,6 @@
1
1
  import os
2
2
  import tempfile
3
+ from enum import Enum
3
4
  from pathlib import Path
4
5
  from typing import List, Optional
5
6
 
@@ -21,6 +22,11 @@ ENV_PHOENIX_PROJECT_NAME = "PHOENIX_PROJECT_NAME"
21
22
  """
22
23
  The project name to use when logging traces and evals. defaults to 'default'.
23
24
  """
25
+ ENV_SPAN_STORAGE_TYPE = "__DANGEROUS__PHOENIX_SPAN_STORAGE_TYPE"
26
+ """
27
+ **EXPERIMENTAL**
28
+ The type of span storage to use.
29
+ """
24
30
 
25
31
 
26
32
  def _get_temp_path() -> Path:
@@ -127,4 +133,27 @@ def get_env_collector_endpoint() -> Optional[str]:
127
133
 
128
134
 
129
135
  def get_env_project_name() -> str:
130
- return os.getenv(ENV_PHOENIX_PROJECT_NAME) or "default"
136
+ return os.getenv(ENV_PHOENIX_PROJECT_NAME) or DEFAULT_PROJECT_NAME
137
+
138
+
139
+ def get_env_span_storage_type() -> Optional["SpanStorageType"]:
140
+ """
141
+ Get the type of span storage to use.
142
+ """
143
+ if not (env_type_str := os.getenv(ENV_SPAN_STORAGE_TYPE)):
144
+ return None
145
+ try:
146
+ return SpanStorageType(env_type_str.lower())
147
+ except ValueError:
148
+ raise ValueError(
149
+ f"⚠️ Invalid span storage type value `{env_type_str}` defined by the "
150
+ f"environment variable `{ENV_SPAN_STORAGE_TYPE}`. Valid values are: "
151
+ f"{', '.join(t.value for t in SpanStorageType)}."
152
+ )
153
+
154
+
155
+ class SpanStorageType(Enum):
156
+ TEXT_FILES = "text-files"
157
+
158
+
159
+ DEFAULT_PROJECT_NAME = "default"
@@ -91,6 +91,7 @@ class Project:
91
91
  def __init__(self) -> None:
92
92
  self._spans = _Spans()
93
93
  self._evals = _Evals()
94
+ self._is_archived = False
94
95
 
95
96
  @property
96
97
  def last_updated_at(self) -> Optional[datetime]:
@@ -192,6 +193,13 @@ class Project:
192
193
  def export_evaluations(self) -> List[Evaluations]:
193
194
  return self._evals.export_evaluations()
194
195
 
196
+ def archive(self) -> None:
197
+ self._is_archived = True
198
+
199
+ @property
200
+ def is_archived(self) -> bool:
201
+ return self._is_archived
202
+
195
203
 
196
204
  class _Spans:
197
205
  def __init__(self) -> None:
@@ -8,13 +8,13 @@ from typing import DefaultDict, Iterator, Optional, Tuple, Union
8
8
  from typing_extensions import assert_never
9
9
 
10
10
  import phoenix.trace.v1 as pb
11
+ from phoenix.config import DEFAULT_PROJECT_NAME
11
12
  from phoenix.core.project import (
12
13
  END_OF_QUEUE,
13
14
  Project,
14
15
  _ProjectName,
15
16
  )
16
17
  from phoenix.trace.schemas import Span
17
- from phoenix.utilities.project import DEFAULT_PROJECT_NAME
18
18
 
19
19
  _SpanItem = Tuple[Span, _ProjectName]
20
20
  _EvalItem = Tuple[pb.Evaluation, _ProjectName]
@@ -38,10 +38,26 @@ class Traces:
38
38
  with self._lock:
39
39
  return self._projects.get(project_name)
40
40
 
41
- def get_projects(self) -> Iterator[Tuple[str, "Project"]]:
41
+ def get_projects(self) -> Iterator[Tuple[int, str, "Project"]]:
42
42
  with self._lock:
43
- projects = tuple(self._projects.items())
44
- yield from projects
43
+ for project_id, (project_name, project) in enumerate(self._projects.items()):
44
+ if project.is_archived:
45
+ continue
46
+ yield project_id, project_name, project
47
+
48
+ def archive_project(self, id: int) -> Optional["Project"]:
49
+ with self._lock:
50
+ active_projects = {
51
+ project_id: project
52
+ for project_id, _, project in self.get_projects()
53
+ if not project.is_archived
54
+ }
55
+ if len(active_projects) <= 1:
56
+ return None
57
+ if project := active_projects.get(id):
58
+ project.archive()
59
+ return project
60
+ return None
45
61
 
46
62
  def put(
47
63
  self,
@@ -15,11 +15,11 @@ from starlette.status import (
15
15
  )
16
16
 
17
17
  import phoenix.trace.v1 as pb
18
+ from phoenix.config import DEFAULT_PROJECT_NAME
18
19
  from phoenix.core.traces import Traces
19
20
  from phoenix.server.api.routers.utils import table_to_bytes
20
21
  from phoenix.session.evaluation import encode_evaluations
21
22
  from phoenix.trace.span_evaluations import Evaluations
22
- from phoenix.utilities.project import DEFAULT_PROJECT_NAME
23
23
 
24
24
 
25
25
  class EvaluationHandler(HTTPEndpoint):
@@ -27,6 +27,7 @@ class EvaluationHandler(HTTPEndpoint):
27
27
 
28
28
  async def post(self, request: Request) -> Response:
29
29
  content_type = request.headers.get("content-type")
30
+ project_name = request.headers.get("project-name", DEFAULT_PROJECT_NAME)
30
31
  if content_type == "application/x-pandas-arrow":
31
32
  return await self._process_pyarrow(request)
32
33
  if content_type != "application/x-protobuf":
@@ -51,7 +52,7 @@ class EvaluationHandler(HTTPEndpoint):
51
52
  content="Request body is invalid",
52
53
  status_code=HTTP_422_UNPROCESSABLE_ENTITY,
53
54
  )
54
- self.traces.put(evaluation)
55
+ self.traces.put(evaluation, project_name=project_name)
55
56
  return Response()
56
57
 
57
58
  async def get(self, request: Request) -> Response:
@@ -7,11 +7,11 @@ from starlette.requests import Request
7
7
  from starlette.responses import Response, StreamingResponse
8
8
  from starlette.status import HTTP_404_NOT_FOUND, HTTP_422_UNPROCESSABLE_ENTITY
9
9
 
10
+ from phoenix.config import DEFAULT_PROJECT_NAME
10
11
  from phoenix.core.traces import Traces
11
12
  from phoenix.server.api.routers.utils import df_to_bytes, from_iso_format
12
13
  from phoenix.trace.dsl import SpanQuery
13
14
  from phoenix.utilities import query_spans
14
- from phoenix.utilities.project import DEFAULT_PROJECT_NAME
15
15
 
16
16
 
17
17
  class SpanHandler(HTTPEndpoint):
@@ -14,7 +14,7 @@ from starlette.responses import Response
14
14
  from starlette.status import HTTP_415_UNSUPPORTED_MEDIA_TYPE, HTTP_422_UNPROCESSABLE_ENTITY
15
15
 
16
16
  from phoenix.core.traces import Traces
17
- from phoenix.storage.spanstore import SpanStore
17
+ from phoenix.storage.span_store import SpanStore
18
18
  from phoenix.trace.otel import decode
19
19
  from phoenix.utilities.project import get_project_name
20
20
 
@@ -56,8 +56,8 @@ class Query:
56
56
  []
57
57
  if (traces := info.context.traces) is None
58
58
  else [
59
- Project(id_attr=i, name=name, project=project)
60
- for i, (name, project) in enumerate(traces.get_projects())
59
+ Project(id_attr=project_id, name=project_name, project=project)
60
+ for project_id, project_name, project in traces.get_projects()
61
61
  ]
62
62
  )
63
63
  return connection_from_list(data=data, args=args)
@@ -86,8 +86,11 @@ class Query:
86
86
  return to_gql_embedding_dimension(node_id, embedding_dimension)
87
87
  elif type_name == "Project":
88
88
  if (traces := info.context.traces) is not None:
89
- projects = list(traces.get_projects())
90
- if node_id < len(projects):
89
+ projects = {
90
+ project_id: (project_name, project)
91
+ for project_id, project_name, project in traces.get_projects()
92
+ }
93
+ if node_id in projects:
91
94
  name, project = projects[node_id]
92
95
  return Project(id_attr=node_id, name=name, project=project)
93
96
  raise Exception(f"Unknown project: {id}")
@@ -224,7 +227,26 @@ class Query:
224
227
 
225
228
 
226
229
  @strawberry.type
227
- class Mutation(ExportEventsMutation): ...
230
+ class Mutation(ExportEventsMutation):
231
+ @strawberry.mutation
232
+ def delete_project(self, info: Info[Context, None], id: GlobalID) -> Query:
233
+ if (traces := info.context.traces) is None:
234
+ return Query()
235
+ type_name, node_id = from_global_id(str(id))
236
+ if type_name != "Project":
237
+ return Query()
238
+ traces.archive_project(node_id)
239
+ return Query()
240
+
241
+ @strawberry.mutation
242
+ def archive_project(self, info: Info[Context, None], id: GlobalID) -> Query:
243
+ if (traces := info.context.traces) is None:
244
+ return Query()
245
+ type_name, node_id = from_global_id(str(id))
246
+ if type_name != "Project":
247
+ return Query()
248
+ traces.archive_project(node_id)
249
+ return Query()
228
250
 
229
251
 
230
252
  schema = strawberry.Schema(query=Query, mutation=Mutation)
@@ -10,6 +10,7 @@ from strawberry import ID, UNSET
10
10
  from strawberry.types import Info
11
11
 
12
12
  import phoenix.trace.schemas as trace_schema
13
+ from phoenix.config import DEFAULT_PROJECT_NAME
13
14
  from phoenix.core.project import Project, WrappedSpan
14
15
  from phoenix.metrics.retrieval_metrics import RetrievalMetrics
15
16
  from phoenix.server.api.context import Context
@@ -17,7 +18,6 @@ from phoenix.server.api.types.DocumentRetrievalMetrics import DocumentRetrievalM
17
18
  from phoenix.server.api.types.Evaluation import DocumentEvaluation, SpanEvaluation
18
19
  from phoenix.server.api.types.MimeType import MimeType
19
20
  from phoenix.trace.schemas import ComputedAttributes, SpanID
20
- from phoenix.utilities.project import DEFAULT_PROJECT_NAME
21
21
 
22
22
  EMBEDDING_EMBEDDINGS = SpanAttributes.EMBEDDING_EMBEDDINGS
23
23
  EMBEDDING_VECTOR = EmbeddingAttributes.EMBEDDING_VECTOR
@@ -28,7 +28,7 @@ from phoenix.server.api.routers.evaluation_handler import EvaluationHandler
28
28
  from phoenix.server.api.routers.span_handler import SpanHandler
29
29
  from phoenix.server.api.routers.trace_handler import TraceHandler
30
30
  from phoenix.server.api.schema import schema
31
- from phoenix.storage.spanstore import SpanStore
31
+ from phoenix.storage.span_store import SpanStore
32
32
 
33
33
  logger = logging.getLogger(__name__)
34
34
 
@@ -16,7 +16,6 @@ from phoenix.config import (
16
16
  get_env_host,
17
17
  get_env_port,
18
18
  get_pids_path,
19
- get_storage_dir,
20
19
  )
21
20
  from phoenix.core.model_schema_adapter import create_model_from_datasets
22
21
  from phoenix.core.traces import Traces
@@ -29,8 +28,7 @@ from phoenix.pointcloud.umap_parameters import (
29
28
  UMAPParameters,
30
29
  )
31
30
  from phoenix.server.app import create_app
32
- from phoenix.storage.spanstore import SpanStore
33
- from phoenix.storage.spanstore.text_file import TextFileSpanStoreImpl
31
+ from phoenix.storage.span_store import SpanStore
34
32
  from phoenix.trace.fixtures import (
35
33
  TRACES_FIXTURES,
36
34
  _download_traces_fixture,
@@ -39,7 +37,7 @@ from phoenix.trace.fixtures import (
39
37
  )
40
38
  from phoenix.trace.otel import decode, encode
41
39
  from phoenix.trace.span_json_decoder import json_string_to_span
42
- from phoenix.utilities.project import get_project_name
40
+ from phoenix.utilities.span_store import get_span_store, load_traces_data_from_store
43
41
 
44
42
  logger = logging.getLogger(__name__)
45
43
 
@@ -108,15 +106,6 @@ def _load_items(
108
106
  queue.put(item)
109
107
 
110
108
 
111
- def _load_from_store(traces: Traces, span_store: SpanStore) -> None:
112
- for traces_data in span_store.load():
113
- for resource_spans in traces_data.resource_spans:
114
- project_name = get_project_name(resource_spans.resource.attributes)
115
- for scope_span in resource_spans.scope_spans:
116
- for span in scope_span.spans:
117
- traces.put(decode(span), project_name=project_name)
118
-
119
-
120
109
  DEFAULT_UMAP_PARAMS_STR = f"{DEFAULT_MIN_DIST},{DEFAULT_N_NEIGHBORS},{DEFAULT_N_SAMPLES}"
121
110
 
122
111
  if __name__ == "__main__":
@@ -142,8 +131,6 @@ if __name__ == "__main__":
142
131
  parser.add_argument("--debug", action="store_false")
143
132
  subparsers = parser.add_subparsers(dest="command", required=True)
144
133
  serve_parser = subparsers.add_parser("serve")
145
- experimental_parser = subparsers.add_parser("extremely-dangerous-experimental-span-storage")
146
- experimental_parser.add_argument("--storage-path", type=str, required=False)
147
134
  datasets_parser = subparsers.add_parser("datasets")
148
135
  datasets_parser.add_argument("--primary", type=str, required=True)
149
136
  datasets_parser.add_argument("--reference", type=str, required=False)
@@ -200,19 +187,14 @@ if __name__ == "__main__":
200
187
  )
201
188
  trace_dataset_name = args.trace_fixture
202
189
  simulate_streaming = args.simulate_streaming
203
- elif args.command == "extremely-dangerous-experimental-span-storage":
204
- span_store_path = (
205
- get_storage_dir() if args.storage_path is None else Path(args.storage_path)
206
- )
207
- span_store = TextFileSpanStoreImpl(span_store_path)
208
190
 
209
191
  model = create_model_from_datasets(
210
192
  primary_dataset,
211
193
  reference_dataset,
212
194
  )
213
195
  traces = Traces()
214
- if span_store:
215
- Thread(target=_load_from_store, args=(traces, span_store), daemon=True).start()
196
+ if span_store := get_span_store():
197
+ Thread(target=load_traces_data_from_store, args=(traces, span_store), daemon=True).start()
216
198
  if trace_dataset_name is not None:
217
199
  fixture_spans = list(
218
200
  # Apply `encode` here because legacy jsonl files contains UUIDs as strings.