arize-phoenix 3.13.1__tar.gz → 3.14.1__tar.gz

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

Potentially problematic release.


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

Files changed (179) hide show
  1. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/PKG-INFO +5 -4
  2. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/pyproject.toml +9 -5
  3. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/config.py +7 -0
  4. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/core/project.py +0 -1
  5. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/core/traces.py +1 -1
  6. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/routers/evaluation_handler.py +1 -1
  7. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/routers/span_handler.py +1 -1
  8. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/routers/trace_handler.py +8 -11
  9. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Span.py +2 -1
  10. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/app.py +3 -1
  11. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/main.py +30 -1
  12. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/index.js +195 -195
  13. arize_phoenix-3.14.1/src/phoenix/storage/__init__.py +0 -0
  14. arize_phoenix-3.14.1/src/phoenix/storage/spanstore/__init__.py +9 -0
  15. arize_phoenix-3.14.1/src/phoenix/storage/spanstore/text_file.py +85 -0
  16. arize_phoenix-3.14.1/src/phoenix/utilities/project.py +13 -0
  17. arize_phoenix-3.14.1/src/phoenix/version.py +1 -0
  18. arize_phoenix-3.13.1/src/phoenix/version.py +0 -1
  19. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/.gitignore +0 -0
  20. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/IP_NOTICE +0 -0
  21. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/LICENSE +0 -0
  22. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/README.md +0 -0
  23. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/__init__.py +0 -0
  24. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/core/__init__.py +0 -0
  25. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/core/embedding_dimension.py +0 -0
  26. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/core/model.py +0 -0
  27. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/core/model_schema.py +0 -0
  28. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/core/model_schema_adapter.py +0 -0
  29. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/datasets/__init__.py +0 -0
  30. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/datasets/dataset.py +0 -0
  31. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/datasets/errors.py +0 -0
  32. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/datasets/fixtures.py +0 -0
  33. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/datasets/schema.py +0 -0
  34. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/datasets/validation.py +0 -0
  35. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/datetime_utils.py +0 -0
  36. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/exceptions.py +0 -0
  37. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/__init__.py +0 -0
  38. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/__init__.py +0 -0
  39. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/evaluators.py +0 -0
  40. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/functions/__init__.py +0 -0
  41. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/functions/classify.py +0 -0
  42. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/functions/executor.py +0 -0
  43. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/functions/generate.py +0 -0
  44. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/functions/processing.py +0 -0
  45. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/__init__.py +0 -0
  46. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/anthropic.py +0 -0
  47. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/base.py +0 -0
  48. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/bedrock.py +0 -0
  49. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/litellm.py +0 -0
  50. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/openai.py +0 -0
  51. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/rate_limiters.py +0 -0
  52. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/vertex.py +0 -0
  53. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/vertexai.py +0 -0
  54. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/retrievals.py +0 -0
  55. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/templates/__init__.py +0 -0
  56. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/templates/default_templates.py +0 -0
  57. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/templates/template.py +0 -0
  58. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/utils/__init__.py +0 -0
  59. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/utils/threads.py +0 -0
  60. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/README.md +0 -0
  61. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/__init__.py +0 -0
  62. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/binning.py +0 -0
  63. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/metrics.py +0 -0
  64. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/mixins.py +0 -0
  65. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  66. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/timeseries.py +0 -0
  67. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/wrappers.py +0 -0
  68. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/pointcloud/__init__.py +0 -0
  69. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/pointcloud/clustering.py +0 -0
  70. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/pointcloud/pointcloud.py +0 -0
  71. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/pointcloud/projectors.py +0 -0
  72. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  73. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/py.typed +0 -0
  74. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/__init__.py +0 -0
  75. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/__init__.py +0 -0
  76. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/context.py +0 -0
  77. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/helpers.py +0 -0
  78. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  79. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  80. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  81. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  82. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  83. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  84. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  85. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  86. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  87. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/__init__.py +0 -0
  88. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/interceptor.py +0 -0
  89. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/routers/__init__.py +0 -0
  90. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/routers/utils.py +0 -0
  91. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/schema.py +0 -0
  92. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Cluster.py +0 -0
  93. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  94. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Dataset.py +0 -0
  95. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DatasetRole.py +0 -0
  96. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  97. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Dimension.py +0 -0
  98. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  99. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  100. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DimensionType.py +0 -0
  101. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  102. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  103. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  104. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  105. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  106. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Evaluation.py +0 -0
  107. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  108. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Event.py +0 -0
  109. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  110. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/ExportEventsMutation.py +0 -0
  111. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  112. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Functionality.py +0 -0
  113. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/MimeType.py +0 -0
  114. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Model.py +0 -0
  115. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/NumericRange.py +0 -0
  116. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  117. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Project.py +0 -0
  118. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  119. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Retrieval.py +0 -0
  120. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  121. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Segments.py +0 -0
  122. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/SortDir.py +0 -0
  123. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  124. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  125. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  126. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  127. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/__init__.py +0 -0
  128. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/node.py +0 -0
  129. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/pagination.py +0 -0
  130. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  131. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  132. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  133. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  134. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  135. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  136. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  137. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  138. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/favicon.ico +0 -0
  139. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/index.css +0 -0
  140. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/modernizr.js +0 -0
  141. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/templates/__init__.py +0 -0
  142. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/templates/index.html +0 -0
  143. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/thread_server.py +0 -0
  144. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/services.py +0 -0
  145. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/session/__init__.py +0 -0
  146. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/session/client.py +0 -0
  147. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/session/data_extractor.py +0 -0
  148. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/session/evaluation.py +0 -0
  149. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/session/session.py +0 -0
  150. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/__init__.py +0 -0
  151. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/dsl/__init__.py +0 -0
  152. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/dsl/filter.py +0 -0
  153. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/dsl/helpers.py +0 -0
  154. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/dsl/missing.py +0 -0
  155. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/dsl/query.py +0 -0
  156. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/errors.py +0 -0
  157. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/evaluation_conventions.py +0 -0
  158. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/exporter.py +0 -0
  159. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/fixtures.py +0 -0
  160. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/langchain/__init__.py +0 -0
  161. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/langchain/instrumentor.py +0 -0
  162. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/llama_index/__init__.py +0 -0
  163. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/llama_index/callback.py +0 -0
  164. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/openai/__init__.py +0 -0
  165. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/openai/instrumentor.py +0 -0
  166. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/otel.py +0 -0
  167. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/projects.py +0 -0
  168. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/schemas.py +0 -0
  169. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/span_evaluations.py +0 -0
  170. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/span_json_decoder.py +0 -0
  171. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/span_json_encoder.py +0 -0
  172. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/trace_dataset.py +0 -0
  173. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/utils.py +0 -0
  174. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/v1/__init__.py +0 -0
  175. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  176. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  177. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/utilities/__init__.py +0 -0
  178. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/utilities/error_handling.py +0 -0
  179. {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/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.13.1
3
+ Version: 3.14.1
4
4
  Summary: AI Observability and Evaluation
5
5
  Project-URL: Documentation, https://docs.arize.com/phoenix/
6
6
  Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
@@ -18,7 +18,7 @@ Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Requires-Python: <3.13,>=3.8
20
20
  Requires-Dist: ddsketch
21
- Requires-Dist: hdbscan<1.0.0,>=0.8.33
21
+ Requires-Dist: hdbscan>=0.8.33
22
22
  Requires-Dist: jinja2
23
23
  Requires-Dist: numpy
24
24
  Requires-Dist: openinference-instrumentation-langchain>=0.1.12
@@ -33,13 +33,14 @@ Requires-Dist: protobuf<5.0,>=3.20
33
33
  Requires-Dist: psutil
34
34
  Requires-Dist: pyarrow
35
35
  Requires-Dist: requests
36
- Requires-Dist: scikit-learn<1.3.0
36
+ Requires-Dist: scikit-learn
37
37
  Requires-Dist: scipy
38
38
  Requires-Dist: sortedcontainers
39
39
  Requires-Dist: starlette
40
40
  Requires-Dist: strawberry-graphql==0.208.2
41
41
  Requires-Dist: tqdm
42
- Requires-Dist: typing-extensions<5,>=4.5
42
+ Requires-Dist: typing-extensions>=4.5; python_version < '3.12'
43
+ Requires-Dist: typing-extensions>=4.6; python_version >= '3.12'
43
44
  Requires-Dist: umap-learn
44
45
  Requires-Dist: uvicorn
45
46
  Requires-Dist: wrapt
@@ -22,18 +22,20 @@ classifiers = [
22
22
  "Programming Language :: Python :: 3.12",
23
23
  ]
24
24
  dependencies = [
25
- "scikit-learn<1.3.0",
25
+ "scikit-learn",
26
26
  "numpy",
27
27
  "pandas",
28
28
  "jinja2",
29
29
  "umap-learn",
30
- "hdbscan>=0.8.33, <1.0.0",
30
+ "hdbscan>=0.8.33",
31
31
  "starlette",
32
32
  "uvicorn",
33
33
  "psutil",
34
34
  "strawberry-graphql==0.208.2",
35
35
  "pyarrow",
36
- "typing-extensions>=4.5, <5",
36
+ "typing-extensions>=4.5; python_version<'3.12'",
37
+ # A minimum version of typing-extensions==4.6.0 is needed to avoid this issue on Python 3.12: https://github.com/Azure/azure-sdk-for-python/issues/33442#issuecomment-1847886784
38
+ "typing-extensions>=4.6; python_version>='3.12'",
37
39
  "scipy",
38
40
  "wrapt",
39
41
  "sortedcontainers",
@@ -123,10 +125,12 @@ dependencies = [
123
125
  "protobuf==3.20", # version minimum (for tests)
124
126
  "responses",
125
127
  "tiktoken",
126
- "typing-extensions<4.6.0", # for Colab
128
+ "typing-extensions==4.5.0; python_version<'3.12'",
129
+ "typing-extensions==4.6.0; python_version>='3.12'",
127
130
  "httpx", # For OpenAI testing
128
131
  "respx", # For OpenAI testing
129
132
  "nest-asyncio", # for executor testing
133
+ "pyfakefs", # for experimental storage implementations
130
134
  ]
131
135
 
132
136
  [tool.hatch.envs.type]
@@ -166,7 +170,7 @@ tests = "pytest {args}"
166
170
  coverage = "pytest --cov-report=term-missing --cov-config=pyproject.toml --cov=src/phoenix --cov=tests {args}"
167
171
 
168
172
  [[tool.hatch.envs.test.matrix]]
169
- python = ["3.8", "3.11"]
173
+ python = ["3.8", "3.12"]
170
174
 
171
175
  [tool.pytest.ini_options]
172
176
  asyncio_mode = "auto"
@@ -56,6 +56,13 @@ def get_working_dir() -> Path:
56
56
  return Path.home().resolve() / ".phoenix"
57
57
 
58
58
 
59
+ def get_storage_dir() -> Path:
60
+ """
61
+ Get the directory for storing traces.
62
+ """
63
+ return get_working_dir() / "storage"
64
+
65
+
59
66
  PHOENIX_DIR = Path(__file__).resolve().parent
60
67
  # Server config
61
68
  SERVER_DIR = PHOENIX_DIR / "server"
@@ -82,7 +82,6 @@ _ParentSpanID: TypeAlias = SpanID
82
82
  _ChildSpanID: TypeAlias = SpanID
83
83
  _ProjectName: TypeAlias = str
84
84
 
85
- DEFAULT_PROJECT_NAME: str = "default"
86
85
 
87
86
  EvaluationName: TypeAlias = str
88
87
  DocumentPosition: TypeAlias = int
@@ -9,12 +9,12 @@ from typing_extensions import assert_never
9
9
 
10
10
  import phoenix.trace.v1 as pb
11
11
  from phoenix.core.project import (
12
- DEFAULT_PROJECT_NAME,
13
12
  END_OF_QUEUE,
14
13
  Project,
15
14
  _ProjectName,
16
15
  )
17
16
  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]
@@ -15,11 +15,11 @@ from starlette.status import (
15
15
  )
16
16
 
17
17
  import phoenix.trace.v1 as pb
18
- from phoenix.core.project import DEFAULT_PROJECT_NAME
19
18
  from phoenix.core.traces import Traces
20
19
  from phoenix.server.api.routers.utils import table_to_bytes
21
20
  from phoenix.session.evaluation import encode_evaluations
22
21
  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):
