arize-phoenix 4.10.1__tar.gz → 4.10.2rc1__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.
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/PKG-INFO +4 -3
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/pyproject.toml +15 -7
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/context.py +5 -7
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/__init__.py +2 -0
- arize_phoenix-4.10.2rc1/src/phoenix/server/api/dataloaders/span_annotations.py +35 -0
- arize_phoenix-4.10.2rc1/src/phoenix/server/api/openapi/main.py +22 -0
- arize_phoenix-4.10.2rc1/src/phoenix/server/api/openapi/schema.py +16 -0
- arize_phoenix-4.10.2rc1/src/phoenix/server/api/routers/v1/__init__.py +42 -0
- arize_phoenix-4.10.2rc1/src/phoenix/server/api/routers/v1/dataset_examples.py +157 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/routers/v1/datasets.py +389 -507
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/routers/v1/evaluations.py +74 -64
- arize_phoenix-4.10.2rc1/src/phoenix/server/api/routers/v1/experiment_evaluations.py +112 -0
- arize_phoenix-4.10.2rc1/src/phoenix/server/api/routers/v1/experiment_runs.py +159 -0
- arize_phoenix-4.10.2rc1/src/phoenix/server/api/routers/v1/experiments.py +251 -0
- arize_phoenix-4.10.2rc1/src/phoenix/server/api/routers/v1/spans.py +243 -0
- arize_phoenix-4.10.2rc1/src/phoenix/server/api/routers/v1/traces.py +213 -0
- arize_phoenix-4.10.2rc1/src/phoenix/server/api/routers/v1/utils.py +94 -0
- arize_phoenix-4.10.2rc1/src/phoenix/server/api/types/Annotation.py +21 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/Evaluation.py +4 -22
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/Span.py +15 -4
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/SpanAnnotation.py +4 -6
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/app.py +149 -174
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/thread_server.py +2 -2
- arize_phoenix-4.10.2rc1/src/phoenix/version.py +1 -0
- arize_phoenix-4.10.1/src/phoenix/server/api/openapi/main.py +0 -6
- arize_phoenix-4.10.1/src/phoenix/server/api/openapi/schema.py +0 -16
- arize_phoenix-4.10.1/src/phoenix/server/api/routers/v1/__init__.py +0 -89
- arize_phoenix-4.10.1/src/phoenix/server/api/routers/v1/dataset_examples.py +0 -178
- arize_phoenix-4.10.1/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -136
- arize_phoenix-4.10.1/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -217
- arize_phoenix-4.10.1/src/phoenix/server/api/routers/v1/experiments.py +0 -301
- arize_phoenix-4.10.1/src/phoenix/server/api/routers/v1/spans.py +0 -275
- arize_phoenix-4.10.1/src/phoenix/server/api/routers/v1/traces.py +0 -228
- arize_phoenix-4.10.1/src/phoenix/server/openapi/docs.py +0 -221
- arize_phoenix-4.10.1/src/phoenix/version.py +0 -1
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/.gitignore +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/IP_NOTICE +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/LICENSE +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/README.md +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/examples/manually-instrumented-chatbot/chat-service/chat/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/examples/manually-instrumented-chatbot/chat-service/chat/app.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/examples/manually-instrumented-chatbot/chat-service/chat/types.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/examples/manually-instrumented-chatbot/frontend/Dockerfile +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/examples/manually-instrumented-chatbot/frontend/Makefile +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/examples/manually-instrumented-chatbot/frontend/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/examples/manually-instrumented-chatbot/frontend/pyproject.toml +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/examples/manually-instrumented-chatbot/frontend/requirements.txt +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/examples/manually-instrumented-chatbot/frontend/schema.json +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/config.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/core/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/core/embedding_dimension.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/core/model.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/core/model_schema.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/core/model_schema_adapter.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/datetime_utils.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/README.md +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/alembic.ini +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/bulk_inserter.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/engines.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/helpers.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/insertion/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/insertion/dataset.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/insertion/evaluation.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/insertion/helpers.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/insertion/span.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/migrate.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/migrations/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/migrations/env.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/migrations/script.py.mako +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/migrations/types.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/db/models.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/exceptions.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/experiments/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/experiments/evaluators/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/experiments/evaluators/base.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/experiments/evaluators/utils.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/experiments/functions.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/experiments/tracing.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/experiments/types.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/experiments/utils.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/inferences/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/inferences/errors.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/inferences/fixtures.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/inferences/inferences.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/inferences/schema.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/inferences/validation.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/metrics/README.md +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/metrics/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/metrics/binning.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/metrics/metrics.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/metrics/mixins.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/metrics/retrieval_metrics.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/metrics/timeseries.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/metrics/wrappers.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/pointcloud/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/pointcloud/clustering.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/pointcloud/pointcloud.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/pointcloud/projectors.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/pointcloud/umap_parameters.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/py.typed +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/evaluation_summaries.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/span_evaluations.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/trace_evaluations.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/trace_row_ids.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/helpers/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/CreateSpanAnnotationsInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/CreateTraceAnnotationsInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/Granularity.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/PatchAnnotationsInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/input_types/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/interceptor.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/mutations/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/mutations/auth.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/openapi/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/queries.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/routers/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/routers/utils.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/schema.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/Cluster.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/Dataset.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/DatasetExample.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/DatasetValues.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/Dimension.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/DimensionShape.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/DimensionType.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/Event.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/EventMetadata.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/Experiment.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/ExportedFile.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/Functionality.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/Inferences.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/InferencesRole.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/MimeType.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/Model.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/NumericRange.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/Project.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/PromptResponse.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/Retrieval.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/Segments.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/SortDir.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/TimeSeries.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/Trace.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/ValidationResult.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/node.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/types/pagination.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/utils.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/grpc_server.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/main.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/openapi/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/prometheus.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/static/apple-touch-icon.png +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/static/favicon.ico +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/static/index.css +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/static/index.js +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/static/modernizr.js +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/telemetry.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/templates/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/templates/index.html +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/services.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/session/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/session/client.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/session/data_extractor.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/session/evaluation.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/session/session.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/settings.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/attributes.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/dsl/README.md +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/dsl/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/dsl/filter.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/dsl/helpers.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/dsl/query.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/errors.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/evaluation_conventions.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/exporter.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/fixtures.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/langchain/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/langchain/instrumentor.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/llama_index/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/llama_index/callback.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/openai/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/openai/instrumentor.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/otel.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/projects.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/schemas.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/span_evaluations.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/span_json_decoder.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/span_json_encoder.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/trace_dataset.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/utils.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/v1/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/utilities/__init__.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/utilities/deprecation.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/utilities/error_handling.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/utilities/json.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/utilities/logging.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/utilities/project.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/utilities/re.py +0 -0
- {arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/utilities/span_store.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: arize-phoenix
|
|
3
|
-
Version: 4.10.
|
|
3
|
+
Version: 4.10.2rc1
|
|
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
|
|
@@ -22,6 +22,7 @@ Requires-Dist: aiosqlite
|
|
|
22
22
|
Requires-Dist: alembic<2,>=1.3.0
|
|
23
23
|
Requires-Dist: arize-phoenix-evals>=0.13.1
|
|
24
24
|
Requires-Dist: cachetools
|
|
25
|
+
Requires-Dist: fastapi
|
|
25
26
|
Requires-Dist: grpcio
|
|
26
27
|
Requires-Dist: hdbscan>=0.8.33
|
|
27
28
|
Requires-Dist: httpx
|
|
@@ -40,8 +41,8 @@ Requires-Dist: pandas>=1.0
|
|
|
40
41
|
Requires-Dist: protobuf<6.0,>=3.20
|
|
41
42
|
Requires-Dist: psutil
|
|
42
43
|
Requires-Dist: pyarrow
|
|
44
|
+
Requires-Dist: pydantic<3,>=1.0
|
|
43
45
|
Requires-Dist: python-multipart
|
|
44
|
-
Requires-Dist: pyyaml
|
|
45
46
|
Requires-Dist: scikit-learn
|
|
46
47
|
Requires-Dist: scipy
|
|
47
48
|
Requires-Dist: sqlalchemy[asyncio]<3,>=2.0.4
|
|
@@ -56,9 +57,9 @@ Requires-Dist: uvicorn
|
|
|
56
57
|
Requires-Dist: wrapt
|
|
57
58
|
Provides-Extra: container
|
|
58
59
|
Requires-Dist: opentelemetry-exporter-otlp; extra == 'container'
|
|
60
|
+
Requires-Dist: opentelemetry-instrumentation-fastapi; extra == 'container'
|
|
59
61
|
Requires-Dist: opentelemetry-instrumentation-grpc; extra == 'container'
|
|
60
62
|
Requires-Dist: opentelemetry-instrumentation-sqlalchemy; extra == 'container'
|
|
61
|
-
Requires-Dist: opentelemetry-instrumentation-starlette; extra == 'container'
|
|
62
63
|
Requires-Dist: opentelemetry-proto>=1.12.0; extra == 'container'
|
|
63
64
|
Requires-Dist: opentelemetry-sdk; extra == 'container'
|
|
64
65
|
Requires-Dist: opentelemetry-semantic-conventions; extra == 'container'
|
|
@@ -59,7 +59,8 @@ dependencies = [
|
|
|
59
59
|
"cachetools",
|
|
60
60
|
"python-multipart", # see https://www.starlette.io/#dependencies
|
|
61
61
|
"arize-phoenix-evals>=0.13.1",
|
|
62
|
-
"
|
|
62
|
+
"fastapi",
|
|
63
|
+
"pydantic>=1.0,<3",
|
|
63
64
|
]
|
|
64
65
|
dynamic = ["version"]
|
|
65
66
|
|
|
@@ -109,7 +110,7 @@ container = [
|
|
|
109
110
|
"opentelemetry-proto>=1.12.0",
|
|
110
111
|
"opentelemetry-exporter-otlp",
|
|
111
112
|
"opentelemetry-semantic-conventions",
|
|
112
|
-
"opentelemetry-instrumentation-
|
|
113
|
+
"opentelemetry-instrumentation-fastapi",
|
|
113
114
|
"opentelemetry-instrumentation-sqlalchemy",
|
|
114
115
|
"opentelemetry-instrumentation-grpc",
|
|
115
116
|
"py-grpc-prometheus",
|
|
@@ -159,8 +160,10 @@ dependencies = [
|
|
|
159
160
|
"protobuf==3.20", # version minimum (for tests)
|
|
160
161
|
"responses",
|
|
161
162
|
"tiktoken",
|
|
162
|
-
"typing-extensions==4.5.0; python_version
|
|
163
|
-
"typing-extensions==4.6.0; python_version
|
|
163
|
+
"typing-extensions==4.5.0; python_version=='3.8'",
|
|
164
|
+
"typing-extensions==4.6.0; python_version=='3.9'",
|
|
165
|
+
"pydantic==1.9.0; python_version<='3.9'", # minimum version of pydantic compatible with openai
|
|
166
|
+
"pydantic==2.8.2; python_version=='3.12'",
|
|
164
167
|
"httpx", # For OpenAI testing
|
|
165
168
|
"respx", # For OpenAI testing
|
|
166
169
|
"nest-asyncio", # for executor testing
|
|
@@ -187,12 +190,15 @@ dependencies = [
|
|
|
187
190
|
"opentelemetry-proto>=1.12.0",
|
|
188
191
|
"opentelemetry-exporter-otlp",
|
|
189
192
|
"opentelemetry-semantic-conventions",
|
|
190
|
-
"opentelemetry-instrumentation-
|
|
193
|
+
"opentelemetry-instrumentation-fastapi",
|
|
191
194
|
"opentelemetry-instrumentation-sqlalchemy",
|
|
192
195
|
"opentelemetry-instrumentation-grpc",
|
|
193
196
|
"py-grpc-prometheus",
|
|
194
197
|
"strawberry-graphql[opentelemetry]==0.235.0", # need to pin version because we're monkey-patching
|
|
195
198
|
"requests", # this is needed to type-check third-party packages
|
|
199
|
+
"pydantic==1.10.17; python_version=='3.8'", # lower minor versions of pydantic break strawberry mypy plugin
|
|
200
|
+
"pydantic==1.10.17; python_version=='3.9'", # lower minor versions of pydantic break strawberry mypy plugin
|
|
201
|
+
"pydantic==2.8.2; python_version=='3.12'",
|
|
196
202
|
]
|
|
197
203
|
|
|
198
204
|
[[tool.hatch.envs.type.matrix]]
|
|
@@ -307,11 +313,12 @@ build = 'strawberry export-schema phoenix.server.api.schema:schema > app/schema.
|
|
|
307
313
|
|
|
308
314
|
[tool.hatch.envs.openapi]
|
|
309
315
|
dependencies = [
|
|
310
|
-
"
|
|
316
|
+
"pydantic==2.8.2",
|
|
317
|
+
"fastapi==0.111.0",
|
|
311
318
|
]
|
|
312
319
|
|
|
313
320
|
[tool.hatch.envs.openapi.scripts]
|
|
314
|
-
build =
|
|
321
|
+
build = "python -m phoenix.server.api.openapi.main > schemas/openapi.json"
|
|
315
322
|
|
|
316
323
|
[tool.hatch.envs.proto]
|
|
317
324
|
detached = true
|
|
@@ -376,6 +383,7 @@ module = [
|
|
|
376
383
|
"sqlean",
|
|
377
384
|
"grpc.*",
|
|
378
385
|
"py_grpc_prometheus.*",
|
|
386
|
+
"orjson", # suppress fastapi internal type errors
|
|
379
387
|
]
|
|
380
388
|
ignore_missing_imports = true
|
|
381
389
|
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
2
|
from datetime import datetime
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from typing import AsyncContextManager, Callable, Optional
|
|
4
|
+
from typing import AsyncContextManager, Callable, Optional
|
|
5
5
|
|
|
6
6
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
7
|
-
from
|
|
8
|
-
from starlette.responses import Response
|
|
9
|
-
from starlette.websockets import WebSocket
|
|
7
|
+
from strawberry.fastapi import BaseContext
|
|
10
8
|
from typing_extensions import TypeAlias
|
|
11
9
|
|
|
12
10
|
from phoenix.core.model_schema import Model
|
|
@@ -27,6 +25,7 @@ from phoenix.server.api.dataloaders import (
|
|
|
27
25
|
MinStartOrMaxEndTimeDataLoader,
|
|
28
26
|
ProjectByNameDataLoader,
|
|
29
27
|
RecordCountDataLoader,
|
|
28
|
+
SpanAnnotationsDataLoader,
|
|
30
29
|
SpanDescendantsDataLoader,
|
|
31
30
|
SpanEvaluationsDataLoader,
|
|
32
31
|
SpanProjectsDataLoader,
|
|
@@ -59,15 +58,14 @@ class DataLoaders:
|
|
|
59
58
|
trace_evaluations: TraceEvaluationsDataLoader
|
|
60
59
|
trace_row_ids: TraceRowIdsDataLoader
|
|
61
60
|
project_by_name: ProjectByNameDataLoader
|
|
61
|
+
span_annotations: SpanAnnotationsDataLoader
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
ProjectRowId: TypeAlias = int
|
|
65
65
|
|
|
66
66
|
|
|
67
67
|
@dataclass
|
|
68
|
-
class Context:
|
|
69
|
-
request: Union[Request, WebSocket]
|
|
70
|
-
response: Optional[Response]
|
|
68
|
+
class Context(BaseContext):
|
|
71
69
|
db: Callable[[], AsyncContextManager[AsyncSession]]
|
|
72
70
|
data_loaders: DataLoaders
|
|
73
71
|
cache_for_dataloaders: Optional[CacheForDataLoaders]
|
{arize_phoenix-4.10.1 → arize_phoenix-4.10.2rc1}/src/phoenix/server/api/dataloaders/__init__.py
RENAMED
|
@@ -26,6 +26,7 @@ from .latency_ms_quantile import LatencyMsQuantileCache, LatencyMsQuantileDataLo
|
|
|
26
26
|
from .min_start_or_max_end_times import MinStartOrMaxEndTimeCache, MinStartOrMaxEndTimeDataLoader
|
|
27
27
|
from .project_by_name import ProjectByNameDataLoader
|
|
28
28
|
from .record_counts import RecordCountCache, RecordCountDataLoader
|
|
29
|
+
from .span_annotations import SpanAnnotationsDataLoader
|
|
29
30
|
from .span_descendants import SpanDescendantsDataLoader
|
|
30
31
|
from .span_evaluations import SpanEvaluationsDataLoader
|
|
31
32
|
from .span_projects import SpanProjectsDataLoader
|
|
@@ -56,6 +57,7 @@ __all__ = [
|
|
|
56
57
|
"TraceEvaluationsDataLoader",
|
|
57
58
|
"TraceRowIdsDataLoader",
|
|
58
59
|
"ProjectByNameDataLoader",
|
|
60
|
+
"SpanAnnotationsDataLoader",
|
|
59
61
|
]
|
|
60
62
|
|
|
61
63
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from collections import defaultdict
|
|
2
|
+
from typing import (
|
|
3
|
+
AsyncContextManager,
|
|
4
|
+
Callable,
|
|
5
|
+
DefaultDict,
|
|
6
|
+
List,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
from sqlalchemy import select
|
|
10
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
11
|
+
from strawberry.dataloader import DataLoader
|
|
12
|
+
from typing_extensions import TypeAlias
|
|
13
|
+
|
|
14
|
+
from phoenix.db import models
|
|
15
|
+
from phoenix.server.api.types.SpanAnnotation import SpanAnnotation, to_gql_span_annotation
|
|
16
|
+
|
|
17
|
+
Key: TypeAlias = int
|
|
18
|
+
Result: TypeAlias = List[SpanAnnotation]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class SpanAnnotationsDataLoader(DataLoader[Key, Result]):
|
|
22
|
+
def __init__(self, db: Callable[[], AsyncContextManager[AsyncSession]]) -> None:
|
|
23
|
+
super().__init__(load_fn=self._load_fn)
|
|
24
|
+
self._db = db
|
|
25
|
+
|
|
26
|
+
async def _load_fn(self, keys: List[Key]) -> List[Result]:
|
|
27
|
+
span_annotations_by_id: DefaultDict[Key, Result] = defaultdict(list)
|
|
28
|
+
msa = models.SpanAnnotation
|
|
29
|
+
async with self._db() as session:
|
|
30
|
+
data = await session.stream_scalars(select(msa).where(msa.span_rowid.in_(keys)))
|
|
31
|
+
async for span_annotation in data:
|
|
32
|
+
span_annotations_by_id[span_annotation.span_rowid].append(
|
|
33
|
+
to_gql_span_annotation(span_annotation)
|
|
34
|
+
)
|
|
35
|
+
return [span_annotations_by_id[key] for key in keys]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from argparse import ArgumentParser
|
|
3
|
+
from typing import Optional, Tuple
|
|
4
|
+
|
|
5
|
+
from .schema import get_openapi_schema
|
|
6
|
+
|
|
7
|
+
if __name__ == "__main__":
|
|
8
|
+
parser = ArgumentParser()
|
|
9
|
+
parser.add_argument(
|
|
10
|
+
"--compress",
|
|
11
|
+
action="store_true",
|
|
12
|
+
help="Whether to output a compressed version of the OpenAPI schema",
|
|
13
|
+
)
|
|
14
|
+
args = parser.parse_args()
|
|
15
|
+
|
|
16
|
+
indent: Optional[int] = None
|
|
17
|
+
separator: Optional[Tuple[str, str]] = None
|
|
18
|
+
if args.compress:
|
|
19
|
+
separator = (",", ":")
|
|
20
|
+
else:
|
|
21
|
+
indent = 2
|
|
22
|
+
print(json.dumps(get_openapi_schema(), indent=indent, separators=separator))
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from typing import Any, Dict
|
|
2
|
+
|
|
3
|
+
from fastapi.openapi.utils import get_openapi
|
|
4
|
+
|
|
5
|
+
from phoenix.server.api.routers.v1 import REST_API_VERSION
|
|
6
|
+
from phoenix.server.api.routers.v1 import router as v1_router
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def get_openapi_schema() -> Dict[str, Any]:
|
|
10
|
+
return get_openapi(
|
|
11
|
+
title="Arize-Phoenix REST API",
|
|
12
|
+
version=REST_API_VERSION,
|
|
13
|
+
openapi_version="3.1.0",
|
|
14
|
+
description="Schema for Arize-Phoenix REST API",
|
|
15
|
+
routes=v1_router.routes,
|
|
16
|
+
)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from fastapi import APIRouter, Depends, HTTPException, Request
|
|
2
|
+
from starlette.status import HTTP_403_FORBIDDEN
|
|
3
|
+
|
|
4
|
+
from .datasets import router as datasets_router
|
|
5
|
+
from .evaluations import router as evaluations_router
|
|
6
|
+
from .experiment_evaluations import router as experiment_evaluations_router
|
|
7
|
+
from .experiment_runs import router as experiment_runs_router
|
|
8
|
+
from .experiments import router as experiments_router
|
|
9
|
+
from .spans import router as spans_router
|
|
10
|
+
from .traces import router as traces_router
|
|
11
|
+
from .utils import add_errors_to_responses
|
|
12
|
+
|
|
13
|
+
REST_API_VERSION = "1.0"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
async def prevent_access_in_read_only_mode(request: Request) -> None:
|
|
17
|
+
"""
|
|
18
|
+
Prevents access to the REST API in read-only mode.
|
|
19
|
+
"""
|
|
20
|
+
if request.app.state.read_only:
|
|
21
|
+
raise HTTPException(
|
|
22
|
+
detail="The Phoenix REST API is disabled in read-only mode.",
|
|
23
|
+
status_code=HTTP_403_FORBIDDEN,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
router = APIRouter(
|
|
28
|
+
prefix="/v1",
|
|
29
|
+
dependencies=[Depends(prevent_access_in_read_only_mode)],
|
|
30
|
+
responses=add_errors_to_responses(
|
|
31
|
+
[
|
|
32
|
+
HTTP_403_FORBIDDEN # adds a 403 response to each route in the generated OpenAPI schema
|
|
33
|
+
]
|
|
34
|
+
),
|
|
35
|
+
)
|
|
36
|
+
router.include_router(datasets_router)
|
|
37
|
+
router.include_router(experiments_router)
|
|
38
|
+
router.include_router(experiment_runs_router)
|
|
39
|
+
router.include_router(experiment_evaluations_router)
|
|
40
|
+
router.include_router(traces_router)
|
|
41
|
+
router.include_router(spans_router)
|
|
42
|
+
router.include_router(evaluations_router)
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Any, Dict, List, Optional
|
|
3
|
+
|
|
4
|
+
from fastapi import APIRouter, HTTPException, Path, Query
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
from sqlalchemy import and_, func, select
|
|
7
|
+
from starlette.requests import Request
|
|
8
|
+
from starlette.status import HTTP_404_NOT_FOUND
|
|
9
|
+
from strawberry.relay import GlobalID
|
|
10
|
+
|
|
11
|
+
from phoenix.db.models import (
|
|
12
|
+
Dataset as ORMDataset,
|
|
13
|
+
)
|
|
14
|
+
from phoenix.db.models import (
|
|
15
|
+
DatasetExample as ORMDatasetExample,
|
|
16
|
+
)
|
|
17
|
+
from phoenix.db.models import (
|
|
18
|
+
DatasetExampleRevision as ORMDatasetExampleRevision,
|
|
19
|
+
)
|
|
20
|
+
from phoenix.db.models import (
|
|
21
|
+
DatasetVersion as ORMDatasetVersion,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
from .utils import ResponseBody, add_errors_to_responses
|
|
25
|
+
|
|
26
|
+
router = APIRouter(tags=["datasets"])
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class DatasetExample(BaseModel):
|
|
30
|
+
id: str
|
|
31
|
+
input: Dict[str, Any]
|
|
32
|
+
output: Dict[str, Any]
|
|
33
|
+
metadata: Dict[str, Any]
|
|
34
|
+
updated_at: datetime
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class ListDatasetExamplesData(BaseModel):
|
|
38
|
+
dataset_id: str
|
|
39
|
+
version_id: str
|
|
40
|
+
examples: List[DatasetExample]
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class ListDatasetExamplesResponseBody(ResponseBody[ListDatasetExamplesData]):
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@router.get(
|
|
48
|
+
"/datasets/{id}/examples",
|
|
49
|
+
operation_id="getDatasetExamples",
|
|
50
|
+
summary="Get examples from a dataset",
|
|
51
|
+
responses=add_errors_to_responses([HTTP_404_NOT_FOUND]),
|
|
52
|
+
)
|
|
53
|
+
async def get_dataset_examples(
|
|
54
|
+
request: Request,
|
|
55
|
+
id: str = Path(description="The ID of the dataset"),
|
|
56
|
+
version_id: Optional[str] = Query(
|
|
57
|
+
default=None,
|
|
58
|
+
description=(
|
|
59
|
+
"The ID of the dataset version " "(if omitted, returns data from the latest version)"
|
|
60
|
+
),
|
|
61
|
+
),
|
|
62
|
+
) -> ListDatasetExamplesResponseBody:
|
|
63
|
+
dataset_gid = GlobalID.from_id(id)
|
|
64
|
+
version_gid = GlobalID.from_id(version_id) if version_id else None
|
|
65
|
+
|
|
66
|
+
if (dataset_type := dataset_gid.type_name) != "Dataset":
|
|
67
|
+
raise HTTPException(
|
|
68
|
+
detail=f"ID {dataset_gid} refers to a {dataset_type}", status_code=HTTP_404_NOT_FOUND
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
if version_gid and (version_type := version_gid.type_name) != "DatasetVersion":
|
|
72
|
+
raise HTTPException(
|
|
73
|
+
detail=f"ID {version_gid} refers to a {version_type}", status_code=HTTP_404_NOT_FOUND
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
async with request.app.state.db() as session:
|
|
77
|
+
if (
|
|
78
|
+
resolved_dataset_id := await session.scalar(
|
|
79
|
+
select(ORMDataset.id).where(ORMDataset.id == int(dataset_gid.node_id))
|
|
80
|
+
)
|
|
81
|
+
) is None:
|
|
82
|
+
raise HTTPException(
|
|
83
|
+
detail=f"No dataset with id {dataset_gid} can be found.",
|
|
84
|
+
status_code=HTTP_404_NOT_FOUND,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
# Subquery to find the maximum created_at for each dataset_example_id
|
|
88
|
+
# timestamp tiebreaks are resolved by the largest id
|
|
89
|
+
partial_subquery = select(
|
|
90
|
+
func.max(ORMDatasetExampleRevision.id).label("max_id"),
|
|
91
|
+
).group_by(ORMDatasetExampleRevision.dataset_example_id)
|
|
92
|
+
|
|
93
|
+
if version_gid:
|
|
94
|
+
if (
|
|
95
|
+
resolved_version_id := await session.scalar(
|
|
96
|
+
select(ORMDatasetVersion.id).where(
|
|
97
|
+
and_(
|
|
98
|
+
ORMDatasetVersion.dataset_id == resolved_dataset_id,
|
|
99
|
+
ORMDatasetVersion.id == int(version_gid.node_id),
|
|
100
|
+
)
|
|
101
|
+
)
|
|
102
|
+
)
|
|
103
|
+
) is None:
|
|
104
|
+
raise HTTPException(
|
|
105
|
+
detail=f"No dataset version with id {version_id} can be found.",
|
|
106
|
+
status_code=HTTP_404_NOT_FOUND,
|
|
107
|
+
)
|
|
108
|
+
# if a version_id is provided, filter the subquery to only include revisions from that
|
|
109
|
+
partial_subquery = partial_subquery.filter(
|
|
110
|
+
ORMDatasetExampleRevision.dataset_version_id <= resolved_version_id
|
|
111
|
+
)
|
|
112
|
+
else:
|
|
113
|
+
if (
|
|
114
|
+
resolved_version_id := await session.scalar(
|
|
115
|
+
select(func.max(ORMDatasetVersion.id)).where(
|
|
116
|
+
ORMDatasetVersion.dataset_id == resolved_dataset_id
|
|
117
|
+
)
|
|
118
|
+
)
|
|
119
|
+
) is None:
|
|
120
|
+
raise HTTPException(
|
|
121
|
+
detail="Dataset has no versions.",
|
|
122
|
+
status_code=HTTP_404_NOT_FOUND,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
subquery = partial_subquery.subquery()
|
|
126
|
+
# Query for the most recent example revisions that are not deleted
|
|
127
|
+
query = (
|
|
128
|
+
select(ORMDatasetExample, ORMDatasetExampleRevision)
|
|
129
|
+
.join(
|
|
130
|
+
ORMDatasetExampleRevision,
|
|
131
|
+
ORMDatasetExample.id == ORMDatasetExampleRevision.dataset_example_id,
|
|
132
|
+
)
|
|
133
|
+
.join(
|
|
134
|
+
subquery,
|
|
135
|
+
(subquery.c.max_id == ORMDatasetExampleRevision.id),
|
|
136
|
+
)
|
|
137
|
+
.filter(ORMDatasetExample.dataset_id == resolved_dataset_id)
|
|
138
|
+
.filter(ORMDatasetExampleRevision.revision_kind != "DELETE")
|
|
139
|
+
.order_by(ORMDatasetExample.id.asc())
|
|
140
|
+
)
|
|
141
|
+
examples = [
|
|
142
|
+
DatasetExample(
|
|
143
|
+
id=str(GlobalID("DatasetExample", str(example.id))),
|
|
144
|
+
input=revision.input,
|
|
145
|
+
output=revision.output,
|
|
146
|
+
metadata=revision.metadata_,
|
|
147
|
+
updated_at=revision.created_at,
|
|
148
|
+
)
|
|
149
|
+
async for example, revision in await session.stream(query)
|
|
150
|
+
]
|
|
151
|
+
return ListDatasetExamplesResponseBody(
|
|
152
|
+
data=ListDatasetExamplesData(
|
|
153
|
+
dataset_id=str(GlobalID("Dataset", str(resolved_dataset_id))),
|
|
154
|
+
version_id=str(GlobalID("DatasetVersion", str(resolved_version_id))),
|
|
155
|
+
examples=examples,
|
|
156
|
+
)
|
|
157
|
+
)
|