arize-phoenix 8.28.1__tar.gz → 8.29.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of arize-phoenix might be problematic. Click here for more details.

Files changed (377) hide show
  1. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/PKG-INFO +1 -1
  2. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/config.py +269 -3
  3. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/grpc_server.py +19 -2
  4. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/main.py +45 -7
  5. arize_phoenix-8.29.0/src/phoenix/version.py +1 -0
  6. arize_phoenix-8.28.1/src/phoenix/version.py +0 -1
  7. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/.gitignore +0 -0
  8. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/IP_NOTICE +0 -0
  9. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/LICENSE +0 -0
  10. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/README.md +0 -0
  11. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/pyproject.toml +0 -0
  12. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/__init__.py +0 -0
  13. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/auth.py +0 -0
  14. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/core/__init__.py +0 -0
  15. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/core/embedding_dimension.py +0 -0
  16. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/core/model.py +0 -0
  17. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/core/model_schema.py +0 -0
  18. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/core/model_schema_adapter.py +0 -0
  19. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/datetime_utils.py +0 -0
  20. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/README.md +0 -0
  21. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/__init__.py +0 -0
  22. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/alembic.ini +0 -0
  23. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/bulk_inserter.py +0 -0
  24. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/engines.py +0 -0
  25. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/enums.py +0 -0
  26. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/facilitator.py +0 -0
  27. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/helpers.py +0 -0
  28. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/__init__.py +0 -0
  29. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/constants.py +0 -0
  30. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/dataset.py +0 -0
  31. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
  32. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/evaluation.py +0 -0
  33. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/helpers.py +0 -0
  34. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/span.py +0 -0
  35. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
  36. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
  37. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/insertion/types.py +0 -0
  38. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/migrate.py +0 -0
  39. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/__init__.py +0 -0
  40. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/data_migration_scripts/__init__.py +0 -0
  41. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/data_migration_scripts/populate_project_sessions.py +0 -0
  42. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/env.py +0 -0
  43. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/script.py.mako +0 -0
  44. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  45. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
  46. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/versions/4ded9e43755f_create_project_sessions_table.py +0 -0
  47. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/versions/bc8fea3c2bc8_add_prompt_tables.py +0 -0
  48. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/versions/cd164e83824f_users_and_tokens.py +0 -0
  49. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  50. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/models.py +0 -0
  51. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/types/__init__.py +0 -0
  52. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/types/identifier.py +0 -0
  53. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/db/types/model_provider.py +0 -0
  54. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/exceptions.py +0 -0
  55. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/experiments/__init__.py +0 -0
  56. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  57. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/experiments/evaluators/base.py +0 -0
  58. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
  59. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
  60. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
  61. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/experiments/functions.py +0 -0
  62. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/experiments/tracing.py +0 -0
  63. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/experiments/types.py +0 -0
  64. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/experiments/utils.py +0 -0
  65. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/inferences/__init__.py +0 -0
  66. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/inferences/errors.py +0 -0
  67. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/inferences/fixtures.py +0 -0
  68. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/inferences/inferences.py +0 -0
  69. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/inferences/schema.py +0 -0
  70. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/inferences/validation.py +0 -0
  71. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/logging/__init__.py +0 -0
  72. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/logging/_config.py +0 -0
  73. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/logging/_filter.py +0 -0
  74. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/logging/_formatter.py +0 -0
  75. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/metrics/README.md +0 -0
  76. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/metrics/__init__.py +0 -0
  77. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/metrics/binning.py +0 -0
  78. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/metrics/metrics.py +0 -0
  79. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/metrics/mixins.py +0 -0
  80. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  81. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/metrics/timeseries.py +0 -0
  82. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/metrics/wrappers.py +0 -0
  83. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/pointcloud/__init__.py +0 -0
  84. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/pointcloud/clustering.py +0 -0
  85. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
  86. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/pointcloud/projectors.py +0 -0
  87. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  88. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/py.typed +0 -0
  89. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/__init__.py +0 -0
  90. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/README.md +0 -0
  91. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/__init__.py +0 -0
  92. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/auth.py +0 -0
  93. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/context.py +0 -0
  94. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
  95. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
  96. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
  97. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  98. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
  99. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
  100. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
  101. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
  102. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
  103. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
  104. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
  105. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
  106. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
  107. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
  108. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
  109. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
  110. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
  111. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/num_child_spans.py +0 -0
  112. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/num_spans_per_trace.py +0 -0
  113. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
  114. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/prompt_version_sequence_number.py +0 -0
  115. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
  116. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/session_io.py +0 -0
  117. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/session_num_traces.py +0 -0
  118. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/session_num_traces_with_error.py +0 -0
  119. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/session_token_usages.py +0 -0
  120. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/session_trace_latency_ms_quantile.py +0 -0
  121. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
  122. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/span_by_id.py +0 -0
  123. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
  124. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
  125. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
  126. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/table_fields.py +0 -0
  127. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
  128. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/trace_by_trace_ids.py +0 -0
  129. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/trace_root_spans.py +0 -0
  130. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/user_roles.py +0 -0
  131. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/dataloaders/users.py +0 -0
  132. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/exceptions.py +0 -0
  133. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
  134. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
  135. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/experiment_run_filters.py +0 -0
  136. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/playground_clients.py +0 -0
  137. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/playground_registry.py +0 -0
  138. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/playground_spans.py +0 -0
  139. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/prompts/__init__.py +0 -0
  140. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/prompts/conversions/__init__.py +0 -0
  141. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/prompts/conversions/anthropic.py +0 -0
  142. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/prompts/conversions/openai.py +0 -0
  143. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/helpers/prompts/models.py +0 -0
  144. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
  145. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
  146. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/ChatCompletionInput.py +0 -0
  147. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/ChatCompletionMessageInput.py +0 -0
  148. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  149. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  150. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  151. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  152. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
  153. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
  154. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  155. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  156. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  157. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  158. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
  159. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
  160. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  161. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
  162. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  163. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  164. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/GenerativeModelInput.py +0 -0
  165. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  166. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/InvocationParameters.py +0 -0
  167. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
  168. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
  169. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  170. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  171. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/ProjectSessionSort.py +0 -0
  172. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/PromptTemplateOptions.py +0 -0
  173. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/PromptVersionInput.py +0 -0
  174. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  175. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  176. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  177. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  178. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
  179. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
  180. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/interceptor.py +0 -0
  181. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
  182. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/api_key_mutations.py +0 -0
  183. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/chat_mutations.py +0 -0
  184. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
  185. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
  186. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
  187. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
  188. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/prompt_label_mutations.py +0 -0
  189. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/prompt_mutations.py +0 -0
  190. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/prompt_version_tag_mutations.py +0 -0
  191. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
  192. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
  193. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/trace_mutations.py +0 -0
  194. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
  195. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
  196. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/openapi/main.py +0 -0
  197. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/openapi/schema.py +0 -0
  198. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/queries.py +0 -0
  199. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/__init__.py +0 -0
  200. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/auth.py +0 -0
  201. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/embeddings.py +0 -0
  202. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/oauth2.py +0 -0
  203. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/utils.py +0 -0
  204. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/__init__.py +0 -0
  205. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/datasets.py +0 -0
  206. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/evaluations.py +0 -0
  207. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
  208. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
  209. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/experiments.py +0 -0
  210. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/models.py +0 -0
  211. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/projects.py +0 -0
  212. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/prompts.py +0 -0
  213. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/spans.py +0 -0
  214. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/traces.py +0 -0
  215. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
  216. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/schema.py +0 -0
  217. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/subscriptions.py +0 -0
  218. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Annotation.py +0 -0
  219. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
  220. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
  221. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
  222. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/AuthMethod.py +0 -0
  223. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ChatCompletionMessageRole.py +0 -0
  224. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ChatCompletionSubscriptionPayload.py +0 -0
  225. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Cluster.py +0 -0
  226. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  227. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  228. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Dataset.py +0 -0
  229. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  230. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  231. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  232. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  233. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Dimension.py +0 -0
  234. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  235. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  236. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
  237. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  238. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  239. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  240. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  241. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  242. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
  243. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  244. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Event.py +0 -0
  245. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  246. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  247. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Experiment.py +0 -0
  248. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  249. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
  250. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  251. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  252. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  253. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Functionality.py +0 -0
  254. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/GenerativeModel.py +0 -0
  255. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/GenerativeProvider.py +0 -0
  256. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Identifier.py +0 -0
  257. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Inferences.py +0 -0
  258. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
  259. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  260. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/MimeType.py +0 -0
  261. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Model.py +0 -0
  262. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
  263. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  264. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Project.py +0 -0
  265. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ProjectSession.py +0 -0
  266. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Prompt.py +0 -0
  267. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/PromptLabel.py +0 -0
  268. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  269. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/PromptVersion.py +0 -0
  270. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/PromptVersionTag.py +0 -0
  271. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/PromptVersionTemplate.py +0 -0
  272. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ResponseFormat.py +0 -0
  273. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
  274. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  275. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Segments.py +0 -0
  276. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/SortDir.py +0 -0
  277. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Span.py +0 -0
  278. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
  279. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/SpanIOValue.py +0 -0
  280. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
  281. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  282. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/TokenUsage.py +0 -0
  283. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ToolDefinition.py +0 -0
  284. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/Trace.py +0 -0
  285. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
  286. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  287. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/User.py +0 -0
  288. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
  289. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/UserRole.py +0 -0
  290. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  291. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  292. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/__init__.py +0 -0
  293. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/node.py +0 -0
  294. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/types/pagination.py +0 -0
  295. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/api/utils.py +0 -0
  296. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/app.py +0 -0
  297. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/bearer_auth.py +0 -0
  298. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/dml_event.py +0 -0
  299. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/dml_event_handler.py +0 -0
  300. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/email/__init__.py +0 -0
  301. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/email/sender.py +0 -0
  302. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/email/templates/__init__.py +0 -0
  303. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/email/templates/password_reset.html +0 -0
  304. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/email/templates/welcome.html +0 -0
  305. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/email/types.py +0 -0
  306. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/jwt_store.py +0 -0
  307. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/middleware/__init__.py +0 -0
  308. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/middleware/gzip.py +0 -0
  309. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/oauth2.py +0 -0
  310. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/openapi/__init__.py +0 -0
  311. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/prometheus.py +0 -0
  312. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/rate_limiters.py +0 -0
  313. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/.vite/manifest.json +0 -0
  314. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  315. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  316. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  317. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  318. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  319. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  320. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  321. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  322. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/components-DepxScNF.js +0 -0
  323. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/index-DUj7q3Q4.js +0 -0
  324. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/pages-CJUakDKi.js +0 -0
  325. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/vendor-BfhM_F1u.js +0 -0
  326. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/vendor-Cg6lcjUC.css +0 -0
  327. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/vendor-arizeai-CxXYQNUl.js +0 -0
  328. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/vendor-codemirror-B0NIFPOL.js +0 -0
  329. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/vendor-recharts-CrrDFWK1.js +0 -0
  330. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/vendor-shiki-C5bJ-RPf.js +0 -0
  331. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/assets/vendor-three-C5WAXd5r.js +0 -0
  332. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/favicon.ico +0 -0
  333. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/static/modernizr.js +0 -0
  334. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/telemetry.py +0 -0
  335. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/templates/__init__.py +0 -0
  336. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/templates/index.html +0 -0
  337. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/thread_server.py +0 -0
  338. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/server/types.py +0 -0
  339. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/services.py +0 -0
  340. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/session/__init__.py +0 -0
  341. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/session/client.py +0 -0
  342. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/session/data_extractor.py +0 -0
  343. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/session/evaluation.py +0 -0
  344. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/session/session.py +0 -0
  345. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/settings.py +0 -0
  346. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/__init__.py +0 -0
  347. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/attributes.py +0 -0
  348. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/dsl/README.md +0 -0
  349. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/dsl/__init__.py +0 -0
  350. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/dsl/filter.py +0 -0
  351. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/dsl/helpers.py +0 -0
  352. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/dsl/query.py +0 -0
  353. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/errors.py +0 -0
  354. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
  355. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/exporter.py +0 -0
  356. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/fixtures.py +0 -0
  357. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/otel.py +0 -0
  358. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/projects.py +0 -0
  359. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/schemas.py +0 -0
  360. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/span_evaluations.py +0 -0
  361. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/span_json_decoder.py +0 -0
  362. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/span_json_encoder.py +0 -0
  363. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/trace_dataset.py +0 -0
  364. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/utils.py +0 -0
  365. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/v1/__init__.py +0 -0
  366. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  367. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  368. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/utilities/__init__.py +0 -0
  369. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/utilities/client.py +0 -0
  370. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/utilities/deprecation.py +0 -0
  371. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/utilities/error_handling.py +0 -0
  372. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/utilities/json.py +0 -0
  373. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/utilities/logging.py +0 -0
  374. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/utilities/project.py +0 -0
  375. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/utilities/re.py +0 -0
  376. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/utilities/span_store.py +0 -0
  377. {arize_phoenix-8.28.1 → arize_phoenix-8.29.0}/src/phoenix/utilities/template_formatters.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arize-phoenix
