arize-phoenix 4.35.2__tar.gz → 4.36.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 (317) hide show
  1. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/PKG-INFO +1 -1
  2. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/pyproject.toml +22 -19
  3. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/config.py +92 -2
  4. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/alembic.ini +0 -34
  5. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/engines.py +27 -10
  6. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/insertion/dataset.py +0 -1
  7. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/insertion/types.py +1 -1
  8. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/migrate.py +3 -3
  9. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/migrations/env.py +0 -7
  10. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/inferences/fixtures.py +0 -1
  11. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/inferences/inferences.py +0 -1
  12. arize_phoenix-4.36.0/src/phoenix/logging/__init__.py +3 -0
  13. arize_phoenix-4.36.0/src/phoenix/logging/_config.py +90 -0
  14. arize_phoenix-4.36.0/src/phoenix/logging/_filter.py +6 -0
  15. arize_phoenix-4.36.0/src/phoenix/logging/_formatter.py +69 -0
  16. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/metrics/__init__.py +0 -1
  17. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/routers/v1/datasets.py +0 -1
  18. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/app.py +2 -3
  19. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/main.py +21 -21
  20. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/telemetry.py +2 -2
  21. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/services.py +0 -1
  22. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/session/client.py +0 -1
  23. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/session/evaluation.py +0 -1
  24. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/session/session.py +0 -1
  25. arize_phoenix-4.36.0/src/phoenix/settings.py +22 -0
  26. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/exporter.py +0 -1
  27. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/fixtures.py +0 -2
  28. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/langchain/instrumentor.py +0 -1
  29. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/llama_index/callback.py +0 -1
  30. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/openai/instrumentor.py +0 -1
  31. arize_phoenix-4.36.0/src/phoenix/utilities/logging.py +18 -0
  32. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/utilities/re.py +3 -3
  33. arize_phoenix-4.36.0/src/phoenix/version.py +1 -0
  34. arize_phoenix-4.35.2/src/phoenix/settings.py +0 -13
  35. arize_phoenix-4.35.2/src/phoenix/utilities/logging.py +0 -10
  36. arize_phoenix-4.35.2/src/phoenix/version.py +0 -1
  37. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/.gitignore +0 -0
  38. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/IP_NOTICE +0 -0
  39. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/LICENSE +0 -0
  40. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/README.md +0 -0
  41. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/examples/manually-instrumented-chatbot/chat-service/chat/__init__.py +0 -0
  42. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/examples/manually-instrumented-chatbot/chat-service/chat/app.py +0 -0
  43. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/examples/manually-instrumented-chatbot/chat-service/chat/types.py +0 -0
  44. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/examples/manually-instrumented-chatbot/frontend/Dockerfile +0 -0
  45. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/examples/manually-instrumented-chatbot/frontend/Makefile +0 -0
  46. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/examples/manually-instrumented-chatbot/frontend/__init__.py +0 -0
  47. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/examples/manually-instrumented-chatbot/frontend/pyproject.toml +0 -0
  48. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/examples/manually-instrumented-chatbot/frontend/requirements.txt +0 -0
  49. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/examples/manually-instrumented-chatbot/frontend/schema.json +0 -0
  50. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/__init__.py +0 -0
  51. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/auth.py +0 -0
  52. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/core/__init__.py +0 -0
  53. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/core/embedding_dimension.py +0 -0
  54. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/core/model.py +0 -0
  55. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/core/model_schema.py +0 -0
  56. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/core/model_schema_adapter.py +0 -0
  57. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/datetime_utils.py +0 -0
  58. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/README.md +0 -0
  59. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/__init__.py +0 -0
  60. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/bulk_inserter.py +0 -0
  61. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/helpers.py +0 -0
  62. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/insertion/__init__.py +0 -0
  63. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/insertion/constants.py +0 -0
  64. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/insertion/document_annotation.py +0 -0
  65. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/insertion/evaluation.py +0 -0
  66. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/insertion/helpers.py +0 -0
  67. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/insertion/span.py +0 -0
  68. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/insertion/span_annotation.py +0 -0
  69. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/insertion/trace_annotation.py +0 -0
  70. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/migrations/__init__.py +0 -0
  71. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/migrations/future_versions/README.md +0 -0
  72. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/migrations/future_versions/cd164e83824f_users_and_tokens.py +0 -0
  73. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/migrations/script.py.mako +0 -0
  74. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/migrations/versions/.gitignore +0 -0
  75. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/migrations/versions/10460e46d750_datasets.py +0 -0
  76. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +0 -0
  77. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/migrations/versions/cf03bd6bae1d_init.py +0 -0
  78. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/db/models.py +0 -0
  79. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/exceptions.py +0 -0
  80. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/experiments/__init__.py +0 -0
  81. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/experiments/evaluators/__init__.py +0 -0
  82. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/experiments/evaluators/base.py +0 -0
  83. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/experiments/evaluators/code_evaluators.py +0 -0
  84. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/experiments/evaluators/llm_evaluators.py +0 -0
  85. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/experiments/evaluators/utils.py +0 -0
  86. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/experiments/functions.py +0 -0
  87. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/experiments/tracing.py +0 -0
  88. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/experiments/types.py +0 -0
  89. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/experiments/utils.py +0 -0
  90. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/inferences/__init__.py +0 -0
  91. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/inferences/errors.py +0 -0
  92. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/inferences/schema.py +0 -0
  93. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/inferences/validation.py +0 -0
  94. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/metrics/README.md +0 -0
  95. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/metrics/binning.py +0 -0
  96. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/metrics/metrics.py +0 -0
  97. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/metrics/mixins.py +0 -0
  98. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/metrics/retrieval_metrics.py +0 -0
  99. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/metrics/timeseries.py +0 -0
  100. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/metrics/wrappers.py +0 -0
  101. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/pointcloud/__init__.py +0 -0
  102. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/pointcloud/clustering.py +0 -0
  103. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/pointcloud/pointcloud.py +0 -0
  104. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/pointcloud/projectors.py +0 -0
  105. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/pointcloud/umap_parameters.py +0 -0
  106. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/py.typed +0 -0
  107. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/__init__.py +0 -0
  108. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/__init__.py +0 -0
  109. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/context.py +0 -0
  110. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/__init__.py +0 -0
  111. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/annotation_summaries.py +0 -0
  112. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/average_experiment_run_latency.py +0 -0
  113. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/cache/__init__.py +0 -0
  114. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/cache/two_tier_cache.py +0 -0
  115. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/dataset_example_revisions.py +0 -0
  116. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/dataset_example_spans.py +0 -0
  117. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/document_evaluation_summaries.py +0 -0
  118. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/document_evaluations.py +0 -0
  119. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/document_retrieval_metrics.py +0 -0
  120. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/experiment_annotation_summaries.py +0 -0
  121. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/experiment_error_rates.py +0 -0
  122. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/experiment_run_annotations.py +0 -0
  123. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/experiment_run_counts.py +0 -0
  124. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/experiment_sequence_number.py +0 -0
  125. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/latency_ms_quantile.py +0 -0
  126. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/min_start_or_max_end_times.py +0 -0
  127. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/project_by_name.py +0 -0
  128. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/record_counts.py +0 -0
  129. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/span_annotations.py +0 -0
  130. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/span_dataset_examples.py +0 -0
  131. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/span_descendants.py +0 -0
  132. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/span_projects.py +0 -0
  133. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/token_counts.py +0 -0
  134. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/dataloaders/trace_row_ids.py +0 -0
  135. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/exceptions.py +0 -0
  136. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/helpers/__init__.py +0 -0
  137. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/helpers/dataset_helpers.py +0 -0
  138. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/AddExamplesToDatasetInput.py +0 -0
  139. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/AddSpansToDatasetInput.py +0 -0
  140. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/ClearProjectInput.py +0 -0
  141. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  142. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  143. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/CreateDatasetInput.py +0 -0
  144. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/CreateSpanAnnotationInput.py +0 -0
  145. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/CreateTraceAnnotationInput.py +0 -0
  146. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  147. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/DatasetExampleInput.py +0 -0
  148. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/DatasetSort.py +0 -0
  149. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/DatasetVersionSort.py +0 -0
  150. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/DeleteAnnotationsInput.py +0 -0
  151. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/DeleteDatasetExamplesInput.py +0 -0
  152. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/DeleteDatasetInput.py +0 -0
  153. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/DeleteExperimentsInput.py +0 -0
  154. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  155. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  156. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  157. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/PatchAnnotationInput.py +0 -0
  158. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/PatchDatasetExamplesInput.py +0 -0
  159. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/PatchDatasetInput.py +0 -0
  160. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  161. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/SpanAnnotationSort.py +0 -0
  162. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  163. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  164. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/TraceAnnotationSort.py +0 -0
  165. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/UserRoleInput.py +0 -0
  166. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/input_types/__init__.py +0 -0
  167. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/interceptor.py +0 -0
  168. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/mutations/__init__.py +0 -0
  169. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/mutations/api_key_mutations.py +0 -0
  170. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/mutations/auth.py +0 -0
  171. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/mutations/auth_mutations.py +0 -0
  172. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/mutations/dataset_mutations.py +0 -0
  173. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/mutations/experiment_mutations.py +0 -0
  174. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/mutations/export_events_mutations.py +0 -0
  175. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/mutations/project_mutations.py +0 -0
  176. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/mutations/span_annotations_mutations.py +0 -0
  177. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/mutations/trace_annotations_mutations.py +0 -0
  178. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/mutations/user_mutations.py +0 -0
  179. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/openapi/__init__.py +0 -0
  180. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/openapi/main.py +0 -0
  181. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/openapi/schema.py +0 -0
  182. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/queries.py +0 -0
  183. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/routers/__init__.py +0 -0
  184. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/routers/utils.py +0 -0
  185. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/routers/v1/__init__.py +0 -0
  186. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/routers/v1/evaluations.py +0 -0
  187. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/routers/v1/experiment_evaluations.py +0 -0
  188. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/routers/v1/experiment_runs.py +0 -0
  189. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/routers/v1/experiments.py +0 -0
  190. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/routers/v1/pydantic_compat.py +0 -0
  191. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/routers/v1/spans.py +0 -0
  192. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/routers/v1/traces.py +0 -0
  193. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/routers/v1/utils.py +0 -0
  194. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/schema.py +0 -0
  195. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/Annotation.py +0 -0
  196. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/AnnotationSummary.py +0 -0
  197. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/AnnotatorKind.py +0 -0
  198. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/ApiKey.py +0 -0
  199. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/Cluster.py +0 -0
  200. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/CreateDatasetPayload.py +0 -0
  201. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/DataQualityMetric.py +0 -0
  202. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/Dataset.py +0 -0
  203. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/DatasetExample.py +0 -0
  204. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/DatasetExampleRevision.py +0 -0
  205. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  206. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/DatasetVersion.py +0 -0
  207. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/Dimension.py +0 -0
  208. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  209. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  210. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/DimensionType.py +0 -0
  211. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  212. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/DocumentEvaluationSummary.py +0 -0
  213. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/DocumentRetrievalMetrics.py +0 -0
  214. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  215. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  216. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/Evaluation.py +0 -0
  217. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/EvaluationSummary.py +0 -0
  218. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/Event.py +0 -0
  219. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  220. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/ExampleRevisionInterface.py +0 -0
  221. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/Experiment.py +0 -0
  222. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/ExperimentAnnotationSummary.py +0 -0
  223. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/ExperimentComparison.py +0 -0
  224. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/ExperimentRun.py +0 -0
  225. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/ExperimentRunAnnotation.py +0 -0
  226. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  227. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/Functionality.py +0 -0
  228. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/Inferences.py +0 -0
  229. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/InferencesRole.py +0 -0
  230. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/LabelFraction.py +0 -0
  231. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/MimeType.py +0 -0
  232. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/Model.py +0 -0
  233. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/NumericRange.py +0 -0
  234. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  235. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/Project.py +0 -0
  236. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  237. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/Retrieval.py +0 -0
  238. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  239. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/Segments.py +0 -0
  240. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/SortDir.py +0 -0
  241. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/Span.py +0 -0
  242. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/SpanAnnotation.py +0 -0
  243. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/SystemApiKey.py +0 -0
  244. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/TimeSeries.py +0 -0
  245. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/Trace.py +0 -0
  246. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/TraceAnnotation.py +0 -0
  247. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  248. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/User.py +0 -0
  249. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/UserApiKey.py +0 -0
  250. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/UserRole.py +0 -0
  251. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/ValidationResult.py +0 -0
  252. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  253. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/__init__.py +0 -0
  254. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/node.py +0 -0
  255. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/types/pagination.py +0 -0
  256. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/api/utils.py +0 -0
  257. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/dml_event.py +0 -0
  258. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/dml_event_handler.py +0 -0
  259. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/grpc_server.py +0 -0
  260. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/openapi/__init__.py +0 -0
  261. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/prometheus.py +0 -0
  262. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/.vite/manifest.json +0 -0
  263. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  264. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  265. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  266. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  267. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  268. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  269. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  270. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  271. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/assets/components-Dte7_KRd.js +0 -0
  272. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/assets/index-fq1-hCK4.js +0 -0
  273. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/assets/pages-CnTvEGEN.js +0 -0
  274. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/assets/vendor-BC3OPQuM.js +0 -0
  275. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/assets/vendor-DxkFTwjz.css +0 -0
  276. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/assets/vendor-arizeai-NjB3cZzD.js +0 -0
  277. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/assets/vendor-codemirror-gE_JCOgX.js +0 -0
  278. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/assets/vendor-recharts-BXLYwcXF.js +0 -0
  279. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/assets/vendor-three-DwGkEfCM.js +0 -0
  280. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/favicon.ico +0 -0
  281. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/static/modernizr.js +0 -0
  282. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/templates/__init__.py +0 -0
  283. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/templates/index.html +0 -0
  284. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/thread_server.py +0 -0
  285. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/server/types.py +0 -0
  286. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/session/__init__.py +0 -0
  287. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/session/data_extractor.py +0 -0
  288. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/__init__.py +0 -0
  289. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/attributes.py +0 -0
  290. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/dsl/README.md +0 -0
  291. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/dsl/__init__.py +0 -0
  292. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/dsl/filter.py +0 -0
  293. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/dsl/helpers.py +0 -0
  294. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/dsl/query.py +0 -0
  295. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/errors.py +0 -0
  296. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/evaluation_conventions.py +0 -0
  297. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/langchain/__init__.py +0 -0
  298. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/llama_index/__init__.py +0 -0
  299. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/openai/__init__.py +0 -0
  300. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/otel.py +0 -0
  301. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/projects.py +0 -0
  302. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/schemas.py +0 -0
  303. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/span_evaluations.py +0 -0
  304. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/span_json_decoder.py +0 -0
  305. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/span_json_encoder.py +0 -0
  306. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/trace_dataset.py +0 -0
  307. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/utils.py +0 -0
  308. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/v1/__init__.py +0 -0
  309. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/v1/evaluation_pb2.py +0 -0
  310. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/trace/v1/evaluation_pb2.pyi +0 -0
  311. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/utilities/__init__.py +0 -0
  312. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/utilities/client.py +0 -0
  313. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/utilities/deprecation.py +0 -0
  314. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/utilities/error_handling.py +0 -0
  315. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/utilities/json.py +0 -0
  316. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/utilities/project.py +0 -0
  317. {arize_phoenix-4.35.2 → arize_phoenix-4.36.0}/src/phoenix/utilities/span_store.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arize-phoenix
