arize-phoenix 3.9.0__tar.gz → 3.10.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of arize-phoenix might be problematic. Click here for more details.
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/PKG-INFO +1 -1
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/config.py +8 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/schema.py +1 -196
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/Dataset.py +5 -2
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/Project.py +17 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/static/index.js +293 -262
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/session/client.py +8 -1
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/session/session.py +72 -5
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/langchain/instrumentor.py +6 -1
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/llama_index/callback.py +50 -24
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/openai/instrumentor.py +6 -1
- arize_phoenix-3.10.0/src/phoenix/version.py +1 -0
- arize_phoenix-3.9.0/src/phoenix/server/api/types/DatasetInfo.py +0 -24
- arize_phoenix-3.9.0/src/phoenix/version.py +0 -1
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/.gitignore +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/IP_NOTICE +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/LICENSE +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/README.md +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/pyproject.toml +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/core/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/core/embedding_dimension.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/core/model.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/core/model_schema.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/core/model_schema_adapter.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/core/project.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/core/traces.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/datasets/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/datasets/dataset.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/datasets/errors.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/datasets/fixtures.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/datasets/schema.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/datasets/validation.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/datetime_utils.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/exceptions.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/evaluators.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/functions/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/functions/classify.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/functions/executor.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/functions/generate.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/functions/processing.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/models/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/models/anthropic.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/models/base.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/models/bedrock.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/models/litellm.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/models/openai.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/models/rate_limiters.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/models/vertex.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/models/vertexai.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/retrievals.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/templates/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/templates/default_templates.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/templates/template.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/utils/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/experimental/evals/utils/threads.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/metrics/README.md +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/metrics/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/metrics/binning.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/metrics/metrics.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/metrics/mixins.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/metrics/timeseries.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/metrics/wrappers.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/pointcloud/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/pointcloud/clustering.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/pointcloud/projectors.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/py.typed +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/context.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/helpers.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/interceptor.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/routers/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/routers/evaluation_handler.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/routers/span_handler.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/routers/trace_handler.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/routers/utils.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/Cluster.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/DatasetRole.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/Dimension.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/Event.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/ExportEventsMutation.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/Functionality.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/MimeType.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/Model.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/Segments.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/SortDir.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/Span.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/node.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/api/types/pagination.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/app.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/main.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/static/favicon.ico +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/static/index.css +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/static/modernizr.js +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/templates/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/templates/index.html +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/server/thread_server.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/services.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/session/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/session/data_extractor.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/session/evaluation.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/dsl/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/dsl/filter.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/dsl/helpers.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/dsl/missing.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/dsl/query.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/errors.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/exporter.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/fixtures.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/langchain/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/langchain/tracer.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/llama_index/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/openai/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/otel.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/schemas.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/span_evaluations.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/span_json_decoder.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/span_json_encoder.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/trace_dataset.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/tracer.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/utils.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/v1/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/utilities/__init__.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/utilities/error_handling.py +0 -0
- {arize_phoenix-3.9.0 → arize_phoenix-3.10.0}/src/phoenix/utilities/logging.py +0 -0
|
@@ -17,6 +17,10 @@ ENV_PHOENIX_WORKING_DIR = "PHOENIX_WORKING_DIR"
|
|
|
17
17
|
The directory in which to save, load, and export datasets. This directory must
|
|
18
18
|
be accessible by both the Phoenix server and the notebook environment.
|
|
19
19
|
"""
|
|
20
|
+
ENV_PHOENIX_PROJECT_NAME = "PHOENIX_PROJECT_NAME"
|
|
21
|
+
"""
|
|
22
|
+
The project name to use when logging traces and evals. defaults to 'default'.
|
|
23
|
+
"""
|
|
20
24
|
|
|
21
25
|
|
|
22
26
|
def _get_temp_path() -> Path:
|
|
@@ -113,3 +117,7 @@ def get_env_host() -> str:
|
|
|
113
117
|
|
|
114
118
|
def get_env_collector_endpoint() -> Optional[str]:
|
|
115
119
|
return os.getenv(ENV_PHOENIX_COLLECTOR_ENDPOINT)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def get_env_project_name() -> str:
|
|
123
|
+
return os.getenv(ENV_PHOENIX_PROJECT_NAME) or "default"
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
from collections import defaultdict
|
|
2
|
-
from
|
|
3
|
-
from itertools import chain
|
|
4
|
-
from typing import Dict, List, Optional, Set, Tuple, Union, cast
|
|
2
|
+
from typing import Dict, List, Optional, Set, Union
|
|
5
3
|
|
|
6
4
|
import numpy as np
|
|
7
5
|
import numpy.typing as npt
|
|
@@ -10,7 +8,6 @@ from strawberry import ID, UNSET
|
|
|
10
8
|
from strawberry.types import Info
|
|
11
9
|
from typing_extensions import Annotated
|
|
12
10
|
|
|
13
|
-
from phoenix.core.project import DEFAULT_PROJECT_NAME
|
|
14
11
|
from phoenix.pointcloud.clustering import Hdbscan
|
|
15
12
|
from phoenix.server.api.helpers import ensure_list
|
|
16
13
|
from phoenix.server.api.input_types.ClusterInput import ClusterInput
|
|
@@ -18,15 +15,10 @@ from phoenix.server.api.input_types.Coordinates import (
|
|
|
18
15
|
InputCoordinate2D,
|
|
19
16
|
InputCoordinate3D,
|
|
20
17
|
)
|
|
21
|
-
from phoenix.server.api.input_types.SpanSort import SpanSort
|
|
22
18
|
from phoenix.server.api.types.Cluster import Cluster, to_gql_clusters
|
|
23
19
|
from phoenix.server.api.types.Project import Project
|
|
24
|
-
from phoenix.trace.dsl import SpanFilter
|
|
25
|
-
from phoenix.trace.schemas import SpanID, TraceID
|
|
26
20
|
|
|
27
21
|
from .context import Context
|
|
28
|
-
from .input_types.TimeRange import TimeRange
|
|
29
|
-
from .types.DatasetInfo import TraceDatasetInfo
|
|
30
22
|
from .types.DatasetRole import AncillaryDatasetRole, DatasetRole
|
|
31
23
|
from .types.Dimension import to_gql_dimension
|
|
32
24
|
from .types.EmbeddingDimension import (
|
|
@@ -35,15 +27,12 @@ from .types.EmbeddingDimension import (
|
|
|
35
27
|
DEFAULT_MIN_SAMPLES,
|
|
36
28
|
to_gql_embedding_dimension,
|
|
37
29
|
)
|
|
38
|
-
from .types.EvaluationSummary import EvaluationSummary
|
|
39
30
|
from .types.Event import create_event_id, unpack_event_id
|
|
40
31
|
from .types.ExportEventsMutation import ExportEventsMutation
|
|
41
32
|
from .types.Functionality import Functionality
|
|
42
33
|
from .types.Model import Model
|
|
43
34
|
from .types.node import GlobalID, Node, from_global_id
|
|
44
35
|
from .types.pagination import Connection, ConnectionArgs, Cursor, connection_from_list
|
|
45
|
-
from .types.Span import Span, to_gql_span
|
|
46
|
-
from .types.ValidationResult import ValidationResult
|
|
47
36
|
|
|
48
37
|
|
|
49
38
|
@strawberry.type
|
|
@@ -233,190 +222,6 @@ class Query:
|
|
|
233
222
|
clustered_events=clustered_events,
|
|
234
223
|
)
|
|
235
224
|
|
|
236
|
-
@strawberry.field
|
|
237
|
-
def streaming_last_updated_at(
|
|
238
|
-
self,
|
|
239
|
-
info: Info[Context, None],
|
|
240
|
-
) -> Optional[datetime]:
|
|
241
|
-
last_updated_at: Optional[datetime] = None
|
|
242
|
-
if (traces := info.context.traces) is not None and (
|
|
243
|
-
traces_last_updated_at := traces.last_updated_at
|
|
244
|
-
) is not None:
|
|
245
|
-
last_updated_at = (
|
|
246
|
-
traces_last_updated_at
|
|
247
|
-
if last_updated_at is None
|
|
248
|
-
else max(last_updated_at, traces_last_updated_at)
|
|
249
|
-
)
|
|
250
|
-
return last_updated_at
|
|
251
|
-
|
|
252
|
-
@strawberry.field
|
|
253
|
-
def spans(
|
|
254
|
-
self,
|
|
255
|
-
info: Info[Context, None],
|
|
256
|
-
time_range: Optional[TimeRange] = UNSET,
|
|
257
|
-
trace_ids: Optional[List[ID]] = UNSET,
|
|
258
|
-
first: Optional[int] = 50,
|
|
259
|
-
last: Optional[int] = UNSET,
|
|
260
|
-
after: Optional[Cursor] = UNSET,
|
|
261
|
-
before: Optional[Cursor] = UNSET,
|
|
262
|
-
sort: Optional[SpanSort] = UNSET,
|
|
263
|
-
root_spans_only: Optional[bool] = UNSET,
|
|
264
|
-
filter_condition: Optional[str] = UNSET,
|
|
265
|
-
) -> Connection[Span]:
|
|
266
|
-
args = ConnectionArgs(
|
|
267
|
-
first=first,
|
|
268
|
-
after=after if isinstance(after, Cursor) else None,
|
|
269
|
-
last=last,
|
|
270
|
-
before=before if isinstance(before, Cursor) else None,
|
|
271
|
-
)
|
|
272
|
-
if not (traces := info.context.traces) or not (
|
|
273
|
-
project := traces.get_project(DEFAULT_PROJECT_NAME)
|
|
274
|
-
):
|
|
275
|
-
return connection_from_list(data=[], args=args)
|
|
276
|
-
predicate = (
|
|
277
|
-
SpanFilter(
|
|
278
|
-
condition=filter_condition,
|
|
279
|
-
evals=project,
|
|
280
|
-
)
|
|
281
|
-
if filter_condition
|
|
282
|
-
else None
|
|
283
|
-
)
|
|
284
|
-
if not trace_ids:
|
|
285
|
-
spans = traces.get_spans(
|
|
286
|
-
start_time=time_range.start if time_range else None,
|
|
287
|
-
stop_time=time_range.end if time_range else None,
|
|
288
|
-
root_spans_only=root_spans_only,
|
|
289
|
-
)
|
|
290
|
-
else:
|
|
291
|
-
spans = chain.from_iterable(
|
|
292
|
-
traces.get_trace(trace_id) for trace_id in map(TraceID, trace_ids)
|
|
293
|
-
)
|
|
294
|
-
if predicate:
|
|
295
|
-
spans = filter(predicate, spans)
|
|
296
|
-
if sort:
|
|
297
|
-
spans = sort(spans, evals=project)
|
|
298
|
-
data = list(map(to_gql_span, spans))
|
|
299
|
-
return connection_from_list(data=data, args=args)
|
|
300
|
-
|
|
301
|
-
@strawberry.field(
|
|
302
|
-
description="Names of all available evaluations for spans. "
|
|
303
|
-
"(The list contains no duplicates.)"
|
|
304
|
-
) # type: ignore
|
|
305
|
-
def span_evaluation_names(
|
|
306
|
-
self,
|
|
307
|
-
info: Info[Context, None],
|
|
308
|
-
) -> List[str]:
|
|
309
|
-
if not (traces := info.context.traces) or not (
|
|
310
|
-
project := traces.get_project(DEFAULT_PROJECT_NAME)
|
|
311
|
-
):
|
|
312
|
-
return []
|
|
313
|
-
return project.get_span_evaluation_names()
|
|
314
|
-
|
|
315
|
-
@strawberry.field(
|
|
316
|
-
description="Names of available document evaluations.",
|
|
317
|
-
) # type: ignore
|
|
318
|
-
def document_evaluation_names(
|
|
319
|
-
self,
|
|
320
|
-
info: Info[Context, None],
|
|
321
|
-
span_id: Optional[ID] = UNSET,
|
|
322
|
-
) -> List[str]:
|
|
323
|
-
if not (traces := info.context.traces) or not (
|
|
324
|
-
project := traces.get_project(DEFAULT_PROJECT_NAME)
|
|
325
|
-
):
|
|
326
|
-
return []
|
|
327
|
-
return project.get_document_evaluation_names(
|
|
328
|
-
None if span_id is UNSET else SpanID(span_id),
|
|
329
|
-
)
|
|
330
|
-
|
|
331
|
-
@strawberry.field
|
|
332
|
-
def span_evaluation_summary(
|
|
333
|
-
self,
|
|
334
|
-
info: Info[Context, None],
|
|
335
|
-
evaluation_name: str,
|
|
336
|
-
time_range: Optional[TimeRange] = UNSET,
|
|
337
|
-
filter_condition: Optional[str] = UNSET,
|
|
338
|
-
) -> Optional[EvaluationSummary]:
|
|
339
|
-
if not (traces := info.context.traces) or not (
|
|
340
|
-
project := traces.get_project(DEFAULT_PROJECT_NAME)
|
|
341
|
-
):
|
|
342
|
-
return None
|
|
343
|
-
predicate = (
|
|
344
|
-
SpanFilter(
|
|
345
|
-
condition=filter_condition,
|
|
346
|
-
evals=project,
|
|
347
|
-
)
|
|
348
|
-
if filter_condition
|
|
349
|
-
else None
|
|
350
|
-
)
|
|
351
|
-
span_ids = project.get_span_evaluation_span_ids(evaluation_name)
|
|
352
|
-
if not span_ids:
|
|
353
|
-
return None
|
|
354
|
-
spans = traces.get_spans(
|
|
355
|
-
start_time=time_range.start if time_range else None,
|
|
356
|
-
stop_time=time_range.end if time_range else None,
|
|
357
|
-
span_ids=span_ids,
|
|
358
|
-
)
|
|
359
|
-
if predicate:
|
|
360
|
-
spans = filter(predicate, spans)
|
|
361
|
-
evaluations = tuple(
|
|
362
|
-
evaluation
|
|
363
|
-
for span in spans
|
|
364
|
-
if (
|
|
365
|
-
evaluation := project.get_span_evaluation(
|
|
366
|
-
span.context.span_id,
|
|
367
|
-
evaluation_name,
|
|
368
|
-
)
|
|
369
|
-
)
|
|
370
|
-
is not None
|
|
371
|
-
)
|
|
372
|
-
if not evaluations:
|
|
373
|
-
return None
|
|
374
|
-
labels = project.get_span_evaluation_labels(evaluation_name)
|
|
375
|
-
return EvaluationSummary(evaluations, labels)
|
|
376
|
-
|
|
377
|
-
@strawberry.field
|
|
378
|
-
def trace_dataset_info(
|
|
379
|
-
self,
|
|
380
|
-
info: Info[Context, None],
|
|
381
|
-
) -> Optional[TraceDatasetInfo]:
|
|
382
|
-
if (traces := info.context.traces) is None:
|
|
383
|
-
return None
|
|
384
|
-
if not (span_count := traces.span_count):
|
|
385
|
-
return None
|
|
386
|
-
start_time, stop_time = cast(
|
|
387
|
-
Tuple[datetime, datetime],
|
|
388
|
-
traces.right_open_time_range,
|
|
389
|
-
)
|
|
390
|
-
latency_ms_p50, latency_ms_p99 = traces.root_span_latency_ms_quantiles(0.50, 0.99)
|
|
391
|
-
return TraceDatasetInfo(
|
|
392
|
-
start_time=start_time,
|
|
393
|
-
end_time=stop_time,
|
|
394
|
-
record_count=span_count,
|
|
395
|
-
token_count_total=traces.token_count_total,
|
|
396
|
-
latency_ms_p50=latency_ms_p50,
|
|
397
|
-
latency_ms_p99=latency_ms_p99,
|
|
398
|
-
)
|
|
399
|
-
|
|
400
|
-
@strawberry.field
|
|
401
|
-
def validate_span_filter_condition(
|
|
402
|
-
self, info: Info[Context, None], condition: str
|
|
403
|
-
) -> ValidationResult:
|
|
404
|
-
traces = info.context.traces
|
|
405
|
-
project = traces.get_project(DEFAULT_PROJECT_NAME) if traces else None
|
|
406
|
-
valid_eval_names = project.get_span_evaluation_names() if project else ()
|
|
407
|
-
try:
|
|
408
|
-
SpanFilter(
|
|
409
|
-
condition=condition,
|
|
410
|
-
evals=project,
|
|
411
|
-
valid_eval_names=valid_eval_names,
|
|
412
|
-
)
|
|
413
|
-
return ValidationResult(is_valid=True, error_message=None)
|
|
414
|
-
except SyntaxError as e:
|
|
415
|
-
return ValidationResult(
|
|
416
|
-
is_valid=False,
|
|
417
|
-
error_message=e.msg,
|
|
418
|
-
)
|
|
419
|
-
|
|
420
225
|
|
|
421
226
|
@strawberry.type
|
|
422
227
|
class Mutation(ExportEventsMutation): ...
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from datetime import datetime
|
|
1
2
|
from typing import Iterable, List, Optional, Set, Union
|
|
2
3
|
|
|
3
4
|
import strawberry
|
|
@@ -8,14 +9,16 @@ import phoenix.core.model_schema as ms
|
|
|
8
9
|
from phoenix.core.model_schema import FEATURE, TAG, ScalarDimension
|
|
9
10
|
|
|
10
11
|
from ..input_types.DimensionInput import DimensionInput
|
|
11
|
-
from .DatasetInfo import DatasetInfo
|
|
12
12
|
from .DatasetRole import AncillaryDatasetRole, DatasetRole
|
|
13
13
|
from .Dimension import Dimension, to_gql_dimension
|
|
14
14
|
from .Event import Event, create_event, create_event_id, parse_event_ids_by_dataset_role
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
@strawberry.type
|
|
18
|
-
class Dataset
|
|
18
|
+
class Dataset:
|
|
19
|
+
start_time: datetime = strawberry.field(description="The start bookend of the data")
|
|
20
|
+
end_time: datetime = strawberry.field(description="The end bookend of the data")
|
|
21
|
+
record_count: int = strawberry.field(description="The record count of the data")
|
|
19
22
|
dataset: strawberry.Private[ms.Dataset]
|
|
20
23
|
dataset_role: strawberry.Private[Union[DatasetRole, AncillaryDatasetRole]]
|
|
21
24
|
model: strawberry.Private[ms.Model]
|
|
@@ -19,6 +19,7 @@ from phoenix.server.api.types.pagination import (
|
|
|
19
19
|
connection_from_list,
|
|
20
20
|
)
|
|
21
21
|
from phoenix.server.api.types.Span import Span, to_gql_span
|
|
22
|
+
from phoenix.server.api.types.ValidationResult import ValidationResult
|
|
22
23
|
from phoenix.trace.dsl import SpanFilter
|
|
23
24
|
from phoenix.trace.schemas import SpanID, TraceID
|
|
24
25
|
|
|
@@ -219,3 +220,19 @@ class Project(Node):
|
|
|
219
220
|
self,
|
|
220
221
|
) -> Optional[datetime]:
|
|
221
222
|
return self.project.last_updated_at
|
|
223
|
+
|
|
224
|
+
@strawberry.field
|
|
225
|
+
def validate_span_filter_condition(self, condition: str) -> ValidationResult:
|
|
226
|
+
valid_eval_names = self.project.get_span_evaluation_names()
|
|
227
|
+
try:
|
|
228
|
+
SpanFilter(
|
|
229
|
+
condition=condition,
|
|
230
|
+
evals=self.project,
|
|
231
|
+
valid_eval_names=valid_eval_names,
|
|
232
|
+
)
|
|
233
|
+
return ValidationResult(is_valid=True, error_message=None)
|
|
234
|
+
except SyntaxError as e:
|
|
235
|
+
return ValidationResult(
|
|
236
|
+
is_valid=False,
|
|
237
|
+
error_message=e.msg,
|
|
238
|
+
)
|