arize-phoenix 8.22.1__tar.gz → 8.23.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-8.22.1 → arize_phoenix-8.23.0}/PKG-INFO +22 -2
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/README.md +21 -1
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/config.py +17 -1
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/__init__.py +2 -0
- arize_phoenix-8.23.0/src/phoenix/server/api/routers/v1/projects.py +383 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/app.py +10 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/main.py +6 -0
- arize_phoenix-8.23.0/src/phoenix/server/static/.vite/manifest.json +87 -0
- arize_phoenix-8.22.1/src/phoenix/server/static/assets/components-BAc4OPED.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/components-D8xtf7Q6.js +82 -82
- arize_phoenix-8.22.1/src/phoenix/server/static/assets/index-Du53xkjY.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/index-CGfsCafL.js +2 -2
- arize_phoenix-8.22.1/src/phoenix/server/static/assets/pages-Dz-gbBPF.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/pages-BiUq97Df.js +342 -339
- arize_phoenix-8.22.1/src/phoenix/server/static/assets/vendor-CEisxXSv.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/vendor-C3H3sezv.js +1 -1
- arize_phoenix-8.22.1/src/phoenix/server/static/assets/vendor-arizeai-BCTsSnvS.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/vendor-arizeai-DT8pwHfH.js +1 -1
- arize_phoenix-8.22.1/src/phoenix/server/static/assets/vendor-codemirror-DIWnRs_7.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/vendor-codemirror-DvimrGxD.js +1 -1
- arize_phoenix-8.22.1/src/phoenix/server/static/assets/vendor-recharts-Bame54mG.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/vendor-recharts-DuSQBcYW.js +1 -1
- arize_phoenix-8.22.1/src/phoenix/server/static/assets/vendor-shiki-Cc73E4D-.js → arize_phoenix-8.23.0/src/phoenix/server/static/assets/vendor-shiki-i05Hmswh.js +1 -1
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/session/session.py +10 -0
- arize_phoenix-8.23.0/src/phoenix/version.py +1 -0
- arize_phoenix-8.22.1/src/phoenix/server/static/.vite/manifest.json +0 -87
- arize_phoenix-8.22.1/src/phoenix/version.py +0 -1
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/.gitignore +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/IP_NOTICE +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/LICENSE +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/pyproject.toml +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/auth.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/core/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/core/embedding_dimension.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/core/model.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/core/model_schema.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/core/model_schema_adapter.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/datetime_utils.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/README.md +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/alembic.ini +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/bulk_inserter.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/engines.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/enums.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/facilitator.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/helpers.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/constants.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/dataset.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/evaluation.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/helpers.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/span.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/insertion/types.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrate.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/data_migration_scripts/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/env.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/script.py.mako +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/versions/bc8fea3c2bc8_add_prompt_tables.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/models.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/types/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/types/identifier.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/db/types/model_provider.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/exceptions.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/evaluators/base.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/functions.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/tracing.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/types.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/experiments/utils.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/inferences/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/inferences/errors.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/inferences/fixtures.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/inferences/inferences.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/inferences/schema.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/inferences/validation.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/logging/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/logging/_config.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/logging/_filter.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/logging/_formatter.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/README.md +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/binning.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/metrics.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/mixins.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/timeseries.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/metrics/wrappers.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/pointcloud/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/pointcloud/clustering.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/pointcloud/projectors.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/py.typed +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/README.md +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/auth.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/context.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/num_child_spans.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/num_spans_per_trace.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/prompt_version_sequence_number.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/session_io.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/session_num_traces.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/session_num_traces_with_error.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/session_token_usages.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/span_by_id.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/table_fields.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/trace_by_trace_ids.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/trace_root_spans.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/user_roles.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/dataloaders/users.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/exceptions.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/experiment_run_filters.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/playground_clients.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/playground_registry.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/playground_spans.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/prompts/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/prompts/conversions/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/prompts/conversions/anthropic.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/prompts/conversions/openai.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/helpers/prompts/models.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/ChatCompletionInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/GenerativeModelInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/InvocationParameters.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/ProjectSessionSort.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/PromptTemplateOptions.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/PromptVersionInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/interceptor.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/api_key_mutations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/chat_mutations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/prompt_label_mutations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/prompt_mutations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/prompt_version_tag_mutations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/trace_mutations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/openapi/main.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/openapi/schema.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/queries.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/auth.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/embeddings.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/oauth2.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/utils.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/datasets.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/evaluations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/experiments.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/models.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/prompts.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/spans.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/traces.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/schema.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/subscriptions.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Annotation.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/AuthMethod.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Cluster.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Dataset.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Dimension.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Event.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Experiment.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Functionality.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/GenerativeProvider.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Identifier.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Inferences.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/MimeType.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Model.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Project.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ProjectSession.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Prompt.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/PromptLabel.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/PromptVersion.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/PromptVersionTag.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/PromptVersionTemplate.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ResponseFormat.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Segments.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/SortDir.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Span.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/SpanIOValue.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/TokenUsage.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ToolDefinition.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/Trace.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/User.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/UserRole.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/node.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/types/pagination.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/api/utils.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/bearer_auth.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/dml_event.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/dml_event_handler.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/email/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/email/sender.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/email/templates/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/email/templates/password_reset.html +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/email/types.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/grpc_server.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/jwt_store.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/oauth2.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/openapi/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/prometheus.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/rate_limiters.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/assets/vendor-Cg6lcjUC.css +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/assets/vendor-three-C5WAXd5r.js +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/favicon.ico +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/static/modernizr.js +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/telemetry.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/templates/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/templates/index.html +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/thread_server.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/server/types.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/services.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/session/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/session/client.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/session/data_extractor.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/session/evaluation.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/settings.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/attributes.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/dsl/README.md +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/dsl/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/dsl/filter.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/dsl/helpers.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/dsl/query.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/errors.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/exporter.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/fixtures.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/otel.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/projects.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/schemas.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/span_evaluations.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/span_json_decoder.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/span_json_encoder.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/trace_dataset.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/utils.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/v1/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/__init__.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/client.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/deprecation.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/error_handling.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/json.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/logging.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/project.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/re.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/span_store.py +0 -0
- {arize_phoenix-8.22.1 → arize_phoenix-8.23.0}/src/phoenix/utilities/template_formatters.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: arize-phoenix
|
|
3
|
-
Version: 8.
|
|
3
|
+
Version: 8.23.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
|
|
@@ -141,7 +141,10 @@ Description-Content-Type: text/markdown
|
|
|
141
141
|
<a target="_blank" href="https://arize-ai.slack.com/join/shared_invite/zt-11t1vbu4x-xkBIHmOREQnYnYDH1GDfCg?__hstc=259489365.a667dfafcfa0169c8aee4178d115dc81.1733501603539.1733501603539.1733501603539.1&__hssc=259489365.1.1733501603539&__hsfp=3822854628&submissionGuid=381a0676-8f38-437b-96f2-fc10875658df#/shared-invite/email">
|
|
142
142
|
<img src="https://img.shields.io/static/v1?message=Community&logo=slack&labelColor=grey&color=blue&logoColor=white&label=%20"/>
|
|
143
143
|
</a>
|
|
144
|
-
|
|
144
|
+
<a target="_blank" href="https://bsky.app/profile/arize-phoenix.bsky.social">
|
|
145
|
+
<img src="https://img.shields.io/badge/-phoenix-blue.svg?color=blue&labelColor=gray&logo=bluesky">
|
|
146
|
+
</a>
|
|
147
|
+
<a target="_blank" href="https://x.com/ArizePhoenix">
|
|
145
148
|
<img src="https://img.shields.io/badge/-ArizePhoenix-blue.svg?color=blue&labelColor=gray&logo=x">
|
|
146
149
|
</a>
|
|
147
150
|
<a target="_blank" href="https://pypi.org/project/arize-phoenix/">
|
|
@@ -156,6 +159,9 @@ Description-Content-Type: text/markdown
|
|
|
156
159
|
<a target="_blank" href="https://hub.docker.com/r/arizephoenix/phoenix/tags">
|
|
157
160
|
<img src="https://img.shields.io/docker/v/arizephoenix/phoenix?sort=semver&logo=docker&label=image&color=blue">
|
|
158
161
|
</a>
|
|
162
|
+
<a target="_blank" href="https://github.com/Arize-ai/phoenix/tree/main/js/packages/phoenix-mcp">
|
|
163
|
+
<img src="https://badge.mcpx.dev?status=on" title="MCP Enabled"/>
|
|
164
|
+
</a>
|
|
159
165
|
</p>
|
|
160
166
|
|
|
161
167
|
Phoenix is an open-source AI observability platform designed for experimentation, evaluation, and troubleshooting. It provides:
|
|
@@ -181,6 +187,20 @@ pip install arize-phoenix
|
|
|
181
187
|
|
|
182
188
|
Phoenix container images are available via [Docker Hub](https://hub.docker.com/r/arizephoenix/phoenix) and can be deployed using Docker or Kubernetes.
|
|
183
189
|
|
|
190
|
+
## Packages
|
|
191
|
+
|
|
192
|
+
The `arize-phoenix` package includes the entire Phoenix platfom. However if you have deployed the Phoenix platform, there are light-weight Python sub-packages and TypeScript packages that can be used in conjunction with the platfrom.
|
|
193
|
+
|
|
194
|
+
### Subpackages
|
|
195
|
+
|
|
196
|
+
| Package | Language | Description |
|
|
197
|
+
| --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
|
|
198
|
+
| [arize-phoenix-otel](https://github.com/Arize-ai/phoenix/tree/main/packages/phoenix-otel) | Python [](https://pypi.org/project/arize-phoenix-otel/) | Provides a lightweight wrapper around OpenTelemetry primitives with Phoenix-aware defaults |
|
|
199
|
+
| [arize-phoenix-client](https://github.com/Arize-ai/phoenix/tree/main/packages/phoenix-client) | Python [](https://pypi.org/project/arize-phoenix-client/) | Lightweight client for interacting with the Phoenix server via its OpenAPI REST interface |
|
|
200
|
+
| [arize-phoenix-evals](https://github.com/Arize-ai/phoenix/tree/main/packages/phoenix-evals) | Python [](https://pypi.org/project/arize-phoenix-evals/) | Tooling to evaluate LLM applications including RAG relevance, answer relevance, and more |
|
|
201
|
+
| [@arizeai/phoenix-client](https://github.com/Arize-ai/phoenix/tree/main/js/packages/phoenix-client) | JavaScript [](https://www.npmjs.com/package/@arizeai/phoenix-client) | Client for the Arize Phoenix API |
|
|
202
|
+
| [@arizeai/phoenix-mcp](https://github.com/Arize-ai/phoenix/tree/main/js/packages/phoenix-mcp) | JavaScript [](https://www.npmjs.com/package/@arizeai/phoenix-mcp) | MCP server implementation for Arize Phoenix providing unified interface to Phoenix's capabilities |
|
|
203
|
+
|
|
184
204
|
## Tracing Integrations
|
|
185
205
|
|
|
186
206
|
Phoenix is built on top of OpenTelemetry and is vendor, language, and framework agnostic. For details about tracing integrations and example applications, see the [OpenInference](https://github.com/Arize-ai/openinference) project.
|
|
@@ -10,7 +10,10 @@
|
|
|
10
10
|
<a target="_blank" href="https://arize-ai.slack.com/join/shared_invite/zt-11t1vbu4x-xkBIHmOREQnYnYDH1GDfCg?__hstc=259489365.a667dfafcfa0169c8aee4178d115dc81.1733501603539.1733501603539.1733501603539.1&__hssc=259489365.1.1733501603539&__hsfp=3822854628&submissionGuid=381a0676-8f38-437b-96f2-fc10875658df#/shared-invite/email">
|
|
11
11
|
<img src="https://img.shields.io/static/v1?message=Community&logo=slack&labelColor=grey&color=blue&logoColor=white&label=%20"/>
|
|
12
12
|
</a>
|
|
13
|
-
|
|
13
|
+
<a target="_blank" href="https://bsky.app/profile/arize-phoenix.bsky.social">
|
|
14
|
+
<img src="https://img.shields.io/badge/-phoenix-blue.svg?color=blue&labelColor=gray&logo=bluesky">
|
|
15
|
+
</a>
|
|
16
|
+
<a target="_blank" href="https://x.com/ArizePhoenix">
|
|
14
17
|
<img src="https://img.shields.io/badge/-ArizePhoenix-blue.svg?color=blue&labelColor=gray&logo=x">
|
|
15
18
|
</a>
|
|
16
19
|
<a target="_blank" href="https://pypi.org/project/arize-phoenix/">
|
|
@@ -25,6 +28,9 @@
|
|
|
25
28
|
<a target="_blank" href="https://hub.docker.com/r/arizephoenix/phoenix/tags">
|
|
26
29
|
<img src="https://img.shields.io/docker/v/arizephoenix/phoenix?sort=semver&logo=docker&label=image&color=blue">
|
|
27
30
|
</a>
|
|
31
|
+
<a target="_blank" href="https://github.com/Arize-ai/phoenix/tree/main/js/packages/phoenix-mcp">
|
|
32
|
+
<img src="https://badge.mcpx.dev?status=on" title="MCP Enabled"/>
|
|
33
|
+
</a>
|
|
28
34
|
</p>
|
|
29
35
|
|
|
30
36
|
Phoenix is an open-source AI observability platform designed for experimentation, evaluation, and troubleshooting. It provides:
|
|
@@ -50,6 +56,20 @@ pip install arize-phoenix
|
|
|
50
56
|
|
|
51
57
|
Phoenix container images are available via [Docker Hub](https://hub.docker.com/r/arizephoenix/phoenix) and can be deployed using Docker or Kubernetes.
|
|
52
58
|
|
|
59
|
+
## Packages
|
|
60
|
+
|
|
61
|
+
The `arize-phoenix` package includes the entire Phoenix platfom. However if you have deployed the Phoenix platform, there are light-weight Python sub-packages and TypeScript packages that can be used in conjunction with the platfrom.
|
|
62
|
+
|
|
63
|
+
### Subpackages
|
|
64
|
+
|
|
65
|
+
| Package | Language | Description |
|
|
66
|
+
| --------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
|
|
67
|
+
| [arize-phoenix-otel](https://github.com/Arize-ai/phoenix/tree/main/packages/phoenix-otel) | Python [](https://pypi.org/project/arize-phoenix-otel/) | Provides a lightweight wrapper around OpenTelemetry primitives with Phoenix-aware defaults |
|
|
68
|
+
| [arize-phoenix-client](https://github.com/Arize-ai/phoenix/tree/main/packages/phoenix-client) | Python [](https://pypi.org/project/arize-phoenix-client/) | Lightweight client for interacting with the Phoenix server via its OpenAPI REST interface |
|
|
69
|
+
| [arize-phoenix-evals](https://github.com/Arize-ai/phoenix/tree/main/packages/phoenix-evals) | Python [](https://pypi.org/project/arize-phoenix-evals/) | Tooling to evaluate LLM applications including RAG relevance, answer relevance, and more |
|
|
70
|
+
| [@arizeai/phoenix-client](https://github.com/Arize-ai/phoenix/tree/main/js/packages/phoenix-client) | JavaScript [](https://www.npmjs.com/package/@arizeai/phoenix-client) | Client for the Arize Phoenix API |
|
|
71
|
+
| [@arizeai/phoenix-mcp](https://github.com/Arize-ai/phoenix/tree/main/js/packages/phoenix-mcp) | JavaScript [](https://www.npmjs.com/package/@arizeai/phoenix-mcp) | MCP server implementation for Arize Phoenix providing unified interface to Phoenix's capabilities |
|
|
72
|
+
|
|
53
73
|
## Tracing Integrations
|
|
54
74
|
|
|
55
75
|
Phoenix is built on top of OpenTelemetry and is vendor, language, and framework agnostic. For details about tracing integrations and example applications, see the [OpenInference](https://github.com/Arize-ai/openinference) project.
|
|
@@ -209,7 +209,11 @@ ENV_PHOENIX_SMTP_VALIDATE_CERTS = "PHOENIX_SMTP_VALIDATE_CERTS"
|
|
|
209
209
|
"""
|
|
210
210
|
Whether to validate SMTP server certificates. Defaults to true.
|
|
211
211
|
"""
|
|
212
|
-
|
|
212
|
+
ENV_PHOENIX_ALLOWED_ORIGINS = "PHOENIX_ALLOWED_ORIGINS"
|
|
213
|
+
"""
|
|
214
|
+
List of allowed origins for CORS. Defaults to None.
|
|
215
|
+
When set to None, CORS is disabled.
|
|
216
|
+
"""
|
|
213
217
|
# API extension settings
|
|
214
218
|
ENV_PHOENIX_FASTAPI_MIDDLEWARE_PATHS = "PHOENIX_FASTAPI_MIDDLEWARE_PATHS"
|
|
215
219
|
ENV_PHOENIX_GQL_EXTENSION_PATHS = "PHOENIX_GQL_EXTENSION_PATHS"
|
|
@@ -1049,4 +1053,16 @@ def get_env_disable_migrations() -> bool:
|
|
|
1049
1053
|
DEFAULT_PROJECT_NAME = "default"
|
|
1050
1054
|
_KUBERNETES_PHOENIX_PORT_PATTERN = re.compile(r"^tcp://\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}:\d+$")
|
|
1051
1055
|
|
|
1056
|
+
|
|
1057
|
+
def get_env_allowed_origins() -> Optional[list[str]]:
|
|
1058
|
+
"""
|
|
1059
|
+
Gets the value of the PHOENIX_ALLOWED_ORIGINS environment variable.
|
|
1060
|
+
"""
|
|
1061
|
+
allowed_origins = getenv(ENV_PHOENIX_ALLOWED_ORIGINS)
|
|
1062
|
+
if allowed_origins is None:
|
|
1063
|
+
return None
|
|
1064
|
+
|
|
1065
|
+
return allowed_origins.split(",")
|
|
1066
|
+
|
|
1067
|
+
|
|
1052
1068
|
SKLEARN_VERSION = cast(tuple[int, int], tuple(map(int, version("scikit-learn").split(".", 2)[:2])))
|
|
@@ -9,6 +9,7 @@ from .evaluations import router as evaluations_router
|
|
|
9
9
|
from .experiment_evaluations import router as experiment_evaluations_router
|
|
10
10
|
from .experiment_runs import router as experiment_runs_router
|
|
11
11
|
from .experiments import router as experiments_router
|
|
12
|
+
from .projects import router as projects_router
|
|
12
13
|
from .prompts import router as prompts_router
|
|
13
14
|
from .spans import router as spans_router
|
|
14
15
|
from .traces import router as traces_router
|
|
@@ -63,4 +64,5 @@ def create_v1_router(authentication_enabled: bool) -> APIRouter:
|
|
|
63
64
|
router.include_router(spans_router)
|
|
64
65
|
router.include_router(evaluations_router)
|
|
65
66
|
router.include_router(prompts_router)
|
|
67
|
+
router.include_router(projects_router)
|
|
66
68
|
return router
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from fastapi import APIRouter, HTTPException, Path, Query
|
|
4
|
+
from sqlalchemy import select
|
|
5
|
+
from starlette.requests import Request
|
|
6
|
+
from starlette.status import (
|
|
7
|
+
HTTP_204_NO_CONTENT,
|
|
8
|
+
HTTP_403_FORBIDDEN,
|
|
9
|
+
HTTP_404_NOT_FOUND,
|
|
10
|
+
HTTP_422_UNPROCESSABLE_ENTITY,
|
|
11
|
+
)
|
|
12
|
+
from strawberry.relay import GlobalID
|
|
13
|
+
|
|
14
|
+
from phoenix.config import DEFAULT_PROJECT_NAME
|
|
15
|
+
from phoenix.db import models
|
|
16
|
+
from phoenix.db.enums import UserRole
|
|
17
|
+
from phoenix.server.api.routers.v1.models import V1RoutesBaseModel
|
|
18
|
+
from phoenix.server.api.routers.v1.utils import (
|
|
19
|
+
PaginatedResponseBody,
|
|
20
|
+
ResponseBody,
|
|
21
|
+
add_errors_to_responses,
|
|
22
|
+
)
|
|
23
|
+
from phoenix.server.api.types.node import from_global_id_with_expected_type
|
|
24
|
+
from phoenix.server.api.types.Project import Project as ProjectNodeType
|
|
25
|
+
|
|
26
|
+
router = APIRouter(tags=["projects"])
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ProjectData(V1RoutesBaseModel):
|
|
30
|
+
name: str
|
|
31
|
+
description: Optional[str] = None
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class Project(ProjectData):
|
|
35
|
+
id: str
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class GetProjectsResponseBody(PaginatedResponseBody[Project]):
|
|
39
|
+
pass
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class GetProjectResponseBody(ResponseBody[Project]):
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class CreateProjectRequestBody(V1RoutesBaseModel):
|
|
47
|
+
project: ProjectData
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class CreateProjectResponseBody(ResponseBody[Project]):
|
|
51
|
+
pass
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class UpdateProjectRequestBody(V1RoutesBaseModel):
|
|
55
|
+
project: ProjectData
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class UpdateProjectResponseBody(ResponseBody[Project]):
|
|
59
|
+
pass
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@router.get(
|
|
63
|
+
"/projects",
|
|
64
|
+
operation_id="getProjects",
|
|
65
|
+
summary="List all projects", # noqa: E501
|
|
66
|
+
description="Retrieve a paginated list of all projects in the system.", # noqa: E501
|
|
67
|
+
response_description="A list of projects with pagination information", # noqa: E501
|
|
68
|
+
responses=add_errors_to_responses(
|
|
69
|
+
[
|
|
70
|
+
HTTP_422_UNPROCESSABLE_ENTITY,
|
|
71
|
+
]
|
|
72
|
+
),
|
|
73
|
+
)
|
|
74
|
+
async def get_projects(
|
|
75
|
+
request: Request,
|
|
76
|
+
cursor: Optional[str] = Query(
|
|
77
|
+
default=None,
|
|
78
|
+
description="Cursor for pagination (base64-encoded project ID)",
|
|
79
|
+
),
|
|
80
|
+
limit: int = Query(
|
|
81
|
+
default=100, description="The max number of projects to return at a time.", gt=0
|
|
82
|
+
),
|
|
83
|
+
) -> GetProjectsResponseBody:
|
|
84
|
+
"""
|
|
85
|
+
Retrieve a paginated list of all projects in the system.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
request (Request): The FastAPI request object.
|
|
89
|
+
cursor (Optional[str]): Pagination cursor (base64-encoded project ID).
|
|
90
|
+
limit (int): Maximum number of projects to return per request.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
GetProjectsResponseBody: Response containing a list of projects and pagination information.
|
|
94
|
+
|
|
95
|
+
Raises:
|
|
96
|
+
HTTPException: If the cursor format is invalid.
|
|
97
|
+
""" # noqa: E501
|
|
98
|
+
async with request.app.state.db() as session:
|
|
99
|
+
stmt = select(models.Project).order_by(models.Project.id.desc())
|
|
100
|
+
|
|
101
|
+
if cursor:
|
|
102
|
+
try:
|
|
103
|
+
cursor_id = GlobalID.from_id(cursor).node_id
|
|
104
|
+
stmt = stmt.filter(models.Project.id <= int(cursor_id))
|
|
105
|
+
except ValueError:
|
|
106
|
+
raise HTTPException(
|
|
107
|
+
detail=f"Invalid cursor format: {cursor}",
|
|
108
|
+
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
stmt = stmt.limit(limit + 1)
|
|
112
|
+
result = await session.execute(stmt)
|
|
113
|
+
orm_projects = result.scalars().all()
|
|
114
|
+
|
|
115
|
+
if not orm_projects:
|
|
116
|
+
return GetProjectsResponseBody(next_cursor=None, data=[])
|
|
117
|
+
|
|
118
|
+
next_cursor = None
|
|
119
|
+
if len(orm_projects) == limit + 1:
|
|
120
|
+
last_project = orm_projects[-1]
|
|
121
|
+
next_cursor = str(GlobalID(ProjectNodeType.__name__, str(last_project.id)))
|
|
122
|
+
orm_projects = orm_projects[:-1]
|
|
123
|
+
|
|
124
|
+
projects = [_project_from_orm_project(orm_project) for orm_project in orm_projects]
|
|
125
|
+
return GetProjectsResponseBody(next_cursor=next_cursor, data=projects)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
@router.get(
|
|
129
|
+
"/projects/{project_id}",
|
|
130
|
+
operation_id="getProject",
|
|
131
|
+
summary="Get project by ID", # noqa: E501
|
|
132
|
+
description="Retrieve a specific project using its unique identifier.", # noqa: E501
|
|
133
|
+
response_description="The requested project", # noqa: E501
|
|
134
|
+
responses=add_errors_to_responses(
|
|
135
|
+
[
|
|
136
|
+
HTTP_404_NOT_FOUND,
|
|
137
|
+
HTTP_422_UNPROCESSABLE_ENTITY,
|
|
138
|
+
]
|
|
139
|
+
),
|
|
140
|
+
)
|
|
141
|
+
async def get_project(
|
|
142
|
+
request: Request,
|
|
143
|
+
project_id: str = Path(description="The ID of the project."),
|
|
144
|
+
) -> GetProjectResponseBody:
|
|
145
|
+
"""
|
|
146
|
+
Retrieve a specific project by its ID.
|
|
147
|
+
|
|
148
|
+
Args:
|
|
149
|
+
request (Request): The FastAPI request object.
|
|
150
|
+
project_id (str): The ID of the project to retrieve.
|
|
151
|
+
|
|
152
|
+
Returns:
|
|
153
|
+
GetProjectResponseBody: Response containing the requested project.
|
|
154
|
+
|
|
155
|
+
Raises:
|
|
156
|
+
HTTPException: If the project ID is invalid or the project is not found.
|
|
157
|
+
""" # noqa: E501
|
|
158
|
+
async with request.app.state.db() as session:
|
|
159
|
+
try:
|
|
160
|
+
id_ = from_global_id_with_expected_type(
|
|
161
|
+
GlobalID.from_id(project_id),
|
|
162
|
+
ProjectNodeType.__name__,
|
|
163
|
+
)
|
|
164
|
+
project = await session.get(models.Project, id_)
|
|
165
|
+
except ValueError:
|
|
166
|
+
raise HTTPException(
|
|
167
|
+
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
168
|
+
detail=f"Invalid project ID format: {project_id}",
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
if project is None:
|
|
172
|
+
raise HTTPException(
|
|
173
|
+
status_code=HTTP_404_NOT_FOUND,
|
|
174
|
+
detail=f"Project with ID {project_id} not found",
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
data = _project_from_orm_project(project)
|
|
178
|
+
return GetProjectResponseBody(data=data)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
@router.post(
|
|
182
|
+
"/projects",
|
|
183
|
+
operation_id="createProject",
|
|
184
|
+
summary="Create a new project", # noqa: E501
|
|
185
|
+
description="Create a new project with the specified configuration.", # noqa: E501
|
|
186
|
+
response_description="The newly created project", # noqa: E501
|
|
187
|
+
responses=add_errors_to_responses(
|
|
188
|
+
[
|
|
189
|
+
HTTP_422_UNPROCESSABLE_ENTITY,
|
|
190
|
+
]
|
|
191
|
+
),
|
|
192
|
+
)
|
|
193
|
+
async def create_project(
|
|
194
|
+
request: Request,
|
|
195
|
+
request_body: CreateProjectRequestBody,
|
|
196
|
+
) -> CreateProjectResponseBody:
|
|
197
|
+
"""
|
|
198
|
+
Create a new project.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
request (Request): The FastAPI request object.
|
|
202
|
+
request_body (CreateProjectRequestBody): The request body containing project data.
|
|
203
|
+
|
|
204
|
+
Returns:
|
|
205
|
+
CreateProjectResponseBody: Response containing the created project.
|
|
206
|
+
|
|
207
|
+
Raises:
|
|
208
|
+
HTTPException: If any validation error occurs.
|
|
209
|
+
"""
|
|
210
|
+
project = request_body.project
|
|
211
|
+
async with request.app.state.db() as session:
|
|
212
|
+
project_orm = models.Project(
|
|
213
|
+
name=project.name,
|
|
214
|
+
description=project.description,
|
|
215
|
+
)
|
|
216
|
+
session.add(project_orm)
|
|
217
|
+
await session.flush()
|
|
218
|
+
data = _project_from_orm_project(project_orm)
|
|
219
|
+
return CreateProjectResponseBody(data=data)
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
@router.put(
|
|
223
|
+
"/projects/{project_id}",
|
|
224
|
+
operation_id="updateProject",
|
|
225
|
+
summary="Update a project", # noqa: E501
|
|
226
|
+
description="Update an existing project with new configuration. Project names cannot be changed.", # noqa: E501
|
|
227
|
+
response_description="The updated project", # noqa: E501
|
|
228
|
+
responses=add_errors_to_responses(
|
|
229
|
+
[
|
|
230
|
+
HTTP_403_FORBIDDEN,
|
|
231
|
+
HTTP_404_NOT_FOUND,
|
|
232
|
+
HTTP_422_UNPROCESSABLE_ENTITY,
|
|
233
|
+
]
|
|
234
|
+
),
|
|
235
|
+
)
|
|
236
|
+
async def update_project(
|
|
237
|
+
request: Request,
|
|
238
|
+
request_body: UpdateProjectRequestBody,
|
|
239
|
+
project_id: str = Path(description="The ID of the project to update."),
|
|
240
|
+
) -> UpdateProjectResponseBody:
|
|
241
|
+
"""
|
|
242
|
+
Update an existing project.
|
|
243
|
+
|
|
244
|
+
Args:
|
|
245
|
+
request (Request): The FastAPI request object.
|
|
246
|
+
request_body (UpdateProjectRequestBody): The request body containing updated project data.
|
|
247
|
+
project_id (str): The ID of the project to update.
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
UpdateProjectResponseBody: Response containing the updated project.
|
|
251
|
+
|
|
252
|
+
Raises:
|
|
253
|
+
HTTPException: If the project ID is invalid, the project is not found, or the name is changed.
|
|
254
|
+
""" # noqa: E501
|
|
255
|
+
if request.app.state.authentication_enabled:
|
|
256
|
+
async with request.app.state.db() as session:
|
|
257
|
+
# Check if the user is an admin
|
|
258
|
+
stmt = (
|
|
259
|
+
select(models.UserRole.name)
|
|
260
|
+
.join(models.User)
|
|
261
|
+
.where(models.User.id == int(request.user.identity))
|
|
262
|
+
)
|
|
263
|
+
role_name = await session.scalar(stmt)
|
|
264
|
+
if role_name != UserRole.ADMIN.value:
|
|
265
|
+
raise HTTPException(
|
|
266
|
+
status_code=HTTP_403_FORBIDDEN,
|
|
267
|
+
detail="Only admins can update projects",
|
|
268
|
+
)
|
|
269
|
+
async with request.app.state.db() as session:
|
|
270
|
+
try:
|
|
271
|
+
id_ = from_global_id_with_expected_type(
|
|
272
|
+
GlobalID.from_id(project_id),
|
|
273
|
+
ProjectNodeType.__name__,
|
|
274
|
+
)
|
|
275
|
+
project_orm = await session.get(models.Project, id_)
|
|
276
|
+
except ValueError:
|
|
277
|
+
raise HTTPException(
|
|
278
|
+
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
279
|
+
detail=f"Invalid project ID format: {project_id}",
|
|
280
|
+
)
|
|
281
|
+
|
|
282
|
+
if project_orm is None:
|
|
283
|
+
raise HTTPException(
|
|
284
|
+
status_code=HTTP_404_NOT_FOUND,
|
|
285
|
+
detail=f"Project with ID {project_id} not found",
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
# Prevent changing the project name
|
|
289
|
+
if project_orm.name != request_body.project.name:
|
|
290
|
+
raise HTTPException(
|
|
291
|
+
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
292
|
+
detail="Project names cannot be changed",
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
# Only update the description
|
|
296
|
+
project_orm.description = request_body.project.description
|
|
297
|
+
|
|
298
|
+
data = _project_from_orm_project(project_orm)
|
|
299
|
+
return UpdateProjectResponseBody(data=data)
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
@router.delete(
|
|
303
|
+
"/projects/{project_id}",
|
|
304
|
+
operation_id="deleteProject",
|
|
305
|
+
summary="Delete a project", # noqa: E501
|
|
306
|
+
description="Delete an existing project and all its associated data.", # noqa: E501
|
|
307
|
+
response_description="No content returned on successful deletion", # noqa: E501
|
|
308
|
+
status_code=HTTP_204_NO_CONTENT,
|
|
309
|
+
responses=add_errors_to_responses(
|
|
310
|
+
[
|
|
311
|
+
HTTP_403_FORBIDDEN,
|
|
312
|
+
HTTP_404_NOT_FOUND,
|
|
313
|
+
HTTP_422_UNPROCESSABLE_ENTITY,
|
|
314
|
+
]
|
|
315
|
+
),
|
|
316
|
+
)
|
|
317
|
+
async def delete_project(
|
|
318
|
+
request: Request,
|
|
319
|
+
project_id: str = Path(description="The ID of the project to delete."),
|
|
320
|
+
) -> None:
|
|
321
|
+
"""
|
|
322
|
+
Delete an existing project.
|
|
323
|
+
|
|
324
|
+
Args:
|
|
325
|
+
request (Request): The FastAPI request object.
|
|
326
|
+
project_id (str): The ID of the project to delete.
|
|
327
|
+
|
|
328
|
+
Returns:
|
|
329
|
+
None: Returns a 204 No Content response on success.
|
|
330
|
+
|
|
331
|
+
Raises:
|
|
332
|
+
HTTPException: If the project ID is invalid, the project is not found, or it's the default project.
|
|
333
|
+
""" # noqa: E501
|
|
334
|
+
if request.app.state.authentication_enabled:
|
|
335
|
+
async with request.app.state.db() as session:
|
|
336
|
+
# Check if the user is an admin
|
|
337
|
+
stmt = (
|
|
338
|
+
select(models.UserRole.name)
|
|
339
|
+
.join(models.User)
|
|
340
|
+
.where(models.User.id == int(request.user.identity))
|
|
341
|
+
)
|
|
342
|
+
role_name = await session.scalar(stmt)
|
|
343
|
+
if role_name != UserRole.ADMIN.value:
|
|
344
|
+
raise HTTPException(
|
|
345
|
+
status_code=HTTP_403_FORBIDDEN,
|
|
346
|
+
detail="Only admins can delete projects",
|
|
347
|
+
)
|
|
348
|
+
async with request.app.state.db() as session:
|
|
349
|
+
try:
|
|
350
|
+
id_ = from_global_id_with_expected_type(
|
|
351
|
+
GlobalID.from_id(project_id),
|
|
352
|
+
ProjectNodeType.__name__,
|
|
353
|
+
)
|
|
354
|
+
project = await session.get(models.Project, id_)
|
|
355
|
+
except ValueError:
|
|
356
|
+
raise HTTPException(
|
|
357
|
+
status_code=HTTP_422_UNPROCESSABLE_ENTITY,
|
|
358
|
+
detail=f"Invalid project ID format: {project_id}",
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
if project is None:
|
|
362
|
+
raise HTTPException(
|
|
363
|
+
status_code=HTTP_404_NOT_FOUND,
|
|
364
|
+
detail=f"Project with ID {project_id} not found",
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
# The default project must not be deleted - it's forbidden
|
|
368
|
+
if project.name == DEFAULT_PROJECT_NAME:
|
|
369
|
+
raise HTTPException(
|
|
370
|
+
status_code=HTTP_403_FORBIDDEN,
|
|
371
|
+
detail="The default project cannot be deleted",
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
await session.delete(project)
|
|
375
|
+
return None
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
def _project_from_orm_project(orm_project: models.Project) -> Project:
|
|
379
|
+
return Project(
|
|
380
|
+
id=str(GlobalID(ProjectNodeType.__name__, str(orm_project.id))),
|
|
381
|
+
name=orm_project.name,
|
|
382
|
+
description=orm_project.description,
|
|
383
|
+
)
|
|
@@ -24,6 +24,7 @@ from urllib.parse import urlparse
|
|
|
24
24
|
|
|
25
25
|
import strawberry
|
|
26
26
|
from fastapi import APIRouter, Depends, FastAPI
|
|
27
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
27
28
|
from fastapi.middleware.gzip import GZipMiddleware
|
|
28
29
|
from fastapi.utils import is_body_allowed_for_status_code
|
|
29
30
|
from grpc.aio import ServerInterceptor
|
|
@@ -765,6 +766,7 @@ def create_app(
|
|
|
765
766
|
email_sender: Optional[EmailSender] = None,
|
|
766
767
|
oauth2_client_configs: Optional[list[OAuth2ClientConfig]] = None,
|
|
767
768
|
bulk_inserter_factory: Optional[Callable[..., BulkInserter]] = None,
|
|
769
|
+
allowed_origins: Optional[list[str]] = None,
|
|
768
770
|
) -> FastAPI:
|
|
769
771
|
if model.embedding_dimensions:
|
|
770
772
|
try:
|
|
@@ -948,6 +950,14 @@ def create_app(
|
|
|
948
950
|
FastAPIInstrumentor().instrument(tracer_provider=tracer_provider)
|
|
949
951
|
FastAPIInstrumentor.instrument_app(app, tracer_provider=tracer_provider)
|
|
950
952
|
shutdown_callbacks_list.append(FastAPIInstrumentor().uninstrument)
|
|
953
|
+
if allowed_origins:
|
|
954
|
+
app.add_middleware(
|
|
955
|
+
CORSMiddleware,
|
|
956
|
+
allow_origins=allowed_origins,
|
|
957
|
+
allow_credentials=True,
|
|
958
|
+
allow_methods=["*"],
|
|
959
|
+
allow_headers=["*"],
|
|
960
|
+
)
|
|
951
961
|
return app
|
|
952
962
|
|
|
953
963
|
|
|
@@ -16,6 +16,7 @@ import phoenix.trace.v1 as pb
|
|
|
16
16
|
from phoenix.config import (
|
|
17
17
|
EXPORT_DIR,
|
|
18
18
|
get_env_access_token_expiry,
|
|
19
|
+
get_env_allowed_origins,
|
|
19
20
|
get_env_auth_settings,
|
|
20
21
|
get_env_database_connection_str,
|
|
21
22
|
get_env_database_schema,
|
|
@@ -98,6 +99,7 @@ _WELCOME_MESSAGE = Environment(loader=BaseLoader()).from_string("""
|
|
|
98
99
|
| Phoenix UI: {{ ui_path }}
|
|
99
100
|
| Authentication: {{ auth_enabled }}
|
|
100
101
|
| Websockets: {{ websockets_enabled }}
|
|
102
|
+
{%- if allowed_origins %}\n| Allowed Origins: {{ allowed_origins }}{% endif %}
|
|
101
103
|
| Log traces:
|
|
102
104
|
| - gRPC: {{ grpc_path }}
|
|
103
105
|
| - HTTP: {{ http_path }}
|
|
@@ -359,6 +361,8 @@ def main() -> None:
|
|
|
359
361
|
if enable_websockets is None:
|
|
360
362
|
enable_websockets = True
|
|
361
363
|
|
|
364
|
+
allowed_origins = get_env_allowed_origins()
|
|
365
|
+
|
|
362
366
|
# Print information about the server
|
|
363
367
|
root_path = urljoin(f"http://{host}:{port}", host_root_path)
|
|
364
368
|
msg = _WELCOME_MESSAGE.render(
|
|
@@ -370,6 +374,7 @@ def main() -> None:
|
|
|
370
374
|
schema=get_env_database_schema(),
|
|
371
375
|
auth_enabled=authentication_enabled,
|
|
372
376
|
websockets_enabled=enable_websockets,
|
|
377
|
+
allowed_origins=allowed_origins,
|
|
373
378
|
)
|
|
374
379
|
if sys.platform.startswith("win"):
|
|
375
380
|
msg = codecs.encode(msg, "ascii", errors="ignore").decode("ascii").strip()
|
|
@@ -419,6 +424,7 @@ def main() -> None:
|
|
|
419
424
|
scaffolder_config=scaffolder_config,
|
|
420
425
|
email_sender=email_sender,
|
|
421
426
|
oauth2_client_configs=get_env_oauth2_settings(),
|
|
427
|
+
allowed_origins=allowed_origins,
|
|
422
428
|
)
|
|
423
429
|
server = Server(config=Config(app, host=host, port=port, root_path=host_root_path)) # type: ignore
|
|
424
430
|
Thread(target=_write_pid_file_when_ready, args=(server,), daemon=True).start()
|