arize-phoenix 12.3.0__tar.gz → 12.5.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.

Files changed (491) hide show
  1. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/PKG-INFO +2 -1
  2. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/pyproject.toml +1 -0
  3. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/auth.py +27 -2
  4. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/config.py +302 -53
  5. arize_phoenix-12.5.0/src/phoenix/db/README.md +960 -0
  6. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/models.py +3 -3
  7. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/auth.py +9 -0
  8. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/context.py +2 -0
  9. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/__init__.py +2 -0
  10. arize_phoenix-12.5.0/src/phoenix/server/api/dataloaders/dataset_dataset_splits.py +52 -0
  11. arize_phoenix-12.5.0/src/phoenix/server/api/input_types/ProjectSessionSort.py +189 -0
  12. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/SpanSort.py +2 -1
  13. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/UserRoleInput.py +1 -0
  14. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/annotation_config_mutations.py +6 -6
  15. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/api_key_mutations.py +13 -5
  16. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/chat_mutations.py +3 -3
  17. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/dataset_label_mutations.py +6 -6
  18. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/dataset_mutations.py +8 -8
  19. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/dataset_split_mutations.py +7 -7
  20. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/experiment_mutations.py +2 -2
  21. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/export_events_mutations.py +3 -3
  22. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/model_mutations.py +4 -4
  23. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/project_mutations.py +4 -4
  24. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/project_session_annotations_mutations.py +4 -4
  25. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/project_trace_retention_policy_mutations.py +8 -4
  26. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/prompt_label_mutations.py +7 -7
  27. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/prompt_mutations.py +7 -7
  28. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/prompt_version_tag_mutations.py +3 -3
  29. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +5 -5
  30. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +4 -4
  31. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/trace_mutations.py +3 -3
  32. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/user_mutations.py +8 -5
  33. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/auth.py +23 -32
  34. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/oauth2.py +213 -24
  35. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/__init__.py +18 -4
  36. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/annotation_configs.py +19 -30
  37. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/annotations.py +21 -22
  38. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/datasets.py +86 -64
  39. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/documents.py +2 -3
  40. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/evaluations.py +12 -24
  41. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +2 -3
  42. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +16 -11
  43. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/experiments.py +57 -22
  44. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/projects.py +16 -50
  45. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/prompts.py +30 -31
  46. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/sessions.py +2 -5
  47. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/spans.py +35 -26
  48. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/traces.py +11 -19
  49. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/users.py +13 -29
  50. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/utils.py +3 -7
  51. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/subscriptions.py +3 -3
  52. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/Dataset.py +95 -6
  53. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/Project.py +24 -68
  54. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/app.py +3 -2
  55. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/authorization.py +5 -4
  56. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/bearer_auth.py +13 -5
  57. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/jwt_store.py +8 -6
  58. arize_phoenix-12.5.0/src/phoenix/server/oauth2.py +261 -0
  59. arize_phoenix-12.5.0/src/phoenix/server/static/.vite/manifest.json +93 -0
  60. arize_phoenix-12.3.0/src/phoenix/server/static/assets/components-Bs8eJEpU.js → arize_phoenix-12.5.0/src/phoenix/server/static/assets/components-cwdYEs7B.js +501 -404
  61. arize_phoenix-12.3.0/src/phoenix/server/static/assets/index-C6WEu5UP.js → arize_phoenix-12.5.0/src/phoenix/server/static/assets/index-Dc0vD1Rn.js +1 -1
  62. arize_phoenix-12.3.0/src/phoenix/server/static/assets/pages-D-n2pkoG.js → arize_phoenix-12.5.0/src/phoenix/server/static/assets/pages-BDkB3a_a.js +577 -533
  63. arize_phoenix-12.3.0/src/phoenix/server/static/assets/vendor-D2eEI-6h.js → arize_phoenix-12.5.0/src/phoenix/server/static/assets/vendor-Ce6GTAin.js +1 -1
  64. arize_phoenix-12.3.0/src/phoenix/server/static/assets/vendor-arizeai-kfOei7nf.js → arize_phoenix-12.5.0/src/phoenix/server/static/assets/vendor-arizeai-CSF-1Kc5.js +1 -1
  65. arize_phoenix-12.3.0/src/phoenix/server/static/assets/vendor-codemirror-1bq_t1Ec.js → arize_phoenix-12.5.0/src/phoenix/server/static/assets/vendor-codemirror-Bv8J_7an.js +3 -3
  66. arize_phoenix-12.3.0/src/phoenix/server/static/assets/vendor-recharts-DQ4xfrf4.js → arize_phoenix-12.5.0/src/phoenix/server/static/assets/vendor-recharts-DcLgzI7g.js +1 -1
  67. arize_phoenix-12.3.0/src/phoenix/server/static/assets/vendor-shiki-GGmcIQxA.js → arize_phoenix-12.5.0/src/phoenix/server/static/assets/vendor-shiki-BF8rh_7m.js +1 -1
  68. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/attributes.py +80 -13
  69. arize_phoenix-12.5.0/src/phoenix/version.py +1 -0
  70. arize_phoenix-12.3.0/src/phoenix/db/README.md +0 -442
  71. arize_phoenix-12.3.0/src/phoenix/server/api/input_types/ProjectSessionSort.py +0 -32
  72. arize_phoenix-12.3.0/src/phoenix/server/oauth2.py +0 -94
  73. arize_phoenix-12.3.0/src/phoenix/server/static/.vite/manifest.json +0 -93
  74. arize_phoenix-12.3.0/src/phoenix/version.py +0 -1
  75. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/.gitignore +0 -0
  76. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/IP_NOTICE +0 -0
  77. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/LICENSE +0 -0
  78. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/README.md +0 -0
  79. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/__init__.py +0 -0
  80. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/core/__init__.py +0 -0
  81. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/core/embedding_dimension.py +0 -0
  82. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/core/model.py +0 -0
  83. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/core/model_schema.py +0 -0
  84. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/core/model_schema_adapter.py +0 -0
  85. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/datetime_utils.py +0 -0
  86. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/__init__.py +0 -0
  87. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/alembic.ini +0 -0
  88. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/bulk_inserter.py +0 -0
  89. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/constants.py +0 -0
  90. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/engines.py +0 -0
  91. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/enums.py +0 -0
  92. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/facilitator.py +0 -0
  93. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/helpers.py +0 -0
  94. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/insertion/__init__.py +0 -0
  95. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/insertion/constants.py +0 -0
  96. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/insertion/dataset.py +0 -0
  97. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
  98. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/insertion/evaluation.py +0 -0
  99. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/insertion/helpers.py +0 -0
  100. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/insertion/session_annotation.py +0 -0
  101. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/insertion/span.py +0 -0
  102. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
  103. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
  104. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/insertion/types.py +0 -0
  105. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrate.py +0 -0
  106. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/__init__.py +0 -0
  107. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/data_migration_scripts/__init__.py +0 -0
  108. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +0 -0
  109. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/env.py +0 -0
  110. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/script.py.mako +0 -0
  111. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/01a8342c9cdf_add_user_id_on_datasets.py +0 -0
  112. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/0df286449799_add_session_annotations_table.py +0 -0
  113. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  114. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/272b66ff50f8_drop_single_indices.py +0 -0
  115. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/2f9d1a65945f_annotation_config_migration.py +0 -0
  116. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
  117. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +0 -0
  118. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/58228d933c91_dataset_labels.py +0 -0
  119. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/699f655af132_experiment_tags.py +0 -0
  120. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/6a88424799fe_update_users_with_auth_method.py +0 -0
  121. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/735d3d93c33e_add_composite_indices.py +0 -0
  122. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/8a3764fe7f1a_change_jsonb_to_json_for_prompts.py +0 -0
  123. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/a20694b15f82_cost.py +0 -0
  124. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/ab513d89518b_add_user_id_on_dataset_versions.py +0 -0
  125. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/bb8139330879_create_project_trace_retention_policies_table.py +0 -0
  126. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/bc8fea3c2bc8_add_prompt_tables.py +0 -0
  127. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
  128. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  129. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/d0690a79ea51_users_on_experiments.py +0 -0
  130. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/deb2c81c0bb2_dataset_splits.py +0 -0
  131. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/migrations/versions/e76cbd66ffc3_add_experiments_dataset_examples.py +0 -0
  132. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/pg_config.py +0 -0
  133. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/types/__init__.py +0 -0
  134. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/types/annotation_configs.py +0 -0
  135. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/types/db_models.py +0 -0
  136. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/types/identifier.py +0 -0
  137. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/types/model_provider.py +0 -0
  138. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/types/token_price_customization.py +0 -0
  139. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/db/types/trace_retention.py +0 -0
  140. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/exceptions.py +0 -0
  141. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/experiments/__init__.py +0 -0
  142. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  143. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/experiments/evaluators/base.py +0 -0
  144. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
  145. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
  146. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
  147. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/experiments/functions.py +0 -0
  148. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/experiments/tracing.py +0 -0
  149. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/experiments/types.py +0 -0
  150. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/experiments/utils.py +0 -0
  151. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/inferences/__init__.py +0 -0
  152. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/inferences/errors.py +0 -0
  153. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/inferences/fixtures.py +0 -0
  154. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/inferences/inferences.py +0 -0
  155. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/inferences/schema.py +0 -0
  156. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/inferences/validation.py +0 -0
  157. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/logging/__init__.py +0 -0
  158. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/logging/_config.py +0 -0
  159. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/logging/_filter.py +0 -0
  160. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/logging/_formatter.py +0 -0
  161. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/metrics/README.md +0 -0
  162. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/metrics/__init__.py +0 -0
  163. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/metrics/binning.py +0 -0
  164. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/metrics/metrics.py +0 -0
  165. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/metrics/mixins.py +0 -0
  166. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  167. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/metrics/timeseries.py +0 -0
  168. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/metrics/wrappers.py +0 -0
  169. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/pointcloud/__init__.py +0 -0
  170. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/pointcloud/clustering.py +0 -0
  171. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
  172. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/pointcloud/projectors.py +0 -0
  173. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  174. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/py.typed +0 -0
  175. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/__init__.py +0 -0
  176. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/README.md +0 -0
  177. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/__init__.py +0 -0
  178. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/auth_messages.py +0 -0
  179. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/annotation_configs_by_project.py +0 -0
  180. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
  181. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/average_experiment_repeated_run_group_latency.py +0 -0
  182. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
  183. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  184. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
  185. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
  186. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
  187. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/dataset_example_splits.py +0 -0
  188. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/dataset_examples_and_versions_by_experiment_run.py +0 -0
  189. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/dataset_labels.py +0 -0
  190. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
  191. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
  192. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
  193. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
  194. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
  195. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/experiment_repeated_run_group_annotation_summaries.py +0 -0
  196. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/experiment_repeated_run_groups.py +0 -0
  197. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
  198. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
  199. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
  200. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/last_used_times_by_generative_model_id.py +0 -0
  201. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
  202. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
  203. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/num_child_spans.py +0 -0
  204. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/num_spans_per_trace.py +0 -0
  205. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
  206. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/project_ids_by_trace_retention_policy_id.py +0 -0
  207. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/prompt_version_sequence_number.py +0 -0
  208. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
  209. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/session_annotations_by_session.py +0 -0
  210. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/session_io.py +0 -0
  211. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/session_num_traces.py +0 -0
  212. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/session_num_traces_with_error.py +0 -0
  213. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/session_token_usages.py +0 -0
  214. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +0 -0
  215. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
  216. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_by_id.py +0 -0
  217. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_cost_by_span.py +0 -0
  218. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_generative_model.py +0 -0
  219. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_project_session.py +0 -0
  220. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_span.py +0 -0
  221. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_cost_detail_summary_entries_by_trace.py +0 -0
  222. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_cost_details_by_span_cost.py +0 -0
  223. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_experiment.py +0 -0
  224. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_experiment_repeated_run_group.py +0 -0
  225. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_experiment_run.py +0 -0
  226. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_generative_model.py +0 -0
  227. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_project.py +0 -0
  228. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_project_session.py +0 -0
  229. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_cost_summary_by_trace.py +0 -0
  230. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_costs.py +0 -0
  231. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
  232. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
  233. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
  234. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/table_fields.py +0 -0
  235. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
  236. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/trace_annotations_by_trace.py +0 -0
  237. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/trace_by_trace_ids.py +0 -0
  238. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/trace_retention_policy_id_by_project_id.py +0 -0
  239. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/trace_root_spans.py +0 -0
  240. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/types.py +0 -0
  241. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/user_roles.py +0 -0
  242. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/dataloaders/users.py +0 -0
  243. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/exceptions.py +0 -0
  244. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
  245. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/helpers/annotations.py +0 -0
  246. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
  247. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/helpers/experiment_run_filters.py +0 -0
  248. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/helpers/playground_clients.py +0 -0
  249. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/helpers/playground_registry.py +0 -0
  250. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/helpers/playground_spans.py +0 -0
  251. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/helpers/playground_users.py +0 -0
  252. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/helpers/prompts/__init__.py +0 -0
  253. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/helpers/prompts/conversions/__init__.py +0 -0
  254. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/helpers/prompts/conversions/anthropic.py +0 -0
  255. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/helpers/prompts/conversions/aws.py +0 -0
  256. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/helpers/prompts/conversions/openai.py +0 -0
  257. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/helpers/prompts/models.py +0 -0
  258. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
  259. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
  260. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/AnnotationFilter.py +0 -0
  261. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/ChatCompletionInput.py +0 -0
  262. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -0
  263. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  264. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  265. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  266. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  267. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/CreateProjectInput.py +0 -0
  268. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/CreateProjectSessionAnnotationInput.py +0 -0
  269. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
  270. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
  271. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  272. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  273. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/DatasetFilter.py +0 -0
  274. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  275. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  276. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
  277. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
  278. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  279. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
  280. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  281. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  282. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/GenerativeCredentialInput.py +0 -0
  283. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/GenerativeModelInput.py +0 -0
  284. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  285. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/InvocationParameters.py +0 -0
  286. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
  287. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
  288. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  289. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  290. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/ProjectFilter.py +0 -0
  291. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/ProjectSort.py +0 -0
  292. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/PromptFilter.py +0 -0
  293. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/PromptTemplateOptions.py +0 -0
  294. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/PromptVersionInput.py +0 -0
  295. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  296. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/TimeBinConfig.py +0 -0
  297. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  298. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  299. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/UpdateAnnotationInput.py +0 -0
  300. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
  301. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/interceptor.py +0 -0
  302. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
  303. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
  304. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/openapi/main.py +0 -0
  305. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/openapi/schema.py +0 -0
  306. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/queries.py +0 -0
  307. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/__init__.py +0 -0
  308. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/embeddings.py +0 -0
  309. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/utils.py +0 -0
  310. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/routers/v1/models.py +0 -0
  311. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/schema.py +0 -0
  312. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/Annotation.py +0 -0
  313. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/AnnotationConfig.py +0 -0
  314. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/AnnotationSource.py +0 -0
  315. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
  316. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
  317. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
  318. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/AuthMethod.py +0 -0
  319. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
  320. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +0 -0
  321. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/Cluster.py +0 -0
  322. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/CostBreakdown.py +0 -0
  323. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  324. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/CronExpression.py +0 -0
  325. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  326. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  327. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  328. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/DatasetExperimentAnnotationSummary.py +0 -0
  329. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/DatasetLabel.py +0 -0
  330. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/DatasetSplit.py +0 -0
  331. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  332. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  333. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/Dimension.py +0 -0
  334. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  335. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  336. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
  337. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  338. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/DocumentAnnotation.py +0 -0
  339. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  340. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  341. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  342. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  343. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  344. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/Event.py +0 -0
  345. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  346. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  347. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/Experiment.py +0 -0
  348. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  349. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
  350. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ExperimentRepeatedRunGroup.py +0 -0
  351. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ExperimentRepeatedRunGroupAnnotationSummary.py +0 -0
  352. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  353. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  354. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  355. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/Functionality.py +0 -0
  356. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
  357. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/GenerativeProvider.py +0 -0
  358. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/Identifier.py +0 -0
  359. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/InferenceModel.py +0 -0
  360. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/Inferences.py +0 -0
  361. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
  362. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  363. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/MimeType.py +0 -0
  364. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ModelInterface.py +0 -0
  365. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
  366. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  367. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/PlaygroundModel.py +0 -0
  368. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ProjectSession.py +0 -0
  369. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ProjectSessionAnnotation.py +0 -0
  370. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ProjectTraceRetentionPolicy.py +0 -0
  371. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/Prompt.py +0 -0
  372. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/PromptLabel.py +0 -0
  373. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  374. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/PromptVersion.py +0 -0
  375. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/PromptVersionTag.py +0 -0
  376. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/PromptVersionTemplate.py +0 -0
  377. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ResponseFormat.py +0 -0
  378. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
  379. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  380. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/Segments.py +0 -0
  381. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ServerStatus.py +0 -0
  382. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/SortDir.py +0 -0
  383. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/Span.py +0 -0
  384. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
  385. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/SpanCostDetailSummaryEntry.py +0 -0
  386. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/SpanCostSummary.py +0 -0
  387. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/SpanIOValue.py +0 -0
  388. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
  389. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  390. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/TokenCountPromptDetails.py +0 -0
  391. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/TokenPrice.py +0 -0
  392. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/TokenUsage.py +0 -0
  393. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ToolDefinition.py +0 -0
  394. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/Trace.py +0 -0
  395. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
  396. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  397. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/User.py +0 -0
  398. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
  399. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/UserRole.py +0 -0
  400. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  401. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  402. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/__init__.py +0 -0
  403. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/node.py +0 -0
  404. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/types/pagination.py +0 -0
  405. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/api/utils.py +0 -0
  406. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/cost_tracking/__init__.py +0 -0
  407. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/cost_tracking/cost_details_calculator.py +0 -0
  408. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/cost_tracking/cost_model_lookup.py +0 -0
  409. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/cost_tracking/helpers.py +0 -0
  410. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/cost_tracking/model_cost_manifest.json +0 -0
  411. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/cost_tracking/regex_specificity.py +0 -0
  412. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/cost_tracking/token_cost_calculator.py +0 -0
  413. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/daemons/__init__.py +0 -0
  414. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/daemons/db_disk_usage_monitor.py +0 -0
  415. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/daemons/generative_model_store.py +0 -0
  416. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/daemons/span_cost_calculator.py +0 -0
  417. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/dml_event.py +0 -0
  418. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/dml_event_handler.py +0 -0
  419. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/email/__init__.py +0 -0
  420. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/email/sender.py +0 -0
  421. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/email/templates/__init__.py +0 -0
  422. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/email/templates/db_disk_usage_notification.html +0 -0
  423. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/email/templates/password_reset.html +0 -0
  424. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/email/templates/welcome.html +0 -0
  425. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/email/types.py +0 -0
  426. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/experiments/__init__.py +0 -0
  427. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/experiments/utils.py +0 -0
  428. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/grpc_server.py +0 -0
  429. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/main.py +0 -0
  430. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/middleware/__init__.py +0 -0
  431. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/middleware/gzip.py +0 -0
  432. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/openapi/__init__.py +0 -0
  433. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/prometheus.py +0 -0
  434. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/rate_limiters.py +0 -0
  435. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/retention.py +0 -0
  436. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/session_filters.py +0 -0
  437. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  438. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  439. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  440. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  441. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  442. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  443. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  444. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  445. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/static/assets/vendor-BGzfc4EU.css +0 -0
  446. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/static/assets/vendor-three-BLWp5bic.js +0 -0
  447. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/static/favicon.ico +0 -0
  448. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/static/modernizr.js +0 -0
  449. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/telemetry.py +0 -0
  450. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/templates/__init__.py +0 -0
  451. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/templates/index.html +0 -0
  452. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/thread_server.py +0 -0
  453. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/types.py +0 -0
  454. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/server/utils.py +0 -0
  455. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/services.py +0 -0
  456. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/session/__init__.py +0 -0
  457. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/session/client.py +0 -0
  458. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/session/data_extractor.py +0 -0
  459. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/session/evaluation.py +0 -0
  460. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/session/session.py +0 -0
  461. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/settings.py +0 -0
  462. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/__init__.py +0 -0
  463. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/dsl/README.md +0 -0
  464. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/dsl/__init__.py +0 -0
  465. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/dsl/filter.py +0 -0
  466. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/dsl/helpers.py +0 -0
  467. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/dsl/query.py +0 -0
  468. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/errors.py +0 -0
  469. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
  470. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/exporter.py +0 -0
  471. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/fixtures.py +0 -0
  472. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/otel.py +0 -0
  473. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/projects.py +0 -0
  474. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/schemas.py +0 -0
  475. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/span_evaluations.py +0 -0
  476. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/span_json_decoder.py +0 -0
  477. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/span_json_encoder.py +0 -0
  478. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/trace_dataset.py +0 -0
  479. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/utils.py +0 -0
  480. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/v1/__init__.py +0 -0
  481. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  482. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  483. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/utilities/__init__.py +0 -0
  484. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/utilities/client.py +0 -0
  485. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/utilities/error_handling.py +0 -0
  486. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/utilities/json.py +0 -0
  487. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/utilities/logging.py +0 -0
  488. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/utilities/project.py +0 -0
  489. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/utilities/re.py +0 -0
  490. {arize_phoenix-12.3.0 → arize_phoenix-12.5.0}/src/phoenix/utilities/span_store.py +0 -0
  491. {arize_phoenix-12.3.0 → arize_phoenix-12.5.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.0
3
+ Version: 12.5.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
@@ -63,6 +63,7 @@ dependencies = [
63
63
  "python-dateutil",
64
64
  "prometheus_client",
65
65
  "orjson",
66
+ "jmespath",
66
67
  ]
67
68
  dynamic = ["version"]
68
69
 
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import re
4
4
  from dataclasses import dataclass
5
- from datetime import datetime, timedelta
5
+ from datetime import datetime, timedelta, timezone
6
6
  from enum import Enum, auto
7
7
  from hashlib import pbkdf2_hmac
8
8
  from typing import Any, Literal, Optional, Protocol
@@ -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
@@ -312,7 +331,13 @@ class ClaimSet:
312
331
 
313
332
  @property
314
333
  def status(self) -> ClaimSetStatus:
315
- if self.expiration_time and self.expiration_time.timestamp() < datetime.now().timestamp():
334
+ # Per JWT RFC 7519 Section 4.1.4, the expiration time identifies the time
335
+ # "on or after which" the JWT must not be accepted. Use <= for inclusive check.
336
+ # https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.4
337
+ if (
338
+ self.expiration_time
339
+ and self.expiration_time.timestamp() <= datetime.now(timezone.utc).timestamp()
340
+ ):
316
341
  return ClaimSetStatus.EXPIRED
317
342
  if self.token_id is not None and self.subject is not None:
318
343
  return ClaimSetStatus.VALID
@@ -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: str
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
- idp_name_upper = idp_name.upper()
982
- if not (
983
- client_id := getenv(client_id_env_var := f"PHOENIX_OAUTH2_{idp_name_upper}_CLIENT_ID")
984
- ):
985
- raise ValueError(
986
- f"A client id must be set for the {idp_name} OAuth2 IDP "
987
- f"via the {client_id_env_var} environment variable"
988
- )
989
- if not (
990
- client_secret := getenv(
991
- client_secret_env_var := f"PHOENIX_OAUTH2_{idp_name_upper}_CLIENT_SECRET"
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"An OpenID Connect configuration URL must be set for the {idp_name} OAuth2 IDP "
1007
- f"via the {oidc_config_url_env_var} environment variable"
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
- parsed_oidc_config_url = urlparse(oidc_config_url)
1012
- is_local_oidc_config_url = parsed_oidc_config_url.hostname in ("localhost", "127.0.0.1")
1013
- if parsed_oidc_config_url.scheme != "https" and not is_local_oidc_config_url:
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"Server metadata URL for {idp_name} OAuth2 IDP "
1016
- "must be a valid URL using the https protocol"
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=getenv(
1021
- f"PHOENIX_OAUTH2_{idp_name_upper}_DISPLAY_NAME",
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. It supports multiple identity providers simultaneously.
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
- - PHOENIX_OAUTH2_{IDP_NAME}_CLIENT_SECRET: The OAuth2 client secret issued by the identity provider
1045
- - PHOENIX_OAUTH2_{IDP_NAME}_OIDC_CONFIG_URL: The OpenID Connect configuration URL (must be HTTPS)
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
- - PHOENIX_OAUTH2_{IDP_NAME}_ALLOW_SIGN_UP: Whether to allow new user registration (defaults to True)
1050
- When set to False, the system will check if the user exists in the database by their email address.
1051
- If the user does not exist or has a password set, they will be redirected to the login page with
1052
- an error message.
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
- Example:
1063
- To configure Google as an identity provider, set these environment variables:
1064
- PHOENIX_OAUTH2_GOOGLE_CLIENT_ID=your_client_id
1065
- PHOENIX_OAUTH2_GOOGLE_CLIENT_SECRET=your_client_secret
1066
- PHOENIX_OAUTH2_GOOGLE_OIDC_CONFIG_URL=https://accounts.google.com/.well-known/openid-configuration
1067
- PHOENIX_OAUTH2_GOOGLE_DISPLAY_NAME=Google (optional)
1068
- PHOENIX_OAUTH2_GOOGLE_ALLOW_SIGN_UP=true (optional, defaults to true)
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 := pattern.match(env_var)) is not None and (idp_name := match.group(1).lower()):
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