@@ -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.core.project import DEFAULT_PROJECT_NAME
11
10
  from phoenix.core.traces import Traces
12
11
  from phoenix.server.api.routers.utils import df_to_bytes, from_iso_format
13
12
  from phoenix.trace.dsl import SpanQuery
14
13
  from phoenix.utilities import query_spans
14
+ from phoenix.utilities.project import DEFAULT_PROJECT_NAME
15
15
 
16
16
 
17
17
  class SpanHandler(HTTPEndpoint):
@@ -1,25 +1,27 @@
1
1
  import asyncio
2
2
  import gzip
3
3
  import zlib
4
- from typing import Iterable, Optional
4
+ from typing import Optional
5
5
 
6
6
  from google.protobuf.message import DecodeError
7
- from openinference.semconv.resource import ResourceAttributes
8
7
  from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import (
9
8
  ExportTraceServiceRequest,
10
9
  )
11
- from opentelemetry.proto.common.v1.common_pb2 import KeyValue
10
+ from opentelemetry.proto.trace.v1.trace_pb2 import TracesData
12
11
  from starlette.endpoints import HTTPEndpoint
13
12
  from starlette.requests import Request
14
13
  from starlette.responses import Response
15
14
  from starlette.status import HTTP_415_UNSUPPORTED_MEDIA_TYPE, HTTP_422_UNPROCESSABLE_ENTITY
