arize-phoenix 4.31.0__tar.gz → 4.33.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-4.31.0 → arize_phoenix-4.33.0}/.gitignore +1 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/PKG-INFO +22 -21
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/README.md +15 -18
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/pyproject.toml +9 -4
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/config.py +21 -1
- arize_phoenix-4.33.0/src/phoenix/db/README.md +54 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/engines.py +13 -1
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrate.py +1 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/models.py +3 -2
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/api_key_mutations.py +2 -1
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/app.py +65 -58
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/grpc_server.py +2 -2
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/main.py +27 -14
- arize_phoenix-4.33.0/src/phoenix/server/static/.vite/manifest.json +78 -0
- arize_phoenix-4.31.0/src/phoenix/server/static/assets/components-CEsu6itL.js → arize_phoenix-4.33.0/src/phoenix/server/static/assets/components-CPHugqwr.js +91 -91
- arize_phoenix-4.33.0/src/phoenix/server/static/assets/index-U9TnafOn.js +100 -0
- arize_phoenix-4.31.0/src/phoenix/server/static/assets/pages-eeRVG3GZ.js → arize_phoenix-4.33.0/src/phoenix/server/static/assets/pages-Ds3nQwKE.js +293 -230
- arize_phoenix-4.31.0/src/phoenix/server/static/assets/vendor-DsnEJuEV.js → arize_phoenix-4.33.0/src/phoenix/server/static/assets/vendor-Dpio9q2e.js +1 -1
- arize_phoenix-4.31.0/src/phoenix/server/static/assets/vendor-arizeai-DtynTLNi.js → arize_phoenix-4.33.0/src/phoenix/server/static/assets/vendor-arizeai-DDzwX9A6.js +24 -24
- arize_phoenix-4.31.0/src/phoenix/server/static/assets/vendor-codemirror-C5to5cK4.js → arize_phoenix-4.33.0/src/phoenix/server/static/assets/vendor-codemirror-xRvQKK1G.js +1 -1
- arize_phoenix-4.31.0/src/phoenix/server/static/assets/vendor-recharts-reihe2SJ.js → arize_phoenix-4.33.0/src/phoenix/server/static/assets/vendor-recharts-DoxlB_Wo.js +1 -1
- arize_phoenix-4.33.0/src/phoenix/version.py +1 -0
- arize_phoenix-4.31.0/src/phoenix/db/README.md +0 -28
- arize_phoenix-4.31.0/src/phoenix/server/static/.vite/manifest.json +0 -78
- arize_phoenix-4.31.0/src/phoenix/server/static/assets/index-Cuxn1Qdi.js +0 -100
- arize_phoenix-4.31.0/src/phoenix/version.py +0 -1
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/IP_NOTICE +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/LICENSE +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/chat-service/chat/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/chat-service/chat/app.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/chat-service/chat/types.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/frontend/Dockerfile +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/frontend/Makefile +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/frontend/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/frontend/pyproject.toml +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/frontend/requirements.txt +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/examples/manually-instrumented-chatbot/frontend/schema.json +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/auth.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/core/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/core/embedding_dimension.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/core/model.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/core/model_schema.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/core/model_schema_adapter.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/datetime_utils.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/alembic.ini +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/bulk_inserter.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/helpers.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/constants.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/dataset.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/evaluation.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/helpers.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/span.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/insertion/types.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/env.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/future_versions/README.md +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/future_versions/cd164e83824f_users_and_tokens.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/script.py.mako +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/versions/.gitignore +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/exceptions.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/evaluators/base.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/functions.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/tracing.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/types.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/experiments/utils.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/inferences/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/inferences/errors.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/inferences/fixtures.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/inferences/inferences.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/inferences/schema.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/inferences/validation.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/README.md +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/binning.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/metrics.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/mixins.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/timeseries.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/metrics/wrappers.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/pointcloud/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/pointcloud/clustering.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/pointcloud/projectors.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/py.typed +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/context.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/dataloaders/trace_row_ids.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/exceptions.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/interceptor.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/auth.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/auth_mutations.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/openapi/main.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/openapi/schema.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/queries.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/utils.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/datasets.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/evaluations.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/experiments.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/pydantic_compat.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/spans.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/traces.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/schema.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Annotation.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Cluster.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Dataset.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Dimension.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Event.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Experiment.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Functionality.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Inferences.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/MimeType.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Model.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Project.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Segments.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/SortDir.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Span.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/Trace.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/User.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/UserRole.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/node.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/types/pagination.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/utils.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/dml_event.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/dml_event_handler.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/openapi/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/prometheus.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/assets/vendor-DxkFTwjz.css +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/assets/vendor-three-DwGkEfCM.js +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/favicon.ico +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/static/modernizr.js +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/telemetry.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/templates/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/templates/index.html +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/thread_server.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/types.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/services.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/session/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/session/client.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/session/data_extractor.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/session/evaluation.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/session/session.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/settings.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/attributes.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/dsl/README.md +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/dsl/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/dsl/filter.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/dsl/helpers.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/dsl/query.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/errors.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/exporter.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/fixtures.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/langchain/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/langchain/instrumentor.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/llama_index/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/llama_index/callback.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/openai/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/openai/instrumentor.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/otel.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/projects.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/schemas.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/span_evaluations.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/span_json_decoder.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/span_json_encoder.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/trace_dataset.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/utils.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/v1/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/__init__.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/client.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/deprecation.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/error_handling.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/json.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/logging.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/project.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/utilities/re.py +0 -0
- {arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/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.
|
|
3
|
+
Version: 4.33.0
|
|
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
|
|
@@ -77,12 +77,13 @@ Requires-Dist: asyncpg; extra == 'dev'
|
|
|
77
77
|
Requires-Dist: faker>=26.0.0; extra == 'dev'
|
|
78
78
|
Requires-Dist: gcsfs; extra == 'dev'
|
|
79
79
|
Requires-Dist: google-cloud-aiplatform>=1.3; extra == 'dev'
|
|
80
|
+
Requires-Dist: grpc-interceptor[testing]; extra == 'dev'
|
|
80
81
|
Requires-Dist: hatch; extra == 'dev'
|
|
81
82
|
Requires-Dist: jupyter; extra == 'dev'
|
|
82
83
|
Requires-Dist: langchain>=0.0.334; extra == 'dev'
|
|
83
84
|
Requires-Dist: litellm>=1.0.3; extra == 'dev'
|
|
84
85
|
Requires-Dist: llama-index>=0.10.3; extra == 'dev'
|
|
85
|
-
Requires-Dist: mypy==1.11.
|
|
86
|
+
Requires-Dist: mypy==1.11.2; extra == 'dev'
|
|
86
87
|
Requires-Dist: nbqa; extra == 'dev'
|
|
87
88
|
Requires-Dist: pandas-stubs==2.0.3.230814; (python_version < '3.9') and extra == 'dev'
|
|
88
89
|
Requires-Dist: pandas-stubs==2.2.2.240603; (python_version >= '3.9') and extra == 'dev'
|
|
@@ -96,10 +97,13 @@ Requires-Dist: pytest-cov; extra == 'dev'
|
|
|
96
97
|
Requires-Dist: pytest-postgresql; extra == 'dev'
|
|
97
98
|
Requires-Dist: pytest-xdist; extra == 'dev'
|
|
98
99
|
Requires-Dist: pytest==8.3.2; extra == 'dev'
|
|
99
|
-
Requires-Dist: ruff==0.6.
|
|
100
|
+
Requires-Dist: ruff==0.6.3; extra == 'dev'
|
|
100
101
|
Requires-Dist: strawberry-graphql[debug-server,opentelemetry]==0.236.0; extra == 'dev'
|
|
101
102
|
Requires-Dist: tabulate; extra == 'dev'
|
|
103
|
+
Requires-Dist: tox-uv==1.11.2; extra == 'dev'
|
|
104
|
+
Requires-Dist: tox==4.18.0; extra == 'dev'
|
|
102
105
|
Requires-Dist: types-tabulate; extra == 'dev'
|
|
106
|
+
Requires-Dist: uv==0.4.2; extra == 'dev'
|
|
103
107
|
Requires-Dist: uvloop; (platform_system != 'Windows') and extra == 'dev'
|
|
104
108
|
Provides-Extra: evals
|
|
105
109
|
Provides-Extra: experimental
|
|
@@ -146,21 +150,23 @@ Description-Content-Type: text/markdown
|
|
|
146
150
|
|
|
147
151
|
Phoenix is an open-source AI observability platform designed for experimentation, evaluation, and troubleshooting. It provides:
|
|
148
152
|
|
|
149
|
-
-
|
|
150
|
-
-
|
|
151
|
-
-
|
|
152
|
-
-
|
|
153
|
+
- **_Tracing_** - Trace your LLM application's runtime using OpenTelemetry-based instrumentation.
|
|
154
|
+
- **_Evaluation_** - Leverage LLMs to benchmark your application's performance using response and retrieval evals.
|
|
155
|
+
- **_Datasets_** - Create versioned datasets of examples for experimentation, evaluation, and fine-tuning.
|
|
156
|
+
- **_Experiments_** - Track and evaluate changes to prompts, LLMs, and retrieval.
|
|
153
157
|
|
|
154
158
|
Phoenix is vendor and language agnostic with out-of-the-box support for popular frameworks (🦙LlamaIndex, 🦜⛓LangChain, Haystack, 🧩DSPy) and LLM providers (OpenAI, Bedrock, and more). For details on auto-instrumentation, check out the [OpenInference](https://github.com/Arize-ai/openinference) project.
|
|
155
159
|
|
|
156
160
|
Phoenix runs practically anywhere, including your Jupyter notebook, local machine, containerized deployment, or in the cloud.
|
|
157
161
|
|
|
162
|
+
<img alt="phoenix_overview.gif" width="100%" src="https://github.com/Arize-ai/phoenix-assets/blob/main/gifs/phoenix_overview.gif?raw=true">
|
|
163
|
+
|
|
158
164
|
## Installation
|
|
159
165
|
|
|
160
|
-
Install Phoenix via `pip` or `conda`
|
|
166
|
+
Install Phoenix via `pip` or `conda`
|
|
161
167
|
|
|
162
168
|
```shell
|
|
163
|
-
pip install
|
|
169
|
+
pip install arize-phoenix
|
|
164
170
|
```
|
|
165
171
|
|
|
166
172
|
Phoenix container images are available via [Docker Hub](https://hub.docker.com/r/arizephoenix/phoenix) and can be deployed using Docker or Kubernetes.
|
|
@@ -169,18 +175,13 @@ Phoenix container images are available via [Docker Hub](https://hub.docker.com/r
|
|
|
169
175
|
|
|
170
176
|
Join our community to connect with thousands of AI builders.
|
|
171
177
|
|
|
172
|
-
-
|
|
173
|
-
-
|
|
174
|
-
-
|
|
175
|
-
-
|
|
176
|
-
-
|
|
177
|
-
-
|
|
178
|
-
-
|
|
179
|
-
|
|
180
|
-
## Thanks
|
|
181
|
-
|
|
182
|
-
- [UMAP](https://github.com/lmcinnes/umap) For unlocking the ability to visualize and reason about embeddings
|
|
183
|
-
- [HDBSCAN](https://github.com/scikit-learn-contrib/hdbscan) For providing a clustering algorithm to aid in the discovery of drift and performance degradation
|
|
178
|
+
- 🌍 Join our [Slack community](https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q).
|
|
179
|
+
- 💡 Ask questions and provide feedback in the _#phoenix-support_ channel.
|
|
180
|
+
- 🌟 Leave a star on our [GitHub](https://github.com/Arize-ai/phoenix).
|
|
181
|
+
- 🐞 Report bugs with [GitHub Issues](https://github.com/Arize-ai/phoenix/issues).
|
|
182
|
+
- 𝕏 Follow us on [𝕏](https://twitter.com/ArizePhoenix).
|
|
183
|
+
- 💌️ Sign up for our [mailing list](https://phoenix.arize.com/#updates).
|
|
184
|
+
- 🗺️ Check out our [roadmap](https://github.com/orgs/Arize-ai/projects/45) to see where we're heading next.
|
|
184
185
|
|
|
185
186
|
## Breaking Changes
|
|
186
187
|
|
|
@@ -29,21 +29,23 @@
|
|
|
29
29
|
|
|
30
30
|
Phoenix is an open-source AI observability platform designed for experimentation, evaluation, and troubleshooting. It provides:
|
|
31
31
|
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
-
|
|
32
|
+
- **_Tracing_** - Trace your LLM application's runtime using OpenTelemetry-based instrumentation.
|
|
33
|
+
- **_Evaluation_** - Leverage LLMs to benchmark your application's performance using response and retrieval evals.
|
|
34
|
+
- **_Datasets_** - Create versioned datasets of examples for experimentation, evaluation, and fine-tuning.
|
|
35
|
+
- **_Experiments_** - Track and evaluate changes to prompts, LLMs, and retrieval.
|
|
36
36
|
|
|
37
37
|
Phoenix is vendor and language agnostic with out-of-the-box support for popular frameworks (🦙LlamaIndex, 🦜⛓LangChain, Haystack, 🧩DSPy) and LLM providers (OpenAI, Bedrock, and more). For details on auto-instrumentation, check out the [OpenInference](https://github.com/Arize-ai/openinference) project.
|
|
38
38
|
|
|
39
39
|
Phoenix runs practically anywhere, including your Jupyter notebook, local machine, containerized deployment, or in the cloud.
|
|
40
40
|
|
|
41
|
+
<img alt="phoenix_overview.gif" width="100%" src="https://github.com/Arize-ai/phoenix-assets/blob/main/gifs/phoenix_overview.gif?raw=true">
|
|
42
|
+
|
|
41
43
|
## Installation
|
|
42
44
|
|
|
43
|
-
Install Phoenix via `pip` or `conda`
|
|
45
|
+
Install Phoenix via `pip` or `conda`
|
|
44
46
|
|
|
45
47
|
```shell
|
|
46
|
-
pip install
|
|
48
|
+
pip install arize-phoenix
|
|
47
49
|
```
|
|
48
50
|
|
|
49
51
|
Phoenix container images are available via [Docker Hub](https://hub.docker.com/r/arizephoenix/phoenix) and can be deployed using Docker or Kubernetes.
|
|
@@ -52,18 +54,13 @@ Phoenix container images are available via [Docker Hub](https://hub.docker.com/r
|
|
|
52
54
|
|
|
53
55
|
Join our community to connect with thousands of AI builders.
|
|
54
56
|
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
-
|
|
62
|
-
|
|
63
|
-
## Thanks
|
|
64
|
-
|
|
65
|
-
- [UMAP](https://github.com/lmcinnes/umap) For unlocking the ability to visualize and reason about embeddings
|
|
66
|
-
- [HDBSCAN](https://github.com/scikit-learn-contrib/hdbscan) For providing a clustering algorithm to aid in the discovery of drift and performance degradation
|
|
57
|
+
- 🌍 Join our [Slack community](https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q).
|
|
58
|
+
- 💡 Ask questions and provide feedback in the _#phoenix-support_ channel.
|
|
59
|
+
- 🌟 Leave a star on our [GitHub](https://github.com/Arize-ai/phoenix).
|
|
60
|
+
- 🐞 Report bugs with [GitHub Issues](https://github.com/Arize-ai/phoenix/issues).
|
|
61
|
+
- 𝕏 Follow us on [𝕏](https://twitter.com/ArizePhoenix).
|
|
62
|
+
- 💌️ Sign up for our [mailing list](https://phoenix.arize.com/#updates).
|
|
63
|
+
- 🗺️ Check out our [roadmap](https://github.com/orgs/Arize-ai/projects/45) to see where we're heading next.
|
|
67
64
|
|
|
68
65
|
## Breaking Changes
|
|
69
66
|
|
|
@@ -70,10 +70,13 @@ dynamic = ["version"]
|
|
|
70
70
|
dev = [
|
|
71
71
|
"gcsfs",
|
|
72
72
|
"hatch",
|
|
73
|
+
"tox==4.18.0",
|
|
74
|
+
"tox-uv==1.11.2",
|
|
75
|
+
"uv==0.4.2",
|
|
73
76
|
"jupyter",
|
|
74
77
|
"nbqa",
|
|
75
|
-
"ruff==0.6.
|
|
76
|
-
"mypy==1.11.
|
|
78
|
+
"ruff==0.6.3",
|
|
79
|
+
"mypy==1.11.2",
|
|
77
80
|
"pandas>=1.0",
|
|
78
81
|
"tabulate", # used by DataFrame.to_markdown()
|
|
79
82
|
"types-tabulate",
|
|
@@ -99,6 +102,7 @@ dev = [
|
|
|
99
102
|
"Faker>=26.0.0",
|
|
100
103
|
"portpicker",
|
|
101
104
|
"uvloop; platform_system != 'Windows'",
|
|
105
|
+
"grpc-interceptor[testing]",
|
|
102
106
|
]
|
|
103
107
|
evals = []
|
|
104
108
|
experimental = []
|
|
@@ -187,7 +191,7 @@ dependencies = [
|
|
|
187
191
|
|
|
188
192
|
[tool.hatch.envs.type]
|
|
189
193
|
dependencies = [
|
|
190
|
-
"mypy==1.11.
|
|
194
|
+
"mypy==1.11.2",
|
|
191
195
|
"tenacity",
|
|
192
196
|
"pandas>=1.0",
|
|
193
197
|
"pandas-stubs==2.0.3.230814",
|
|
@@ -222,7 +226,7 @@ python = ["3.8", "3.9", "3.12"]
|
|
|
222
226
|
[tool.hatch.envs.style]
|
|
223
227
|
detached = true
|
|
224
228
|
dependencies = [
|
|
225
|
-
"ruff==0.6.
|
|
229
|
+
"ruff==0.6.3",
|
|
226
230
|
]
|
|
227
231
|
|
|
228
232
|
[[tool.hatch.envs.style.matrix]]
|
|
@@ -256,6 +260,7 @@ addopts = [
|
|
|
256
260
|
"--doctest-modules",
|
|
257
261
|
"--new-first",
|
|
258
262
|
"--showlocals",
|
|
263
|
+
"--exitfirst",
|
|
259
264
|
]
|
|
260
265
|
testpaths = [
|
|
261
266
|
"tests",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import os
|
|
2
|
+
import re
|
|
2
3
|
import tempfile
|
|
3
4
|
from logging import getLogger
|
|
4
5
|
from pathlib import Path
|
|
@@ -46,7 +47,11 @@ Phoenix supports two types of database URLs:
|
|
|
46
47
|
Note that if you plan on using SQLite, it's advised to to use a persistent volume
|
|
47
48
|
and simply point the PHOENIX_WORKING_DIR to that volume.
|
|
48
49
|
"""
|
|
49
|
-
|
|
50
|
+
ENV_PHOENIX_SQL_DATABASE_SCHEMA = "PHOENIX_SQL_DATABASE_SCHEMA"
|
|
51
|
+
"""
|
|
52
|
+
The schema to use for the PostgresSQL database. (This is ignored for SQLite.)
|
|
53
|
+
See e.g. https://www.postgresql.org/docs/current/ddl-schemas.html
|
|
54
|
+
"""
|
|
50
55
|
ENV_PHOENIX_ENABLE_PROMETHEUS = "PHOENIX_ENABLE_PROMETHEUS"
|
|
51
56
|
"""
|
|
52
57
|
Whether to enable Prometheus. Defaults to false.
|
|
@@ -231,6 +236,14 @@ def get_env_port() -> int:
|
|
|
231
236
|
return PORT
|
|
232
237
|
if port.isnumeric():
|
|
233
238
|
return int(port)
|
|
239
|
+
if _KUBERNETES_PHOENIX_PORT_PATTERN.match(port) is not None:
|
|
240
|
+
raise ValueError(
|
|
241
|
+
'If you are deploying Phoenix with Kubernetes using a service named "phoenix", '
|
|
242
|
+
"Kubernetes will automatically generate an environment variable `PHOENIX_PORT` "
|
|
243
|
+
'of the form "tcp://<IP>:<PORT>" that is not the integer format Phoenix expects. '
|
|
244
|
+
"To resolve this issue, explicitly set the `PHOENIX_PORT` environment variable to "
|
|
245
|
+
"an integer value in your Kubernetes deployment configuration."
|
|
246
|
+
)
|
|
234
247
|
raise ValueError(
|
|
235
248
|
f"Invalid value for environment variable {ENV_PHOENIX_PORT}: "
|
|
236
249
|
f"{port}. Value must be an integer."
|
|
@@ -272,6 +285,12 @@ def get_env_database_connection_str() -> str:
|
|
|
272
285
|
return env_url
|
|
273
286
|
|
|
274
287
|
|
|
288
|
+
def get_env_database_schema() -> Optional[str]:
|
|
289
|
+
if get_env_database_connection_str().startswith("sqlite"):
|
|
290
|
+
return None
|
|
291
|
+
return os.getenv(ENV_PHOENIX_SQL_DATABASE_SCHEMA)
|
|
292
|
+
|
|
293
|
+
|
|
275
294
|
def get_env_enable_prometheus() -> bool:
|
|
276
295
|
if (enable_promotheus := os.getenv(ENV_PHOENIX_ENABLE_PROMETHEUS)) is None or (
|
|
277
296
|
enable_promotheus_lower := enable_promotheus.lower()
|
|
@@ -313,3 +332,4 @@ def get_web_base_url() -> str:
|
|
|
313
332
|
|
|
314
333
|
|
|
315
334
|
DEFAULT_PROJECT_NAME = "default"
|
|
335
|
+
_KUBERNETES_PHOENIX_PORT_PATTERN = re.compile(r"^tcp://\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}:\d+$")
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Database
|
|
2
|
+
|
|
3
|
+
This module is responsible for the database connection and the migrations.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
## Migrations
|
|
7
|
+
|
|
8
|
+
All migrations are managed by Alembic. Migrations are applied to the database automatically when the application starts.
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Manually Applying Migrations
|
|
12
|
+
|
|
13
|
+
Sometimes, it's necessary to manually apply migrations, e.g., to recover from a failed migration. To manually apply migrations, you must first clone the Phoenix repository.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
git clone https://github.com/Arize-ai/phoenix.git
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Then navigate to the current directory.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
cd phoenix/src/phoenix/db
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
If you are using a non-default SQL database URL (e.g., for running PostgreSQL), ensure your `PHOENIX_SQL_DATABASE_URL` is set. This is not needed if you are running Phoenix with the default SQLite URL.
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
export PHOENIX_SQL_DATABASE_URL=<sql-database-url>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
To manually run up-migrations, run the following command:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
alembic upgrade head
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
If the above command fails, it may be necessary to undo partially applied changes from a failed migration by first running down-migrations. This can be accomplished by identifying the ID of the migration revision you wish to return to. Revisions are defined [here](./migrations/versions/).
|
|
39
|
+
|
|
40
|
+
⚠️ Running down-migrations can result in lost data. Only run down-migrations if you know what you are doing and consider backing up your database first. If you have any questions or doubts, contact the Phoenix team in the `#phoenix-support` channel of the [Arize AI Slack community](https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q) or via GitHub.
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
alembic downgrade <revision-id>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Creating a Migration
|
|
47
|
+
|
|
48
|
+
All migrations are stored in the `migrations` folder. To create a new migration, run the following command:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
alembic revision -m "your_revision_name"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Then fill the migration file with the necessary changes.
|
|
@@ -3,7 +3,7 @@ import json
|
|
|
3
3
|
from datetime import datetime
|
|
4
4
|
from enum import Enum
|
|
5
5
|
from sqlite3 import Connection
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any, Callable
|
|
7
7
|
|
|
8
8
|
import aiosqlite
|
|
9
9
|
import numpy as np
|
|
@@ -13,6 +13,7 @@ from sqlalchemy import URL, StaticPool, event, make_url
|
|
|
13
13
|
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
|
|
14
14
|
from typing_extensions import assert_never
|
|
15
15
|
|
|
16
|
+
from phoenix.config import get_env_database_schema
|
|
16
17
|
from phoenix.db.helpers import SupportedSQLDialect
|
|
17
18
|
from phoenix.db.migrate import migrate_in_thread
|
|
18
19
|
from phoenix.db.models import init_models
|
|
@@ -130,6 +131,15 @@ def aio_sqlite_engine(
|
|
|
130
131
|
return engine
|
|
131
132
|
|
|
132
133
|
|
|
134
|
+
def set_postgresql_search_path(schema: str) -> Callable[[Connection, Any], None]:
|
|
135
|
+
def _(connection: Connection, _: Any) -> None:
|
|
136
|
+
cursor = connection.cursor()
|
|
137
|
+
cursor.execute(f"CREATE SCHEMA IF NOT EXISTS {schema};")
|
|
138
|
+
cursor.execute(f"SET search_path TO {schema};")
|
|
139
|
+
|
|
140
|
+
return _
|
|
141
|
+
|
|
142
|
+
|
|
133
143
|
def aio_postgresql_engine(
|
|
134
144
|
url: URL,
|
|
135
145
|
migrate: bool = True,
|
|
@@ -143,6 +153,8 @@ def aio_postgresql_engine(
|
|
|
143
153
|
echo=Settings.log_migrations,
|
|
144
154
|
json_serializer=_dumps,
|
|
145
155
|
)
|
|
156
|
+
if schema := get_env_database_schema():
|
|
157
|
+
event.listen(sync_engine, "connect", set_postgresql_search_path(schema))
|
|
146
158
|
migrate_in_thread(sync_engine)
|
|
147
159
|
return engine
|
|
148
160
|
|
|
@@ -50,6 +50,7 @@ def migrate(
|
|
|
50
50
|
alembic_cfg.set_main_option("sqlalchemy.url", url)
|
|
51
51
|
alembic_cfg.attributes["connection"] = engine.connect()
|
|
52
52
|
command.upgrade(alembic_cfg, "head")
|
|
53
|
+
engine.dispose()
|
|
53
54
|
printif(log_migrations, "---------------------------")
|
|
54
55
|
printif(log_migrations, "✅ Migrations complete.")
|
|
55
56
|
except BaseException as e:
|
|
@@ -34,7 +34,7 @@ from sqlalchemy.orm import (
|
|
|
34
34
|
)
|
|
35
35
|
from sqlalchemy.sql import expression
|
|
36
36
|
|
|
37
|
-
from phoenix.config import ENABLE_AUTH
|
|
37
|
+
from phoenix.config import ENABLE_AUTH, get_env_database_schema
|
|
38
38
|
from phoenix.datetime_utils import normalize_datetime
|
|
39
39
|
|
|
40
40
|
|
|
@@ -100,13 +100,14 @@ class Base(DeclarativeBase):
|
|
|
100
100
|
# Enforce best practices for naming constraints
|
|
101
101
|
# https://alembic.sqlalchemy.org/en/latest/naming.html#integration-of-naming-conventions-into-operations-autogenerate
|
|
102
102
|
metadata = MetaData(
|
|
103
|
+
schema=get_env_database_schema(),
|
|
103
104
|
naming_convention={
|
|
104
105
|
"ix": "ix_%(table_name)s_%(column_0_N_name)s",
|
|
105
106
|
"uq": "uq_%(table_name)s_%(column_0_N_name)s",
|
|
106
107
|
"ck": "ck_%(table_name)s_`%(constraint_name)s`",
|
|
107
108
|
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
|
|
108
109
|
"pk": "pk_%(table_name)s",
|
|
109
|
-
}
|
|
110
|
+
},
|
|
110
111
|
)
|
|
111
112
|
type_annotation_map = {
|
|
112
113
|
Dict[str, Any]: JsonDict,
|
{arize_phoenix-4.31.0 → arize_phoenix-4.33.0}/src/phoenix/server/api/mutations/api_key_mutations.py
RENAMED
|
@@ -39,6 +39,7 @@ class DeleteApiKeyInput:
|
|
|
39
39
|
@strawberry.type
|
|
40
40
|
class DeleteSystemApiKeyMutationPayload:
|
|
41
41
|
id: GlobalID
|
|
42
|
+
query: Query
|
|
42
43
|
|
|
43
44
|
|
|
44
45
|
@strawberry.type
|
|
@@ -106,7 +107,7 @@ class ApiKeyMutationMixin:
|
|
|
106
107
|
|
|
107
108
|
await session.delete(api_key)
|
|
108
109
|
|
|
109
|
-
return DeleteSystemApiKeyMutationPayload(id=input.id)
|
|
110
|
+
return DeleteSystemApiKeyMutationPayload(id=input.id, query=Query())
|
|
110
111
|
|
|
111
112
|
|
|
112
113
|
def create_jwt(
|
|
@@ -2,6 +2,8 @@ import asyncio
|
|
|
2
2
|
import contextlib
|
|
3
3
|
import json
|
|
4
4
|
import logging
|
|
5
|
+
from contextlib import AsyncExitStack
|
|
6
|
+
from dataclasses import dataclass, field
|
|
5
7
|
from datetime import datetime, timedelta, timezone
|
|
6
8
|
from functools import cached_property
|
|
7
9
|
from pathlib import Path
|
|
@@ -18,7 +20,6 @@ from typing import (
|
|
|
18
20
|
List,
|
|
19
21
|
NamedTuple,
|
|
20
22
|
Optional,
|
|
21
|
-
Set,
|
|
22
23
|
Tuple,
|
|
23
24
|
Union,
|
|
24
25
|
cast,
|
|
@@ -133,6 +134,7 @@ If so, demo data is automatically ingested upon initial boot up to populate the
|
|
|
133
134
|
NEW_DB_AGE_THRESHOLD_MINUTES = 2
|
|
134
135
|
|
|
135
136
|
ProjectName: TypeAlias = str
|
|
137
|
+
_Callback: TypeAlias = Callable[[], Union[None, Awaitable[None]]]
|
|
136
138
|
|
|
137
139
|
|
|
138
140
|
class AppConfig(NamedTuple):
|
|
@@ -251,27 +253,36 @@ def _db(engine: AsyncEngine) -> Callable[[], AsyncContextManager[AsyncSession]]:
|
|
|
251
253
|
return factory
|
|
252
254
|
|
|
253
255
|
|
|
256
|
+
@dataclass(frozen=True)
|
|
257
|
+
class ScaffolderConfig:
|
|
258
|
+
db: DbSessionFactory
|
|
259
|
+
tracing_fixture_names: Iterable[str] = field(default_factory=list)
|
|
260
|
+
force_fixture_ingestion: bool = False
|
|
261
|
+
scaffold_datasets: bool = False
|
|
262
|
+
phoenix_url: str = f"http://{get_env_host()}:{get_env_port()}"
|
|
263
|
+
|
|
264
|
+
|
|
254
265
|
class Scaffolder(DaemonTask):
|
|
255
266
|
def __init__(
|
|
256
267
|
self,
|
|
257
|
-
|
|
268
|
+
config: ScaffolderConfig,
|
|
258
269
|
queue_span: Callable[[Span, ProjectName], Awaitable[None]],
|
|
259
270
|
queue_evaluation: Callable[[pb.Evaluation], Awaitable[None]],
|
|
260
|
-
tracing_fixture_names: Set[str] = set(),
|
|
261
|
-
force_fixture_ingestion: bool = False,
|
|
262
|
-
scaffold_datasets: bool = False,
|
|
263
271
|
) -> None:
|
|
264
272
|
super().__init__()
|
|
265
|
-
self._db = db
|
|
273
|
+
self._db = config.db
|
|
266
274
|
self._queue_span = queue_span
|
|
267
275
|
self._queue_evaluation = queue_evaluation
|
|
268
|
-
self._tracing_fixtures =
|
|
269
|
-
get_trace_fixture_by_name(name) for name in tracing_fixture_names
|
|
270
|
-
|
|
271
|
-
self._force_fixture_ingestion = force_fixture_ingestion
|
|
272
|
-
self._scaffold_datasets = scaffold_datasets
|
|
276
|
+
self._tracing_fixtures = [
|
|
277
|
+
get_trace_fixture_by_name(name) for name in set(config.tracing_fixture_names)
|
|
278
|
+
]
|
|
279
|
+
self._force_fixture_ingestion = config.force_fixture_ingestion
|
|
280
|
+
self._scaffold_datasets = config.scaffold_datasets
|
|
281
|
+
self._phoenix_url = config.phoenix_url
|
|
273
282
|
|
|
274
283
|
async def __aenter__(self) -> None:
|
|
284
|
+
if not self._tracing_fixtures:
|
|
285
|
+
return
|
|
275
286
|
await self.start()
|
|
276
287
|
|
|
277
288
|
async def __aexit__(self, *args: Any, **kwargs: Any) -> None:
|
|
@@ -353,7 +364,7 @@ class Scaffolder(DaemonTask):
|
|
|
353
364
|
await loop.run_in_executor(
|
|
354
365
|
None,
|
|
355
366
|
send_dataset_fixtures,
|
|
356
|
-
|
|
367
|
+
self._phoenix_url,
|
|
357
368
|
dataset_fixtures,
|
|
358
369
|
)
|
|
359
370
|
except Exception as e:
|
|
@@ -367,37 +378,40 @@ def _lifespan(
|
|
|
367
378
|
dml_event_handler: DmlEventHandler,
|
|
368
379
|
tracer_provider: Optional["TracerProvider"] = None,
|
|
369
380
|
enable_prometheus: bool = False,
|
|
370
|
-
startup_callbacks: Iterable[
|
|
371
|
-
shutdown_callbacks: Iterable[
|
|
381
|
+
startup_callbacks: Iterable[_Callback] = (),
|
|
382
|
+
shutdown_callbacks: Iterable[_Callback] = (),
|
|
372
383
|
read_only: bool = False,
|
|
373
|
-
|
|
374
|
-
force_fixture_ingestion: bool = False,
|
|
375
|
-
scaffold_datasets: bool = False,
|
|
384
|
+
scaffolder_config: Optional[ScaffolderConfig] = None,
|
|
376
385
|
) -> StatefulLifespan[FastAPI]:
|
|
377
386
|
@contextlib.asynccontextmanager
|
|
378
387
|
async def lifespan(_: FastAPI) -> AsyncIterator[Dict[str, Any]]:
|
|
388
|
+
for callback in startup_callbacks:
|
|
389
|
+
if isinstance((res := callback()), Awaitable):
|
|
390
|
+
await res
|
|
379
391
|
global DB_MUTEX
|
|
380
392
|
DB_MUTEX = asyncio.Lock() if db.dialect is SupportedSQLDialect.SQLITE else None
|
|
381
|
-
async with
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
393
|
+
async with AsyncExitStack() as stack:
|
|
394
|
+
(
|
|
395
|
+
enqueue,
|
|
396
|
+
queue_span,
|
|
397
|
+
queue_evaluation,
|
|
398
|
+
enqueue_operation,
|
|
399
|
+
) = await stack.enter_async_context(bulk_inserter)
|
|
400
|
+
grpc_server = GrpcServer(
|
|
401
|
+
queue_span,
|
|
402
|
+
disabled=read_only,
|
|
403
|
+
tracer_provider=tracer_provider,
|
|
404
|
+
enable_prometheus=enable_prometheus,
|
|
405
|
+
)
|
|
406
|
+
await stack.enter_async_context(grpc_server)
|
|
407
|
+
await stack.enter_async_context(dml_event_handler)
|
|
408
|
+
if scaffolder_config:
|
|
409
|
+
scaffolder = Scaffolder(
|
|
410
|
+
config=scaffolder_config,
|
|
411
|
+
queue_span=queue_span,
|
|
412
|
+
queue_evaluation=queue_evaluation,
|
|
413
|
+
)
|
|
414
|
+
await stack.enter_async_context(scaffolder)
|
|
401
415
|
yield {
|
|
402
416
|
"event_queue": dml_event_handler,
|
|
403
417
|
"enqueue": enqueue,
|
|
@@ -406,7 +420,8 @@ def _lifespan(
|
|
|
406
420
|
"enqueue_operation": enqueue_operation,
|
|
407
421
|
}
|
|
408
422
|
for callback in shutdown_callbacks:
|
|
409
|
-
callback()
|
|
423
|
+
if isinstance((res := callback()), Awaitable):
|
|
424
|
+
await res
|
|
410
425
|
|
|
411
426
|
return lifespan
|
|
412
427
|
|
|
@@ -584,15 +599,13 @@ def create_app(
|
|
|
584
599
|
initial_spans: Optional[Iterable[Union[Span, Tuple[Span, str]]]] = None,
|
|
585
600
|
initial_evaluations: Optional[Iterable[pb.Evaluation]] = None,
|
|
586
601
|
serve_ui: bool = True,
|
|
587
|
-
startup_callbacks: Iterable[
|
|
588
|
-
shutdown_callbacks: Iterable[
|
|
602
|
+
startup_callbacks: Iterable[_Callback] = (),
|
|
603
|
+
shutdown_callbacks: Iterable[_Callback] = (),
|
|
589
604
|
secret: Optional[str] = None,
|
|
590
|
-
|
|
591
|
-
force_fixture_ingestion: bool = False,
|
|
592
|
-
scaffold_datasets: bool = False,
|
|
605
|
+
scaffolder_config: Optional[ScaffolderConfig] = None,
|
|
593
606
|
) -> FastAPI:
|
|
594
|
-
startup_callbacks_list: List[
|
|
595
|
-
shutdown_callbacks_list: List[
|
|
607
|
+
startup_callbacks_list: List[_Callback] = list(startup_callbacks)
|
|
608
|
+
shutdown_callbacks_list: List[_Callback] = list(shutdown_callbacks)
|
|
596
609
|
initial_batch_of_spans: Iterable[Tuple[Span, str]] = (
|
|
597
610
|
()
|
|
598
611
|
if initial_spans is None
|
|
@@ -606,6 +619,7 @@ def create_app(
|
|
|
606
619
|
CacheForDataLoaders() if db.dialect is SupportedSQLDialect.SQLITE else None
|
|
607
620
|
)
|
|
608
621
|
last_updated_at = LastUpdatedAt()
|
|
622
|
+
middlewares: List[Middleware] = [Middleware(HeadersMiddleware)]
|
|
609
623
|
dml_event_handler = DmlEventHandler(
|
|
610
624
|
db=db,
|
|
611
625
|
cache_for_dataloaders=cache_for_dataloaders,
|
|
@@ -659,10 +673,7 @@ def create_app(
|
|
|
659
673
|
if enable_prometheus:
|
|
660
674
|
from phoenix.server.prometheus import PrometheusMiddleware
|
|
661
675
|
|
|
662
|
-
|
|
663
|
-
else:
|
|
664
|
-
prometheus_middlewares = []
|
|
665
|
-
|
|
676
|
+
middlewares.append(Middleware(PrometheusMiddleware))
|
|
666
677
|
app = FastAPI(
|
|
667
678
|
title="Arize-Phoenix REST API",
|
|
668
679
|
version=REST_API_VERSION,
|
|
@@ -675,14 +686,9 @@ def create_app(
|
|
|
675
686
|
enable_prometheus=enable_prometheus,
|
|
676
687
|
shutdown_callbacks=shutdown_callbacks_list,
|
|
677
688
|
startup_callbacks=startup_callbacks_list,
|
|
678
|
-
|
|
679
|
-
force_fixture_ingestion=force_fixture_ingestion,
|
|
680
|
-
scaffold_datasets=scaffold_datasets,
|
|
689
|
+
scaffolder_config=scaffolder_config,
|
|
681
690
|
),
|
|
682
|
-
middleware=
|
|
683
|
-
Middleware(HeadersMiddleware),
|
|
684
|
-
*prometheus_middlewares,
|
|
685
|
-
],
|
|
691
|
+
middleware=middlewares,
|
|
686
692
|
exception_handlers={HTTPException: plain_text_http_exception_handler},
|
|
687
693
|
debug=debug,
|
|
688
694
|
swagger_ui_parameters={
|
|
@@ -695,7 +701,8 @@ def create_app(
|
|
|
695
701
|
app.include_router(router)
|
|
696
702
|
app.include_router(graphql_router)
|
|
697
703
|
app.add_middleware(GZipMiddleware)
|
|
698
|
-
|
|
704
|
+
web_manifest_path = SERVER_DIR / "static" / ".vite" / "manifest.json"
|
|
705
|
+
if serve_ui and web_manifest_path.is_file():
|
|
699
706
|
app.mount(
|
|
700
707
|
"/",
|
|
701
708
|
app=Static(
|
|
@@ -708,7 +715,7 @@ def create_app(
|
|
|
708
715
|
n_samples=umap_params.n_samples,
|
|
709
716
|
is_development=dev,
|
|
710
717
|
authentication_enabled=authentication_enabled,
|
|
711
|
-
web_manifest_path=
|
|
718
|
+
web_manifest_path=web_manifest_path,
|
|
712
719
|
),
|
|
713
720
|
),
|
|
714
721
|
name="static",
|
|
@@ -23,7 +23,7 @@ if TYPE_CHECKING:
|
|
|
23
23
|
ProjectName: TypeAlias = str
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
class Servicer(TraceServiceServicer): # type:ignore
|
|
26
|
+
class Servicer(TraceServiceServicer): # type: ignore[misc,unused-ignore]
|
|
27
27
|
def __init__(
|
|
28
28
|
self,
|
|
29
29
|
callback: Callable[[Span, ProjectName], Awaitable[None]],
|
|
@@ -78,7 +78,7 @@ class GrpcServer:
|
|
|
78
78
|
interceptors=interceptors,
|
|
79
79
|
)
|
|
80
80
|
server.add_insecure_port(f"[::]:{get_env_grpc_port()}")
|
|
81
|
-
add_TraceServiceServicer_to_server(Servicer(self._callback), server)
|
|
81
|
+
add_TraceServiceServicer_to_server(Servicer(self._callback), server) # type: ignore[no-untyped-call,unused-ignore]
|
|
82
82
|
await server.start()
|
|
83
83
|
self._server = server
|
|
84
84
|
|