arize-phoenix 3.10.0__tar.gz → 3.11.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.10.0 → arize_phoenix-3.11.1}/PKG-INFO +2 -2
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/pyproject.toml +1 -1
- arize_phoenix-3.11.1/src/phoenix/core/traces.py +84 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/Project.py +1 -1
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/Span.py +9 -12
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/static/index.js +398 -398
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/session/session.py +5 -2
- arize_phoenix-3.11.1/src/phoenix/trace/__init__.py +26 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/exporter.py +5 -12
- arize_phoenix-3.11.1/src/phoenix/trace/langchain/__init__.py +3 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/langchain/instrumentor.py +0 -2
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/llama_index/callback.py +0 -2
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/openai/instrumentor.py +0 -2
- arize_phoenix-3.11.1/src/phoenix/version.py +1 -0
- arize_phoenix-3.10.0/src/phoenix/core/traces.py +0 -156
- arize_phoenix-3.10.0/src/phoenix/trace/__init__.py +0 -10
- arize_phoenix-3.10.0/src/phoenix/trace/langchain/__init__.py +0 -26
- arize_phoenix-3.10.0/src/phoenix/trace/langchain/tracer.py +0 -47
- arize_phoenix-3.10.0/src/phoenix/trace/tracer.py +0 -99
- arize_phoenix-3.10.0/src/phoenix/version.py +0 -1
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/.gitignore +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/IP_NOTICE +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/LICENSE +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/README.md +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/config.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/core/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/core/embedding_dimension.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/core/model.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/core/model_schema.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/core/model_schema_adapter.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/core/project.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/datasets/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/datasets/dataset.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/datasets/errors.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/datasets/fixtures.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/datasets/schema.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/datasets/validation.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/datetime_utils.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/exceptions.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/evaluators.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/functions/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/functions/classify.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/functions/executor.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/functions/generate.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/functions/processing.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/models/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/models/anthropic.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/models/base.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/models/bedrock.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/models/litellm.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/models/openai.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/models/rate_limiters.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/models/vertex.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/models/vertexai.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/retrievals.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/templates/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/templates/default_templates.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/templates/template.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/utils/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/experimental/evals/utils/threads.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/metrics/README.md +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/metrics/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/metrics/binning.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/metrics/metrics.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/metrics/mixins.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/metrics/retrieval_metrics.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/metrics/timeseries.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/metrics/wrappers.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/pointcloud/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/pointcloud/clustering.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/pointcloud/pointcloud.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/pointcloud/projectors.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/pointcloud/umap_parameters.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/py.typed +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/context.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/helpers.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/input_types/Granularity.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/input_types/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/interceptor.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/routers/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/routers/evaluation_handler.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/routers/span_handler.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/routers/trace_handler.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/routers/utils.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/schema.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/Cluster.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/Dataset.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/DatasetRole.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/DatasetValues.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/Dimension.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/DimensionShape.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/DimensionType.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/Evaluation.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/Event.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/EventMetadata.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/ExportEventsMutation.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/ExportedFile.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/Functionality.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/MimeType.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/Model.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/NumericRange.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/PromptResponse.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/Retrieval.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/Segments.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/SortDir.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/TimeSeries.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/ValidationResult.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/node.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/api/types/pagination.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/app.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/main.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/static/apple-touch-icon.png +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/static/favicon.ico +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/static/index.css +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/static/modernizr.js +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/templates/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/templates/index.html +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/server/thread_server.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/services.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/session/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/session/client.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/session/data_extractor.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/session/evaluation.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/dsl/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/dsl/filter.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/dsl/helpers.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/dsl/missing.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/dsl/query.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/errors.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/evaluation_conventions.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/fixtures.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/llama_index/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/openai/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/otel.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/schemas.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/span_evaluations.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/span_json_decoder.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/span_json_encoder.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/trace_dataset.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/utils.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/v1/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/utilities/__init__.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/utilities/error_handling.py +0 -0
- {arize_phoenix-3.10.0 → arize_phoenix-3.11.1}/src/phoenix/utilities/logging.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: arize-phoenix
|
|
3
|
-
Version: 3.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 3.11.1
|
|
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
|
|
7
7
|
Project-URL: Source, https://github.com/Arize-ai/phoenix
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import weakref
|
|
2
|
+
from collections import defaultdict
|
|
3
|
+
from queue import SimpleQueue
|
|
4
|
+
from threading import RLock, Thread
|
|
5
|
+
from types import MethodType
|
|
6
|
+
from typing import DefaultDict, Iterator, Optional, Tuple, Union
|
|
7
|
+
|
|
8
|
+
from typing_extensions import assert_never
|
|
9
|
+
|
|
10
|
+
import phoenix.trace.v1 as pb
|
|
11
|
+
from phoenix.core.project import (
|
|
12
|
+
DEFAULT_PROJECT_NAME,
|
|
13
|
+
END_OF_QUEUE,
|
|
14
|
+
Project,
|
|
15
|
+
_ProjectName,
|
|
16
|
+
)
|
|
17
|
+
from phoenix.trace.schemas import Span
|
|
18
|
+
|
|
19
|
+
_SpanItem = Tuple[Span, _ProjectName]
|
|
20
|
+
_EvalItem = Tuple[pb.Evaluation, _ProjectName]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class Traces:
|
|
24
|
+
def __init__(self) -> None:
|
|
25
|
+
self._span_queue: "SimpleQueue[Optional[_SpanItem]]" = SimpleQueue()
|
|
26
|
+
self._eval_queue: "SimpleQueue[Optional[_EvalItem]]" = SimpleQueue()
|
|
27
|
+
# Putting `None` as the sentinel value for queue termination.
|
|
28
|
+
weakref.finalize(self, self._span_queue.put, END_OF_QUEUE)
|
|
29
|
+
weakref.finalize(self, self._eval_queue.put, END_OF_QUEUE)
|
|
30
|
+
self._lock = RLock()
|
|
31
|
+
self._projects: DefaultDict[_ProjectName, "Project"] = defaultdict(
|
|
32
|
+
Project,
|
|
33
|
+
{DEFAULT_PROJECT_NAME: Project()},
|
|
34
|
+
)
|
|
35
|
+
self._start_consumers()
|
|
36
|
+
|
|
37
|
+
def get_project(self, project_name: str) -> Optional["Project"]:
|
|
38
|
+
with self._lock:
|
|
39
|
+
return self._projects.get(project_name)
|
|
40
|
+
|
|
41
|
+
def get_projects(self) -> Iterator[Tuple[str, "Project"]]:
|
|
42
|
+
with self._lock:
|
|
43
|
+
projects = tuple(self._projects.items())
|
|
44
|
+
yield from projects
|
|
45
|
+
|
|
46
|
+
def put(
|
|
47
|
+
self,
|
|
48
|
+
item: Union[Span, pb.Evaluation],
|
|
49
|
+
project_name: Optional[str] = None,
|
|
50
|
+
) -> None:
|
|
51
|
+
if not project_name:
|
|
52
|
+
project_name = DEFAULT_PROJECT_NAME
|
|
53
|
+
if isinstance(item, Span):
|
|
54
|
+
self._span_queue.put((item, project_name))
|
|
55
|
+
elif isinstance(item, pb.Evaluation):
|
|
56
|
+
self._eval_queue.put((item, project_name))
|
|
57
|
+
else:
|
|
58
|
+
assert_never(item)
|
|
59
|
+
|
|
60
|
+
def _start_consumers(self) -> None:
|
|
61
|
+
Thread(
|
|
62
|
+
target=MethodType(self.__class__._consume_spans, weakref.proxy(self)),
|
|
63
|
+
args=(self._span_queue,),
|
|
64
|
+
daemon=True,
|
|
65
|
+
).start()
|
|
66
|
+
Thread(
|
|
67
|
+
target=MethodType(self.__class__._consume_evals, weakref.proxy(self)),
|
|
68
|
+
args=(self._eval_queue,),
|
|
69
|
+
daemon=True,
|
|
70
|
+
).start()
|
|
71
|
+
|
|
72
|
+
def _consume_spans(self, queue: "SimpleQueue[Optional[_SpanItem]]") -> None:
|
|
73
|
+
while (item := queue.get()) is not END_OF_QUEUE:
|
|
74
|
+
span, project_name = item
|
|
75
|
+
with self._lock:
|
|
76
|
+
project = self._projects[project_name]
|
|
77
|
+
project.add_span(span)
|
|
78
|
+
|
|
79
|
+
def _consume_evals(self, queue: "SimpleQueue[Optional[_EvalItem]]") -> None:
|
|
80
|
+
while (item := queue.get()) is not END_OF_QUEUE:
|
|
81
|
+
pb_eval, project_name = item
|
|
82
|
+
with self._lock:
|
|
83
|
+
project = self._projects[project_name]
|
|
84
|
+
project.add_eval(pb_eval)
|
|
@@ -112,7 +112,7 @@ class Project(Node):
|
|
|
112
112
|
spans = filter(predicate, spans)
|
|
113
113
|
if sort:
|
|
114
114
|
spans = sort(spans, evals=project)
|
|
115
|
-
data =
|
|
115
|
+
data = [to_gql_span(span, project) for span in spans]
|
|
116
116
|
return connection_from_list(data=data, args=args)
|
|
117
117
|
|
|
118
118
|
@strawberry.field(
|
|
@@ -10,7 +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.core.project import DEFAULT_PROJECT_NAME, WrappedSpan
|
|
13
|
+
from phoenix.core.project import DEFAULT_PROJECT_NAME, 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
|
|
@@ -95,6 +95,7 @@ class SpanEvent:
|
|
|
95
95
|
|
|
96
96
|
@strawberry.type
|
|
97
97
|
class Span:
|
|
98
|
+
project: strawberry.Private[Project]
|
|
98
99
|
name: str
|
|
99
100
|
status_code: SpanStatusCode
|
|
100
101
|
status_message: str
|
|
@@ -185,14 +186,10 @@ class Span:
|
|
|
185
186
|
info: Info[Context, None],
|
|
186
187
|
evaluation_name: Optional[str] = UNSET,
|
|
187
188
|
) -> List[DocumentRetrievalMetrics]:
|
|
188
|
-
if
|
|
189
|
-
not self.num_documents
|
|
190
|
-
or not (traces := info.context.traces)
|
|
191
|
-
or not (project := traces.get_project(DEFAULT_PROJECT_NAME))
|
|
192
|
-
):
|
|
189
|
+
if not self.num_documents:
|
|
193
190
|
return []
|
|
194
191
|
span_id = SpanID(str(self.context.span_id))
|
|
195
|
-
all_document_evaluation_names = project.get_document_evaluation_names(span_id)
|
|
192
|
+
all_document_evaluation_names = self.project.get_document_evaluation_names(span_id)
|
|
196
193
|
if not all_document_evaluation_names:
|
|
197
194
|
return []
|
|
198
195
|
if evaluation_name is UNSET:
|
|
@@ -203,7 +200,7 @@ class Span:
|
|
|
203
200
|
evaluation_names = [evaluation_name]
|
|
204
201
|
retrieval_metrics = []
|
|
205
202
|
for name in evaluation_names:
|
|
206
|
-
evaluation_scores = project.get_document_evaluation_scores(
|
|
203
|
+
evaluation_scores = self.project.get_document_evaluation_scores(
|
|
207
204
|
span_id=span_id,
|
|
208
205
|
evaluation_name=name,
|
|
209
206
|
num_documents=self.num_documents,
|
|
@@ -223,20 +220,20 @@ class Span:
|
|
|
223
220
|
self,
|
|
224
221
|
info: Info[Context, None],
|
|
225
222
|
) -> List["Span"]:
|
|
226
|
-
if (traces := info.context.traces) is None:
|
|
227
|
-
return []
|
|
228
223
|
return [
|
|
229
|
-
to_gql_span(span
|
|
224
|
+
to_gql_span(span, self.project)
|
|
225
|
+
for span in self.project.get_descendant_spans(SpanID(self.context.span_id))
|
|
230
226
|
]
|
|
231
227
|
|
|
232
228
|
|
|
233
|
-
def to_gql_span(span: WrappedSpan) -> "Span":
|
|
229
|
+
def to_gql_span(span: WrappedSpan, project: Project) -> "Span":
|
|
234
230
|
events: List[SpanEvent] = list(map(SpanEvent.from_event, span.events))
|
|
235
231
|
input_value = cast(Optional[str], span.attributes.get(INPUT_VALUE))
|
|
236
232
|
output_value = cast(Optional[str], span.attributes.get(OUTPUT_VALUE))
|
|
237
233
|
retrieval_documents = span.attributes.get(RETRIEVAL_DOCUMENTS)
|
|
238
234
|
num_documents = len(retrieval_documents) if isinstance(retrieval_documents, Sized) else None
|
|
239
235
|
return Span(
|
|
236
|
+
project=project,
|
|
240
237
|
name=span.name,
|
|
241
238
|
status_code=SpanStatusCode(span.status_code),
|
|
242
239
|
status_message=span.status_message,
|