16
15
 
17
16
  from phoenix.core.traces import Traces
17
+ from phoenix.storage.spanstore import SpanStore
18
18
  from phoenix.trace.otel import decode
19
+ from phoenix.utilities.project import get_project_name
19
20
 
20
21
 
21
22
  class TraceHandler(HTTPEndpoint):
22
23
  traces: Traces
24
+ store: Optional[SpanStore]
23
25
 
24
26
  async def post(self, request: Request) -> Response:
25
27
  content_type = request.headers.get("content-type")
@@ -47,17 +49,12 @@ class TraceHandler(HTTPEndpoint):
47
49
  content="Request body is invalid ExportTraceServiceRequest",
48
50
  status_code=HTTP_422_UNPROCESSABLE_ENTITY,
49
51
  )
52
+ if self.store:
53
+ self.store.save(TracesData(resource_spans=req.resource_spans))
50
54
  for resource_spans in req.resource_spans:
51
- project_name = _get_project_name(resource_spans.resource.attributes)
55
+ project_name = get_project_name(resource_spans.resource.attributes)
52
56
  for scope_span in resource_spans.scope_spans:
53
57
  for span in scope_span.spans:
54
58
  self.traces.put(decode(span), project_name=project_name)
55
59
  await asyncio.sleep(0)