3
- Version: 8.28.1
3
+ Version: 8.29.0
4
4
  Summary: AI Observability and Evaluation
5
5
  Project-URL: Documentation, https://docs.arize.com/phoenix/
6
6
  Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
@@ -2,7 +2,7 @@ import logging
2
2
  import os
3
3
  import re
4
4
  import tempfile
5
- from dataclasses import dataclass
5
+ from dataclasses import dataclass, field
6
6
  from datetime import timedelta
7
7
  from enum import Enum
8
8
  from importlib.metadata import version
@@ -240,6 +240,243 @@ ENV_PHOENIX_FASTAPI_MIDDLEWARE_PATHS = "PHOENIX_FASTAPI_MIDDLEWARE_PATHS"
240
240
  ENV_PHOENIX_GQL_EXTENSION_PATHS = "PHOENIX_GQL_EXTENSION_PATHS"
241
241
  ENV_PHOENIX_GRPC_INTERCEPTOR_PATHS = "PHOENIX_GRPC_INTERCEPTOR_PATHS"
242
242
 
243
+ ENV_PHOENIX_TLS_ENABLED = "PHOENIX_TLS_ENABLED"
244
+ """
245
+ Whether to enable TLS for Phoenix HTTP and gRPC servers.
246
+ """
247
+ ENV_PHOENIX_TLS_CERT_FILE = "PHOENIX_TLS_CERT_FILE"
248
+ """
249
+ Path to the TLS certificate file for HTTPS connections.
250
+ When set, Phoenix will use HTTPS instead of HTTP for all connections.
251
+ """
252
+ ENV_PHOENIX_TLS_KEY_FILE = "PHOENIX_TLS_KEY_FILE"
253
+ """
254
+ Path to the TLS private key file for HTTPS connections.
255
+ Required when PHOENIX_TLS_CERT_FILE is set.
256
+ """
257
+ ENV_PHOENIX_TLS_KEY_FILE_PASSWORD = "PHOENIX_TLS_KEY_FILE_PASSWORD"
258
+ """
259
+ Password for the TLS private key file if it's encrypted.
260
+ Only needed if the private key file requires a password.
261
+ """
262
+ ENV_PHOENIX_TLS_CA_FILE = "PHOENIX_TLS_CA_FILE"
263
+ """
264
+ Path to the Certificate Authority (CA) file for client certificate verification.
265
+ Used when PHOENIX_TLS_VERIFY_CLIENT is set to true.
266
+ """
267
+ ENV_PHOENIX_TLS_VERIFY_CLIENT = "PHOENIX_TLS_VERIFY_CLIENT"
268
+ """
269
+ Whether to verify client certificates for mutual TLS (mTLS) authentication.
270
+ When set to true, clients must provide valid certificates signed by the CA specified in
271
+ PHOENIX_TLS_CA_FILE.
272
+ """
273
+
274
+
275
+ @dataclass(frozen=True)
276
+ class TLSConfig:
277
+ """Configuration for TLS (Transport Layer Security) connections.
278
+
279
+ This class manages TLS certificates and private keys for secure connections.
280
+ It handles reading certificate and key files, and decrypting private keys
281
+ if they are password-protected.
282
+
283
+ Attributes:
284
+ cert_file: Path to the TLS certificate file
285
+ key_file: Path to the TLS private key file
286
+ key_file_password: Optional password for decrypting the private key
287
+ _cert_data: Cached certificate data (internal use)
288
+ _key_data: Cached decrypted key data (internal use)
289
+ _decrypted_key_data: Cached decrypted key data (internal use)
290
+ """
291
+
292
+ cert_file: Path
293
+ key_file: Path
294
+ key_file_password: Optional[str]
295
+ _cert_data: bytes = field(default=b"", init=False, repr=False)
296
+ _key_data: bytes = field(default=b"", init=False, repr=False)
297
+ _decrypted_key_data: Optional[bytes] = field(default=None, init=False, repr=False)
298
+
299
+ @property
300
+ def cert_data(self) -> bytes:
301
+ """Get the certificate data, reading from file if not cached.
302
+
303
+ Returns:
304
+ bytes: The certificate data in PEM format
305
+ """
306
+ if not self._cert_data:
307
+ with open(self.cert_file, "rb") as f:
308
+ object.__setattr__(self, "_cert_data", f.read())
309
+ return self._cert_data
310
+
311
+ @property
312
+ def key_data(self) -> bytes:
313
+ """Get the decrypted key data, reading from file if not cached.
314
+
315
+ This property reads the private key file and decrypts it if a password
316
+ is provided. The decrypted key is cached for subsequent accesses.
317
+
318
+ Returns:
319
+ bytes: The decrypted private key data in PEM format
320
+
321
+ Raises:
322
+ ValueError: If the cryptography library is not installed or if
323
+ decryption fails
324
+ """
325
+ if not self._key_data:
326
+ self._read_and_cache_key_data()
327
+ return self._key_data
328
+
329
+ def _read_and_cache_key_data(self) -> None:
330
+ """Read and decrypt the private key file, then cache the result.
331
+
332
+ This method reads the private key file, decrypts it if a password
333
+ is provided, and stores the decrypted key in the _key_data attribute.
334
+
335
+ Raises:
336
+ ValueError: If the cryptography library is not installed or if
337
+ decryption fails
338
+ """
339
+ try:
340
+ from cryptography.hazmat.backends import default_backend
341
+ from cryptography.hazmat.primitives.serialization import (
342
+ Encoding,
343
+ NoEncryption,
344
+ PrivateFormat,
345
+ load_pem_private_key,
346
+ )
347
+ except ImportError:
348
+ raise ValueError(
349
+ "The cryptography library is needed to read private keys for "
350
+ "TLS configuration. Please install it with: pip install cryptography"
351
+ )
352
+
353
+ # First read the key file
354
+ with open(self.key_file, "rb") as f:
355
+ key_data = f.read()
356
+
357
+ try:
358
+ # Convert password to bytes if it exists
359
+ password_bytes = self.key_file_password.encode() if self.key_file_password else None
360
+
361
+ # Load the key (decrypting if password is provided)
362
+ private_key = load_pem_private_key(
363
+ key_data,
364
+ password=password_bytes,
365
+ backend=default_backend(),
366
+ )
367
+
368
+ # Convert to PEM format without encryption
369
+ decrypted_pem = private_key.private_bytes(
370
+ encoding=Encoding.PEM,
371
+ format=PrivateFormat.PKCS8,
372
+ encryption_algorithm=NoEncryption(),
373
+ )
374
+ except Exception as e:
375
+ raise ValueError(f"Failed to decrypt private key: {e}")
376
+ object.__setattr__(self, "_key_data", decrypted_pem)
377
+
378
+
379
+ @dataclass(frozen=True)
380
+ class TLSConfigVerifyClient(TLSConfig):
381
+ """TLS configuration with client verification enabled."""
382
+
383
+ ca_file: Path
384
+ _ca_data: bytes = field(default=b"", init=False, repr=False)
385
+
386
+ @property
387
+ def ca_data(self) -> bytes:
388
+ """Get the CA certificate data, reading from file if not cached."""
389
+ if not self._ca_data:
390
+ with open(self.ca_file, "rb") as f:
391
+ object.__setattr__(self, "_ca_data", f.read())
392
+ return self._ca_data
393
+
394
+
395
+ def get_env_tls_enabled() -> bool:
396
+ """
397
+ Gets the value of the PHOENIX_TLS_ENABLED environment variable.
398
+
399
+ Returns:
400
+ bool: True if TLS is enabled, False otherwise. Defaults to False if the environment
401
+ variable is not set.
402
+ """ # noqa: E501
403
+ return _bool_val(ENV_PHOENIX_TLS_ENABLED, False)
404
+
405
+
406
+ def get_env_tls_verify_client() -> bool:
407
+ """
408
+ Gets the value of the PHOENIX_TLS_VERIFY_CLIENT environment variable.
409
+
410
+ Returns:
411
+ bool: True if client certificate verification is enabled, False otherwise. Defaults to False
412
+ if the environment variable is not set.
413
+ """ # noqa: E501
414
+ return _bool_val(ENV_PHOENIX_TLS_VERIFY_CLIENT, False)
415
+
416
+
417
+ def get_env_tls_config() -> Optional[TLSConfig]:
418
+ """
419
+ Retrieves and validates TLS configuration from environment variables.
420
+
421
+ Returns:
422
+ Optional[TLSConfig]: A configuration object containing TLS settings, or None if TLS is disabled.
423
+ If client verification is enabled, returns TLSConfigVerifyClient instead.
424
+
425
+ The function reads the following environment variables:
426
+ - PHOENIX_TLS_ENABLED: Whether TLS is enabled (defaults to False)
427
+ - PHOENIX_TLS_CERT_FILE: Path to the TLS certificate file
428
+ - PHOENIX_TLS_KEY_FILE: Path to the TLS private key file
429
+ - PHOENIX_TLS_KEY_FILE_PASSWORD: Password for the TLS private key file
430
+ - PHOENIX_TLS_CA_FILE: Path to the Certificate Authority file (required for client verification)
431
+ - PHOENIX_TLS_VERIFY_CLIENT: Whether to verify client certificates
432
+
433
+ Raises:
434
+ ValueError: If required files are missing or don't exist when TLS is enabled
435
+ """ # noqa: E501
436
+ # Check if TLS is enabled
437
+ if not get_env_tls_enabled():
438
+ return None
439
+
440
+ # Get certificate file path if specified
441
+ if not (cert_file_str := getenv(ENV_PHOENIX_TLS_CERT_FILE)):
442
+ raise ValueError("PHOENIX_TLS_CERT_FILE must be set when PHOENIX_TLS_ENABLED is true")
443
+ cert_file = Path(cert_file_str)
444
+
445
+ # Get private key file path if specified
446
+ if not (key_file_str := getenv(ENV_PHOENIX_TLS_KEY_FILE)):
447
+ raise ValueError("PHOENIX_TLS_KEY_FILE must be set when PHOENIX_TLS_ENABLED is true")
448
+ key_file = Path(key_file_str)
449
+
450
+ # Get private key password if specified
451
+ key_file_password = getenv(ENV_PHOENIX_TLS_KEY_FILE_PASSWORD)
452
+
453
+ # Validate certificate and key files
454
+ _validate_file_exists_and_is_readable(cert_file, "certificate")
455
+ _validate_file_exists_and_is_readable(key_file, "key")
456
+
457
+ # If client verification is enabled, validate CA file and return TLSConfigVerifyClient
458
+ if get_env_tls_verify_client():
459
+ if not (ca_file_str := getenv(ENV_PHOENIX_TLS_CA_FILE)):
460
+ raise ValueError(
461
+ "PHOENIX_TLS_CA_FILE must be set when PHOENIX_TLS_VERIFY_CLIENT is true"
462
+ )
463
+
464
+ ca_file = Path(ca_file_str)
465
+ _validate_file_exists_and_is_readable(ca_file, "CA")
466
+
467
+ return TLSConfigVerifyClient(
468
+ cert_file=cert_file,
469
+ key_file=key_file,
470
+ key_file_password=key_file_password,
471
+ ca_file=ca_file,
472
+ )
473
+
474
+ return TLSConfig(
475
+ cert_file=cert_file,
476
+ key_file=key_file,
477
+ key_file_password=key_file_password,
478
+ )
479
+
243
480
 
