arize-phoenix 12.2.0__tar.gz → 12.4.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-12.2.0 → arize_phoenix-12.4.0}/PKG-INFO +2 -1
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/pyproject.toml +1 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/auth.py +19 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/config.py +302 -53
- arize_phoenix-12.4.0/src/phoenix/db/README.md +960 -0
- arize_phoenix-12.4.0/src/phoenix/server/api/auth_messages.py +46 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/auth.py +21 -30
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/oauth2.py +255 -46
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/__init__.py +2 -3
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/annotation_configs.py +12 -29
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/annotations.py +21 -22
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/datasets.py +38 -56
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/documents.py +2 -3
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/evaluations.py +12 -24
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +2 -3
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +9 -10
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/experiments.py +16 -17
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/projects.py +15 -21
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/prompts.py +30 -31
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/sessions.py +2 -5
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/spans.py +35 -26
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/traces.py +11 -19
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/users.py +14 -23
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/utils.py +3 -7
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/app.py +6 -2
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/authorization.py +2 -3
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/bearer_auth.py +4 -5
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/cost_tracking/model_cost_manifest.json +54 -54
- arize_phoenix-12.4.0/src/phoenix/server/oauth2.py +261 -0
- arize_phoenix-12.4.0/src/phoenix/server/static/.vite/manifest.json +93 -0
- arize_phoenix-12.2.0/src/phoenix/server/static/assets/components-BG6v0EM8.js → arize_phoenix-12.4.0/src/phoenix/server/static/assets/components-BvsExS75.js +422 -387
- arize_phoenix-12.2.0/src/phoenix/server/static/assets/index-CSVcULw1.js → arize_phoenix-12.4.0/src/phoenix/server/static/assets/index-iq8WDxat.js +12 -12
- arize_phoenix-12.2.0/src/phoenix/server/static/assets/pages-DgaM7kpM.js → arize_phoenix-12.4.0/src/phoenix/server/static/assets/pages-Ckg4SLQ9.js +542 -488
- arize_phoenix-12.4.0/src/phoenix/server/static/assets/vendor-D2eEI-6h.js +914 -0
- arize_phoenix-12.2.0/src/phoenix/server/static/assets/vendor-arizeai-DlOj0PQQ.js → arize_phoenix-12.4.0/src/phoenix/server/static/assets/vendor-arizeai-kfOei7nf.js +2 -2
- arize_phoenix-12.2.0/src/phoenix/server/static/assets/vendor-codemirror-B2PHH5yZ.js → arize_phoenix-12.4.0/src/phoenix/server/static/assets/vendor-codemirror-1bq_t1Ec.js +3 -3
- arize_phoenix-12.2.0/src/phoenix/server/static/assets/vendor-recharts-CKsi4IjN.js → arize_phoenix-12.4.0/src/phoenix/server/static/assets/vendor-recharts-DQ4xfrf4.js +1 -1
- arize_phoenix-12.2.0/src/phoenix/server/static/assets/vendor-shiki-DN26BkKE.js → arize_phoenix-12.4.0/src/phoenix/server/static/assets/vendor-shiki-GGmcIQxA.js +1 -1
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/templates/index.html +1 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/attributes.py +80 -13
- arize_phoenix-12.4.0/src/phoenix/version.py +1 -0
- arize_phoenix-12.2.0/src/phoenix/db/README.md +0 -442
- arize_phoenix-12.2.0/src/phoenix/server/oauth2.py +0 -96
- arize_phoenix-12.2.0/src/phoenix/server/static/.vite/manifest.json +0 -93
- arize_phoenix-12.2.0/src/phoenix/server/static/assets/vendor-BqTEkGQU.js +0 -903
- arize_phoenix-12.2.0/src/phoenix/version.py +0 -1
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/.gitignore +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/IP_NOTICE +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/LICENSE +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/README.md +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/core/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/core/embedding_dimension.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/core/model.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/core/model_schema.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/core/model_schema_adapter.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/datetime_utils.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/alembic.ini +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/bulk_inserter.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/constants.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/engines.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/enums.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/facilitator.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/helpers.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/insertion/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/insertion/constants.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/insertion/dataset.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/insertion/evaluation.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/insertion/helpers.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/insertion/session_annotation.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/insertion/span.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/insertion/types.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrate.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/data_migration_scripts/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/env.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/script.py.mako +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/01a8342c9cdf_add_user_id_on_datasets.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/0df286449799_add_session_annotations_table.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/272b66ff50f8_drop_single_indices.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/2f9d1a65945f_annotation_config_migration.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/58228d933c91_dataset_labels.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/699f655af132_experiment_tags.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/6a88424799fe_update_users_with_auth_method.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/735d3d93c33e_add_composite_indices.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/8a3764fe7f1a_change_jsonb_to_json_for_prompts.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/a20694b15f82_cost.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/ab513d89518b_add_user_id_on_dataset_versions.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/bb8139330879_create_project_trace_retention_policies_table.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/bc8fea3c2bc8_add_prompt_tables.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/d0690a79ea51_users_on_experiments.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/deb2c81c0bb2_dataset_splits.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/migrations/versions/e76cbd66ffc3_add_experiments_dataset_examples.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/models.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/pg_config.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/types/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/types/annotation_configs.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/types/db_models.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/types/identifier.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/types/model_provider.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/types/token_price_customization.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/db/types/trace_retention.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/exceptions.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/experiments/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/experiments/evaluators/base.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/experiments/functions.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/experiments/tracing.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/experiments/types.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/experiments/utils.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/inferences/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/inferences/errors.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/inferences/fixtures.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/inferences/inferences.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/inferences/schema.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/inferences/validation.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/logging/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/logging/_config.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/logging/_filter.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/logging/_formatter.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/metrics/README.md +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/metrics/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/metrics/binning.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/metrics/metrics.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/metrics/mixins.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/metrics/timeseries.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/metrics/wrappers.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/pointcloud/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/pointcloud/clustering.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/pointcloud/projectors.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/py.typed +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/README.md +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/auth.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/context.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/annotation_configs_by_project.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/average_experiment_repeated_run_group_latency.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/dataset_example_splits.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/dataset_examples_and_versions_by_experiment_run.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/dataset_labels.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/experiment_repeated_run_group_annotation_summaries.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/experiment_repeated_run_groups.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/last_used_times_by_generative_model_id.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/num_child_spans.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/num_spans_per_trace.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/project_ids_by_trace_retention_policy_id.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/prompt_version_sequence_number.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/session_annotations_by_session.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/session_io.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/session_num_traces.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/session_num_traces_with_error.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/session_token_usages.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_by_id.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_cost_by_span.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_generative_model.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_project_session.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_span.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_trace.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_cost_details_by_span_cost.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_experiment.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_experiment_repeated_run_group.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_experiment_run.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_generative_model.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_project.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_project_session.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_trace.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_costs.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/table_fields.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/trace_annotations_by_trace.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/trace_by_trace_ids.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/trace_retention_policy_id_by_project_id.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/trace_root_spans.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/types.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/user_roles.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/dataloaders/users.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/exceptions.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/helpers/annotations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/helpers/experiment_run_filters.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/helpers/playground_clients.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/helpers/playground_registry.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/helpers/playground_spans.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/helpers/playground_users.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/helpers/prompts/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/helpers/prompts/conversions/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/helpers/prompts/conversions/anthropic.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/helpers/prompts/conversions/aws.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/helpers/prompts/conversions/openai.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/helpers/prompts/models.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/AnnotationFilter.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/ChatCompletionInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/CreateProjectInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/CreateProjectSessionAnnotationInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/DatasetFilter.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/GenerativeCredentialInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/GenerativeModelInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/InvocationParameters.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/ProjectFilter.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/ProjectSessionSort.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/ProjectSort.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/PromptFilter.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/PromptTemplateOptions.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/PromptVersionInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/TimeBinConfig.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/UpdateAnnotationInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/interceptor.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/annotation_config_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/api_key_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/chat_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/dataset_label_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/dataset_split_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/model_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/project_session_annotations_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/project_trace_retention_policy_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/prompt_label_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/prompt_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/prompt_version_tag_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/trace_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/openapi/main.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/openapi/schema.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/queries.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/embeddings.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/utils.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/routers/v1/models.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/schema.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/subscriptions.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/Annotation.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/AnnotationConfig.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/AnnotationSource.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/AuthMethod.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/Cluster.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/CostBreakdown.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/CronExpression.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/Dataset.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/DatasetExperimentAnnotationSummary.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/DatasetLabel.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/DatasetSplit.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/Dimension.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/DocumentAnnotation.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/Event.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/Experiment.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ExperimentRepeatedRunGroup.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ExperimentRepeatedRunGroupAnnotationSummary.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/Functionality.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/GenerativeProvider.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/Identifier.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/InferenceModel.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/Inferences.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/MimeType.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ModelInterface.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/PlaygroundModel.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/Project.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ProjectSession.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ProjectSessionAnnotation.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ProjectTraceRetentionPolicy.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/Prompt.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/PromptLabel.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/PromptVersion.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/PromptVersionTag.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/PromptVersionTemplate.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ResponseFormat.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/Segments.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ServerStatus.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/SortDir.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/Span.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/SpanCostDetailSummaryEntry.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/SpanCostSummary.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/SpanIOValue.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/TokenCountPromptDetails.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/TokenPrice.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/TokenUsage.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ToolDefinition.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/Trace.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/User.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/UserRole.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/node.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/types/pagination.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/api/utils.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/cost_tracking/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/cost_tracking/cost_details_calculator.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/cost_tracking/cost_model_lookup.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/cost_tracking/helpers.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/cost_tracking/regex_specificity.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/cost_tracking/token_cost_calculator.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/daemons/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/daemons/db_disk_usage_monitor.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/daemons/generative_model_store.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/daemons/span_cost_calculator.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/dml_event.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/dml_event_handler.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/email/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/email/sender.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/email/templates/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/email/templates/db_disk_usage_notification.html +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/email/templates/password_reset.html +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/email/templates/welcome.html +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/email/types.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/experiments/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/experiments/utils.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/grpc_server.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/jwt_store.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/main.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/middleware/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/middleware/gzip.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/openapi/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/prometheus.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/rate_limiters.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/retention.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/session_filters.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/static/assets/vendor-BGzfc4EU.css +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/static/assets/vendor-three-BLWp5bic.js +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/static/favicon.ico +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/static/modernizr.js +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/telemetry.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/templates/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/thread_server.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/types.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/server/utils.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/services.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/session/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/session/client.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/session/data_extractor.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/session/evaluation.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/session/session.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/settings.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/dsl/README.md +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/dsl/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/dsl/filter.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/dsl/helpers.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/dsl/query.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/errors.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/exporter.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/fixtures.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/otel.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/projects.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/schemas.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/span_evaluations.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/span_json_decoder.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/span_json_encoder.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/trace_dataset.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/utils.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/v1/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/utilities/__init__.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/utilities/client.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/utilities/error_handling.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/utilities/json.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/utilities/logging.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/utilities/project.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/utilities/re.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/utilities/span_store.py +0 -0
- {arize_phoenix-12.2.0 → arize_phoenix-12.4.0}/src/phoenix/utilities/template_formatters.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: arize-phoenix
|
|
3
|
-
Version: 12.
|
|
3
|
+
Version: 12.4.0
|
|
4
4
|
Summary: AI Observability and Evaluation
|
|
5
5
|
Project-URL: Documentation, https://arize.com/docs/phoenix/
|
|
6
6
|
Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
|
|
@@ -31,6 +31,7 @@ Requires-Dist: grpc-interceptor
|
|
|
31
31
|
Requires-Dist: grpcio
|
|
32
32
|
Requires-Dist: httpx
|
|
33
33
|
Requires-Dist: jinja2
|
|
34
|
+
Requires-Dist: jmespath
|
|
34
35
|
Requires-Dist: numpy!=2.0.0
|
|
35
36
|
Requires-Dist: openinference-instrumentation>=0.1.32
|
|
36
37
|
Requires-Dist: openinference-semantic-conventions>=0.1.20
|
|
@@ -129,6 +129,18 @@ def set_oauth2_nonce_cookie(
|
|
|
129
129
|
)
|
|
130
130
|
|
|
131
131
|
|
|
132
|
+
def set_oauth2_code_verifier_cookie(
|
|
133
|
+
*, response: ResponseType, code_verifier: str, max_age: timedelta
|
|
134
|
+
) -> ResponseType:
|
|
135
|
+
return _set_cookie(
|
|
136
|
+
response=response,
|
|
137
|
+
cookie_name=PHOENIX_OAUTH2_CODE_VERIFIER_COOKIE_NAME,
|
|
138
|
+
cookie_max_age=max_age,
|
|
139
|
+
samesite="lax",
|
|
140
|
+
value=code_verifier,
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
|
|
132
144
|
def _set_cookie(
|
|
133
145
|
*,
|
|
134
146
|
response: ResponseType,
|
|
@@ -169,6 +181,11 @@ def delete_oauth2_nonce_cookie(response: ResponseType) -> ResponseType:
|
|
|
169
181
|
return response
|
|
170
182
|
|
|
171
183
|
|
|
184
|
+
def delete_oauth2_code_verifier_cookie(response: ResponseType) -> ResponseType:
|
|
185
|
+
response.delete_cookie(key=PHOENIX_OAUTH2_CODE_VERIFIER_COOKIE_NAME)
|
|
186
|
+
return response
|
|
187
|
+
|
|
188
|
+
|
|
172
189
|
@dataclass(frozen=True)
|
|
173
190
|
class _PasswordRequirements:
|
|
174
191
|
"""
|
|
@@ -270,6 +287,8 @@ PHOENIX_OAUTH2_STATE_COOKIE_NAME = "phoenix-oauth2-state"
|
|
|
270
287
|
"""The name of the cookie that stores the state used for the OAuth2 authorization code flow."""
|
|
271
288
|
PHOENIX_OAUTH2_NONCE_COOKIE_NAME = "phoenix-oauth2-nonce"
|
|
272
289
|
"""The name of the cookie that stores the nonce used for the OAuth2 authorization code flow."""
|
|
290
|
+
PHOENIX_OAUTH2_CODE_VERIFIER_COOKIE_NAME = "phoenix-oauth2-code-verifier"
|
|
291
|
+
"""The name of the cookie that stores the PKCE code verifier for OAuth2."""
|
|
273
292
|
DEFAULT_OAUTH2_LOGIN_EXPIRY_MINUTES = 15
|
|
274
293
|
"""
|
|
275
294
|
The default amount of time in minutes that can elapse between the initial
|
|
@@ -966,90 +966,299 @@ def get_env_smtp_validate_certs() -> bool:
|
|
|
966
966
|
return _bool_val(ENV_PHOENIX_SMTP_VALIDATE_CERTS, True)
|
|
967
967
|
|
|
968
968
|
|
|
969
|
+
_ALLOWED_TOKEN_ENDPOINT_AUTH_METHODS = (
|
|
970
|
+
"client_secret_basic",
|
|
971
|
+
"client_secret_post",
|
|
972
|
+
"none",
|
|
973
|
+
)
|
|
974
|
+
"""Allowed OAuth2 token endpoint authentication methods (OIDC Core §9)."""
|
|
975
|
+
|
|
976
|
+
|
|
969
977
|
@dataclass(frozen=True)
|
|
970
978
|
class OAuth2ClientConfig:
|
|
979
|
+
"""Configuration for an OAuth2/OIDC identity provider."""
|
|
980
|
+
|
|
981
|
+
# Identity provider identification
|
|
971
982
|
idp_name: str
|
|
972
983
|
idp_display_name: str
|
|
984
|
+
|
|
985
|
+
# OAuth2 client credentials (RFC 6749 §2)
|
|
973
986
|
client_id: str
|
|
974
|
-
client_secret:
|
|
987
|
+
client_secret: Optional[
|
|
988
|
+
str
|
|
989
|
+
] # Optional when token_endpoint_auth_method is "none" (RFC 6749 §2.3.1)
|
|
975
990
|
oidc_config_url: str
|
|
991
|
+
|
|
992
|
+
# Authentication behavior
|
|
976
993
|
allow_sign_up: bool
|
|
977
994
|
auto_login: bool
|
|
995
|
+
use_pkce: bool # Proof Key for Code Exchange (RFC 7636)
|
|
996
|
+
token_endpoint_auth_method: Optional[str] # OIDC Core §9
|
|
997
|
+
|
|
998
|
+
# Scopes and permissions (RFC 6749 §3.3: space-delimited)
|
|
999
|
+
scopes: str
|
|
1000
|
+
|
|
1001
|
+
# Group-based access control
|
|
1002
|
+
groups_attribute_path: Optional[str]
|
|
1003
|
+
allowed_groups: list[str]
|
|
978
1004
|
|
|
979
1005
|
@classmethod
|
|
980
1006
|
def from_env(cls, idp_name: str) -> "OAuth2ClientConfig":
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
):
|
|
985
|
-
raise
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
)
|
|
993
|
-
):
|
|
994
|
-
raise ValueError(
|
|
995
|
-
f"A client secret must be set for the {idp_name} OAuth2 IDP "
|
|
996
|
-
f"via the {client_secret_env_var} environment variable"
|
|
997
|
-
)
|
|
998
|
-
if not (
|
|
999
|
-
oidc_config_url := (
|
|
1000
|
-
getenv(
|
|
1001
|
-
oidc_config_url_env_var := f"PHOENIX_OAUTH2_{idp_name_upper}_OIDC_CONFIG_URL",
|
|
1007
|
+
"""Load OAuth2 client configuration from environment variables for the given IDP name."""
|
|
1008
|
+
idp_prefix = f"PHOENIX_OAUTH2_{idp_name.upper()}"
|
|
1009
|
+
|
|
1010
|
+
def _get_required(suffix: str, description: str) -> str:
|
|
1011
|
+
"""Get a required environment variable or raise a descriptive error."""
|
|
1012
|
+
env_var = f"{idp_prefix}_{suffix}"
|
|
1013
|
+
value = getenv(env_var)
|
|
1014
|
+
if value is None or not value:
|
|
1015
|
+
raise ValueError(
|
|
1016
|
+
f"{description} must be set for the {idp_name} OAuth2 IDP "
|
|
1017
|
+
f"via the {env_var} environment variable"
|
|
1002
1018
|
)
|
|
1019
|
+
return value
|
|
1020
|
+
|
|
1021
|
+
def _get_optional(suffix: str) -> Optional[str]:
|
|
1022
|
+
"""Get an optional environment variable."""
|
|
1023
|
+
return getenv(f"{idp_prefix}_{suffix}")
|
|
1024
|
+
|
|
1025
|
+
# Required configuration
|
|
1026
|
+
client_id = _get_required("CLIENT_ID", "Client ID")
|
|
1027
|
+
oidc_config_url = _get_required("OIDC_CONFIG_URL", "OpenID Connect configuration URL")
|
|
1028
|
+
|
|
1029
|
+
# Validate OIDC URL format and HTTPS requirement
|
|
1030
|
+
parsed_url = urlparse(oidc_config_url)
|
|
1031
|
+
if not parsed_url.scheme or not parsed_url.hostname:
|
|
1032
|
+
raise ValueError(
|
|
1033
|
+
f"Invalid OIDC configuration URL for {idp_name} OAuth2 IDP: {oidc_config_url}"
|
|
1003
1034
|
)
|
|
1004
|
-
|
|
1035
|
+
|
|
1036
|
+
is_localhost = parsed_url.hostname in ("localhost", "127.0.0.1", "::1")
|
|
1037
|
+
if parsed_url.scheme != "https" and not is_localhost:
|
|
1005
1038
|
raise ValueError(
|
|
1006
|
-
f"
|
|
1007
|
-
|
|
1039
|
+
f"OIDC configuration URL for {idp_name} OAuth2 IDP "
|
|
1040
|
+
"must use HTTPS (except for localhost)"
|
|
1008
1041
|
)
|
|
1042
|
+
|
|
1043
|
+
# Boolean flags
|
|
1009
1044
|
allow_sign_up = get_env_oauth2_allow_sign_up(idp_name)
|
|
1010
1045
|
auto_login = get_env_oauth2_auto_login(idp_name)
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1046
|
+
use_pkce = _bool_val(f"{idp_prefix}_USE_PKCE", False)
|
|
1047
|
+
|
|
1048
|
+
# Token endpoint auth method validation
|
|
1049
|
+
token_endpoint_auth_method = None
|
|
1050
|
+
if auth_method := _get_optional("TOKEN_ENDPOINT_AUTH_METHOD"):
|
|
1051
|
+
auth_method = auth_method.lower()
|
|
1052
|
+
if auth_method not in _ALLOWED_TOKEN_ENDPOINT_AUTH_METHODS:
|
|
1053
|
+
raise ValueError(
|
|
1054
|
+
f"Invalid TOKEN_ENDPOINT_AUTH_METHOD for {idp_name}. "
|
|
1055
|
+
f"Allowed: {', '.join(sorted(_ALLOWED_TOKEN_ENDPOINT_AUTH_METHODS))}"
|
|
1056
|
+
)
|
|
1057
|
+
token_endpoint_auth_method = auth_method
|
|
1058
|
+
|
|
1059
|
+
# CLIENT_SECRET: required based on TOKEN_ENDPOINT_AUTH_METHOD (OIDC Core §9)
|
|
1060
|
+
client_secret: Optional[str] = None
|
|
1061
|
+
|
|
1062
|
+
# Determine if CLIENT_SECRET is required based on TOKEN_ENDPOINT_AUTH_METHOD:
|
|
1063
|
+
# - "none": CLIENT_SECRET is optional (public clients, RFC 8252 §8.1)
|
|
1064
|
+
# - "client_secret_basic" or "client_secret_post": CLIENT_SECRET is required
|
|
1065
|
+
# - Not set: Default to requiring CLIENT_SECRET (assumes confidential client with
|
|
1066
|
+
# client_secret_basic)
|
|
1067
|
+
#
|
|
1068
|
+
# Note: PKCE (USE_PKCE, RFC 7636) is orthogonal to client authentication. PKCE can be
|
|
1069
|
+
# used with both public clients (no secret) and confidential clients (with secret) to
|
|
1070
|
+
# protect the authorization code from interception.
|
|
1071
|
+
|
|
1072
|
+
if token_endpoint_auth_method == "none":
|
|
1073
|
+
# Public client - no client authentication required
|
|
1074
|
+
client_secret = _get_optional("CLIENT_SECRET")
|
|
1075
|
+
else:
|
|
1076
|
+
# Confidential client (either explicitly set to client_secret_* or using default)
|
|
1077
|
+
# CLIENT_SECRET is required
|
|
1078
|
+
client_secret = _get_required("CLIENT_SECRET", "Client secret")
|
|
1079
|
+
|
|
1080
|
+
# Build scopes: start with required baseline, add custom scopes (deduplicated)
|
|
1081
|
+
scopes = ["openid", "email", "profile"]
|
|
1082
|
+
if custom_scopes := _get_optional("SCOPES"):
|
|
1083
|
+
for scope in custom_scopes.split():
|
|
1084
|
+
if scope and scope not in scopes:
|
|
1085
|
+
scopes.append(scope)
|
|
1086
|
+
|
|
1087
|
+
# Group-based access control
|
|
1088
|
+
groups_attribute_path = _get_optional("GROUPS_ATTRIBUTE_PATH")
|
|
1089
|
+
allowed_groups: list[str] = []
|
|
1090
|
+
if raw_groups := _get_optional("ALLOWED_GROUPS"):
|
|
1091
|
+
# Parse as comma-delimited
|
|
1092
|
+
# Deduplicate while preserving order
|
|
1093
|
+
seen = set()
|
|
1094
|
+
for g in raw_groups.split(","):
|
|
1095
|
+
g = g.strip()
|
|
1096
|
+
if g and g not in seen:
|
|
1097
|
+
allowed_groups.append(g)
|
|
1098
|
+
seen.add(g)
|
|
1099
|
+
|
|
1100
|
+
# Validate: ALLOWED_GROUPS requires GROUPS_ATTRIBUTE_PATH
|
|
1101
|
+
if allowed_groups and not groups_attribute_path:
|
|
1102
|
+
raise ValueError(
|
|
1103
|
+
f"ALLOWED_GROUPS is set for {idp_name} but GROUPS_ATTRIBUTE_PATH is not. "
|
|
1104
|
+
"GROUPS_ATTRIBUTE_PATH must be configured to use group-based access control."
|
|
1105
|
+
)
|
|
1106
|
+
|
|
1107
|
+
# Validate: GROUPS_ATTRIBUTE_PATH requires ALLOWED_GROUPS
|
|
1108
|
+
if groups_attribute_path and not allowed_groups:
|
|
1014
1109
|
raise ValueError(
|
|
1015
|
-
f"
|
|
1016
|
-
"
|
|
1110
|
+
f"GROUPS_ATTRIBUTE_PATH is set for {idp_name} but ALLOWED_GROUPS is not. "
|
|
1111
|
+
"If you want to extract groups, you must specify which groups are allowed. "
|
|
1112
|
+
"If you don't need group-based access control, remove GROUPS_ATTRIBUTE_PATH."
|
|
1017
1113
|
)
|
|
1114
|
+
|
|
1018
1115
|
return cls(
|
|
1019
1116
|
idp_name=idp_name,
|
|
1020
|
-
idp_display_name=
|
|
1021
|
-
|
|
1022
|
-
_get_default_idp_display_name(idp_name),
|
|
1023
|
-
),
|
|
1117
|
+
idp_display_name=_get_optional("DISPLAY_NAME")
|
|
1118
|
+
or _get_default_idp_display_name(idp_name),
|
|
1024
1119
|
client_id=client_id,
|
|
1025
1120
|
client_secret=client_secret,
|
|
1026
1121
|
oidc_config_url=oidc_config_url,
|
|
1027
1122
|
allow_sign_up=allow_sign_up,
|
|
1028
1123
|
auto_login=auto_login,
|
|
1124
|
+
use_pkce=use_pkce,
|
|
1125
|
+
token_endpoint_auth_method=token_endpoint_auth_method,
|
|
1126
|
+
scopes=" ".join(scopes),
|
|
1127
|
+
groups_attribute_path=groups_attribute_path,
|
|
1128
|
+
allowed_groups=allowed_groups,
|
|
1029
1129
|
)
|
|
1030
1130
|
|
|
1031
1131
|
|
|
1132
|
+
_OAUTH2_CONFIG_SUFFIXES = (
|
|
1133
|
+
"DISPLAY_NAME", # User-friendly name shown in login UI
|
|
1134
|
+
"CLIENT_ID", # OAuth2 client ID from your identity provider (RFC 6749 §2.2)
|
|
1135
|
+
# OAuth2 client secret (RFC 6749 §2.3.1, required by default, optional with auth method "none")
|
|
1136
|
+
"CLIENT_SECRET",
|
|
1137
|
+
"OIDC_CONFIG_URL", # OpenID Connect discovery URL (.well-known/openid-configuration)
|
|
1138
|
+
"ALLOW_SIGN_UP", # Whether to allow new user registration (default: true)
|
|
1139
|
+
"AUTO_LOGIN", # Automatically redirect to this provider (default: false)
|
|
1140
|
+
"USE_PKCE", # Enable PKCE for authorization code protection (RFC 7636, default: false)
|
|
1141
|
+
"TOKEN_ENDPOINT_AUTH_METHOD", # How to authenticate at token endpoint (OIDC Core §9)
|
|
1142
|
+
# Additional OAuth2 scopes beyond "openid email profile" (RFC 6749 §3.3: space-delimited)
|
|
1143
|
+
"SCOPES",
|
|
1144
|
+
"GROUPS_ATTRIBUTE_PATH", # JMESPath expression to extract groups from ID token
|
|
1145
|
+
"ALLOWED_GROUPS", # Comma-separated list of groups allowed to sign in
|
|
1146
|
+
)
|
|
1147
|
+
|
|
1148
|
+
|
|
1149
|
+
_OAUTH2_ENV_VAR_PATTERN = re.compile(
|
|
1150
|
+
rf"^PHOENIX_OAUTH2_(\w+)_({'|'.join(_OAUTH2_CONFIG_SUFFIXES)})$"
|
|
1151
|
+
)
|
|
1152
|
+
|
|
1153
|
+
|
|
1032
1154
|
def get_env_oauth2_settings() -> list[OAuth2ClientConfig]:
|
|
1033
1155
|
"""
|
|
1034
1156
|
Retrieves and validates OAuth2/OpenID Connect (OIDC) identity provider configurations from environment variables.
|
|
1035
1157
|
|
|
1036
1158
|
This function scans the environment for OAuth2 configuration variables and returns a list of
|
|
1037
|
-
configured identity providers.
|
|
1159
|
+
configured identity providers. Multiple identity providers can be configured simultaneously,
|
|
1160
|
+
and users will see all enabled providers as login options in the Phoenix UI.
|
|
1038
1161
|
|
|
1039
1162
|
Environment Variable Pattern:
|
|
1040
1163
|
PHOENIX_OAUTH2_{IDP_NAME}_{CONFIG_TYPE}
|
|
1041
1164
|
|
|
1165
|
+
Where {IDP_NAME} is any alphanumeric identifier you choose (e.g., GOOGLE, OKTA, KEYCLOAK).
|
|
1166
|
+
The name is case-insensitive and used to group related configuration variables. You can use
|
|
1167
|
+
any name that makes sense for your organization (e.g., COMPANY_SSO, INTERNAL_AUTH).
|
|
1168
|
+
|
|
1042
1169
|
Required Environment Variables for each IDP:
|
|
1043
1170
|
- PHOENIX_OAUTH2_{IDP_NAME}_CLIENT_ID: The OAuth2 client ID issued by the identity provider
|
|
1044
|
-
|
|
1045
|
-
- PHOENIX_OAUTH2_{IDP_NAME}
|
|
1171
|
+
|
|
1172
|
+
- PHOENIX_OAUTH2_{IDP_NAME}_CLIENT_SECRET: The OAuth2 client secret issued by the identity provider.
|
|
1173
|
+
Required by default for confidential clients. Only optional when TOKEN_ENDPOINT_AUTH_METHOD is
|
|
1174
|
+
explicitly set to "none" (for public clients without client authentication).
|
|
1175
|
+
|
|
1176
|
+
- PHOENIX_OAUTH2_{IDP_NAME}_OIDC_CONFIG_URL: The OpenID Connect configuration URL (must be HTTPS
|
|
1177
|
+
except for localhost). This URL typically ends with /.well-known/openid-configuration and is
|
|
1178
|
+
used to auto-discover OAuth2 endpoints.
|
|
1046
1179
|
|
|
1047
1180
|
Optional Environment Variables:
|
|
1048
|
-
- PHOENIX_OAUTH2_{IDP_NAME}_DISPLAY_NAME: A user-friendly name for the identity provider
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1181
|
+
- PHOENIX_OAUTH2_{IDP_NAME}_DISPLAY_NAME: A user-friendly name for the identity provider shown in the UI
|
|
1182
|
+
|
|
1183
|
+
- PHOENIX_OAUTH2_{IDP_NAME}_ALLOW_SIGN_UP: Whether to allow new user registration via this OAuth2 provider
|
|
1184
|
+
(defaults to True). When set to False, only existing users can sign in.
|
|
1185
|
+
|
|
1186
|
+
- PHOENIX_OAUTH2_{IDP_NAME}_AUTO_LOGIN: Automatically redirect to this provider's login page, skipping
|
|
1187
|
+
the Phoenix login screen (defaults to False). Useful for single sign-on deployments.
|
|
1188
|
+
Note: Only one provider should have AUTO_LOGIN enabled if you configure multiple IDPs.
|
|
1189
|
+
|
|
1190
|
+
- PHOENIX_OAUTH2_{IDP_NAME}_USE_PKCE: Enable PKCE (Proof Key for Code Exchange) with S256 code challenge
|
|
1191
|
+
method for enhanced security. PKCE protects the authorization code from interception and can be used
|
|
1192
|
+
with both public clients and confidential clients. This setting is orthogonal to client authentication -
|
|
1193
|
+
whether CLIENT_SECRET is required is determined solely by TOKEN_ENDPOINT_AUTH_METHOD, not by USE_PKCE.
|
|
1194
|
+
|
|
1195
|
+
- PHOENIX_OAUTH2_{IDP_NAME}_TOKEN_ENDPOINT_AUTH_METHOD: OAuth2 token endpoint authentication method.
|
|
1196
|
+
This setting determines how the client authenticates with the token endpoint and whether
|
|
1197
|
+
CLIENT_SECRET is required. If not set, defaults to requiring CLIENT_SECRET (confidential client).
|
|
1198
|
+
|
|
1199
|
+
Options:
|
|
1200
|
+
• client_secret_basic: Send credentials in HTTP Basic Auth header (most common).
|
|
1201
|
+
CLIENT_SECRET is required. This is the assumed default behavior if not set.
|
|
1202
|
+
• client_secret_post: Send credentials in POST body (required by some providers).
|
|
1203
|
+
CLIENT_SECRET is required.
|
|
1204
|
+
• none: No client authentication (for public clients).
|
|
1205
|
+
CLIENT_SECRET is not required. Use this for public clients that cannot
|
|
1206
|
+
securely store a client secret, typically in combination with PKCE.
|
|
1207
|
+
|
|
1208
|
+
Most providers work with the default behavior. Set this explicitly only if your provider requires
|
|
1209
|
+
a specific method or if you're configuring a public client.
|
|
1210
|
+
|
|
1211
|
+
- PHOENIX_OAUTH2_{IDP_NAME}_SCOPES: Additional OAuth2 scopes to request (space-separated).
|
|
1212
|
+
These are added to the required baseline scopes "openid email profile". For example, set to
|
|
1213
|
+
"offline_access groups" to request refresh tokens and group information. The baseline scopes
|
|
1214
|
+
are always included and cannot be removed.
|
|
1215
|
+
|
|
1216
|
+
- PHOENIX_OAUTH2_{IDP_NAME}_GROUPS_ATTRIBUTE_PATH: JMESPath expression to extract group/role claims
|
|
1217
|
+
from the OIDC ID token or userinfo endpoint response. See https://jmespath.org for full syntax.
|
|
1218
|
+
|
|
1219
|
+
The path navigates nested JSON structures to find group/role information. This claim is checked
|
|
1220
|
+
from both the ID token and userinfo endpoint (if available). The result is normalized to a list
|
|
1221
|
+
of strings for group matching.
|
|
1222
|
+
|
|
1223
|
+
⚠️ IMPORTANT: Claim keys with special characters (colons, dots, slashes, hyphens, etc.) MUST be
|
|
1224
|
+
enclosed in double quotes. Examples:
|
|
1225
|
+
• Auth0 namespace: `"https://myapp.com/groups"` (NOT `https://myapp.com/groups`)
|
|
1226
|
+
• AWS Cognito: `"cognito:groups"` (NOT `cognito:groups`)
|
|
1227
|
+
• Keycloak app: `resource_access."my-app".roles` (quotes only around special chars)
|
|
1228
|
+
|
|
1229
|
+
Common JMESPath patterns:
|
|
1230
|
+
• Simple keys: `groups` - extracts top-level array
|
|
1231
|
+
• Nested keys: `resource_access.phoenix.roles` - dot notation for nested objects
|
|
1232
|
+
• Array projection: `teams[*].name` - extracts 'name' field from each object in array
|
|
1233
|
+
• Array indexing: `groups[0]` - gets first element
|
|
1234
|
+
|
|
1235
|
+
Common provider examples:
|
|
1236
|
+
• Google Workspace: `groups`
|
|
1237
|
+
• Azure AD/Entra ID: `roles` or `groups`
|
|
1238
|
+
• Keycloak: `resource_access.phoenix.roles` (nested structure)
|
|
1239
|
+
• AWS Cognito: `"cognito:groups"` (use quotes for colon in key name)
|
|
1240
|
+
• Okta: `groups`
|
|
1241
|
+
• Auth0 (custom namespace): `"https://myapp.com/groups"` (use quotes for special chars)
|
|
1242
|
+
• Custom objects: `teams[*].name` (extract field from array of objects)
|
|
1243
|
+
|
|
1244
|
+
If not set, group-based access control is disabled for this provider.
|
|
1245
|
+
|
|
1246
|
+
- PHOENIX_OAUTH2_{IDP_NAME}_ALLOWED_GROUPS: Comma-separated list of group names that
|
|
1247
|
+
are permitted to sign in. Users must belong to at least one of these groups (extracted via
|
|
1248
|
+
GROUPS_ATTRIBUTE_PATH) to authenticate successfully.
|
|
1249
|
+
|
|
1250
|
+
Example:
|
|
1251
|
+
PHOENIX_OAUTH2_OKTA_ALLOWED_GROUPS="admin,developers,viewers"
|
|
1252
|
+
|
|
1253
|
+
Works together with GROUPS_ATTRIBUTE_PATH to implement group-based access control. If not set,
|
|
1254
|
+
all authenticated users can sign in (subject to ALLOW_SIGN_UP restrictions).
|
|
1255
|
+
|
|
1256
|
+
Multiple Identity Providers:
|
|
1257
|
+
You can configure multiple IDPs simultaneously. Users will see all configured providers
|
|
1258
|
+
as login options. Each IDP is configured independently with its own set of variables.
|
|
1259
|
+
|
|
1260
|
+
Group-based access control is evaluated per-provider: if a user authenticates via an IDP
|
|
1261
|
+
with ALLOWED_GROUPS configured, they must belong to one of those groups to sign in.
|
|
1053
1262
|
|
|
1054
1263
|
Returns:
|
|
1055
1264
|
list[OAuth2ClientConfig]: A list of configured OAuth2 identity providers, sorted alphabetically by IDP name.
|
|
@@ -1059,20 +1268,60 @@ def get_env_oauth2_settings() -> list[OAuth2ClientConfig]:
|
|
|
1059
1268
|
ValueError: If required environment variables are missing or invalid.
|
|
1060
1269
|
Specifically, if the OIDC configuration URL is not HTTPS (except for localhost).
|
|
1061
1270
|
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1271
|
+
Examples:
|
|
1272
|
+
Basic configuration with Google:
|
|
1273
|
+
PHOENIX_OAUTH2_GOOGLE_CLIENT_ID=your_client_id
|
|
1274
|
+
PHOENIX_OAUTH2_GOOGLE_CLIENT_SECRET=your_client_secret
|
|
1275
|
+
PHOENIX_OAUTH2_GOOGLE_OIDC_CONFIG_URL=https://accounts.google.com/.well-known/openid-configuration
|
|
1276
|
+
|
|
1277
|
+
With custom display name and auto-login:
|
|
1278
|
+
PHOENIX_OAUTH2_GOOGLE_DISPLAY_NAME=Google Workspace
|
|
1279
|
+
PHOENIX_OAUTH2_GOOGLE_AUTO_LOGIN=true
|
|
1280
|
+
|
|
1281
|
+
With group-based access control (simple path):
|
|
1282
|
+
PHOENIX_OAUTH2_GOOGLE_GROUPS_ATTRIBUTE_PATH=groups
|
|
1283
|
+
PHOENIX_OAUTH2_GOOGLE_ALLOWED_GROUPS=engineering platform-team
|
|
1284
|
+
|
|
1285
|
+
With nested group path (Keycloak):
|
|
1286
|
+
PHOENIX_OAUTH2_KEYCLOAK_GROUPS_ATTRIBUTE_PATH=resource_access.phoenix.roles
|
|
1287
|
+
PHOENIX_OAUTH2_KEYCLOAK_ALLOWED_GROUPS=admin developer
|
|
1288
|
+
|
|
1289
|
+
With special characters in path (AWS Cognito - quotes REQUIRED):
|
|
1290
|
+
PHOENIX_OAUTH2_COGNITO_GROUPS_ATTRIBUTE_PATH='"cognito:groups"'
|
|
1291
|
+
PHOENIX_OAUTH2_COGNITO_ALLOWED_GROUPS=Administrators PowerUsers
|
|
1292
|
+
|
|
1293
|
+
With namespaced claims (Auth0 - quotes REQUIRED):
|
|
1294
|
+
PHOENIX_OAUTH2_AUTH0_GROUPS_ATTRIBUTE_PATH='"https://myapp.com/groups"'
|
|
1295
|
+
PHOENIX_OAUTH2_AUTH0_ALLOWED_GROUPS=admin users
|
|
1296
|
+
|
|
1297
|
+
With array projection (extract names from objects):
|
|
1298
|
+
PHOENIX_OAUTH2_CUSTOM_GROUPS_ATTRIBUTE_PATH=teams[*].name
|
|
1299
|
+
PHOENIX_OAUTH2_CUSTOM_ALLOWED_GROUPS=engineering operations
|
|
1300
|
+
|
|
1301
|
+
For public clients using PKCE (no client secret needed):
|
|
1302
|
+
PHOENIX_OAUTH2_MOBILE_CLIENT_ID=mobile_app_id
|
|
1303
|
+
PHOENIX_OAUTH2_MOBILE_OIDC_CONFIG_URL=https://auth.example.com/.well-known/openid-configuration
|
|
1304
|
+
PHOENIX_OAUTH2_MOBILE_TOKEN_ENDPOINT_AUTH_METHOD=none
|
|
1305
|
+
PHOENIX_OAUTH2_MOBILE_USE_PKCE=true
|
|
1306
|
+
|
|
1307
|
+
Multiple identity providers (users can choose):
|
|
1308
|
+
# Google OAuth
|
|
1309
|
+
PHOENIX_OAUTH2_GOOGLE_CLIENT_ID=google_client_id
|
|
1310
|
+
PHOENIX_OAUTH2_GOOGLE_CLIENT_SECRET=google_secret
|
|
1311
|
+
PHOENIX_OAUTH2_GOOGLE_OIDC_CONFIG_URL=https://accounts.google.com/.well-known/openid-configuration
|
|
1312
|
+
|
|
1313
|
+
# Internal Okta
|
|
1314
|
+
PHOENIX_OAUTH2_OKTA_CLIENT_ID=okta_client_id
|
|
1315
|
+
PHOENIX_OAUTH2_OKTA_CLIENT_SECRET=okta_secret
|
|
1316
|
+
PHOENIX_OAUTH2_OKTA_OIDC_CONFIG_URL=https://your-domain.okta.com/.well-known/openid-configuration
|
|
1317
|
+
PHOENIX_OAUTH2_OKTA_GROUPS_ATTRIBUTE_PATH=groups
|
|
1318
|
+
PHOENIX_OAUTH2_OKTA_ALLOWED_GROUPS=engineering
|
|
1069
1319
|
""" # noqa: E501
|
|
1070
1320
|
idp_names = set()
|
|
1071
|
-
pattern = re.compile(
|
|
1072
|
-
r"^PHOENIX_OAUTH2_(\w+)_(DISPLAY_NAME|CLIENT_ID|CLIENT_SECRET|OIDC_CONFIG_URL|ALLOW_SIGN_UP|AUTO_LOGIN)$" # noqa: E501
|
|
1073
|
-
)
|
|
1074
1321
|
for env_var in os.environ:
|
|
1075
|
-
if (match :=
|
|
1322
|
+
if (match := _OAUTH2_ENV_VAR_PATTERN.match(env_var)) is not None and (
|
|
1323
|
+
idp_name := match.group(1).lower()
|
|
1324
|
+
):
|
|
1076
1325
|
idp_names.add(idp_name)
|
|
1077
1326
|
return [OAuth2ClientConfig.from_env(idp_name) for idp_name in sorted(idp_names)]
|
|
1078
1327
|
|