56
60
  return Response()
57
-
58
-
59
- def _get_project_name(attributes: Iterable[KeyValue]) -> Optional[str]:
60
- for kv in attributes:
61
- if kv.key == ResourceAttributes.PROJECT_NAME and (v := kv.value.string_value):
62
- return v
63
- return None
@@ -10,13 +10,14 @@ 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.core.project import DEFAULT_PROJECT_NAME, Project, WrappedSpan
13
+ from phoenix.core.project import Project, WrappedSpan
14
14
  from phoenix.metrics.retrieval_metrics import RetrievalMetrics
15
15
  from phoenix.server.api.context import Context
16
16
  from phoenix.server.api.types.DocumentRetrievalMetrics import DocumentRetrievalMetrics
17
17
  from phoenix.server.api.types.Evaluation import DocumentEvaluation, SpanEvaluation
18
18
  from phoenix.server.api.types.MimeType import MimeType
19
19
  from phoenix.trace.schemas import ComputedAttributes, SpanID
20
+ from phoenix.utilities.project import DEFAULT_PROJECT_NAME
20
21
 
21
22
  EMBEDDING_EMBEDDINGS = SpanAttributes.EMBEDDING_EMBEDDINGS
22
23
  EMBEDDING_VECTOR = EmbeddingAttributes.EMBEDDING_VECTOR
@@ -28,6 +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
32
 
32
33
  logger = logging.getLogger(__name__)
33
34
 
@@ -147,6 +148,7 @@ def create_app(
147
148
  umap_params: UMAPParameters,
148
149
  corpus: Optional[Model] = None,
149
150
  traces: Optional[Traces] = None,
151
+ span_store: Optional[SpanStore] = None,
150
152
  debug: bool = False,
151
153
  read_only: bool = False,
152
154
  ) -> Starlette:
@@ -173,7 +175,7 @@ def create_app(
173
175
  ),
174
176
  Route(
175
177
  "/v1/traces",
176
- type("TraceEndpoint", (TraceHandler,), {"traces": traces}),
178
+ type("TraceEndpoint", (TraceHandler,), {"traces": traces, "store": span_store}),
177
179
  ),
178
180
  Route(
179
181
  "/v1/evaluations",
@@ -11,7 +11,13 @@ from typing import Iterable, Optional, Protocol, TypeVar
11
11
  import pkg_resources
12
12
  from uvicorn import Config, Server
13
13
 
14
- from phoenix.config import EXPORT_DIR, get_env_host, get_env_port, get_pids_path
14
+ from phoenix.config import (
15
+ EXPORT_DIR,
16
+ get_env_host,
17
+ get_env_port,
18
+ get_pids_path,
19
+ get_storage_dir,
20
+ )
15
21
  from phoenix.core.model_schema_adapter import create_model_from_datasets
16
22
  from phoenix.core.traces import Traces
17
23
  from phoenix.datasets.dataset import EMPTY_DATASET, Dataset
@@ -23,6 +29,8 @@ from phoenix.pointcloud.umap_parameters import (
23
29
  UMAPParameters,
24
30
  )
25
31
  from phoenix.server.app import create_app
32
+ from phoenix.storage.spanstore import SpanStore
33
+ from phoenix.storage.spanstore.text_file import TextFileSpanStoreImpl
26
34
  from phoenix.trace.fixtures import (
27
35
  TRACES_FIXTURES,
28
36
  _download_traces_fixture,
@@ -31,6 +39,7 @@ from phoenix.trace.fixtures import (
31
39
  )
32
40
  from phoenix.trace.otel import decode, encode
33
41
  from phoenix.trace.span_json_decoder import json_string_to_span
42
+ from phoenix.utilities.project import get_project_name
34
43
 
35
44
  logger = logging.getLogger(__name__)
36
45
 
@@ -99,6 +108,15 @@ def _load_items(
99
108
  queue.put(item)
100
109
 
101
110
 
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
+
102
120
  DEFAULT_UMAP_PARAMS_STR = f"{DEFAULT_MIN_DIST},{DEFAULT_N_NEIGHBORS},{DEFAULT_N_SAMPLES}"
103
121
 
104
122
  if __name__ == "__main__":
@@ -124,6 +142,8 @@ if __name__ == "__main__":
124
142
  parser.add_argument("--debug", action="store_false")
125
143
  subparsers = parser.add_subparsers(dest="command", required=True)
126
144
  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)
127
147
  datasets_parser = subparsers.add_parser("datasets")
128
148
  datasets_parser.add_argument("--primary", type=str, required=True)
129
149
  datasets_parser.add_argument("--reference", type=str, required=False)
@@ -145,6 +165,7 @@ if __name__ == "__main__":
145
165
  demo_parser.add_argument("--simulate-streaming", action="store_true")
146
166
  args = parser.parse_args()
147
167
  export_path = Path(args.export_path) if args.export_path else EXPORT_DIR
168
+ span_store: Optional[SpanStore] = None
148
169
  if args.command == "datasets":
149
170
  primary_dataset_name = args.primary
150
171
  reference_dataset_name = args.reference
@@ -179,12 +200,19 @@ if __name__ == "__main__":
179
200
  )
180
201
  trace_dataset_name = args.trace_fixture
181
202
  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)
182
208
 
183
209
  model = create_model_from_datasets(
184
210
  primary_dataset,
185
211
  reference_dataset,
186
212
  )
187
213
  traces = Traces()
214
+ if span_store:
215
+ Thread(target=_load_from_store, args=(traces, span_store), daemon=True).start()
188
216
  if trace_dataset_name is not None:
189
217
  fixture_spans = list(
190
218
  # Apply `encode` here because legacy jsonl files contains UUIDs as strings.
@@ -221,6 +249,7 @@ if __name__ == "__main__":
221
249
  corpus=None if corpus_dataset is None else create_model_from_datasets(corpus_dataset),
222
250
  debug=args.debug,
223
251
  read_only=read_only,
252
+ span_store=span_store,
224
253
  )
225
254
  host = args.host or get_env_host()
226
255
  port = args.port or get_env_port()