3
- Version: 4.35.2
3
+ Version: 4.36.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
@@ -191,33 +191,35 @@ dependencies = [
191
191
 
192
192
  [tool.hatch.envs.type]
193
193
  dependencies = [
194
+ "grpcio",
195
+ "litellm>=1.0.3",
194
196
  "mypy==1.11.2",
195
- "tenacity",
196
- "pandas>=1.0",
197
- "pandas-stubs==2.0.3.230814",
198
- "types-tabulate",
199
- "types-psutil",
200
- "types-tqdm",
201
- "types-protobuf",
202
- "types-setuptools",
203
- "types-cachetools",
204
197
  "openai>=1.0.0",
205
- "litellm>=1.0.3",
206
- "prometheus_client",
207
- "grpcio",
208
- "opentelemetry-sdk",
209
- "opentelemetry-proto>=1.12.0",
210
198
  "opentelemetry-exporter-otlp",
211
- "opentelemetry-semantic-conventions",
212
199
  "opentelemetry-instrumentation-fastapi",
213
- "opentelemetry-instrumentation-sqlalchemy",
214
200
  "opentelemetry-instrumentation-grpc",
201
+ "opentelemetry-instrumentation-sqlalchemy",
202
+ "opentelemetry-proto>=1.12.0",
203
+ "opentelemetry-sdk",
204
+ "opentelemetry-semantic-conventions",
205
+ "pandas-stubs==2.0.3.230814",
206
+ "pandas>=1.0",
207
+ "prometheus_client",
215
208
  "py-grpc-prometheus",
216
- "strawberry-graphql[opentelemetry]==0.236.0", # need to pin version because we're monkey-patching
217
- "requests", # this is needed to type-check third-party packages
218
209
  "pydantic==1.10.17; python_version=='3.8'", # lower minor versions of pydantic break strawberry mypy plugin
219
210
  "pydantic==1.10.17; python_version=='3.9'", # lower minor versions of pydantic break strawberry mypy plugin
220
211
  "pydantic==2.8.2; python_version=='3.12'",
212
+ "pypistats", # this is needed to type-check third-party packages
213
+ "requests", # this is needed to type-check third-party packages
214
+ "strawberry-graphql[opentelemetry]==0.236.0", # need to pin version because we're monkey-patching
215
+ "tenacity",
216
+ "types-cachetools",
217
+ "types-protobuf",
218
+ "types-psutil",
219
+ "types-requests",
220
+ "types-setuptools",
221
+ "types-tabulate",
222
+ "types-tqdm",
221
223
  ]
222
224
 
223
225
  [[tool.hatch.envs.type.matrix]]
@@ -389,7 +391,7 @@ exclude = [
389
391
  "sdist/",
390
392
  "tests/",
391
393
  "tutorials/",
392
- "examples/manually-instrumented-chatbot/"
394
+ "examples/manually-instrumented-chatbot/",
393
395
  ]
394
396
 
395
397
  [[tool.mypy.overrides]]
@@ -411,6 +413,7 @@ module = [
411
413
  "grpc.*",
412
414
  "py_grpc_prometheus.*",
413
415
  "orjson", # suppress fastapi internal type errors
416
+ "pypistats",
414
417
  ]
415
418
  ignore_missing_imports = true
416
419
 
@@ -1,13 +1,16 @@
1
+ import logging
1
2
  import os
2
3
  import re
3
4
  import tempfile
4
- from logging import getLogger
5
+ from enum import Enum
5
6
  from pathlib import Path
6
7
  from typing import Dict, List, Optional, Tuple
7
8
 
9
+ from phoenix.utilities.logging import log_a_list
10
+
8
11
  from .utilities.re import parse_env_headers
9
12
 
10
- logger = getLogger(__name__)
13
+ logger = logging.getLogger(__name__)
11
14
 
12
15
  # Phoenix environment variables
13
16
  ENV_PHOENIX_PORT = "PHOENIX_PORT"
@@ -56,6 +59,24 @@ ENV_PHOENIX_ENABLE_PROMETHEUS = "PHOENIX_ENABLE_PROMETHEUS"
56
59
  """
57
60
  Whether to enable Prometheus. Defaults to false.
58
61
  """
62
+ ENV_LOGGING_MODE = "PHOENIX_LOGGING_MODE"
63
+ """
64
+ The logging mode (either 'default' or 'structured').
65
+ """
66
+ ENV_LOGGING_LEVEL = "PHOENIX_LOGGING_LEVEL"
67
+ """
68
+ The logging level ('debug', 'info', 'warning', 'error', 'critical') for the Phoenix backend. For
69
+ database logging see ENV_DB_LOGGING_LEVEL. Defaults to info.
70
+ """
71
+ ENV_DB_LOGGING_LEVEL = "PHOENIX_DB_LOGGING_LEVEL"
72
+ """
73
+ The logging level ('debug', 'info', 'warning', 'error', 'critical') for the Phoenix ORM.
74
+ Defaults to warning.
75
+ """
76
+ ENV_LOG_MIGRATIONS = "PHOENIX_LOG_MIGRATIONS"
77
+ """
78
+ Whether or not to log migrations. Defaults to true.
79
+ """
59
80
 
60
81
  # Phoenix server OpenTelemetry instrumentation environment variables
61
82
  ENV_PHOENIX_SERVER_INSTRUMENTATION_OTLP_TRACE_COLLECTOR_HTTP_ENDPOINT = (
@@ -331,5 +352,74 @@ def get_web_base_url() -> str:
331
352
  return get_base_url()
332
353
 
333
354
 
355
+ class LoggingMode(Enum):
356
+ DEFAULT = "default"
357
+ STRUCTURED = "structured"
358
+
359
+
360
+ def get_env_logging_mode() -> LoggingMode:
361
+ if (logging_mode := os.getenv(ENV_LOGGING_MODE)) is None:
362
+ return LoggingMode.DEFAULT
363
+ try:
364
+ return LoggingMode(logging_mode.lower().strip())
365
+ except ValueError:
366
+ raise ValueError(
367
+ f"Invalid value `{logging_mode}` for env var `{ENV_LOGGING_MODE}`. "
368
+ f"Valid values are: {log_a_list([mode.value for mode in LoggingMode],'and')} "
369
+ "(case-insensitive)."
370
+ )
371
+
372
+
373
+ def get_env_logging_level() -> int:
374
+ return _get_logging_level(
375
+ env_var=ENV_LOGGING_LEVEL,
376
+ default_level=logging.INFO,
377
+ )
378
+
379
+
380
+ def get_env_db_logging_level() -> int:
381
+ return _get_logging_level(
382
+ env_var=ENV_DB_LOGGING_LEVEL,
383
+ default_level=logging.WARNING,
384
+ )
385
+
386
+
387
+ def _get_logging_level(env_var: str, default_level: int) -> int:
388
+ logging_level = os.getenv(env_var)
389
+ if not logging_level:
390
+ return default_level
391
+
392
+ # levelNamesMapping = logging.getLevelNamesMapping() is not supported in python 3.8
393
+ # but is supported in 3.12. Hence, we define the mapping ourselves and will remove
394
+ # this once we drop support for older python versions
395
+ levelNamesMapping = logging._nameToLevel.copy()
396
+
397
+ valid_values = [level for level in levelNamesMapping if level != "NOTSET"]
398
+
399
+ if logging_level.upper() not in valid_values:
400
+ raise ValueError(
401
+ f"Invalid value `{logging_level}` for env var `{env_var}`. "
402
+ f"Valid values are: {log_a_list(valid_values,'and')} (case-insensitive)."
403
+ )
404
+ return levelNamesMapping[logging_level.upper()]
405
+
406
+
407
+ def get_env_log_migrations() -> bool:
408
+ log_migrations = os.getenv(ENV_LOG_MIGRATIONS)
409
+ # Default to True
410
+ if log_migrations is None:
411
+ return True
412
+
413
+ if log_migrations.lower() == "true":
414
+ return True
415
+ elif log_migrations.lower() == "false":
416
+ return False
417
+ else:
418
+ raise ValueError(
419
+ f"Invalid value for environment variable {ENV_LOG_MIGRATIONS}: "
420
+ f"{log_migrations}. Value values are 'TRUE' and 'FALSE' (case-insensitive)."
421
+ )
422
+
423
+
334
424
  DEFAULT_PROJECT_NAME = "default"
335
425
  _KUBERNETES_PHOENIX_PORT_PATTERN = re.compile(r"^tcp://\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}:\d+$")
@@ -83,37 +83,3 @@ version_path_separator = os # Use os.pathsep. Default configuration used for ne
83
83
  # ruff.executable = %(here)s/.venv/bin/ruff
84
84
  # ruff.options = --fix REVISION_SCRIPT_FILENAME
85
85
 
86
- # Logging configuration
87
- [loggers]
88
- keys = root,sqlalchemy,alembic
89
-
90
- [handlers]
91
- keys = console
92
-
93
- [formatters]
94
- keys = generic
95
-
96
- [logger_root]
97
- level = WARN
98
- handlers = console
99
- qualname =
100
-
101
- [logger_sqlalchemy]
102
- level = WARN
103
- handlers =
104
- qualname = sqlalchemy.engine
105
-
106
- [logger_alembic]
107
- level = WARN
108
- handlers =
109
- qualname = alembic
110
-
111
- [handler_console]
112
- class = StreamHandler
113
- args = (sys.stderr,)
114
- level = NOTSET
115
- formatter = generic
116
-
117
- [formatter_generic]
118
- format = %(levelname)-5.5s [%(name)s] %(message)s
119
- datefmt = %H:%M:%S
@@ -13,7 +13,7 @@ from sqlalchemy import URL, StaticPool, event, make_url
13
13
  from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
14
14
  from typing_extensions import assert_never
15
15
 
16
- from phoenix.config import get_env_database_schema
16
+ from phoenix.config import LoggingMode, get_env_database_schema
17
17
  from phoenix.db.helpers import SupportedSQLDialect
18
18
  from phoenix.db.migrate import migrate_in_thread
19
19
  from phoenix.db.models import init_models
@@ -64,7 +64,7 @@ def get_async_db_url(connection_str: str) -> URL:
64
64
  def create_engine(
65
65
  connection_str: str,
66
66
  migrate: bool = True,
67
- echo: bool = False,
67
+ log_to_stdout: bool = False,
68
68
  ) -> AsyncEngine:
69
69
  """
70
70
  Factory to create a SQLAlchemy engine from a URL string.
@@ -74,10 +74,25 @@ def create_engine(
74
74
  raise ValueError("Failed to parse database from connection string")
75
75
  backend = SupportedSQLDialect(url.get_backend_name())
76
76
  url = get_async_db_url(url.render_as_string(hide_password=False))
77
+ # If Phoenix is run as an application, we want to pass log_migrations_to_stdout=False
78
+ # and let the configured sqlalchemy logger handle the migration logs
79
+ log_migrations_to_stdout = (
80
+ Settings.log_migrations and Settings.logging_mode != LoggingMode.STRUCTURED
81
+ )
77
82
  if backend is SupportedSQLDialect.SQLITE:
78
- return aio_sqlite_engine(url=url, migrate=migrate, echo=echo)
83
+ return aio_sqlite_engine(
84
+ url=url,
85
+ migrate=migrate,
86
+ log_to_stdout=log_to_stdout,
87
+ log_migrations_to_stdout=log_migrations_to_stdout,
88
+ )
79
89
  elif backend is SupportedSQLDialect.POSTGRESQL:
80
- return aio_postgresql_engine(url=url, migrate=migrate, echo=echo)
90
+ return aio_postgresql_engine(
91
+ url=url,
92
+ migrate=migrate,
93
+ log_to_stdout=log_to_stdout,
94
+ log_migrations_to_stdout=log_migrations_to_stdout,
95
+ )
81
96
  else:
82
97
  assert_never(backend)
83
98
 
@@ -85,8 +100,9 @@ def create_engine(
85
100
  def aio_sqlite_engine(
86
101
  url: URL,
87
102
  migrate: bool = True,
88
- echo: bool = False,
89
103
  shared_cache: bool = True,
104
+ log_to_stdout: bool = False,
105
+ log_migrations_to_stdout: bool = True,
90
106
  ) -> AsyncEngine:
91
107
  database = url.database or ":memory:"
92
108
  if database.startswith("file:"):
@@ -105,7 +121,7 @@ def aio_sqlite_engine(
105
121
 
106
122
  engine = create_async_engine(
107
123
  url=url,
108
- echo=echo,
124
+ echo=log_to_stdout,
109
125
  json_serializer=_dumps,
110
126
  async_creator=async_creator,
111
127
  poolclass=StaticPool,
@@ -123,7 +139,7 @@ def aio_sqlite_engine(
123
139
  else:
124
140
  sync_engine = sqlalchemy.create_engine(
125
141
  url=url.set(drivername="sqlite"),
126
- echo=Settings.log_migrations,
142
+ echo=log_migrations_to_stdout,
127
143
  json_serializer=_dumps,
128
144
  creator=lambda: sqlean.connect(f"file:{database}", uri=True),
129
145
  )
@@ -143,14 +159,15 @@ def set_postgresql_search_path(schema: str) -> Callable[[Connection, Any], None]
143
159
  def aio_postgresql_engine(
144
160
  url: URL,
145
161
  migrate: bool = True,
146
- echo: bool = False,
162
+ log_to_stdout: bool = False,
163
+ log_migrations_to_stdout: bool = True,
147
164
  ) -> AsyncEngine:
148
- engine = create_async_engine(url=url, echo=echo, json_serializer=_dumps)
165
+ engine = create_async_engine(url=url, echo=log_to_stdout, json_serializer=_dumps)
149
166
  if not migrate:
150
167
  return engine
151
168
  sync_engine = sqlalchemy.create_engine(
152
169
  url=url.set(drivername="postgresql+psycopg"),
153
- echo=Settings.log_migrations,
170
+ echo=log_migrations_to_stdout,
154
171
  json_serializer=_dumps,
155
172
  )
156
173
  if schema := get_env_database_schema():
@@ -24,7 +24,6 @@ from phoenix.db import models
24
24
  from phoenix.db.insertion.helpers import DataManipulationEvent
25
25
 
26
26
  logger = logging.getLogger(__name__)
27
- logger.addHandler(logging.NullHandler())
28
27
 
29
28
  DatasetId: TypeAlias = int
30
29
  DatasetVersionId: TypeAlias = int
@@ -29,7 +29,7 @@ from phoenix.db.insertion.helpers import insert_on_conflict
29
29
  from phoenix.server.dml_event import DmlEvent
30
30
  from phoenix.server.types import DbSessionFactory
31
31
 
32
- logger = logging.getLogger("__name__")
32
+ logger = logging.getLogger(__name__)
33
33
 
34
34
 
35
35
  class Insertable(Protocol):
@@ -14,7 +14,6 @@ from phoenix.exceptions import PhoenixMigrationError
14
14
  from phoenix.settings import Settings
15
15
 
16
16
  logger = logging.getLogger(__name__)
17
- logger.addHandler(logging.NullHandler())
18
17
 
19
18
 
20
19
  def printif(condition: bool, text: str) -> None:
@@ -48,8 +47,9 @@ def migrate(
48
47
  alembic_cfg.set_main_option("script_location", scripts_location)
49
48
  url = str(engine.url).replace("%", "%%")
50
49
  alembic_cfg.set_main_option("sqlalchemy.url", url)
51
- alembic_cfg.attributes["connection"] = engine.connect()
52
- command.upgrade(alembic_cfg, "head")
50
+ with engine.connect() as conn:
51
+ alembic_cfg.attributes["connection"] = conn
52
+ command.upgrade(alembic_cfg, "head")
53
53
  engine.dispose()
54
54
  printif(log_migrations, "---------------------------")
55
55
  printif(log_migrations, "✅ Migrations complete.")
@@ -1,5 +1,4 @@
1
1
  import asyncio
2
- from logging.config import fileConfig
3
2
 
4
3
  from alembic import context
5
4
  from sqlalchemy import Connection, engine_from_config, pool
@@ -14,14 +13,8 @@ from phoenix.settings import Settings
14
13
  # access to the values within the .ini file in use.
15
14
  config = context.config
16
15
 
17
- # Interpret the config file for Python logging.
18
- # This line sets up loggers basically.
19
- if config.config_file_name is not None:
20
- fileConfig(config.config_file_name, disable_existing_loggers=False)
21
-
22
16
  # add your model's MetaData object here
23
17
  # for 'autogenerate' support
24
-
25
18
  target_metadata = Base.metadata
26
19
 
27
20
  # other values from the config, defined by the needs of env.py,
@@ -18,7 +18,6 @@ from phoenix.inferences.schema import (
18
18
  )
19
19
 
20
20
  logger = logging.getLogger(__name__)
21
- logger.addHandler(logging.NullHandler())
22
21
 
23
22
 
24
23
  class InferencesRole(Enum):
@@ -34,7 +34,6 @@ from .schema import (
34
34
  from .validation import validate_inferences_inputs
35
35
 
36
36
  logger = logging.getLogger(__name__)
37
- logger.addHandler(logging.NullHandler())
38
37
 
39
38
  # A schema like object. Not recommended to use this directly
40
39
  SchemaLike: TypeAlias = Any
@@ -0,0 +1,3 @@
1
+ from ._config import setup_logging
2
+
3
+ __all__ = ["setup_logging"]
@@ -0,0 +1,90 @@
1
+ import atexit
2
+ import logging
3
+ import logging.config
4
+ import logging.handlers
5
+ import queue
6
+ from sys import stderr, stdout
7
+
8
+ from typing_extensions import assert_never
9
+
10
+ from phoenix.config import LoggingMode
11
+ from phoenix.logging._filter import NonErrorFilter
12
+ from phoenix.settings import Settings
13
+
14
+ from ._formatter import PhoenixJSONFormatter
15
+
16
+
17
+ def setup_logging() -> None:
18
+ """
19
+ Configures logging for the specified logging mode.
20
+ """
21
+ logging_mode = Settings.logging_mode
22
+ if logging_mode is LoggingMode.DEFAULT:
23
+ _setup_library_logging()
24
+ elif logging_mode is LoggingMode.STRUCTURED:
25
+ _setup_application_logging()
26
+ else:
27
+ assert_never(logging_mode)
28
+
29
+
30
+ def _setup_library_logging() -> None:
31
+ """
32
+ Configures logging if Phoenix is used as a library
33
+ """
34
+ logger = logging.getLogger("phoenix")
35
+ logger.setLevel(Settings.logging_level)
36
+ db_logger = logging.getLogger("sqlalchemy")
37
+ db_logger.setLevel(Settings.db_logging_level)
38
+ logger.info("Default logging ready")
39
+
40
+
41
+ def _setup_application_logging() -> None:
42
+ """
43
+ Configures logging if Phoenix is used as an application
44
+ """
45
+ sql_engine_logger = logging.getLogger("sqlalchemy.engine.Engine")
46
+ # Remove all existing handlers
47
+ for handler in sql_engine_logger.handlers[:]:
48
+ sql_engine_logger.removeHandler(handler)
49
+ handler.close()
50
+
51
+ phoenix_logger = logging.getLogger("phoenix")
52
+ phoenix_logger.setLevel(Settings.logging_level)
53
+ phoenix_logger.propagate = False # Do not pass records to the root logger
54
+ sql_logger = logging.getLogger("sqlalchemy")
55
+ sql_logger.setLevel(Settings.db_logging_level)
56
+ sql_logger.propagate = False # Do not pass records to the root logger
57
+
58
+ log_queue = queue.Queue() # type:ignore
59
+ queue_handler = logging.handlers.QueueHandler(log_queue)
60
+ phoenix_logger.addHandler(queue_handler)
61
+ sql_logger.addHandler(queue_handler)
62
+
63
+ fmt_keys = {
64
+ "level": "levelname",
65
+ "message": "message",
66
+ "timestamp": "timestamp",
67
+ "logger": "name",
68
+ "module": "module",
69
+ "function": "funcName",
70
+ "line": "lineno",
71
+ "thread_name": "threadName",
72
+ }
73
+ formatter = PhoenixJSONFormatter(fmt_keys=fmt_keys)
74
+
75
+ # stdout handler
76
+ stdout_handler = logging.StreamHandler(stdout)
77
+ stdout_handler.setFormatter(formatter)
78
+ stdout_handler.setLevel(Settings.logging_level)
79
+ stdout_handler.addFilter(NonErrorFilter())
80
+
81
+ # stderr handler
82
+ stderr_handler = logging.StreamHandler(stderr)
83
+ stderr_handler.setFormatter(formatter)
84
+ stderr_handler.setLevel(logging.WARNING)
85
+
86
+ queue_listener = logging.handlers.QueueListener(log_queue, stdout_handler, stderr_handler)
87
+ if queue_listener is not None:
88
+ queue_listener.start()
89
+ atexit.register(queue_listener.stop)
90
+ phoenix_logger.info("Structured logging ready")
@@ -0,0 +1,6 @@
1
+ import logging
2
+
3
+
4
+ class NonErrorFilter(logging.Filter):
5
+ def filter(self, record: logging.LogRecord) -> bool:
6
+ return record.levelno <= logging.INFO
@@ -0,0 +1,69 @@
1
+ import datetime as dt
2
+ import json
3
+ import logging
4
+ from typing import Dict, Optional
5
+
6
+ LOG_RECORD_BUILTIN_ATTRS = {
7
+ "args",
8
+ "asctime",
9
+ "created",
10
+ "exc_info",
11
+ "exc_text",
12
+ "filename",
13
+ "funcName",
14
+ "levelname",
15
+ "levelno",
16
+ "lineno",
17
+ "module",
18
+ "msecs",
19
+ "message",
20
+ "msg",
21
+ "name",
22
+ "pathname",
23
+ "process",
24
+ "processName",
25
+ "relativeCreated",
26
+ "stack_info",
27
+ "thread",
28
+ "threadName",
29
+ "taskName",
30
+ }
31
+
32
+
33
+ class PhoenixJSONFormatter(logging.Formatter):
34
+ def __init__(
35
+ self,
36
+ *,
37
+ fmt_keys: Optional[Dict[str, str]] = None,
38
+ ):
39
+ super().__init__()
40
+ self.fmt_keys = fmt_keys if fmt_keys is not None else {}
41
+
42
+ def format(self, record: logging.LogRecord) -> str:
43
+ message = self._prepare_log_dict(record)
44
+ return json.dumps(message, default=str)
45
+
46
+ def _prepare_log_dict(self, record: logging.LogRecord) -> Dict[str, str]:
47
+ always_fields = {
48
+ "message": record.getMessage(),
49
+ "timestamp": dt.datetime.fromtimestamp(record.created, tz=dt.timezone.utc).isoformat(),
50
+ }
51
+ if record.exc_info is not None:
52
+ always_fields["exc_info"] = self.formatException(record.exc_info)
53
+
54
+ if record.stack_info is not None:
55
+ always_fields["stack_info"] = self.formatStack(record.stack_info)
56
+
57
+ message = {
58
+ key: msg_val
59
+ if (msg_val := always_fields.pop(val, None)) is not None
60
+ else getattr(record, val)
61
+ for key, val in self.fmt_keys.items()
62
+ }
63
+ message.update(always_fields)
64
+
65
+ for key, val in record.__dict__.items():
66
+ if key not in LOG_RECORD_BUILTIN_ATTRS:
67
+ message[key] = val
68
+
69
+ return message
@@ -10,7 +10,6 @@ import pandas as pd
10
10
  from phoenix.core.model_schema import Column
11
11
 
12
12
  logger = logging.getLogger(__name__)
13
- logger.addHandler(logging.NullHandler())
14
13
 
15
14
 
16
15
  @dataclass(frozen=True)
@@ -71,7 +71,6 @@ from .utils import (
71
71
  )
72
72
 
73
73
  logger = logging.getLogger(__name__)
74
- logger.addHandler(logging.NullHandler())
75
74
 
76
75
  DATASET_NODE_NAME = DatasetNodeType.__name__
77
76
  DATASET_VERSION_NODE_NAME = DatasetVersionNodeType.__name__
@@ -118,8 +118,6 @@ if TYPE_CHECKING:
118
118
  from opentelemetry.trace import TracerProvider
119
119
 
120
120
  logger = logging.getLogger(__name__)
121
- logger.setLevel(logging.INFO)
122
- logger.addHandler(logging.NullHandler())
123
121
 
124
122
  router = APIRouter(include_in_schema=False)
125
123
 
@@ -542,7 +540,7 @@ def create_engine_and_run_migrations(
542
540
  database_url: str,
543
541
  ) -> AsyncEngine:
544
542
  try:
545
- return create_engine(database_url)
543
+ return create_engine(connection_str=database_url, migrate=True, log_to_stdout=False)
546
544
  except PhoenixMigrationError as e:
547
545
  msg = (
548
546
  "\n\n⚠️⚠️ Phoenix failed to migrate the database to the latest version. ⚠️⚠️\n\n"
@@ -604,6 +602,7 @@ def create_app(
604
602
  secret: Optional[str] = None,
605
603
  scaffolder_config: Optional[ScaffolderConfig] = None,
606
604
  ) -> FastAPI:
605
+ logger.info(f"Server umap params: {umap_params}")
607
606
  startup_callbacks_list: List[_Callback] = list(startup_callbacks)
608
607
  shutdown_callbacks_list: List[_Callback] = list(shutdown_callbacks)
609
608
  initial_batch_of_spans: Iterable[Tuple[Span, str]] = (