arize-phoenix 8.28.0__tar.gz → 8.29.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.0 → arize_phoenix-8.29.0}/PKG-INFO +1 -1
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/config.py +269 -3
- arize_phoenix-8.29.0/src/phoenix/db/README.md +353 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/queries.py +0 -3
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Functionality.py +0 -3
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/grpc_server.py +19 -2
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/main.py +45 -7
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/.vite/manifest.json +9 -9
- arize_phoenix-8.28.0/src/phoenix/server/static/assets/components-BEtrHoeq.js → arize_phoenix-8.29.0/src/phoenix/server/static/assets/components-DepxScNF.js +6 -1
- arize_phoenix-8.28.0/src/phoenix/server/static/assets/index-Cdj4_6tq.js → arize_phoenix-8.29.0/src/phoenix/server/static/assets/index-DUj7q3Q4.js +1 -1
- arize_phoenix-8.28.0/src/phoenix/server/static/assets/pages-CZ0wMeOx.js → arize_phoenix-8.29.0/src/phoenix/server/static/assets/pages-CJUakDKi.js +6 -7
- arize_phoenix-8.29.0/src/phoenix/version.py +1 -0
- arize_phoenix-8.28.0/src/phoenix/db/README.md +0 -54
- arize_phoenix-8.28.0/src/phoenix/version.py +0 -1
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/.gitignore +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/IP_NOTICE +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/LICENSE +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/README.md +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/pyproject.toml +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/auth.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/core/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/core/embedding_dimension.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/core/model.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/core/model_schema.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/core/model_schema_adapter.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/datetime_utils.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/alembic.ini +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/bulk_inserter.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/engines.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/enums.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/facilitator.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/helpers.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/constants.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/dataset.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/evaluation.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/helpers.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/span.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/types.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/migrate.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/data_migration_scripts/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/env.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/script.py.mako +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/versions/bc8fea3c2bc8_add_prompt_tables.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/models.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/types/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/types/identifier.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/db/types/model_provider.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/exceptions.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/experiments/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/experiments/evaluators/base.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/experiments/functions.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/experiments/tracing.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/experiments/types.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/experiments/utils.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/inferences/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/inferences/errors.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/inferences/fixtures.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/inferences/inferences.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/inferences/schema.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/inferences/validation.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/logging/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/logging/_config.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/logging/_filter.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/logging/_formatter.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/metrics/README.md +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/metrics/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/metrics/binning.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/metrics/metrics.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/metrics/mixins.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/metrics/timeseries.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/metrics/wrappers.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/pointcloud/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/pointcloud/clustering.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/pointcloud/projectors.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/py.typed +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/README.md +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/auth.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/context.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/num_child_spans.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/num_spans_per_trace.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/prompt_version_sequence_number.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/session_io.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/session_num_traces.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/session_num_traces_with_error.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/session_token_usages.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/span_by_id.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/table_fields.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/trace_by_trace_ids.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/trace_root_spans.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/user_roles.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/users.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/exceptions.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/experiment_run_filters.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/playground_clients.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/playground_registry.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/playground_spans.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/prompts/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/prompts/conversions/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/prompts/conversions/anthropic.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/prompts/conversions/openai.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/prompts/models.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/ChatCompletionInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/GenerativeModelInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/InvocationParameters.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/ProjectSessionSort.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/PromptTemplateOptions.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/PromptVersionInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/interceptor.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/api_key_mutations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/chat_mutations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/prompt_label_mutations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/prompt_mutations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/prompt_version_tag_mutations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/trace_mutations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/openapi/main.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/openapi/schema.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/auth.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/embeddings.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/oauth2.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/utils.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/datasets.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/evaluations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/experiments.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/models.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/projects.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/prompts.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/spans.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/traces.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/schema.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/subscriptions.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Annotation.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/AuthMethod.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Cluster.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Dataset.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Dimension.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Event.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Experiment.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/GenerativeProvider.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Identifier.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Inferences.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/MimeType.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Model.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Project.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ProjectSession.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Prompt.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/PromptLabel.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/PromptVersion.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/PromptVersionTag.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/PromptVersionTemplate.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ResponseFormat.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Segments.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/SortDir.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Span.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/SpanIOValue.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/TokenUsage.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ToolDefinition.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Trace.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/User.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/UserRole.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/node.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/pagination.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/api/utils.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/app.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/bearer_auth.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/dml_event.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/dml_event_handler.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/email/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/email/sender.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/email/templates/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/email/templates/password_reset.html +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/email/templates/welcome.html +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/email/types.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/jwt_store.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/middleware/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/middleware/gzip.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/oauth2.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/openapi/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/prometheus.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/rate_limiters.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/vendor-BfhM_F1u.js +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/vendor-Cg6lcjUC.css +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/vendor-arizeai-CxXYQNUl.js +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/vendor-codemirror-B0NIFPOL.js +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/vendor-recharts-CrrDFWK1.js +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/vendor-shiki-C5bJ-RPf.js +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/vendor-three-C5WAXd5r.js +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/favicon.ico +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/static/modernizr.js +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/telemetry.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/templates/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/templates/index.html +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/thread_server.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/server/types.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/services.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/session/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/session/client.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/session/data_extractor.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/session/evaluation.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/session/session.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/settings.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/attributes.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/dsl/README.md +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/dsl/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/dsl/filter.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/dsl/helpers.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/dsl/query.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/errors.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/exporter.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/fixtures.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/otel.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/projects.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/schemas.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/span_evaluations.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/span_json_decoder.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/span_json_encoder.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/trace_dataset.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/utils.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/v1/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/utilities/__init__.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/utilities/client.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/utilities/deprecation.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/utilities/error_handling.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/utilities/json.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/utilities/logging.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/utilities/project.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/utilities/re.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.0}/src/phoenix/utilities/span_store.py +0 -0
- {arize_phoenix-8.28.0 → arize_phoenix-8.29.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,243 @@ 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_CERT_FILE = "PHOENIX_TLS_CERT_FILE"
|
|
248
|
+
"""
|
|
249
|
+
Path to the TLS certificate file for HTTPS connections.
|
|
250
|
+
When set, Phoenix will use HTTPS instead of HTTP for all connections.
|
|
251
|
+
"""
|
|
252
|
+
ENV_PHOENIX_TLS_KEY_FILE = "PHOENIX_TLS_KEY_FILE"
|
|
253
|
+
"""
|
|
254
|
+
Path to the TLS private key file for HTTPS connections.
|
|
255
|
+
Required when PHOENIX_TLS_CERT_FILE is set.
|
|
256
|
+
"""
|
|
257
|
+
ENV_PHOENIX_TLS_KEY_FILE_PASSWORD = "PHOENIX_TLS_KEY_FILE_PASSWORD"
|
|
258
|
+
"""
|
|
259
|
+
Password for the TLS private key file if it's encrypted.
|
|
260
|
+
Only needed if the private key file requires a password.
|
|
261
|
+
"""
|
|
262
|
+
ENV_PHOENIX_TLS_CA_FILE = "PHOENIX_TLS_CA_FILE"
|
|
263
|
+
"""
|
|
264
|
+
Path to the Certificate Authority (CA) file for client certificate verification.
|
|
265
|
+
Used when PHOENIX_TLS_VERIFY_CLIENT is set to true.
|
|
266
|
+
"""
|
|
267
|
+
ENV_PHOENIX_TLS_VERIFY_CLIENT = "PHOENIX_TLS_VERIFY_CLIENT"
|
|
268
|
+
"""
|
|
269
|
+
Whether to verify client certificates for mutual TLS (mTLS) authentication.
|
|
270
|
+
When set to true, clients must provide valid certificates signed by the CA specified in
|
|
271
|
+
PHOENIX_TLS_CA_FILE.
|
|
272
|
+
"""
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
@dataclass(frozen=True)
|
|
276
|
+
class TLSConfig:
|
|
277
|
+
"""Configuration for TLS (Transport Layer Security) connections.
|
|
278
|
+
|
|
279
|
+
This class manages TLS certificates and private keys for secure connections.
|
|
280
|
+
It handles reading certificate and key files, and decrypting private keys
|
|
281
|
+
if they are password-protected.
|
|
282
|
+
|
|
283
|
+
Attributes:
|
|
284
|
+
cert_file: Path to the TLS certificate file
|
|
285
|
+
key_file: Path to the TLS private key file
|
|
286
|
+
key_file_password: Optional password for decrypting the private key
|
|
287
|
+
_cert_data: Cached certificate data (internal use)
|
|
288
|
+
_key_data: Cached decrypted key data (internal use)
|
|
289
|
+
_decrypted_key_data: Cached decrypted key data (internal use)
|
|
290
|
+
"""
|
|
291
|
+
|
|
292
|
+
cert_file: Path
|
|
293
|
+
key_file: Path
|
|
294
|
+
key_file_password: Optional[str]
|
|
295
|
+
_cert_data: bytes = field(default=b"", init=False, repr=False)
|
|
296
|
+
_key_data: bytes = field(default=b"", init=False, repr=False)
|
|
297
|
+
_decrypted_key_data: Optional[bytes] = field(default=None, init=False, repr=False)
|
|
298
|
+
|
|
299
|
+
@property
|
|
300
|
+
def cert_data(self) -> bytes:
|
|
301
|
+
"""Get the certificate data, reading from file if not cached.
|
|
302
|
+
|
|
303
|
+
Returns:
|
|
304
|
+
bytes: The certificate data in PEM format
|
|
305
|
+
"""
|
|
306
|
+
if not self._cert_data:
|
|
307
|
+
with open(self.cert_file, "rb") as f:
|
|
308
|
+
object.__setattr__(self, "_cert_data", f.read())
|
|
309
|
+
return self._cert_data
|
|
310
|
+
|
|
311
|
+
@property
|
|
312
|
+
def key_data(self) -> bytes:
|
|
313
|
+
"""Get the decrypted key data, reading from file if not cached.
|
|
314
|
+
|
|
315
|
+
This property reads the private key file and decrypts it if a password
|
|
316
|
+
is provided. The decrypted key is cached for subsequent accesses.
|
|
317
|
+
|
|
318
|
+
Returns:
|
|
319
|
+
bytes: The decrypted private key data in PEM format
|
|
320
|
+
|
|
321
|
+
Raises:
|
|
322
|
+
ValueError: If the cryptography library is not installed or if
|
|
323
|
+
decryption fails
|
|
324
|
+
"""
|
|
325
|
+
if not self._key_data:
|
|
326
|
+
self._read_and_cache_key_data()
|
|
327
|
+
return self._key_data
|
|
328
|
+
|
|
329
|
+
def _read_and_cache_key_data(self) -> None:
|
|
330
|
+
"""Read and decrypt the private key file, then cache the result.
|
|
331
|
+
|
|
332
|
+
This method reads the private key file, decrypts it if a password
|
|
333
|
+
is provided, and stores the decrypted key in the _key_data attribute.
|
|
334
|
+
|
|
335
|
+
Raises:
|
|
336
|
+
ValueError: If the cryptography library is not installed or if
|
|
337
|
+
decryption fails
|
|
338
|
+
"""
|
|
339
|
+
try:
|
|
340
|
+
from cryptography.hazmat.backends import default_backend
|
|
341
|
+
from cryptography.hazmat.primitives.serialization import (
|
|
342
|
+
Encoding,
|
|
343
|
+
NoEncryption,
|
|
344
|
+
PrivateFormat,
|
|
345
|
+
load_pem_private_key,
|
|
346
|
+
)
|
|
347
|
+
except ImportError:
|
|
348
|
+
raise ValueError(
|
|
349
|
+
"The cryptography library is needed to read private keys for "
|
|
350
|
+
"TLS configuration. Please install it with: pip install cryptography"
|
|
351
|
+
)
|
|
352
|
+
|
|
353
|
+
# First read the key file
|
|
354
|
+
with open(self.key_file, "rb") as f:
|
|
355
|
+
key_data = f.read()
|
|
356
|
+
|
|
357
|
+
try:
|
|
358
|
+
# Convert password to bytes if it exists
|
|
359
|
+
password_bytes = self.key_file_password.encode() if self.key_file_password else None
|
|
360
|
+
|
|
361
|
+
# Load the key (decrypting if password is provided)
|
|
362
|
+
private_key = load_pem_private_key(
|
|
363
|
+
key_data,
|
|
364
|
+
password=password_bytes,
|
|
365
|
+
backend=default_backend(),
|
|
366
|
+
)
|
|
367
|
+
|
|
368
|
+
# Convert to PEM format without encryption
|
|
369
|
+
decrypted_pem = private_key.private_bytes(
|
|
370
|
+
encoding=Encoding.PEM,
|
|
371
|
+
format=PrivateFormat.PKCS8,
|
|
372
|
+
encryption_algorithm=NoEncryption(),
|
|
373
|
+
)
|
|
374
|
+
except Exception as e:
|
|
375
|
+
raise ValueError(f"Failed to decrypt private key: {e}")
|
|
376
|
+
object.__setattr__(self, "_key_data", decrypted_pem)
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
@dataclass(frozen=True)
|
|
380
|
+
class TLSConfigVerifyClient(TLSConfig):
|
|
381
|
+
"""TLS configuration with client verification enabled."""
|
|
382
|
+
|
|
383
|
+
ca_file: Path
|
|
384
|
+
_ca_data: bytes = field(default=b"", init=False, repr=False)
|
|
385
|
+
|
|
386
|
+
@property
|
|
387
|
+
def ca_data(self) -> bytes:
|
|
388
|
+
"""Get the CA certificate data, reading from file if not cached."""
|
|
389
|
+
if not self._ca_data:
|
|
390
|
+
with open(self.ca_file, "rb") as f:
|
|
391
|
+
object.__setattr__(self, "_ca_data", f.read())
|
|
392
|
+
return self._ca_data
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
def get_env_tls_enabled() -> bool:
|
|
396
|
+
"""
|
|
397
|
+
Gets the value of the PHOENIX_TLS_ENABLED environment variable.
|
|
398
|
+
|
|
399
|
+
Returns:
|
|
400
|
+
bool: True if TLS is enabled, False otherwise. Defaults to False if the environment
|
|
401
|
+
variable is not set.
|
|
402
|
+
""" # noqa: E501
|
|
403
|
+
return _bool_val(ENV_PHOENIX_TLS_ENABLED, False)
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
def get_env_tls_verify_client() -> bool:
|
|
407
|
+
"""
|
|
408
|
+
Gets the value of the PHOENIX_TLS_VERIFY_CLIENT environment variable.
|
|
409
|
+
|
|
410
|
+
Returns:
|
|
411
|
+
bool: True if client certificate verification is enabled, False otherwise. Defaults to False
|
|
412
|
+
if the environment variable is not set.
|
|
413
|
+
""" # noqa: E501
|
|
414
|
+
return _bool_val(ENV_PHOENIX_TLS_VERIFY_CLIENT, False)
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
def get_env_tls_config() -> Optional[TLSConfig]:
|
|
418
|
+
"""
|
|
419
|
+
Retrieves and validates TLS configuration from environment variables.
|
|
420
|
+
|
|
421
|
+
Returns:
|
|
422
|
+
Optional[TLSConfig]: A configuration object containing TLS settings, or None if TLS is disabled.
|
|
423
|
+
If client verification is enabled, returns TLSConfigVerifyClient instead.
|
|
424
|
+
|
|
425
|
+
The function reads the following environment variables:
|
|
426
|
+
- PHOENIX_TLS_ENABLED: Whether TLS is enabled (defaults to False)
|
|
427
|
+
- PHOENIX_TLS_CERT_FILE: Path to the TLS certificate file
|
|
428
|
+
- PHOENIX_TLS_KEY_FILE: Path to the TLS private key file
|
|
429
|
+
- PHOENIX_TLS_KEY_FILE_PASSWORD: Password for the TLS private key file
|
|
430
|
+
- PHOENIX_TLS_CA_FILE: Path to the Certificate Authority file (required for client verification)
|
|
431
|
+
- PHOENIX_TLS_VERIFY_CLIENT: Whether to verify client certificates
|
|
432
|
+
|
|
433
|
+
Raises:
|
|
434
|
+
ValueError: If required files are missing or don't exist when TLS is enabled
|
|
435
|
+
""" # noqa: E501
|
|
436
|
+
# Check if TLS is enabled
|
|
437
|
+
if not get_env_tls_enabled():
|
|
438
|
+
return None
|
|
439
|
+
|
|
440
|
+
# Get certificate file path if specified
|
|
441
|
+
if not (cert_file_str := getenv(ENV_PHOENIX_TLS_CERT_FILE)):
|
|
442
|
+
raise ValueError("PHOENIX_TLS_CERT_FILE must be set when PHOENIX_TLS_ENABLED is true")
|
|
443
|
+
cert_file = Path(cert_file_str)
|
|
444
|
+
|
|
445
|
+
# Get private key file path if specified
|
|
446
|
+
if not (key_file_str := getenv(ENV_PHOENIX_TLS_KEY_FILE)):
|
|
447
|
+
raise ValueError("PHOENIX_TLS_KEY_FILE must be set when PHOENIX_TLS_ENABLED is true")
|
|
448
|
+
key_file = Path(key_file_str)
|
|
449
|
+
|
|
450
|
+
# Get private key password if specified
|
|
451
|
+
key_file_password = getenv(ENV_PHOENIX_TLS_KEY_FILE_PASSWORD)
|
|
452
|
+
|
|
453
|
+
# Validate certificate and key files
|
|
454
|
+
_validate_file_exists_and_is_readable(cert_file, "certificate")
|
|
455
|
+
_validate_file_exists_and_is_readable(key_file, "key")
|
|
456
|
+
|
|
457
|
+
# If client verification is enabled, validate CA file and return TLSConfigVerifyClient
|
|
458
|
+
if get_env_tls_verify_client():
|
|
459
|
+
if not (ca_file_str := getenv(ENV_PHOENIX_TLS_CA_FILE)):
|
|
460
|
+
raise ValueError(
|
|
461
|
+
"PHOENIX_TLS_CA_FILE must be set when PHOENIX_TLS_VERIFY_CLIENT is true"
|
|
462
|
+
)
|
|
463
|
+
|
|
464
|
+
ca_file = Path(ca_file_str)
|
|
465
|
+
_validate_file_exists_and_is_readable(ca_file, "CA")
|
|
466
|
+
|
|
467
|
+
return TLSConfigVerifyClient(
|
|
468
|
+
cert_file=cert_file,
|
|
469
|
+
key_file=key_file,
|
|
470
|
+
key_file_password=key_file_password,
|
|
471
|
+
ca_file=ca_file,
|
|
472
|
+
)
|
|
473
|
+
|
|
474
|
+
return TLSConfig(
|
|
475
|
+
cert_file=cert_file,
|
|
476
|
+
key_file=key_file,
|
|
477
|
+
key_file_password=key_file_password,
|
|
478
|
+
)
|
|
479
|
+
|
|
243
480
|
|
|
244
481
|
def server_instrumentation_is_enabled() -> bool:
|
|
245
482
|
return bool(
|
|
@@ -956,7 +1193,8 @@ def get_env_root_url() -> URL:
|
|
|
956
1193
|
host = get_env_host()
|
|
957
1194
|
if host == "0.0.0.0":
|
|
958
1195
|
host = "127.0.0.1"
|
|
959
|
-
|
|
1196
|
+
scheme = "https" if get_env_tls_enabled() else "http"
|
|
1197
|
+
return URL(urljoin(f"{scheme}://{host}:{get_env_port()}", get_env_host_root_path()))
|
|
960
1198
|
|
|
961
1199
|
|
|
962
1200
|
def get_base_url() -> str:
|
|
@@ -964,7 +1202,8 @@ def get_base_url() -> str:
|
|
|
964
1202
|
host = get_env_host()
|
|
965
1203
|
if host == "0.0.0.0":
|
|
966
1204
|
host = "127.0.0.1"
|
|
967
|
-
|
|
1205
|
+
scheme = "https" if get_env_tls_enabled() else "http"
|
|
1206
|
+
base_url = get_env_collector_endpoint() or f"{scheme}://{host}:{get_env_port()}"
|
|
968
1207
|
return base_url if base_url.endswith("/") else base_url + "/"
|
|
969
1208
|
|
|
970
1209
|
|
|
@@ -1159,3 +1398,30 @@ When the PHOENIX_ADMIN_SECRET is used as a bearer token in API requests, the
|
|
|
1159
1398
|
request is authenticated as the system user with the user_id set to this
|
|
1160
1399
|
SYSTEM_USER_ID value (only if this variable is not None).
|
|
1161
1400
|
"""
|
|
1401
|
+
|
|
1402
|
+
|
|
1403
|
+
def _validate_file_exists_and_is_readable(
|
|
1404
|
+
file_path: Path,
|
|
1405
|
+
description: str,
|
|
1406
|
+
check_non_empty: bool = True,
|
|
1407
|
+
) -> None:
|
|
1408
|
+
"""
|
|
1409
|
+
Validate that a file exists, is readable, and optionally has non-zero size.
|
|
1410
|
+
|
|
1411
|
+
Args:
|
|
1412
|
+
file_path: Path to the file to validate
|
|
1413
|
+
description: Description of the file for error messages (e.g., "certificate", "key", "CA")
|
|
1414
|
+
check_non_empty: Whether to check if the file has non-zero size. Defaults to True.
|
|
1415
|
+
|
|
1416
|
+
Raises:
|
|
1417
|
+
ValueError: If the path is not a file, isn't readable, or has zero size (if check_non_empty is True)
|
|
1418
|
+
""" # noqa: E501
|
|
1419
|
+
if not file_path.is_file():
|
|
1420
|
+
raise ValueError(f"{description} path is not a file: {file_path}")
|
|
1421
|
+
if check_non_empty and file_path.stat().st_size == 0:
|
|
1422
|
+
raise ValueError(f"{description} file is empty: {file_path}")
|
|
1423
|
+
try:
|
|
1424
|
+
with open(file_path, "rb") as f:
|
|
1425
|
+
f.read(1) # Read just one byte to verify readability
|
|
1426
|
+
except Exception as e:
|
|
1427
|
+
raise ValueError(f"{description} file is not readable: {e}")
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
# Database
|
|
2
|
+
|
|
3
|
+
This module is responsible for the database connection and the migrations.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
## Migrations
|
|
7
|
+
|
|
8
|
+
All migrations are managed by Alembic. Migrations are applied to the database automatically when the application starts.
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Manually Applying Migrations
|
|
12
|
+
|
|
13
|
+
Sometimes, it's necessary to manually apply migrations, e.g., to recover from a failed migration. To manually apply migrations, you must first clone the Phoenix repository.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
git clone https://github.com/Arize-ai/phoenix.git
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Then navigate to the current directory.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
cd phoenix/src/phoenix/db
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
If you are using a non-default SQL database URL (e.g., for running PostgreSQL), ensure your `PHOENIX_SQL_DATABASE_URL` is set. This is not needed if you are running Phoenix with the default SQLite URL.
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
export PHOENIX_SQL_DATABASE_URL=<sql-database-url>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
To manually run up-migrations, run the following command:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
alembic upgrade head
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
If the above command fails, it may be necessary to undo partially applied changes from a failed migration by first running down-migrations. This can be accomplished by identifying the ID of the migration revision you wish to return to. Revisions are defined [here](./migrations/versions/).
|
|
39
|
+
|
|
40
|
+
⚠️ Running down-migrations can result in lost data. Only run down-migrations if you know what you are doing and consider backing up your database first. If you have any questions or doubts, contact the Phoenix team in the `#phoenix-support` channel of the [Arize AI Slack community](https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q) or via GitHub.
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
alembic downgrade <revision-id>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Creating a Migration
|
|
47
|
+
|
|
48
|
+
All migrations are stored in the `migrations` folder. To create a new migration, run the following command:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
alembic revision -m "your_revision_name"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Then fill the migration file with the necessary changes.
|
|
55
|
+
|
|
56
|
+
## Entity Relationship Diagram
|
|
57
|
+
|
|
58
|
+
Below is a Mermaid diagram showing the current relationships between the main entities in the database:
|
|
59
|
+
|
|
60
|
+
```mermaid
|
|
61
|
+
erDiagram
|
|
62
|
+
Project ||--o{ Trace : has
|
|
63
|
+
Project {
|
|
64
|
+
int id PK
|
|
65
|
+
string name
|
|
66
|
+
string description
|
|
67
|
+
string gradient_start_color
|
|
68
|
+
string gradient_end_color
|
|
69
|
+
datetime created_at
|
|
70
|
+
datetime updated_at
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
ProjectSession ||--o{ Trace : has
|
|
74
|
+
ProjectSession {
|
|
75
|
+
int id PK
|
|
76
|
+
string session_id
|
|
77
|
+
int project_id FK
|
|
78
|
+
datetime start_time
|
|
79
|
+
datetime end_time
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
Trace ||--o{ Span : contains
|
|
83
|
+
Trace ||--o{ ExperimentRun : has
|
|
84
|
+
Trace ||--o{ TraceAnnotation : has
|
|
85
|
+
Trace ||--o{ ExperimentRunAnnotation : has
|
|
86
|
+
Trace {
|
|
87
|
+
int id PK
|
|
88
|
+
int project_rowid FK
|
|
89
|
+
string trace_id
|
|
90
|
+
int project_session_rowid FK
|
|
91
|
+
datetime start_time
|
|
92
|
+
datetime end_time
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
Span ||--o{ DocumentAnnotation : has
|
|
96
|
+
Span ||--o{ DatasetExample : has
|
|
97
|
+
Span ||--o{ SpanAnnotation : has
|
|
98
|
+
Span {
|
|
99
|
+
int id PK
|
|
100
|
+
int trace_rowid FK
|
|
101
|
+
string span_id
|
|
102
|
+
string parent_id
|
|
103
|
+
string name
|
|
104
|
+
string span_kind
|
|
105
|
+
datetime start_time
|
|
106
|
+
datetime end_time
|
|
107
|
+
json attributes
|
|
108
|
+
json events
|
|
109
|
+
string status_code
|
|
110
|
+
string status_message
|
|
111
|
+
int cumulative_error_count
|
|
112
|
+
int cumulative_llm_token_count_prompt
|
|
113
|
+
int cumulative_llm_token_count_completion
|
|
114
|
+
int llm_token_count_prompt
|
|
115
|
+
int llm_token_count_completion
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
DocumentAnnotation {
|
|
119
|
+
int id PK
|
|
120
|
+
int span_rowid FK
|
|
121
|
+
int document_position
|
|
122
|
+
string name
|
|
123
|
+
string label
|
|
124
|
+
float score
|
|
125
|
+
string explanation
|
|
126
|
+
json metadata
|
|
127
|
+
string annotator_kind
|
|
128
|
+
datetime created_at
|
|
129
|
+
datetime updated_at
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
SpanAnnotation {
|
|
133
|
+
int id PK
|
|
134
|
+
int span_rowid FK
|
|
135
|
+
string name
|
|
136
|
+
string label
|
|
137
|
+
float score
|
|
138
|
+
string explanation
|
|
139
|
+
json metadata
|
|
140
|
+
string annotator_kind
|
|
141
|
+
datetime created_at
|
|
142
|
+
datetime updated_at
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
TraceAnnotation {
|
|
146
|
+
int id PK
|
|
147
|
+
int trace_rowid FK
|
|
148
|
+
string name
|
|
149
|
+
string label
|
|
150
|
+
float score
|
|
151
|
+
string explanation
|
|
152
|
+
json metadata
|
|
153
|
+
string annotator_kind
|
|
154
|
+
datetime created_at
|
|
155
|
+
datetime updated_at
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
Dataset ||--o{ DatasetVersion : has
|
|
159
|
+
Dataset ||--o{ DatasetExample : contains
|
|
160
|
+
Dataset {
|
|
161
|
+
int id PK
|
|
162
|
+
string name
|
|
163
|
+
string description
|
|
164
|
+
json metadata
|
|
165
|
+
datetime created_at
|
|
166
|
+
datetime updated_at
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
DatasetVersion ||--o{ DatasetExampleRevision : has
|
|
170
|
+
DatasetVersion {
|
|
171
|
+
int id PK
|
|
172
|
+
int dataset_id FK
|
|
173
|
+
string description
|
|
174
|
+
json metadata
|
|
175
|
+
datetime created_at
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
DatasetExample ||--o{ DatasetExampleRevision : has
|
|
179
|
+
DatasetExample {
|
|
180
|
+
int id PK
|
|
181
|
+
int dataset_id FK
|
|
182
|
+
int span_rowid FK
|
|
183
|
+
datetime created_at
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
DatasetExampleRevision {
|
|
187
|
+
int id PK
|
|
188
|
+
int dataset_example_id FK
|
|
189
|
+
int dataset_version_id FK
|
|
190
|
+
json input
|
|
191
|
+
json output
|
|
192
|
+
json metadata
|
|
193
|
+
string revision_kind
|
|
194
|
+
datetime created_at
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
Experiment ||--o{ ExperimentRun : has
|
|
198
|
+
Experiment {
|
|
199
|
+
int id PK
|
|
200
|
+
int dataset_id FK
|
|
201
|
+
int dataset_version_id FK
|
|
202
|
+
string name
|
|
203
|
+
string description
|
|
204
|
+
int repetitions
|
|
205
|
+
json metadata
|
|
206
|
+
string project_name
|
|
207
|
+
datetime created_at
|
|
208
|
+
datetime updated_at
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
ExperimentRun ||--o{ ExperimentRunAnnotation : has
|
|
212
|
+
ExperimentRun {
|
|
213
|
+
int id PK
|
|
214
|
+
int experiment_id FK
|
|
215
|
+
int dataset_example_id FK
|
|
216
|
+
int repetition_number
|
|
217
|
+
string trace_id
|
|
218
|
+
json output
|
|
219
|
+
datetime start_time
|
|
220
|
+
datetime end_time
|
|
221
|
+
int prompt_token_count
|
|
222
|
+
int completion_token_count
|
|
223
|
+
string error
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
ExperimentRunAnnotation {
|
|
227
|
+
int id PK
|
|
228
|
+
int experiment_run_id FK
|
|
229
|
+
string name
|
|
230
|
+
string annotator_kind
|
|
231
|
+
string label
|
|
232
|
+
float score
|
|
233
|
+
string explanation
|
|
234
|
+
string trace_id
|
|
235
|
+
string error
|
|
236
|
+
json metadata
|
|
237
|
+
datetime start_time
|
|
238
|
+
datetime end_time
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
User ||--o{ ApiKey : has
|
|
242
|
+
User ||--o{ AccessToken : has
|
|
243
|
+
User ||--o{ RefreshToken : has
|
|
244
|
+
User ||--o{ PasswordResetToken : has
|
|
245
|
+
User ||--o{ PromptVersion : has
|
|
246
|
+
User ||--o{ PromptVersionTag : has
|
|
247
|
+
User {
|
|
248
|
+
int id PK
|
|
249
|
+
int user_role_id FK
|
|
250
|
+
string username
|
|
251
|
+
string email
|
|
252
|
+
string profile_picture_url
|
|
253
|
+
bytes password_hash
|
|
254
|
+
bytes password_salt
|
|
255
|
+
boolean reset_password
|
|
256
|
+
string oauth2_client_id
|
|
257
|
+
string oauth2_user_id
|
|
258
|
+
datetime created_at
|
|
259
|
+
datetime updated_at
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
UserRole ||--o{ User : has
|
|
263
|
+
UserRole {
|
|
264
|
+
int id PK
|
|
265
|
+
string name
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
ApiKey {
|
|
269
|
+
int id PK
|
|
270
|
+
int user_id FK
|
|
271
|
+
string name
|
|
272
|
+
string description
|
|
273
|
+
datetime created_at
|
|
274
|
+
datetime expires_at
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
AccessToken {
|
|
278
|
+
int id PK
|
|
279
|
+
int user_id FK
|
|
280
|
+
datetime created_at
|
|
281
|
+
datetime expires_at
|
|
282
|
+
int refresh_token_id FK
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
RefreshToken {
|
|
286
|
+
int id PK
|
|
287
|
+
int user_id FK
|
|
288
|
+
datetime created_at
|
|
289
|
+
datetime expires_at
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
PasswordResetToken {
|
|
293
|
+
int id PK
|
|
294
|
+
int user_id FK
|
|
295
|
+
datetime created_at
|
|
296
|
+
datetime expires_at
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
Prompt ||--o{ PromptVersion : has
|
|
300
|
+
Prompt ||--o{ PromptPromptLabel : has
|
|
301
|
+
Prompt ||--o{ PromptVersionTag : has
|
|
302
|
+
Prompt ||--o{ Prompt : has
|
|
303
|
+
Prompt {
|
|
304
|
+
int id PK
|
|
305
|
+
int source_prompt_id FK
|
|
306
|
+
string name
|
|
307
|
+
string description
|
|
308
|
+
json metadata
|
|
309
|
+
datetime created_at
|
|
310
|
+
datetime updated_at
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
PromptVersion ||--o{ PromptVersionTag : has
|
|
314
|
+
PromptVersion {
|
|
315
|
+
int id PK
|
|
316
|
+
int prompt_id FK
|
|
317
|
+
string description
|
|
318
|
+
int user_id FK
|
|
319
|
+
string template_type
|
|
320
|
+
string template_format
|
|
321
|
+
json template
|
|
322
|
+
json invocation_parameters
|
|
323
|
+
json tools
|
|
324
|
+
json response_format
|
|
325
|
+
string model_provider
|
|
326
|
+
string model_name
|
|
327
|
+
json metadata
|
|
328
|
+
datetime created_at
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
PromptLabel ||--o{ PromptPromptLabel : has
|
|
332
|
+
PromptLabel {
|
|
333
|
+
int id PK
|
|
334
|
+
string name
|
|
335
|
+
string description
|
|
336
|
+
string color
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
PromptPromptLabel {
|
|
340
|
+
int id PK
|
|
341
|
+
int prompt_label_id FK
|
|
342
|
+
int prompt_id FK
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
PromptVersionTag {
|
|
346
|
+
int id PK
|
|
347
|
+
string name
|
|
348
|
+
string description
|
|
349
|
+
int prompt_id FK
|
|
350
|
+
int prompt_version_id FK
|
|
351
|
+
int user_id FK
|
|
352
|
+
}
|
|
353
|
+
```
|
|
@@ -427,11 +427,8 @@ class Query:
|
|
|
427
427
|
@strawberry.field
|
|
428
428
|
async def functionality(self, info: Info[Context, None]) -> "Functionality":
|
|
429
429
|
has_model_inferences = not info.context.model.is_empty
|
|
430
|
-
async with info.context.db() as session:
|
|
431
|
-
has_traces = (await session.scalar(select(models.Trace).limit(1))) is not None
|
|
432
430
|
return Functionality(
|
|
433
431
|
model_inferences=has_model_inferences,
|
|
434
|
-
tracing=has_traces,
|
|
435
432
|
)
|
|
436
433
|
|
|
437
434
|
@strawberry.field
|