arize-phoenix 8.28.1__tar.gz → 8.30.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.28.1 → arize_phoenix-8.30.0}/PKG-INFO +1 -1
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/config.py +294 -3
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/helpers/playground_spans.py +4 -0
- arize_phoenix-8.30.0/src/phoenix/server/authorization.py +53 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/grpc_server.py +21 -2
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/main.py +56 -7
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/.vite/manifest.json +9 -9
- arize_phoenix-8.28.1/src/phoenix/server/static/assets/components-DepxScNF.js → arize_phoenix-8.30.0/src/phoenix/server/static/assets/components-BypB0fGT.js +1 -1
- arize_phoenix-8.28.1/src/phoenix/server/static/assets/index-DUj7q3Q4.js → arize_phoenix-8.30.0/src/phoenix/server/static/assets/index-Ccebc6-h.js +1 -1
- arize_phoenix-8.28.1/src/phoenix/server/static/assets/pages-CJUakDKi.js → arize_phoenix-8.30.0/src/phoenix/server/static/assets/pages-DGdjQlsy.js +94 -94
- arize_phoenix-8.30.0/src/phoenix/version.py +1 -0
- arize_phoenix-8.28.1/src/phoenix/version.py +0 -1
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/.gitignore +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/IP_NOTICE +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/LICENSE +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/README.md +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/pyproject.toml +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/auth.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/core/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/core/embedding_dimension.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/core/model.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/core/model_schema.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/core/model_schema_adapter.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/datetime_utils.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/README.md +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/alembic.ini +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/bulk_inserter.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/engines.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/enums.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/facilitator.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/helpers.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/insertion/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/insertion/constants.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/insertion/dataset.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/insertion/evaluation.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/insertion/helpers.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/insertion/span.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/insertion/types.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/migrate.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/migrations/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/migrations/data_migration_scripts/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/migrations/env.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/migrations/script.py.mako +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/migrations/versions/bc8fea3c2bc8_add_prompt_tables.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/models.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/types/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/types/identifier.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/db/types/model_provider.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/exceptions.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/experiments/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/experiments/evaluators/base.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/experiments/functions.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/experiments/tracing.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/experiments/types.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/experiments/utils.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/inferences/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/inferences/errors.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/inferences/fixtures.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/inferences/inferences.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/inferences/schema.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/inferences/validation.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/logging/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/logging/_config.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/logging/_filter.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/logging/_formatter.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/metrics/README.md +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/metrics/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/metrics/binning.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/metrics/metrics.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/metrics/mixins.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/metrics/timeseries.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/metrics/wrappers.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/pointcloud/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/pointcloud/clustering.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/pointcloud/projectors.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/py.typed +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/README.md +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/auth.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/context.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/num_child_spans.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/num_spans_per_trace.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/prompt_version_sequence_number.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/session_io.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/session_num_traces.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/session_num_traces_with_error.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/session_token_usages.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/span_by_id.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/table_fields.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/trace_by_trace_ids.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/trace_root_spans.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/user_roles.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/dataloaders/users.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/exceptions.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/helpers/experiment_run_filters.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/helpers/playground_clients.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/helpers/playground_registry.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/helpers/prompts/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/helpers/prompts/conversions/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/helpers/prompts/conversions/anthropic.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/helpers/prompts/conversions/openai.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/helpers/prompts/models.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/ChatCompletionInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/GenerativeModelInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/InvocationParameters.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/ProjectSessionSort.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/PromptTemplateOptions.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/PromptVersionInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/interceptor.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/mutations/api_key_mutations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/mutations/chat_mutations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/mutations/prompt_label_mutations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/mutations/prompt_mutations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/mutations/prompt_version_tag_mutations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/mutations/trace_mutations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/openapi/main.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/openapi/schema.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/queries.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/auth.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/embeddings.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/oauth2.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/utils.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/v1/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/v1/datasets.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/v1/evaluations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/v1/experiments.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/v1/models.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/v1/projects.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/v1/prompts.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/v1/spans.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/v1/traces.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/schema.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/subscriptions.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Annotation.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/AuthMethod.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Cluster.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Dataset.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Dimension.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Event.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Experiment.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Functionality.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/GenerativeProvider.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Identifier.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Inferences.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/MimeType.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Model.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Project.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/ProjectSession.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Prompt.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/PromptLabel.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/PromptVersion.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/PromptVersionTag.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/PromptVersionTemplate.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/ResponseFormat.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Segments.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/SortDir.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Span.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/SpanIOValue.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/TokenUsage.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/ToolDefinition.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/Trace.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/User.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/UserRole.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/node.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/types/pagination.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/utils.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/app.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/bearer_auth.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/dml_event.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/dml_event_handler.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/email/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/email/sender.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/email/templates/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/email/templates/password_reset.html +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/email/templates/welcome.html +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/email/types.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/jwt_store.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/middleware/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/middleware/gzip.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/oauth2.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/openapi/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/prometheus.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/rate_limiters.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/assets/vendor-BfhM_F1u.js +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/assets/vendor-Cg6lcjUC.css +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/assets/vendor-arizeai-CxXYQNUl.js +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/assets/vendor-codemirror-B0NIFPOL.js +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/assets/vendor-recharts-CrrDFWK1.js +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/assets/vendor-shiki-C5bJ-RPf.js +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/assets/vendor-three-C5WAXd5r.js +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/favicon.ico +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/static/modernizr.js +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/telemetry.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/templates/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/templates/index.html +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/thread_server.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/types.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/services.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/session/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/session/client.py +1 -1
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/session/data_extractor.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/session/evaluation.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/session/session.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/settings.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/attributes.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/dsl/README.md +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/dsl/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/dsl/filter.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/dsl/helpers.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/dsl/query.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/errors.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/exporter.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/fixtures.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/otel.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/projects.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/schemas.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/span_evaluations.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/span_json_decoder.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/span_json_encoder.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/trace_dataset.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/utils.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/v1/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/utilities/__init__.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/utilities/client.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/utilities/deprecation.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/utilities/error_handling.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/utilities/json.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/utilities/logging.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/utilities/project.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/utilities/re.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/utilities/span_store.py +0 -0
- {arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/utilities/template_formatters.py +0 -0
|
@@ -2,7 +2,7 @@ import logging
|
|
|
2
2
|
import os
|
|
3
3
|
import re
|
|
4
4
|
import tempfile
|
|
5
|
-
from dataclasses import dataclass
|
|
5
|
+
from dataclasses import dataclass, field
|
|
6
6
|
from datetime import timedelta
|
|
7
7
|
from enum import Enum
|
|
8
8
|
from importlib.metadata import version
|
|
@@ -240,6 +240,268 @@ ENV_PHOENIX_FASTAPI_MIDDLEWARE_PATHS = "PHOENIX_FASTAPI_MIDDLEWARE_PATHS"
|
|
|
240
240
|
ENV_PHOENIX_GQL_EXTENSION_PATHS = "PHOENIX_GQL_EXTENSION_PATHS"
|
|
241
241
|
ENV_PHOENIX_GRPC_INTERCEPTOR_PATHS = "PHOENIX_GRPC_INTERCEPTOR_PATHS"
|
|
242
242
|
|
|
243
|
+
ENV_PHOENIX_TLS_ENABLED = "PHOENIX_TLS_ENABLED"
|
|
244
|
+
"""
|
|
245
|
+
Whether to enable TLS for Phoenix HTTP and gRPC servers.
|
|
246
|
+
"""
|
|
247
|
+
ENV_PHOENIX_TLS_ENABLED_FOR_HTTP = "PHOENIX_TLS_ENABLED_FOR_HTTP"
|
|
248
|
+
"""
|
|
249
|
+
Whether to enable TLS for Phoenix HTTP server. Overrides PHOENIX_TLS_ENABLED.
|
|
250
|
+
"""
|
|
251
|
+
ENV_PHOENIX_TLS_ENABLED_FOR_GRPC = "PHOENIX_TLS_ENABLED_FOR_GRPC"
|
|
252
|
+
"""
|
|
253
|
+
Whether to enable TLS for Phoenix gRPC server. Overrides PHOENIX_TLS_ENABLED.
|
|
254
|
+
"""
|
|
255
|
+
ENV_PHOENIX_TLS_CERT_FILE = "PHOENIX_TLS_CERT_FILE"
|
|
256
|
+
"""
|
|
257
|
+
Path to the TLS certificate file for HTTPS connections.
|
|
258
|
+
When set, Phoenix will use HTTPS instead of HTTP for all connections.
|
|
259
|
+
"""
|
|
260
|
+
ENV_PHOENIX_TLS_KEY_FILE = "PHOENIX_TLS_KEY_FILE"
|
|
261
|
+
"""
|
|
262
|
+
Path to the TLS private key file for HTTPS connections.
|
|
263
|
+
Required when PHOENIX_TLS_CERT_FILE is set.
|
|
264
|
+
"""
|
|
265
|
+
ENV_PHOENIX_TLS_KEY_FILE_PASSWORD = "PHOENIX_TLS_KEY_FILE_PASSWORD"
|
|
266
|
+
"""
|
|
267
|
+
Password for the TLS private key file if it's encrypted.
|
|
268
|
+
Only needed if the private key file requires a password.
|
|
269
|
+
"""
|
|
270
|
+
ENV_PHOENIX_TLS_CA_FILE = "PHOENIX_TLS_CA_FILE"
|
|
271
|
+
"""
|
|
272
|
+
Path to the Certificate Authority (CA) file for client certificate verification.
|
|
273
|
+
Used when PHOENIX_TLS_VERIFY_CLIENT is set to true.
|
|
274
|
+
"""
|
|
275
|
+
ENV_PHOENIX_TLS_VERIFY_CLIENT = "PHOENIX_TLS_VERIFY_CLIENT"
|
|
276
|
+
"""
|
|
277
|
+
Whether to verify client certificates for mutual TLS (mTLS) authentication.
|
|
278
|
+
When set to true, clients must provide valid certificates signed by the CA specified in
|
|
279
|
+
PHOENIX_TLS_CA_FILE.
|
|
280
|
+
"""
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
@dataclass(frozen=True)
|
|
284
|
+
class TLSConfig:
|
|
285
|
+
"""Configuration for TLS (Transport Layer Security) connections.
|
|
286
|
+
|
|
287
|
+
This class manages TLS certificates and private keys for secure connections.
|
|
288
|
+
It handles reading certificate and key files, and decrypting private keys
|
|
289
|
+
if they are password-protected.
|
|
290
|
+
|
|
291
|
+
Attributes:
|
|
292
|
+
cert_file: Path to the TLS certificate file
|
|
293
|
+
key_file: Path to the TLS private key file
|
|
294
|
+
key_file_password: Optional password for decrypting the private key
|
|
295
|
+
_cert_data: Cached certificate data (internal use)
|
|
296
|
+
_key_data: Cached decrypted key data (internal use)
|
|
297
|
+
_decrypted_key_data: Cached decrypted key data (internal use)
|
|
298
|
+
"""
|
|
299
|
+
|
|
300
|
+
cert_file: Path
|
|
301
|
+
key_file: Path
|
|
302
|
+
key_file_password: Optional[str]
|
|
303
|
+
_cert_data: bytes = field(default=b"", init=False, repr=False)
|
|
304
|
+
_key_data: bytes = field(default=b"", init=False, repr=False)
|
|
305
|
+
_decrypted_key_data: Optional[bytes] = field(default=None, init=False, repr=False)
|
|
306
|
+
|
|
307
|
+
@property
|
|
308
|
+
def cert_data(self) -> bytes:
|
|
309
|
+
"""Get the certificate data, reading from file if not cached.
|
|
310
|
+
|
|
311
|
+
Returns:
|
|
312
|
+
bytes: The certificate data in PEM format
|
|
313
|
+
"""
|
|
314
|
+
if not self._cert_data:
|
|
315
|
+
with open(self.cert_file, "rb") as f:
|
|
316
|
+
object.__setattr__(self, "_cert_data", f.read())
|
|
317
|
+
return self._cert_data
|
|
318
|
+
|
|
319
|
+
@property
|
|
320
|
+
def key_data(self) -> bytes:
|
|
321
|
+
"""Get the decrypted key data, reading from file if not cached.
|
|
322
|
+
|
|
323
|
+
This property reads the private key file and decrypts it if a password
|
|
324
|
+
is provided. The decrypted key is cached for subsequent accesses.
|
|
325
|
+
|
|
326
|
+
Returns:
|
|
327
|
+
bytes: The decrypted private key data in PEM format
|
|
328
|
+
|
|
329
|
+
Raises:
|
|
330
|
+
ValueError: If the cryptography library is not installed or if
|
|
331
|
+
decryption fails
|
|
332
|
+
"""
|
|
333
|
+
if not self._key_data:
|
|
334
|
+
self._read_and_cache_key_data()
|
|
335
|
+
return self._key_data
|
|
336
|
+
|
|
337
|
+
def _read_and_cache_key_data(self) -> None:
|
|
338
|
+
"""Read and decrypt the private key file, then cache the result.
|
|
339
|
+
|
|
340
|
+
This method reads the private key file, decrypts it if a password
|
|
341
|
+
is provided, and stores the decrypted key in the _key_data attribute.
|
|
342
|
+
|
|
343
|
+
Raises:
|
|
344
|
+
ValueError: If the cryptography library is not installed or if
|
|
345
|
+
decryption fails
|
|
346
|
+
"""
|
|
347
|
+
try:
|
|
348
|
+
from cryptography.hazmat.backends import default_backend
|
|
349
|
+
from cryptography.hazmat.primitives.serialization import (
|
|
350
|
+
Encoding,
|
|
351
|
+
NoEncryption,
|
|
352
|
+
PrivateFormat,
|
|
353
|
+
load_pem_private_key,
|
|
354
|
+
)
|
|
355
|
+
except ImportError:
|
|
356
|
+
raise ValueError(
|
|
357
|
+
"The cryptography library is needed to read private keys for "
|
|
358
|
+
"TLS configuration. Please install it with: pip install cryptography"
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
# First read the key file
|
|
362
|
+
with open(self.key_file, "rb") as f:
|
|
363
|
+
key_data = f.read()
|
|
364
|
+
|
|
365
|
+
try:
|
|
366
|
+
# Convert password to bytes if it exists
|
|
367
|
+
password_bytes = self.key_file_password.encode() if self.key_file_password else None
|
|
368
|
+
|
|
369
|
+
# Load the key (decrypting if password is provided)
|
|
370
|
+
private_key = load_pem_private_key(
|
|
371
|
+
key_data,
|
|
372
|
+
password=password_bytes,
|
|
373
|
+
backend=default_backend(),
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
# Convert to PEM format without encryption
|
|
377
|
+
decrypted_pem = private_key.private_bytes(
|
|
378
|
+
encoding=Encoding.PEM,
|
|
379
|
+
format=PrivateFormat.PKCS8,
|
|
380
|
+
encryption_algorithm=NoEncryption(),
|
|
381
|
+
)
|
|
382
|
+
except Exception as e:
|
|
383
|
+
raise ValueError(f"Failed to decrypt private key: {e}")
|
|
384
|
+
object.__setattr__(self, "_key_data", decrypted_pem)
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
@dataclass(frozen=True)
|
|
388
|
+
class TLSConfigVerifyClient(TLSConfig):
|
|
389
|
+
"""TLS configuration with client verification enabled."""
|
|
390
|
+
|
|
391
|
+
ca_file: Path
|
|
392
|
+
_ca_data: bytes = field(default=b"", init=False, repr=False)
|
|
393
|
+
|
|
394
|
+
@property
|
|
395
|
+
def ca_data(self) -> bytes:
|
|
396
|
+
"""Get the CA certificate data, reading from file if not cached."""
|
|
397
|
+
if not self._ca_data:
|
|
398
|
+
with open(self.ca_file, "rb") as f:
|
|
399
|
+
object.__setattr__(self, "_ca_data", f.read())
|
|
400
|
+
return self._ca_data
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
def get_env_tls_enabled_for_http() -> bool:
|
|
404
|
+
"""
|
|
405
|
+
Gets whether TLS is enabled for the HTTP server.
|
|
406
|
+
|
|
407
|
+
This function checks both PHOENIX_TLS_ENABLED_FOR_HTTP and PHOENIX_TLS_ENABLED environment variables.
|
|
408
|
+
If PHOENIX_TLS_ENABLED_FOR_HTTP is set, it takes precedence over PHOENIX_TLS_ENABLED.
|
|
409
|
+
|
|
410
|
+
Returns:
|
|
411
|
+
bool: True if TLS is enabled for HTTP server, False otherwise. Defaults to False if neither
|
|
412
|
+
environment variable is set.
|
|
413
|
+
""" # noqa: E501
|
|
414
|
+
return _bool_val(ENV_PHOENIX_TLS_ENABLED_FOR_HTTP, _bool_val(ENV_PHOENIX_TLS_ENABLED, False))
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
def get_env_tls_enabled_for_grpc() -> bool:
|
|
418
|
+
"""
|
|
419
|
+
Gets whether TLS is enabled for the gRPC server.
|
|
420
|
+
|
|
421
|
+
This function checks both PHOENIX_TLS_ENABLED_FOR_GRPC and PHOENIX_TLS_ENABLED environment variables.
|
|
422
|
+
If PHOENIX_TLS_ENABLED_FOR_GRPC is set, it takes precedence over PHOENIX_TLS_ENABLED.
|
|
423
|
+
|
|
424
|
+
Returns:
|
|
425
|
+
bool: True if TLS is enabled for gRPC server, False otherwise. Defaults to False if neither
|
|
426
|
+
environment variable is set.
|
|
427
|
+
""" # noqa: E501
|
|
428
|
+
return _bool_val(ENV_PHOENIX_TLS_ENABLED_FOR_GRPC, _bool_val(ENV_PHOENIX_TLS_ENABLED, False))
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
def get_env_tls_verify_client() -> bool:
|
|
432
|
+
"""
|
|
433
|
+
Gets the value of the PHOENIX_TLS_VERIFY_CLIENT environment variable.
|
|
434
|
+
|
|
435
|
+
Returns:
|
|
436
|
+
bool: True if client certificate verification is enabled, False otherwise. Defaults to False
|
|
437
|
+
if the environment variable is not set.
|
|
438
|
+
""" # noqa: E501
|
|
439
|
+
return _bool_val(ENV_PHOENIX_TLS_VERIFY_CLIENT, False)
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
def get_env_tls_config() -> Optional[TLSConfig]:
|
|
443
|
+
"""
|
|
444
|
+
Retrieves and validates TLS configuration from environment variables.
|
|
445
|
+
|
|
446
|
+
Returns:
|
|
447
|
+
Optional[TLSConfig]: A configuration object containing TLS settings, or None if TLS is disabled.
|
|
448
|
+
If client verification is enabled, returns TLSConfigVerifyClient instead.
|
|
449
|
+
|
|
450
|
+
The function reads the following environment variables:
|
|
451
|
+
- PHOENIX_TLS_ENABLED: Whether TLS is enabled (defaults to False)
|
|
452
|
+
- PHOENIX_TLS_CERT_FILE: Path to the TLS certificate file
|
|
453
|
+
- PHOENIX_TLS_KEY_FILE: Path to the TLS private key file
|
|
454
|
+
- PHOENIX_TLS_KEY_FILE_PASSWORD: Password for the TLS private key file
|
|
455
|
+
- PHOENIX_TLS_CA_FILE: Path to the Certificate Authority file (required for client verification)
|
|
456
|
+
- PHOENIX_TLS_VERIFY_CLIENT: Whether to verify client certificates
|
|
457
|
+
|
|
458
|
+
Raises:
|
|
459
|
+
ValueError: If required files are missing or don't exist when TLS is enabled
|
|
460
|
+
""" # noqa: E501
|
|
461
|
+
# Check if TLS is enabled
|
|
462
|
+
if not (get_env_tls_enabled_for_http() or get_env_tls_enabled_for_grpc()):
|
|
463
|
+
return None
|
|
464
|
+
|
|
465
|
+
# Get certificate file path if specified
|
|
466
|
+
if not (cert_file_str := getenv(ENV_PHOENIX_TLS_CERT_FILE)):
|
|
467
|
+
raise ValueError("PHOENIX_TLS_CERT_FILE must be set when PHOENIX_TLS_ENABLED is true")
|
|
468
|
+
cert_file = Path(cert_file_str)
|
|
469
|
+
|
|
470
|
+
# Get private key file path if specified
|
|
471
|
+
if not (key_file_str := getenv(ENV_PHOENIX_TLS_KEY_FILE)):
|
|
472
|
+
raise ValueError("PHOENIX_TLS_KEY_FILE must be set when PHOENIX_TLS_ENABLED is true")
|
|
473
|
+
key_file = Path(key_file_str)
|
|
474
|
+
|
|
475
|
+
# Get private key password if specified
|
|
476
|
+
key_file_password = getenv(ENV_PHOENIX_TLS_KEY_FILE_PASSWORD)
|
|
477
|
+
|
|
478
|
+
# Validate certificate and key files
|
|
479
|
+
_validate_file_exists_and_is_readable(cert_file, "certificate")
|
|
480
|
+
_validate_file_exists_and_is_readable(key_file, "key")
|
|
481
|
+
|
|
482
|
+
# If client verification is enabled, validate CA file and return TLSConfigVerifyClient
|
|
483
|
+
if get_env_tls_verify_client():
|
|
484
|
+
if not (ca_file_str := getenv(ENV_PHOENIX_TLS_CA_FILE)):
|
|
485
|
+
raise ValueError(
|
|
486
|
+
"PHOENIX_TLS_CA_FILE must be set when PHOENIX_TLS_VERIFY_CLIENT is true"
|
|
487
|
+
)
|
|
488
|
+
|
|
489
|
+
ca_file = Path(ca_file_str)
|
|
490
|
+
_validate_file_exists_and_is_readable(ca_file, "CA")
|
|
491
|
+
|
|
492
|
+
return TLSConfigVerifyClient(
|
|
493
|
+
cert_file=cert_file,
|
|
494
|
+
key_file=key_file,
|
|
495
|
+
key_file_password=key_file_password,
|
|
496
|
+
ca_file=ca_file,
|
|
497
|
+
)
|
|
498
|
+
|
|
499
|
+
return TLSConfig(
|
|
500
|
+
cert_file=cert_file,
|
|
501
|
+
key_file=key_file,
|
|
502
|
+
key_file_password=key_file_password,
|
|
503
|
+
)
|
|
504
|
+
|
|
243
505
|
|
|
244
506
|
def server_instrumentation_is_enabled() -> bool:
|
|
245
507
|
return bool(
|
|
@@ -956,7 +1218,8 @@ def get_env_root_url() -> URL:
|
|
|
956
1218
|
host = get_env_host()
|
|
957
1219
|
if host == "0.0.0.0":
|
|
958
1220
|
host = "127.0.0.1"
|
|
959
|
-
|
|
1221
|
+
scheme = "https" if get_env_tls_enabled_for_http() else "http"
|
|
1222
|
+
return URL(urljoin(f"{scheme}://{host}:{get_env_port()}", get_env_host_root_path()))
|
|
960
1223
|
|
|
961
1224
|
|
|
962
1225
|
def get_base_url() -> str:
|
|
@@ -964,7 +1227,8 @@ def get_base_url() -> str:
|
|
|
964
1227
|
host = get_env_host()
|
|
965
1228
|
if host == "0.0.0.0":
|
|
966
1229
|
host = "127.0.0.1"
|
|
967
|
-
|
|
1230
|
+
scheme = "https" if get_env_tls_enabled_for_http() else "http"
|
|
1231
|
+
base_url = get_env_collector_endpoint() or f"{scheme}://{host}:{get_env_port()}"
|
|
968
1232
|
return base_url if base_url.endswith("/") else base_url + "/"
|
|
969
1233
|
|
|
970
1234
|
|
|
@@ -1159,3 +1423,30 @@ When the PHOENIX_ADMIN_SECRET is used as a bearer token in API requests, the
|
|
|
1159
1423
|
request is authenticated as the system user with the user_id set to this
|
|
1160
1424
|
SYSTEM_USER_ID value (only if this variable is not None).
|
|
1161
1425
|
"""
|
|
1426
|
+
|
|
1427
|
+
|
|
1428
|
+
def _validate_file_exists_and_is_readable(
|
|
1429
|
+
file_path: Path,
|
|
1430
|
+
description: str,
|
|
1431
|
+
check_non_empty: bool = True,
|
|
1432
|
+
) -> None:
|
|
1433
|
+
"""
|
|
1434
|
+
Validate that a file exists, is readable, and optionally has non-zero size.
|
|
1435
|
+
|
|
1436
|
+
Args:
|
|
1437
|
+
file_path: Path to the file to validate
|
|
1438
|
+
description: Description of the file for error messages (e.g., "certificate", "key", "CA")
|
|
1439
|
+
check_non_empty: Whether to check if the file has non-zero size. Defaults to True.
|
|
1440
|
+
|
|
1441
|
+
Raises:
|
|
1442
|
+
ValueError: If the path is not a file, isn't readable, or has zero size (if check_non_empty is True)
|
|
1443
|
+
""" # noqa: E501
|
|
1444
|
+
if not file_path.is_file():
|
|
1445
|
+
raise ValueError(f"{description} path is not a file: {file_path}")
|
|
1446
|
+
if check_non_empty and file_path.stat().st_size == 0:
|
|
1447
|
+
raise ValueError(f"{description} file is empty: {file_path}")
|
|
1448
|
+
try:
|
|
1449
|
+
with open(file_path, "rb") as f:
|
|
1450
|
+
f.read(1) # Read just one byte to verify readability
|
|
1451
|
+
except Exception as e:
|
|
1452
|
+
raise ValueError(f"{description} file is not readable: {e}")
|
{arize_phoenix-8.28.1 → arize_phoenix-8.30.0}/src/phoenix/server/api/helpers/playground_spans.py
RENAMED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import json
|
|
2
|
+
import logging
|
|
2
3
|
from collections import defaultdict
|
|
3
4
|
from collections.abc import Mapping
|
|
4
5
|
from dataclasses import asdict
|
|
@@ -54,6 +55,8 @@ ChatCompletionMessage: TypeAlias = tuple[
|
|
|
54
55
|
]
|
|
55
56
|
ToolCallID: TypeAlias = str
|
|
56
57
|
|
|
58
|
+
logger = logging.getLogger(__name__)
|
|
59
|
+
|
|
57
60
|
|
|
58
61
|
class streaming_llm_span:
|
|
59
62
|
"""
|
|
@@ -117,6 +120,7 @@ class streaming_llm_span:
|
|
|
117
120
|
exception_stacktrace=format_exc(),
|
|
118
121
|
)
|
|
119
122
|
)
|
|
123
|
+
logger.exception(exc_value)
|
|
120
124
|
if self._text_chunks or self._tool_call_chunks:
|
|
121
125
|
self._attributes.update(
|
|
122
126
|
chain(
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Authorization dependencies for FastAPI routes.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
Use the provided dependencies (e.g., require_admin) with FastAPI's Depends to restrict access to
|
|
6
|
+
certain routes.
|
|
7
|
+
|
|
8
|
+
These dependencies will raise HTTP 403 if the user is not authorized.
|
|
9
|
+
|
|
10
|
+
Example:
|
|
11
|
+
|
|
12
|
+
from fastapi import APIRouter, Depends
|
|
13
|
+
from phoenix.server.authorization import require_admin
|
|
14
|
+
|
|
15
|
+
router = APIRouter()
|
|
16
|
+
|
|
17
|
+
@router.post("/dangerous-thing", dependencies=[Depends(require_admin)])
|
|
18
|
+
async def dangerous_thing(...):
|
|
19
|
+
...
|
|
20
|
+
|
|
21
|
+
The require_admin dependency allows only admin or system users to access the route.
|
|
22
|
+
It expects authentication to be enabled and the request.user to be set by the authentication.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from fastapi import HTTPException, Request
|
|
26
|
+
from fastapi import status as fastapi_status
|
|
27
|
+
|
|
28
|
+
from phoenix.server.bearer_auth import PhoenixUser
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def require_admin(request: Request) -> None:
|
|
32
|
+
"""
|
|
33
|
+
FastAPI dependency to restrict access to admin or system users only.
|
|
34
|
+
|
|
35
|
+
Usage:
|
|
36
|
+
Add as a dependency to any route that should only be accessible by admin or system users:
|
|
37
|
+
|
|
38
|
+
@router.post("/dangerous-thing", dependencies=[Depends(require_admin)])
|
|
39
|
+
async def dangerous_thing(...):
|
|
40
|
+
...
|
|
41
|
+
|
|
42
|
+
Behavior:
|
|
43
|
+
- Allows access if the authenticated user is an admin or a system user.
|
|
44
|
+
- Raises HTTP 403 Forbidden if the user is not authorized.
|
|
45
|
+
- Expects authentication to be enabled and request.user to be set by the authentication.
|
|
46
|
+
"""
|
|
47
|
+
user = getattr(request, "user", None)
|
|
48
|
+
# System users have all privileges
|
|
49
|
+
if not (isinstance(user, PhoenixUser) and user.is_admin):
|
|
50
|
+
raise HTTPException(
|
|
51
|
+
status_code=fastapi_status.HTTP_403_FORBIDDEN,
|
|
52
|
+
detail="Only admin or system users can perform this action.",
|
|
53
|
+
)
|
|
@@ -14,7 +14,12 @@ from opentelemetry.proto.collector.trace.v1.trace_service_pb2_grpc import (
|
|
|
14
14
|
from typing_extensions import TypeAlias
|
|
15
15
|
|
|
16
16
|
from phoenix.auth import CanReadToken
|
|
17
|
-
from phoenix.config import
|
|
17
|
+
from phoenix.config import (
|
|
18
|
+
TLSConfigVerifyClient,
|
|
19
|
+
get_env_grpc_port,
|
|
20
|
+
get_env_tls_config,
|
|
21
|
+
get_env_tls_enabled_for_grpc,
|
|
22
|
+
)
|
|
18
23
|
from phoenix.server.bearer_auth import ApiKeyInterceptor
|
|
19
24
|
from phoenix.trace.otel import decode_otlp_span
|
|
20
25
|
from phoenix.trace.schemas import Span
|
|
@@ -86,7 +91,21 @@ class GrpcServer:
|
|
|
86
91
|
options=(("grpc.so_reuseport", 0),),
|
|
87
92
|
interceptors=interceptors,
|
|
88
93
|
)
|
|
89
|
-
|
|
94
|
+
if get_env_tls_enabled_for_grpc():
|
|
95
|
+
assert (tls_config := get_env_tls_config())
|
|
96
|
+
private_key_certificate_chain_pairs = [(tls_config.key_data, tls_config.cert_data)]
|
|
97
|
+
server_credentials = (
|
|
98
|
+
grpc.ssl_server_credentials(
|
|
99
|
+
private_key_certificate_chain_pairs,
|
|
100
|
+
root_certificates=tls_config.ca_data,
|
|
101
|
+
require_client_auth=True,
|
|
102
|
+
)
|
|
103
|
+
if isinstance(tls_config, TLSConfigVerifyClient)
|
|
104
|
+
else grpc.ssl_server_credentials(private_key_certificate_chain_pairs)
|
|
105
|
+
)
|
|
106
|
+
server.add_secure_port(f"[::]:{get_env_grpc_port()}", server_credentials)
|
|
107
|
+
else:
|
|
108
|
+
server.add_insecure_port(f"[::]:{get_env_grpc_port()}")
|
|
90
109
|
add_TraceServiceServicer_to_server(Servicer(self._callback), server) # type: ignore[no-untyped-call,unused-ignore]
|
|
91
110
|
await server.start()
|
|
92
111
|
self._server = server
|
|
@@ -4,6 +4,7 @@ import os
|
|
|
4
4
|
import sys
|
|
5
5
|
from argparse import SUPPRESS, ArgumentParser
|
|
6
6
|
from pathlib import Path
|
|
7
|
+
from ssl import CERT_REQUIRED
|
|
7
8
|
from threading import Thread
|
|
8
9
|
from time import sleep, time
|
|
9
10
|
from typing import Optional
|
|
@@ -15,6 +16,7 @@ from uvicorn import Config, Server
|
|
|
15
16
|
import phoenix.trace.v1 as pb
|
|
16
17
|
from phoenix.config import (
|
|
17
18
|
EXPORT_DIR,
|
|
19
|
+
TLSConfigVerifyClient,
|
|
18
20
|
get_env_access_token_expiry,
|
|
19
21
|
get_env_allowed_origins,
|
|
20
22
|
get_env_auth_settings,
|
|
@@ -39,6 +41,9 @@ from phoenix.config import (
|
|
|
39
41
|
get_env_smtp_port,
|
|
40
42
|
get_env_smtp_username,
|
|
41
43
|
get_env_smtp_validate_certs,
|
|
44
|
+
get_env_tls_config,
|
|
45
|
+
get_env_tls_enabled_for_grpc,
|
|
46
|
+
get_env_tls_enabled_for_http,
|
|
42
47
|
get_pids_path,
|
|
43
48
|
)
|
|
44
49
|
from phoenix.core.model_schema_adapter import create_model_from_inferences
|
|
@@ -98,15 +103,27 @@ _WELCOME_MESSAGE = Environment(loader=BaseLoader()).from_string("""
|
|
|
98
103
|
| 🚀 Phoenix Server 🚀
|
|
99
104
|
| Phoenix UI: {{ ui_path }}
|
|
100
105
|
| Authentication: {{ auth_enabled }}
|
|
101
|
-
|
|
102
|
-
{%- if
|
|
106
|
+
{%- if auth_enabled_for_http or auth_enabled_for_grpc %}
|
|
107
|
+
{%- if tls_enabled_for_http %}
|
|
108
|
+
| TLS: Enabled for HTTP
|
|
109
|
+
{%- endif %}
|
|
110
|
+
{%- if tls_enabled_for_grpc %}
|
|
111
|
+
| TLS: Enabled for gRPC
|
|
112
|
+
{%- endif %}
|
|
113
|
+
{%- if tls_verify_client %}
|
|
114
|
+
| TLS Client Verification: Enabled
|
|
115
|
+
{%- endif %}
|
|
116
|
+
{%- endif %}
|
|
117
|
+
{%- if allowed_origins %}
|
|
118
|
+
| Allowed Origins: {{ allowed_origins }}
|
|
119
|
+
{%- endif %}
|
|
103
120
|
| Log traces:
|
|
104
121
|
| - gRPC: {{ grpc_path }}
|
|
105
122
|
| - HTTP: {{ http_path }}
|
|
106
123
|
| Storage: {{ storage }}
|
|
107
|
-
{
|
|
124
|
+
{%- if schema %}
|
|
108
125
|
| - Schema: {{ schema }}
|
|
109
|
-
{
|
|
126
|
+
{%- endif %}
|
|
110
127
|
""")
|
|
111
128
|
|
|
112
129
|
|
|
@@ -356,16 +373,27 @@ def main() -> None:
|
|
|
356
373
|
|
|
357
374
|
allowed_origins = get_env_allowed_origins()
|
|
358
375
|
|
|
376
|
+
# Get TLS configuration
|
|
377
|
+
tls_enabled_for_http = get_env_tls_enabled_for_http()
|
|
378
|
+
tls_enabled_for_grpc = get_env_tls_enabled_for_grpc()
|
|
379
|
+
tls_config = get_env_tls_config()
|
|
380
|
+
tls_verify_client = tls_config is not None and isinstance(tls_config, TLSConfigVerifyClient)
|
|
381
|
+
|
|
359
382
|
# Print information about the server
|
|
360
|
-
|
|
383
|
+
http_scheme = "https" if tls_enabled_for_http else "http"
|
|
384
|
+
grpc_scheme = "https" if tls_enabled_for_grpc else "http"
|
|
385
|
+
root_path = urljoin(f"{http_scheme}://{host}:{port}", host_root_path)
|
|
361
386
|
msg = _WELCOME_MESSAGE.render(
|
|
362
387
|
version=phoenix_version,
|
|
363
388
|
ui_path=root_path,
|
|
364
|
-
grpc_path=f"
|
|
389
|
+
grpc_path=f"{grpc_scheme}://{host}:{get_env_grpc_port()}",
|
|
365
390
|
http_path=urljoin(root_path, "v1/traces"),
|
|
366
391
|
storage=get_printable_db_url(db_connection_str),
|
|
367
392
|
schema=get_env_database_schema(),
|
|
368
393
|
auth_enabled=authentication_enabled,
|
|
394
|
+
tls_enabled_for_http=tls_enabled_for_http,
|
|
395
|
+
tls_enabled_for_grpc=tls_enabled_for_grpc,
|
|
396
|
+
tls_verify_client=tls_verify_client,
|
|
369
397
|
allowed_origins=allowed_origins,
|
|
370
398
|
)
|
|
371
399
|
if sys.platform.startswith("win"):
|
|
@@ -417,7 +445,28 @@ def main() -> None:
|
|
|
417
445
|
oauth2_client_configs=get_env_oauth2_settings(),
|
|
418
446
|
allowed_origins=allowed_origins,
|
|
419
447
|
)
|
|
420
|
-
|
|
448
|
+
|
|
449
|
+
# Configure server with TLS if enabled
|
|
450
|
+
server_config = Config(
|
|
451
|
+
app=app,
|
|
452
|
+
host=host, # type: ignore[arg-type]
|
|
453
|
+
port=port,
|
|
454
|
+
root_path=host_root_path,
|
|
455
|
+
)
|
|
456
|
+
|
|
457
|
+
if tls_enabled_for_http:
|
|
458
|
+
assert tls_config
|
|
459
|
+
# Configure SSL context with certificate and key
|
|
460
|
+
server_config.ssl_keyfile = str(tls_config.key_file)
|
|
461
|
+
server_config.ssl_keyfile_password = tls_config.key_file_password
|
|
462
|
+
server_config.ssl_certfile = str(tls_config.cert_file)
|
|
463
|
+
|
|
464
|
+
# If CA file is provided and client verification is enabled
|
|
465
|
+
if isinstance(tls_config, TLSConfigVerifyClient):
|
|
466
|
+
server_config.ssl_ca_certs = str(tls_config.ca_file)
|
|
467
|
+
server_config.ssl_cert_reqs = CERT_REQUIRED
|
|
468
|
+
|
|
469
|
+
server = Server(config=server_config)
|
|
421
470
|
Thread(target=_write_pid_file_when_ready, args=(server,), daemon=True).start()
|
|
422
471
|
|
|
423
472
|
try:
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_components-
|
|
3
|
-
"file": "assets/components-
|
|
2
|
+
"_components-BypB0fGT.js": {
|
|
3
|
+
"file": "assets/components-BypB0fGT.js",
|
|
4
4
|
"name": "components",
|
|
5
5
|
"imports": [
|
|
6
6
|
"_vendor-BfhM_F1u.js",
|
|
7
|
-
"_pages-
|
|
7
|
+
"_pages-DGdjQlsy.js",
|
|
8
8
|
"_vendor-arizeai-CxXYQNUl.js",
|
|
9
9
|
"_vendor-codemirror-B0NIFPOL.js",
|
|
10
10
|
"_vendor-three-C5WAXd5r.js"
|
|
11
11
|
]
|
|
12
12
|
},
|
|
13
|
-
"_pages-
|
|
14
|
-
"file": "assets/pages-
|
|
13
|
+
"_pages-DGdjQlsy.js": {
|
|
14
|
+
"file": "assets/pages-DGdjQlsy.js",
|
|
15
15
|
"name": "pages",
|
|
16
16
|
"imports": [
|
|
17
17
|
"_vendor-BfhM_F1u.js",
|
|
18
18
|
"_vendor-arizeai-CxXYQNUl.js",
|
|
19
|
-
"_components-
|
|
19
|
+
"_components-BypB0fGT.js",
|
|
20
20
|
"_vendor-codemirror-B0NIFPOL.js",
|
|
21
21
|
"_vendor-recharts-CrrDFWK1.js"
|
|
22
22
|
]
|
|
@@ -69,15 +69,15 @@
|
|
|
69
69
|
"name": "vendor-three"
|
|
70
70
|
},
|
|
71
71
|
"index.tsx": {
|
|
72
|
-
"file": "assets/index-
|
|
72
|
+
"file": "assets/index-Ccebc6-h.js",
|
|
73
73
|
"name": "index",
|
|
74
74
|
"src": "index.tsx",
|
|
75
75
|
"isEntry": true,
|
|
76
76
|
"imports": [
|
|
77
77
|
"_vendor-BfhM_F1u.js",
|
|
78
78
|
"_vendor-arizeai-CxXYQNUl.js",
|
|
79
|
-
"_pages-
|
|
80
|
-
"_components-
|
|
79
|
+
"_pages-DGdjQlsy.js",
|
|
80
|
+
"_components-BypB0fGT.js",
|
|
81
81
|
"_vendor-three-C5WAXd5r.js",
|
|
82
82
|
"_vendor-codemirror-B0NIFPOL.js",
|
|
83
83
|
"_vendor-shiki-C5bJ-RPf.js",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as p,R as U,j as e,u as dn,a as ze,e as r1,s as P1,b as O1,c as Be,d as X1,f as wi,g as Le,h as xi,i as ki,k as Y1,l as s,m as _e,p as b1,n as Xe,o as Ze,q as Si,C as c1,t as Mi,v as Ti,w as N,L as wa,x as xa,y as ka,z as ge,A as C,B as v1,D as un,E as m,F as Sa,$ as zi,G as Ma,H as Ta,I as Ne,J as gn,K as X,M as Ii,N as Ai,O as Ei,P as K,Q as d1,S as O,T as H,U as R,V as za,W as Ia,X as Vi,Y as Aa,Z as Di,_ as Pi,a0 as Oi,a1 as Fi,a2 as _i,a3 as Ni,a4 as Ri,a5 as $i,a6 as Hi,a7 as C1,a8 as Ki,a9 as Bi,aa as Zi,ab as ji,ac as Me,ad as J1,ae as en,af as nn,ag as _,ah as Te,ai as $n,aj as Gi,ak as Ui,al as Ea,am as Wi,an as Qi,ao as qi,ap as Xi,aq as Yi,ar as Ji,as as er,at as nr,au as ar,av as tr,aw as ir,ax as F,ay as mn,az as rr,aA as or,aB as lr,aC as sr,aD as cr,aE as Hn,aF as Ee,aG as Va,aH as dr,aI as Da,aJ as ur,aK as gr,aL as pn,aM as mr,aN as pr,aO as hr,aP as fr,aQ as br,aR as vr,aS as Cr,aT as Kn,aU as yr,aV as Lr,aW as wr,aX as F1,aY as xr,aZ as kr,a_ as Sr,a$ as Mr,b0 as Tr,b1 as zr,b2 as Ir,b3 as Ar,b4 as Er}from"./vendor-BfhM_F1u.js";import{a as Bn,R as Vr,b as Dr,c as Pr,m as Or,T as Fr,u as _r}from"./pages-
|
|
1
|
+
import{r as p,R as U,j as e,u as dn,a as ze,e as r1,s as P1,b as O1,c as Be,d as X1,f as wi,g as Le,h as xi,i as ki,k as Y1,l as s,m as _e,p as b1,n as Xe,o as Ze,q as Si,C as c1,t as Mi,v as Ti,w as N,L as wa,x as xa,y as ka,z as ge,A as C,B as v1,D as un,E as m,F as Sa,$ as zi,G as Ma,H as Ta,I as Ne,J as gn,K as X,M as Ii,N as Ai,O as Ei,P as K,Q as d1,S as O,T as H,U as R,V as za,W as Ia,X as Vi,Y as Aa,Z as Di,_ as Pi,a0 as Oi,a1 as Fi,a2 as _i,a3 as Ni,a4 as Ri,a5 as $i,a6 as Hi,a7 as C1,a8 as Ki,a9 as Bi,aa as Zi,ab as ji,ac as Me,ad as J1,ae as en,af as nn,ag as _,ah as Te,ai as $n,aj as Gi,ak as Ui,al as Ea,am as Wi,an as Qi,ao as qi,ap as Xi,aq as Yi,ar as Ji,as as er,at as nr,au as ar,av as tr,aw as ir,ax as F,ay as mn,az as rr,aA as or,aB as lr,aC as sr,aD as cr,aE as Hn,aF as Ee,aG as Va,aH as dr,aI as Da,aJ as ur,aK as gr,aL as pn,aM as mr,aN as pr,aO as hr,aP as fr,aQ as br,aR as vr,aS as Cr,aT as Kn,aU as yr,aV as Lr,aW as wr,aX as F1,aY as xr,aZ as kr,a_ as Sr,a$ as Mr,b0 as Tr,b1 as zr,b2 as Ir,b3 as Ar,b4 as Er}from"./vendor-BfhM_F1u.js";import{a as Bn,R as Vr,b as Dr,c as Pr,m as Or,T as Fr,u as _r}from"./pages-DGdjQlsy.js";import{u as Nr,_ as Pa,a as he,T as le,E as Oa,b as Re,c as fe,d as Rr,D as y1,e as $r,f as ue,g as Hr,C as Fa,P as hn,h as _a,i as Kr,F as Na,I as Br,j as Zr,k as jr,l as Gr,m as Ur,n as Wr,o as Qr,p as qr,q as Ra,r as $a,s as Xr,t as Yr}from"./vendor-arizeai-CxXYQNUl.js";import{L as Ha,a as Ka,d as Ue,E as fn,k as Ba,b as Za,l as an,h as Jr,j as eo,c as no,e as ao,f as to,s as io,g as Ye,i as Je,R as e1,p as ro,m as oo}from"./vendor-codemirror-B0NIFPOL.js";import{V as lo}from"./vendor-three-C5WAXd5r.js";const ja=function(){var n={defaultValue:null,kind:"LocalArgument",name:"clusters"},a={defaultValue:null,kind:"LocalArgument",name:"dataQualityMetricColumnName"},t={defaultValue:null,kind:"LocalArgument",name:"fetchDataQualityMetric"},i={defaultValue:null,kind:"LocalArgument",name:"fetchPerformanceMetric"},r={defaultValue:null,kind:"LocalArgument",name:"performanceMetric"},o=[{alias:null,args:null,kind:"ScalarField",name:"primaryValue",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"referenceValue",storageKey:null}],l=[{alias:null,args:[{kind:"Variable",name:"clusters",variableName:"clusters"}],concreteType:"Cluster",kind:"LinkedField",name:"clusters",plural:!0,selections:[{alias:null,args:null,kind:"ScalarField",name:"id",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"eventIds",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"driftRatio",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"primaryToCorpusRatio",storageKey:null},{condition:"fetchDataQualityMetric",kind:"Condition",passingValue:!0,selections:[{alias:null,args:[{fields:[{kind:"Variable",name:"columnName",variableName:"dataQualityMetricColumnName"},{kind:"Literal",name:"metric",value:"mean"}],kind:"ObjectValue",name:"metric"}],concreteType:"DatasetValues",kind:"LinkedField",name:"dataQualityMetric",plural:!1,selections:o,storageKey:null}]},{condition:"fetchPerformanceMetric",kind:"Condition",passingValue:!0,selections:[{alias:null,args:[{fields:[{kind:"Variable",name:"metric",variableName:"performanceMetric"}],kind:"ObjectValue",name:"metric"}],concreteType:"DatasetValues",kind:"LinkedField",name:"performanceMetric",plural:!1,selections:o,storageKey:null}]}],storageKey:null}];return{fragment:{argumentDefinitions:[n,a,t,i,r],kind:"Fragment",metadata:null,name:"pointCloudStore_clusterMetricsQuery",selections:l,type:"Query",abstractKey:null},kind:"Request",operation:{argumentDefinitions:[n,t,a,i,r],kind:"Operation",name:"pointCloudStore_clusterMetricsQuery",selections:l},params:{cacheID:"86666967012812887ac0a0149d2d2535",id:null,metadata:{},name:"pointCloudStore_clusterMetricsQuery",operationKind:"query",text:`query pointCloudStore_clusterMetricsQuery(
|
|
2
2
|
$clusters: [ClusterInput!]!
|
|
3
3
|
$fetchDataQualityMetric: Boolean!
|
|
4
4
|
$dataQualityMetricColumnName: String
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as t,j as o,bp as z,l as c,P as w,R as P,E as b,cx as k,ei as S,ej as F,ek as L,bF as C,el as l,w as E,em as R}from"./vendor-BfhM_F1u.js";import{c as I,x as j,D as A,K as T,M as _}from"./vendor-arizeai-CxXYQNUl.js";import{L as D,r as O,d as G,e as M,F as N,f as V,P as q,h as K,M as m,g as U,D as W,i as B,E as H,j as J,k as Y,p as $,l as X,n as p,o as Z,q as Q,s as oo,S as lo,t as ao,v as ro,w as co,x as go,y as eo,z as bo,A as u,B as f,C as y,G as no,H as io,I as so,J as to,K as mo,N as po,O as uo,Q as fo,U as yo,V as vo,W as ho,X as xo,Y as zo,Z as wo,_ as Po,$ as ko,a0 as So,a1 as Fo,a2 as Lo,a3 as Co,a4 as Eo,a5 as Ro,a6 as Io,a7 as jo,a8 as Ao,a9 as To,aa as _o,ab as Do,ac as Oo,ad as Go,ae as Mo,af as No,ag as Vo,ah as qo}from"./pages-
|
|
1
|
+
import{r as t,j as o,bp as z,l as c,P as w,R as P,E as b,cx as k,ei as S,ej as F,ek as L,bF as C,el as l,w as E,em as R}from"./vendor-BfhM_F1u.js";import{c as I,x as j,D as A,K as T,M as _}from"./vendor-arizeai-CxXYQNUl.js";import{L as D,r as O,d as G,e as M,F as N,f as V,P as q,h as K,M as m,g as U,D as W,i as B,E as H,j as J,k as Y,p as $,l as X,n as p,o as Z,q as Q,s as oo,S as lo,t as ao,v as ro,w as co,x as go,y as eo,z as bo,A as u,B as f,C as y,G as no,H as io,I as so,J as to,K as mo,N as po,O as uo,Q as fo,U as yo,V as vo,W as ho,X as xo,Y as zo,Z as wo,_ as Po,$ as ko,a0 as So,a1 as Fo,a2 as Lo,a3 as Co,a4 as Eo,a5 as Ro,a6 as Io,a7 as jo,a8 as Ao,a9 as To,aa as _o,ab as Do,ac as Oo,ad as Go,ae as Mo,af as No,ag as Vo,ah as qo}from"./pages-DGdjQlsy.js";import{z as Ko,dX as Uo,bH as Wo,R as Bo,dY as Ho,dZ as Jo}from"./components-BypB0fGT.js";import"./vendor-three-C5WAXd5r.js";import"./vendor-codemirror-B0NIFPOL.js";import"./vendor-shiki-C5bJ-RPf.js";import"./vendor-recharts-CrrDFWK1.js";(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const g of r)if(g.type==="childList")for(const n of g.addedNodes)n.tagName==="LINK"&&n.rel==="modulepreload"&&s(n)}).observe(document,{childList:!0,subtree:!0});function i(r){const g={};return r.integrity&&(g.integrity=r.integrity),r.referrerPolicy&&(g.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?g.credentials="include":r.crossOrigin==="anonymous"?g.credentials="omit":g.credentials="same-origin",g}function s(r){if(r.ep)return;r.ep=!0;const g=i(r);fetch(r.href,g)}})();const v="arize-phoenix-feature-flags",d={__RESET__:!1};function Yo(){const a=localStorage.getItem(v);if(!a)return d;try{const e=JSON.parse(a);return Object.assign({},d,e)}catch{return d}}const h=t.createContext(null);function $o(){const a=P.useContext(h);if(a===null)throw new Error("useFeatureFlags must be used within a FeatureFlagsProvider");return a}function Xo(a){const[e,i]=t.useState(Yo()),s=r=>{localStorage.setItem(v,JSON.stringify(r)),i(r)};return o(h.Provider,{value:{featureFlags:e,setFeatureFlags:s},children:o(Zo,{children:a.children})})}function Zo(a){const{children:e}=a,{featureFlags:i,setFeatureFlags:s}=$o(),[r,g]=t.useState(!1);return z("ctrl+shift+f",()=>g(!0)),c(w,{children:[e,o(A,{type:"modal",isDismissable:!0,onDismiss:()=>g(!1),children:r&&o(I,{title:"Feature Flags",children:o(Ko,{height:"size-1000",padding:"size-100",children:Object.keys(i).map(n=>o(j,{isSelected:i[n],onChange:x=>s({...i,[n]:x}),children:n},n))})})})]})}const Qo=b`
|
|
2
2
|
:root {
|
|
3
3
|
--ac-global-dimension-scale-factor: 1;
|
|
4
4
|
--ac-global-dimension-size-0: 0px;
|