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.
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/PKG-INFO +5 -4
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/pyproject.toml +9 -5
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/config.py +7 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/core/project.py +0 -1
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/core/traces.py +1 -1
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/routers/evaluation_handler.py +1 -1
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/routers/span_handler.py +1 -1
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/routers/trace_handler.py +8 -11
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Span.py +2 -1
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/app.py +3 -1
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/main.py +30 -1
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/index.js +195 -195
- arize_phoenix-3.14.1/src/phoenix/storage/__init__.py +0 -0
- arize_phoenix-3.14.1/src/phoenix/storage/spanstore/__init__.py +9 -0
- arize_phoenix-3.14.1/src/phoenix/storage/spanstore/text_file.py +85 -0
- arize_phoenix-3.14.1/src/phoenix/utilities/project.py +13 -0
- arize_phoenix-3.14.1/src/phoenix/version.py +1 -0
- arize_phoenix-3.13.1/src/phoenix/version.py +0 -1
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/.gitignore +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/IP_NOTICE +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/LICENSE +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/README.md +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/core/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/core/embedding_dimension.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/core/model.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/core/model_schema.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/core/model_schema_adapter.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/datasets/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/datasets/dataset.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/datasets/errors.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/datasets/fixtures.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/datasets/schema.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/datasets/validation.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/datetime_utils.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/exceptions.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/evaluators.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/functions/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/functions/classify.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/functions/executor.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/functions/generate.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/functions/processing.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/anthropic.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/base.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/bedrock.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/litellm.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/openai.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/rate_limiters.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/vertex.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/models/vertexai.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/retrievals.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/templates/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/templates/default_templates.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/templates/template.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/utils/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/experimental/evals/utils/threads.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/README.md +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/binning.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/metrics.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/mixins.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/retrieval_metrics.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/timeseries.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/metrics/wrappers.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/pointcloud/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/pointcloud/clustering.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/pointcloud/pointcloud.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/pointcloud/projectors.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/pointcloud/umap_parameters.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/py.typed +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/context.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/helpers.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/Granularity.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/input_types/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/interceptor.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/routers/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/routers/utils.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/schema.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Cluster.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Dataset.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DatasetRole.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DatasetValues.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Dimension.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DimensionShape.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DimensionType.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Evaluation.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Event.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/EventMetadata.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/ExportEventsMutation.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/ExportedFile.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Functionality.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/MimeType.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Model.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/NumericRange.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Project.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/PromptResponse.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Retrieval.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/Segments.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/SortDir.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/TimeSeries.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/ValidationResult.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/node.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/types/pagination.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/apple-touch-icon.png +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/favicon.ico +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/index.css +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/static/modernizr.js +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/templates/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/templates/index.html +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/thread_server.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/services.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/session/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/session/client.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/session/data_extractor.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/session/evaluation.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/session/session.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/dsl/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/dsl/filter.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/dsl/helpers.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/dsl/missing.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/dsl/query.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/errors.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/evaluation_conventions.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/exporter.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/fixtures.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/langchain/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/langchain/instrumentor.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/llama_index/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/llama_index/callback.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/openai/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/openai/instrumentor.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/otel.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/projects.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/schemas.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/span_evaluations.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/span_json_decoder.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/span_json_encoder.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/trace_dataset.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/utils.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/v1/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/utilities/__init__.py +0 -0
- {arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/utilities/error_handling.py +0 -0
- {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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
25
|
+
"scikit-learn",
|
|
26
26
|
"numpy",
|
|
27
27
|
"pandas",
|
|
28
28
|
"jinja2",
|
|
29
29
|
"umap-learn",
|
|
30
|
-
"hdbscan>=0.8.33
|
|
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
|
|
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
|
|
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.
|
|
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"
|
|
@@ -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]
|
{arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/routers/evaluation_handler.py
RENAMED
|
@@ -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):
|
{arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/routers/span_handler.py
RENAMED
|
@@ -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):
|
{arize_phoenix-3.13.1 → arize_phoenix-3.14.1}/src/phoenix/server/api/routers/trace_handler.py
RENAMED
|
@@ -1,25 +1,27 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import gzip
|
|
3
3
|
import zlib
|
|
4
|
-
from typing import
|
|
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.
|
|
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 =
|
|
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
|
|
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
|
|
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()
|