244
481
  def server_instrumentation_is_enabled() -> bool:
245
482
  return bool(
@@ -956,7 +1193,8 @@ def get_env_root_url() -> URL:
956
1193
  host = get_env_host()
957
1194
  if host == "0.0.0.0":
958
1195
  host = "127.0.0.1"
959
- return URL(urljoin(f"http://{host}:{get_env_port()}", get_env_host_root_path()))
1196
+ scheme = "https" if get_env_tls_enabled() else "http"
1197
+ return URL(urljoin(f"{scheme}://{host}:{get_env_port()}", get_env_host_root_path()))
960
1198
 
961
1199
 
962
1200
  def get_base_url() -> str:
@@ -964,7 +1202,8 @@ def get_base_url() -> str:
964
1202
  host = get_env_host()
965
1203
  if host == "0.0.0.0":
966
1204
  host = "127.0.0.1"
967
- base_url = get_env_collector_endpoint() or f"http://{host}:{get_env_port()}"
1205
+ scheme = "https" if get_env_tls_enabled() else "http"
1206
+ base_url = get_env_collector_endpoint() or f"{scheme}://{host}:{get_env_port()}"
968
1207
  return base_url if base_url.endswith("/") else base_url + "/"
969
1208
 
970
1209
 
@@ -1159,3 +1398,30 @@ When the PHOENIX_ADMIN_SECRET is used as a bearer token in API requests, the
1159
1398
  request is authenticated as the system user with the user_id set to this
1160
1399
  SYSTEM_USER_ID value (only if this variable is not None).
1161
1400
  """
1401
+
1402
+
1403
+ def _validate_file_exists_and_is_readable(
1404
+ file_path: Path,
1405
+ description: str,
1406
+ check_non_empty: bool = True,
1407
+ ) -> None:
1408
+ """
1409
+ Validate that a file exists, is readable, and optionally has non-zero size.
1410
+
1411
+ Args:
1412
+ file_path: Path to the file to validate
1413
+ description: Description of the file for error messages (e.g., "certificate", "key", "CA")
1414
+ check_non_empty: Whether to check if the file has non-zero size. Defaults to True.
1415
+
1416
+ Raises:
1417
+ ValueError: If the path is not a file, isn't readable, or has zero size (if check_non_empty is True)
1418
+ """ # noqa: E501
1419
+ if not file_path.is_file():
1420
+ raise ValueError(f"{description} path is not a file: {file_path}")
1421
+ if check_non_empty and file_path.stat().st_size == 0:
1422
+ raise ValueError(f"{description} file is empty: {file_path}")
1423
+ try:
1424
+ with open(file_path, "rb") as f:
1425
+ f.read(1) # Read just one byte to verify readability
1426
+ except Exception as e:
1427
+ raise ValueError(f"{description} file is not readable: {e}")
@@ -14,7 +14,11 @@ from opentelemetry.proto.collector.trace.v1.trace_service_pb2_grpc import (
14
14
  from typing_extensions import TypeAlias
15
15
 
16
16
  from phoenix.auth import CanReadToken
17
- from phoenix.config import get_env_grpc_port
17
+ from phoenix.config import (
18
+ TLSConfigVerifyClient,
19
+ get_env_grpc_port,
20
+ get_env_tls_config,
21
+ )
18
22
  from phoenix.server.bearer_auth import ApiKeyInterceptor
19
23
  from phoenix.trace.otel import decode_otlp_span
20
24
  from phoenix.trace.schemas import Span
@@ -86,7 +90,20 @@ class GrpcServer:
86
90
  options=(("grpc.so_reuseport", 0),),
87
91
  interceptors=interceptors,
88
92
  )
89
- server.add_insecure_port(f"[::]:{get_env_grpc_port()}")
93
+ if tls_config := get_env_tls_config():
94
+ private_key_certificate_chain_pairs = [(tls_config.key_data, tls_config.cert_data)]
95
+ server_credentials = (
96
+ grpc.ssl_server_credentials(
97
+ private_key_certificate_chain_pairs,
98
+ root_certificates=tls_config.ca_data,
99
+ require_client_auth=True,
100
+ )
101
+ if isinstance(tls_config, TLSConfigVerifyClient)
102
+ else grpc.ssl_server_credentials(private_key_certificate_chain_pairs)
103
+ )
104
+ server.add_secure_port(f"[::]:{get_env_grpc_port()}", server_credentials)
105
+ else:
106
+ server.add_insecure_port(f"[::]:{get_env_grpc_port()}")
90
107
  add_TraceServiceServicer_to_server(Servicer(self._callback), server) # type: ignore[no-untyped-call,unused-ignore]
91
108
  await server.start()
92
109
  self._server = server
@@ -4,6 +4,7 @@ import os
4
4
  import sys
5
5
  from argparse import SUPPRESS, ArgumentParser
6
6
  from pathlib import Path
7
+ from ssl import CERT_REQUIRED
7
8
  from threading import Thread
8
9
  from time import sleep, time
9
10
  from typing import Optional
@@ -15,6 +16,7 @@ from uvicorn import Config, Server
15
16
  import phoenix.trace.v1 as pb
16
17
  from phoenix.config import (
17
18
  EXPORT_DIR,
19
+ TLSConfigVerifyClient,
18
20
  get_env_access_token_expiry,
19
21
  get_env_allowed_origins,
20
22
  get_env_auth_settings,
@@ -39,6 +41,7 @@ from phoenix.config import (
39
41
  get_env_smtp_port,
40
42
  get_env_smtp_username,
41
43
  get_env_smtp_validate_certs,
44
+ get_env_tls_config,
42
45
  get_pids_path,
43
46
  )
44
47
  from phoenix.core.model_schema_adapter import create_model_from_inferences
@@ -98,15 +101,22 @@ _WELCOME_MESSAGE = Environment(loader=BaseLoader()).from_string("""
98
101
  | 🚀 Phoenix Server 🚀
99
102
  | Phoenix UI: {{ ui_path }}
100
103
  | Authentication: {{ auth_enabled }}
101
- | Websockets: {{ websockets_enabled }}
102
- {%- if allowed_origins %}\n| Allowed Origins: {{ allowed_origins }}{% endif %}
104
+ {%- if tls_enabled %}
105
+ | TLS: Enabled
106
+ {%- if tls_verify_client %}
107
+ | TLS Client Verification: Enabled
108
+ {%- endif %}
109
+ {%- endif %}
110
+ {%- if allowed_origins %}
111
+ | Allowed Origins: {{ allowed_origins }}
112
+ {%- endif %}
103
113
  | Log traces:
104
114
  | - gRPC: {{ grpc_path }}
105
115
  | - HTTP: {{ http_path }}
106
116
  | Storage: {{ storage }}
107
- {% if schema -%}
117
+ {%- if schema %}
108
118
  | - Schema: {{ schema }}
109
- {% endif -%}
119
+ {%- endif %}
110
120
  """)
111
121
 
112
122
 
@@ -356,16 +366,24 @@ def main() -> None:
356
366
 
357
367
  allowed_origins = get_env_allowed_origins()
358
368
 
369
+ # Get TLS configuration
370
+ tls_config = get_env_tls_config()
371
+ tls_enabled = tls_config is not None
372
+ tls_verify_client = tls_enabled and isinstance(tls_config, TLSConfigVerifyClient)
373
+
359
374
  # Print information about the server
360
- root_path = urljoin(f"http://{host}:{port}", host_root_path)
375
+ scheme = "https" if tls_enabled else "http"
376
+ root_path = urljoin(f"{scheme}://{host}:{port}", host_root_path)
361
377
  msg = _WELCOME_MESSAGE.render(
362
378
  version=phoenix_version,
363
379
  ui_path=root_path,
364
- grpc_path=f"http://{host}:{get_env_grpc_port()}",
380
+ grpc_path=f"{scheme}://{host}:{get_env_grpc_port()}",
365
381
  http_path=urljoin(root_path, "v1/traces"),
366
382
  storage=get_printable_db_url(db_connection_str),
367
383
  schema=get_env_database_schema(),
368
384
  auth_enabled=authentication_enabled,
385
+ tls_enabled=tls_enabled,
386
+ tls_verify_client=tls_verify_client,
369
387
  allowed_origins=allowed_origins,
370
388
  )
371
389
  if sys.platform.startswith("win"):
@@ -417,7 +435,27 @@ def main() -> None:
417
435
  oauth2_client_configs=get_env_oauth2_settings(),
418
436
  allowed_origins=allowed_origins,
419
437
  )
420
- server = Server(config=Config(app, host=host, port=port, root_path=host_root_path)) # type: ignore
438
+
439
+ # Configure server with TLS if enabled
440
+ server_config = Config(
441
+ app=app,
442
+ host=host, # type: ignore[arg-type]
443
+ port=port,
444
+ root_path=host_root_path,
445
+ )
446
+
447
+ if tls_config:
448
+ # Configure SSL context with certificate and key
449
+ server_config.ssl_keyfile = str(tls_config.key_file)
450
+ server_config.ssl_keyfile_password = tls_config.key_file_password
451
+ server_config.ssl_certfile = str(tls_config.cert_file)
452
+
453
+ # If CA file is provided and client verification is enabled
454
+ if isinstance(tls_config, TLSConfigVerifyClient):
455
+ server_config.ssl_ca_certs = str(tls_config.ca_file)
456
+ server_config.ssl_cert_reqs = CERT_REQUIRED
457
+
458
+ server = Server(config=server_config)
421
459
  Thread(target=_write_pid_file_when_ready, args=(server,), daemon=True).start()
422
460
 
423
461
  try:
@@ -0,0 +1 @@
1
+ __version__ = "8.29.0"
@@ -1 +0,0 @@
1
- __version__ = "8.28.1"
File without changes
File without changes
File without changes