arize-phoenix 0.0.36__tar.gz → 0.0.38__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 (142) hide show
  1. arize_phoenix-0.0.38/PKG-INFO +445 -0
  2. arize_phoenix-0.0.38/README.md +389 -0
  3. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/pyproject.toml +15 -11
  4. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/__init__.py +1 -1
  5. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/schema.py +4 -6
  6. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/DataQualityMetric.py +1 -10
  7. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/ExportEventsMutation.py +1 -4
  8. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/Segments.py +6 -5
  9. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/Span.py +20 -2
  10. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/TimeSeries.py +1 -8
  11. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/static/index.js +498 -471
  12. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/session/session.py +5 -2
  13. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/trace/fixtures.py +22 -1
  14. arize_phoenix-0.0.38/src/phoenix/trace/langchain/__init__.py +3 -0
  15. arize_phoenix-0.0.36/src/phoenix/experimental/callbacks/langchain_tracer.py → arize_phoenix-0.0.38/src/phoenix/trace/langchain/tracer.py +102 -2
  16. arize_phoenix-0.0.38/src/phoenix/trace/llama_index/__init__.py +3 -0
  17. arize_phoenix-0.0.36/src/phoenix/experimental/callbacks/llama_index_trace_callback_handler.py → arize_phoenix-0.0.38/src/phoenix/trace/llama_index/callback.py +35 -16
  18. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/trace/semantic_conventions.py +2 -2
  19. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/trace/span_json_decoder.py +0 -12
  20. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/trace/trace_dataset.py +6 -1
  21. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/trace/utils.py +1 -1
  22. arize_phoenix-0.0.36/PKG-INFO +0 -219
  23. arize_phoenix-0.0.36/README.md +0 -165
  24. arize_phoenix-0.0.36/src/phoenix/trace/__init__.py +0 -0
  25. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/.gitignore +0 -0
  26. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/IP_NOTICE +0 -0
  27. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/LICENSE +0 -0
  28. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/config.py +0 -0
  29. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/core/__init__.py +0 -0
  30. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/core/embedding_dimension.py +0 -0
  31. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/core/model.py +0 -0
  32. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/core/model_schema.py +0 -0
  33. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/core/model_schema_adapter.py +0 -0
  34. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/core/traces.py +0 -0
  35. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/datasets/__init__.py +0 -0
  36. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/datasets/dataset.py +0 -0
  37. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/datasets/errors.py +0 -0
  38. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/datasets/fixtures.py +0 -0
  39. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/datasets/schema.py +0 -0
  40. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/datasets/validation.py +0 -0
  41. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/datetime_utils.py +0 -0
  42. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/__init__.py +0 -0
  43. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/__init__.py +0 -0
  44. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/functions/__init__.py +0 -0
  45. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/functions/binary.py +0 -0
  46. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/functions/common.py +0 -0
  47. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/functions/generate.py +0 -0
  48. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/models/__init__.py +0 -0
  49. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/models/base.py +0 -0
  50. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/models/openai.py +0 -0
  51. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/retrievals.py +0 -0
  52. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/templates/__init__.py +0 -0
  53. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/templates/default_templates.py +0 -0
  54. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/templates/template.py +0 -0
  55. {arize_phoenix-0.0.36/src/phoenix/experimental/callbacks → arize_phoenix-0.0.38/src/phoenix/experimental/evals/utils}/__init__.py +0 -0
  56. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/utils/downloads.py +0 -0
  57. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/utils/threads.py +0 -0
  58. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/utils/types.py +0 -0
  59. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/experimental/evals/utils.py +0 -0
  60. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/metrics/README.md +0 -0
  61. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/metrics/__init__.py +0 -0
  62. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/metrics/binning.py +0 -0
  63. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/metrics/metrics.py +0 -0
  64. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/metrics/mixins.py +0 -0
  65. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/metrics/timeseries.py +0 -0
  66. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/metrics/wrappers.py +0 -0
  67. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/pointcloud/__init__.py +0 -0
  68. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/pointcloud/clustering.py +0 -0
  69. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/pointcloud/pointcloud.py +0 -0
  70. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/pointcloud/projectors.py +0 -0
  71. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/py.typed +0 -0
  72. {arize_phoenix-0.0.36/src/phoenix/experimental/evals/utils → arize_phoenix-0.0.38/src/phoenix/server}/__init__.py +0 -0
  73. {arize_phoenix-0.0.36/src/phoenix/server → arize_phoenix-0.0.38/src/phoenix/server/api}/__init__.py +0 -0
  74. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/context.py +0 -0
  75. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/helpers.py +0 -0
  76. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/input_types/ClusterInput.py +0 -0
  77. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/input_types/Coordinates.py +0 -0
  78. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/input_types/DataQualityMetricInput.py +0 -0
  79. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/input_types/DimensionFilter.py +0 -0
  80. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/input_types/DimensionInput.py +0 -0
  81. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/input_types/Granularity.py +0 -0
  82. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/input_types/PerformanceMetricInput.py +0 -0
  83. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/input_types/SpanSort.py +0 -0
  84. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/input_types/TimeRange.py +0 -0
  85. {arize_phoenix-0.0.36/src/phoenix/server/api → arize_phoenix-0.0.38/src/phoenix/server/api/input_types}/__init__.py +0 -0
  86. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/interceptor.py +0 -0
  87. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/Cluster.py +0 -0
  88. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/Dataset.py +0 -0
  89. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/DatasetInfo.py +0 -0
  90. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/DatasetRole.py +0 -0
  91. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/DatasetValues.py +0 -0
  92. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/Dimension.py +0 -0
  93. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/DimensionDataType.py +0 -0
  94. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/DimensionShape.py +0 -0
  95. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/DimensionType.py +0 -0
  96. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/DimensionWithValue.py +0 -0
  97. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/EmbeddingDimension.py +0 -0
  98. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/EmbeddingMetadata.py +0 -0
  99. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/Event.py +0 -0
  100. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/EventMetadata.py +0 -0
  101. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/ExportedFile.py +0 -0
  102. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/Functionality.py +0 -0
  103. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/MimeType.py +0 -0
  104. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/Model.py +0 -0
  105. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/NumericRange.py +0 -0
  106. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/PerformanceMetric.py +0 -0
  107. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/PromptResponse.py +0 -0
  108. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/Retrieval.py +0 -0
  109. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/ScalarDriftMetricEnum.py +0 -0
  110. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/SortDir.py +0 -0
  111. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/UMAPPoints.py +0 -0
  112. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/VectorDriftMetricEnum.py +0 -0
  113. {arize_phoenix-0.0.36/src/phoenix/server/api/input_types → arize_phoenix-0.0.38/src/phoenix/server/api/types}/__init__.py +0 -0
  114. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/node.py +0 -0
  115. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/api/types/pagination.py +0 -0
  116. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/app.py +0 -0
  117. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/main.py +0 -0
  118. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/span_handler.py +0 -0
  119. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/static/apple-touch-icon-114x114.png +0 -0
  120. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/static/apple-touch-icon-120x120.png +0 -0
  121. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/static/apple-touch-icon-144x144.png +0 -0
  122. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/static/apple-touch-icon-152x152.png +0 -0
  123. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/static/apple-touch-icon-180x180.png +0 -0
  124. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/static/apple-touch-icon-72x72.png +0 -0
  125. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/static/apple-touch-icon-76x76.png +0 -0
  126. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/static/apple-touch-icon.png +0 -0
  127. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/static/favicon.ico +0 -0
  128. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/static/index.css +0 -0
  129. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/static/index.html +0 -0
  130. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/static/modernizr.js +0 -0
  131. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/server/thread_server.py +0 -0
  132. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/services.py +0 -0
  133. {arize_phoenix-0.0.36/src/phoenix/server/api/types → arize_phoenix-0.0.38/src/phoenix/session}/__init__.py +0 -0
  134. {arize_phoenix-0.0.36/src/phoenix/session → arize_phoenix-0.0.38/src/phoenix/trace}/__init__.py +0 -0
  135. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/trace/exporter.py +0 -0
  136. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/trace/filter.py +0 -0
  137. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/trace/schemas.py +0 -0
  138. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/trace/span_json_encoder.py +0 -0
  139. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/trace/tracer.py +0 -0
  140. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/trace/v1/__init__.py +0 -0
  141. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/trace/v1/trace_pb2.py +0 -0
  142. {arize_phoenix-0.0.36 → arize_phoenix-0.0.38}/src/phoenix/trace/v1/trace_pb2.pyi +0 -0
@@ -0,0 +1,445 @@
1
+ Metadata-Version: 2.1
2
+ Name: arize-phoenix
3
+ Version: 0.0.38
4
+ Summary: ML Observability in your notebook
5
+ Project-URL: Documentation, https://docs.arize.com/phoenix/
6
+ Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
7
+ Project-URL: Source, https://github.com/Arize-ai/phoenix
8
+ Author-email: Arize AI <phoenix-devs@arize.com>
9
+ License-Expression: Elastic-2.0
10
+ License-File: IP_NOTICE
11
+ License-File: LICENSE
12
+ Keywords: Explainability,Monitoring,Observability
13
+ Classifier: Programming Language :: Python
14
+ Classifier: Programming Language :: Python :: 3.8
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Requires-Python: <3.12,>=3.8
19
+ Requires-Dist: hdbscan<1.0.0,>=0.8.33
20
+ Requires-Dist: numpy
21
+ Requires-Dist: pandas
22
+ Requires-Dist: protobuf<5.0,>=3.20
23
+ Requires-Dist: psutil
24
+ Requires-Dist: pyarrow
25
+ Requires-Dist: scikit-learn<1.3.0
26
+ Requires-Dist: scipy
27
+ Requires-Dist: sortedcontainers
28
+ Requires-Dist: starlette
29
+ Requires-Dist: strawberry-graphql==0.208.2
30
+ Requires-Dist: typing-extensions
31
+ Requires-Dist: umap-learn
32
+ Requires-Dist: uvicorn
33
+ Requires-Dist: wrapt
34
+ Provides-Extra: dev
35
+ Requires-Dist: arize[autoembeddings,llm-evaluation]; extra == 'dev'
36
+ Requires-Dist: black[jupyter]; extra == 'dev'
37
+ Requires-Dist: gcsfs; extra == 'dev'
38
+ Requires-Dist: hatch; extra == 'dev'
39
+ Requires-Dist: jupyter; extra == 'dev'
40
+ Requires-Dist: nbqa; extra == 'dev'
41
+ Requires-Dist: pandas-stubs<=2.0.2.230605; extra == 'dev'
42
+ Requires-Dist: pre-commit; extra == 'dev'
43
+ Requires-Dist: pytest; extra == 'dev'
44
+ Requires-Dist: pytest-cov; extra == 'dev'
45
+ Requires-Dist: pytest-lazy-fixture; extra == 'dev'
46
+ Requires-Dist: ruff==0.0.290; extra == 'dev'
47
+ Requires-Dist: strawberry-graphql[debug-server]==0.208.2; extra == 'dev'
48
+ Provides-Extra: experimental
49
+ Requires-Dist: openai; extra == 'experimental'
50
+ Requires-Dist: tenacity; extra == 'experimental'
51
+ Provides-Extra: langchain
52
+ Requires-Dist: langchain>=0.0.293; extra == 'langchain'
53
+ Provides-Extra: llama-index
54
+ Requires-Dist: llama-index>=0.8.29; extra == 'llama-index'
55
+ Description-Content-Type: text/markdown
56
+
57
+ <p align="center">
58
+ <a target="_blank" href="https://phoenix.arize.com" style="background:none">
59
+ <img alt="phoenix logo" src="https://storage.googleapis.com/arize-assets/phoenix/assets/phoenix-logo-light.svg" width="auto" height="200"></img>
60
+ </a>
61
+ <br/>
62
+ <br/>
63
+ <a href="https://docs.arize.com/phoenix/">
64
+ <img src="https://img.shields.io/static/v1?message=Docs&logo=data:image/png;base64,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&labelColor=grey&color=blue&logoColor=white&label=%20"/>
65
+ </a>
66
+ <a target="_blank" href="https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q">
67
+ <img src="https://img.shields.io/static/v1?message=Community&logo=slack&labelColor=grey&color=blue&logoColor=white&label=%20"/>
68
+ </a>
69
+ <a target="_blank" href="https://twitter.com/ArizePhoenix">
70
+ <img src="https://img.shields.io/badge/-ArizePhoenix-blue.svg?color=blue&labelColor=gray&logo=twitter">
71
+ </a>
72
+ <a target="_blank" href="https://pypi.org/project/arize-phoenix/">
73
+ <img src="https://img.shields.io/pypi/v/arize-phoenix?color=blue">
74
+ </a>
75
+ <a target="_blank" href="https://anaconda.org/conda-forge/arize-phoenix">
76
+ <img src="https://img.shields.io/conda/vn/conda-forge/arize-phoenix.svg?color=blue">
77
+ </a>
78
+ <a target="_blank" href="https://pypi.org/project/arize-phoenix/">
79
+ <img src="https://img.shields.io/pypi/pyversions/arize-phoenix">
80
+ </a>
81
+ </p>
82
+
83
+ ![a rotating UMAP point cloud of a computer vision model](https://github.com/Arize-ai/phoenix-assets/blob/main/gifs/image_classification_10mb.gif?raw=true)
84
+
85
+ Phoenix provides MLOps and LLMOps insights at lightning speed with zero-config observability. Phoenix provides a notebook-first experience for monitoring your models and LLM Applications by providing:
86
+
87
+ - **LLM App Tracing** - Trace through the execution of your LLM Application to understand the internals of your LLM Application and to troubleshoot problems related to things like retrieval and tool execution.
88
+ - **LLM Evals** - Leverage the power of large language models to evaluate your generative model or application's relevance, toxicity, and more.
89
+ - **Embedding Analysis** - Explore embedding point-clouds and identify clusters of high drift and performance degradation.
90
+ - **RAG Introspection** - Visualize your generative application's search and retrieval process to solve improve your retrieval augmented generation.
91
+ - **Structured Data Analysis** - Statistically analyze your structured data by performing A/B analysis, temporal drift analysis, and more.
92
+
93
+ **Table of Contents**
94
+
95
+ - [Installation](#installation)
96
+ - [LLM App Tracing](#llm-app-tracing)
97
+ - [Tracing with LlamaIndex](#tracing-with-llamaindex)
98
+ - [Tracing with LangChain](#tracing-with-langchain)
99
+ - [LLM Evals](#llm-evals)
100
+ - [Embedding Analysis](#embedding-analysis)
101
+ - [UMAP-based Exploratory Data Analysis](#umap-based-exploratory-data-analysis)
102
+ - [Cluster-driven Drift and Performance Analysis](#cluster-driven-drift-and-performance-analysis)
103
+ - [Exportable Clusters](#exportable-clusters)
104
+ - [RAG Introspection](#rag-introspection)
105
+ - [Structured Data Analysis](#structured-data-analysis)
106
+ - [Community](#community)
107
+ - [Thanks](#thanks)
108
+ - [Copyright, Patent, and License](#copyright-patent-and-license)
109
+
110
+ ## Installation
111
+
112
+ Install Phoenix via `pip` or or `conda` as well as any of its subpackages.
113
+
114
+ ```shell
115
+ pip install arize-phoenix
116
+ ```
117
+
118
+ Some functionality such as LLM evals are under the `experimental` subpackage.
119
+
120
+ ```shell
121
+ pip install arize-phoenix[experimental]
122
+ ```
123
+
124
+ ## LLM App Tracing
125
+
126
+ ![LLM Application Tracing](https://github.com/Arize-ai/phoenix-assets/blob/main/gifs/langchain_rag_stuff_documents_chain_10mb.gif?raw=true)
127
+
128
+ With the advent of powerful LLMs, it is now possible to build LLM Applications that can perform complex tasks like summarization, translation, question and answering, and more. However, these applications are often difficult to debug and troubleshoot as they have an extensive surface area: search and retrieval via vector stores, embedding generation, usage of external tools and so on. Phoenix provides a tracing framework that allows you to trace through the execution of your LLM Application hierarchically. This allows you to understand the internals of your LLM Application and to troubleshoot the complex components of your applicaition. Phoenix is built on top of the OpenInference tracing standard and uses it to trace, export, and collect critical information about your LLM Application in the form of `spans`. For more details on the OpenInference tracing standard, see the [OpenInference Specification](https://github.com/Arize-ai/open-inference-spec)
129
+
130
+ ### Tracing with LlamaIndex
131
+
132
+ [![Open in Colab](https://img.shields.io/static/v1?message=Open%20in%20Colab&logo=googlecolab&labelColor=grey&color=blue&logoColor=orange&label=%20)](https://colab.research.google.com/github/Arize-ai/phoenix/blob/main/tutorials/tracing/llama_index_tracing_tutorial) [![Open in GitHub](https://img.shields.io/static/v1?message=Open%20in%20GitHub&logo=github&labelColor=grey&color=blue&logoColor=white&label=%20)](https://github.com/Arize-ai/phoenix/blob/main/tutorials/tracing/llama_index_tracing_tutorial)
133
+
134
+ ![LLM App Tracing UI](https://storage.googleapis.com/arize-assets/phoenix/assets/images/trace_details_view.png)
135
+
136
+ To extract traces from your LlamaIndex application, you will have to add Phoenix's `OpenInferenceTraceCallback` to your LlamaIndex application. A callback (in this case an OpenInference `Tracer`) is a class that automatically accumulates `spans` that trac your application as it executes. The OpenInference `Tracer` is a tracer that is specifically designed to work with Phoenix and by default exports the traces to a locally running phoenix server.
137
+
138
+ ```shell
139
+ # Install phoenix as well as llama_index and your LLM of choice
140
+ pip install arize-phoenix llama-index openai
141
+
142
+ ```
143
+
144
+ Launch Phoenix in a notebook and view the traces of your LlamaIndex application in the Phoenix UI.
145
+
146
+ ```python
147
+ import phoenix as px
148
+
149
+ # To view traces in Phoenix, you will first have to start a Phoenix server. You can do this by running the following:
150
+ session = px.launch_app()
151
+
152
+
153
+ # Once you have started a Phoenix server, you can start your LlamaIndex application with the `OpenInferenceTraceCallback` as a callback. To do this, you will have to add the callback to the initialization of your LlamaIndex application:
154
+
155
+ from phoenix.trace.llama_index import (
156
+ OpenInferenceTraceCallbackHandler,
157
+ )
158
+
159
+ # Initialize the callback handler
160
+ callback_handler = OpenInferenceTraceCallbackHandler()
161
+
162
+ # LlamaIndex application initialization may vary
163
+ # depending on your application
164
+ service_context = ServiceContext.from_defaults(
165
+ llm_predictor=LLMPredictor(llm=ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)),
166
+ embed_model=OpenAIEmbedding(model="text-embedding-ada-002"),
167
+ callback_manager=CallbackManager(handlers=[callback_handler]),
168
+ )
169
+ index = load_index_from_storage(
170
+ storage_context,
171
+ service_context=service_context,
172
+ )
173
+ query_engine = index.as_query_engine()
174
+
175
+ # Query your LlamaIndex application
176
+ query_engine.query("What is the meaning of life?")
177
+ query_engine.query("Why did the cow jump over the moon?")
178
+
179
+ # View the traces in the Phoenix UI
180
+ px.active_session().url
181
+ ```
182
+
183
+ ### Tracing with LangChain
184
+
185
+ [![Open in Colab](https://img.shields.io/static/v1?message=Open%20in%20Colab&logo=googlecolab&labelColor=grey&color=blue&logoColor=orange&label=%20)](https://colab.research.google.com/github/Arize-ai/phoenix/blob/main/tutorials/tracing/langchain_tracing_tutorial) [![Open in GitHub](https://img.shields.io/static/v1?message=Open%20in%20GitHub&logo=github&labelColor=grey&color=blue&logoColor=white&label=%20)](https://github.com/Arize-ai/phoenix/blob/main/tutorials/tracing/langchain_tracing_tutorial)
186
+
187
+ To extract traces from your LangChain application, you will have to add Phoenix's OpenInference Tracer to your LangChain application. A tracer is a class that automatically accumulates traces as your application executes. The OpenInference Tracer is a tracer that is specifically designed to work with Phoenix and by default exports the traces to a locally running phoenix server.
188
+
189
+ ```shell
190
+ # Install phoenix as well as langchain and your LLM of choice
191
+ pip install arize-phoenix langchain openai
192
+
193
+ ```
194
+
195
+ Launch Phoenix in a notebook and view the traces of your LangChain application in the Phoenix UI.
196
+
197
+ ```python
198
+ import phoenix as px
199
+ import pandas as pd
200
+
201
+ # Launch phoenix
202
+ session = px.launch_app()
203
+
204
+ # Once you have started a Phoenix server, you can start your LangChain application with the OpenInference Tracer as a callback. To do this, you will have to add the tracer to the initialization of your LangChain application:
205
+
206
+ from phoenix.trace.langchain import OpenInferenceTracer
207
+
208
+ # If no exporter is specified, the tracer will export to the locally running Phoenix server
209
+ tracer = OpenInferenceTracer()
210
+
211
+ # Initialize your LangChain application
212
+ from langchain.chains import RetrievalQA
213
+ from langchain.chat_models import ChatOpenAI
214
+ from langchain.embeddings import OpenAIEmbeddings
215
+ from langchain.retrievers import KNNRetriever
216
+
217
+ embeddings = OpenAIEmbeddings(model="text-embedding-ada-002")
218
+ documents_df = pd.read_parquet(
219
+ "http://storage.googleapis.com/arize-assets/phoenix/datasets/unstructured/llm/context-retrieval/langchain-pinecone/database.parquet"
220
+ )
221
+ knn_retriever = KNNRetriever(
222
+ index=np.stack(df["text_vector"]),
223
+ texts=documents_df["text"].tolist(),
224
+ embeddings=OpenAIEmbeddings(),
225
+ )
226
+ chain_type = "stuff" # stuff, refine, map_reduce, and map_rerank
227
+ chat_model_name = "gpt-3.5-turbo"
228
+ llm = ChatOpenAI(model_name=chat_model_name)
229
+ chain = RetrievalQA.from_chain_type(
230
+ llm=llm,
231
+ chain_type=chain_type,
232
+ retriever=knn_retriever,
233
+ )
234
+
235
+ # Instrument the execution of the runs with the tracer. By default the tracer uses an HTTPExporter
236
+ query = "What is euclidean distance?"
237
+ response = chain.run(query, callbacks=[tracer])
238
+
239
+ # By adding the tracer to the callbacks of LangChain, we've created a one-way data connection between your LLM application and Phoenix.
240
+
241
+ # To view the traces in Phoenix, simply open the UI in your browser.
242
+ session.url
243
+ ```
244
+
245
+ ## LLM Evals
246
+
247
+ 🚧 LLM Evals is still under construction under a sub-module `arize-phoenix[experimental]`
248
+
249
+ [![Open in Colab](https://img.shields.io/static/v1?message=Open%20in%20Colab&logo=googlecolab&labelColor=grey&color=blue&logoColor=orange&label=%20)](https://colab.research.google.com/github/Arize-ai/phoenix/blob/main/tutorials/evals/evaluate_relevance_classifications.ipynb) [![Open in GitHub](https://img.shields.io/static/v1?message=Open%20in%20GitHub&logo=github&labelColor=grey&color=blue&logoColor=white&label=%20)](https://github.com/Arize-ai/phoenix/blob/main/tutorials/evals/evaluate_relevance_classifications.ipynb)
250
+
251
+ Phoenix provides tooling to evaluate LLM applications, including tools to determine the relevance or irrelevance of documents retrieved by retrieval-augmented generation (RAG) application, whether or not the response is toxic, and much more.
252
+
253
+ Phoenix's approach to LLM evals is notable for the following reasons:
254
+
255
+ - Includes pre-tested templates and convenience functions for a set of common Eval “tasks”
256
+ - Data science rigor applied to the testing of model and template combinations
257
+ - Designed to run as fast as possible on batches of data
258
+ - Includes benchmark datasets and tests for each eval function
259
+
260
+ Here is an example of running the RAG relevance eval on a dataset of Wikipedia questions and answers:
261
+
262
+ ```shell
263
+ # Install phoenix as well as the experimental subpackage
264
+ pip install -qq arize-phoenix[experimental] ipython matplotlib openai pycm scikit-learn
265
+ ```
266
+
267
+ ```python
268
+ from phoenix.experimental.evals import (
269
+ RAG_RELEVANCY_PROMPT_TEMPLATE_STR,
270
+ RAG_RELEVANCY_PROMPT_RAILS_MAP,
271
+ OpenAIModel,
272
+ download_benchmark_dataset,
273
+ llm_eval_binary,
274
+ )
275
+ from sklearn.metrics import precision_recall_fscore_support, confusion_matrix, ConfusionMatrixDisplay
276
+
277
+ # Download the benchmark golden dataset
278
+ df = download_benchmark_dataset(
279
+ task="binary-relevance-classification", dataset_name="wiki_qa-train"
280
+ )
281
+ # Sample and re-name the columns to match the template
282
+ df = df.sample(100)
283
+ df = df.rename(
284
+ columns={
285
+ "query_text": "query",
286
+ "document_text": "reference",
287
+ },
288
+ )
289
+ model = OpenAIModel(
290
+ model_name="gpt-4",
291
+ temperature=0.0,
292
+ )
293
+ rails =list(RAG_RELEVANCY_PROMPT_RAILS_MAP.values())
294
+ df["eval_relevance"] = llm_eval_binary(df, RAG_RELEVANCY_PROMPT_TEMPLATE_STR, model, rails)
295
+ #Golden dataset has True/False map to -> "irrelevant" / "relevant"
296
+ #we can then scikit compare to output of template - same format
297
+ y_true = df["relevant"].map({True: "relevant", False: "irrelevant"})
298
+ y_pred = df["eval_relevance"]
299
+
300
+ # Compute Per-Class Precision, Recall, F1 Score, Support
301
+ precision, recall, f1, support = precision_recall_fscore_support(y_true, y_pred)
302
+ ```
303
+
304
+ To learn more about LLM Evals, see the [LLM Evals documentation](https://docs.arize.com/phoenix/concepts/llm-evals/).
305
+
306
+ ## Embedding Analysis
307
+
308
+ [![Open in Colab](https://img.shields.io/static/v1?message=Open%20in%20Colab&logo=googlecolab&labelColor=grey&color=blue&logoColor=orange&label=%20)](https://colab.research.google.com/github/Arize-ai/phoenix/blob/main/tutorials/image_classification_tutorial.ipynb) [![Open in GitHub](https://img.shields.io/static/v1?message=Open%20in%20GitHub&logo=github&labelColor=grey&color=blue&logoColor=white&label=%20)](https://github.com/Arize-ai/phoenix/blob/main/tutorials/image_classification_tutorial.ipynb)
309
+
310
+ Explore UMAP point-clouds at times of high drift and performance degredation and identify clusters of problematic data.
311
+
312
+ ![Euclidean distance drift analysis](https://storage.googleapis.com/arize-assets/phoenix/assets/images/ner_color_by_correctness.png)
313
+
314
+ Embedding analysis is critical for understanding the behavior of you NLP, CV, and LLM Apps that use embeddings. Phoenix provides an A/B testing framework to help you understand how your embeddings are changing over time and how they are changing between different versions of your model (`prod` vs `train`, `champion` vs `challenger`).
315
+
316
+ ```python
317
+ # Import libraries.
318
+ from dataclasses import replace
319
+ import pandas as pd
320
+ import phoenix as px
321
+
322
+ # Download curated datasets and load them into pandas DataFrames.
323
+ train_df = pd.read_parquet(
324
+ "https://storage.googleapis.com/arize-assets/phoenix/datasets/unstructured/cv/human-actions/human_actions_training.parquet"
325
+ )
326
+ prod_df = pd.read_parquet(
327
+ "https://storage.googleapis.com/arize-assets/phoenix/datasets/unstructured/cv/human-actions/human_actions_production.parquet"
328
+ )
329
+
330
+ # Define schemas that tell Phoenix which columns of your DataFrames correspond to features, predictions, actuals (i.e., ground truth), embeddings, etc.
331
+ train_schema = px.Schema(
332
+ prediction_id_column_name="prediction_id",
333
+ timestamp_column_name="prediction_ts",
334
+ prediction_label_column_name="predicted_action",
335
+ actual_label_column_name="actual_action",
336
+ embedding_feature_column_names={
337
+ "image_embedding": px.EmbeddingColumnNames(
338
+ vector_column_name="image_vector",
339
+ link_to_data_column_name="url",
340
+ ),
341
+ },
342
+ )
343
+ prod_schema = replace(train_schema, actual_label_column_name=None)
344
+
345
+ # Define your production and training datasets.
346
+ prod_ds = px.Dataset(prod_df, prod_schema)
347
+ train_ds = px.Dataset(train_df, train_schema)
348
+
349
+ # Launch Phoenix.
350
+ session = px.launch_app(prod_ds, train_ds)
351
+
352
+ # View the Phoenix UI in the browser
353
+ session.url
354
+ ```
355
+
356
+ ### UMAP-based Exploratory Data Analysis
357
+
358
+ Color your UMAP point-clouds by your model's dimensions, drift, and performance to identify problematic cohorts.
359
+
360
+ ![UMAP-based EDA](https://storage.googleapis.com/arize-assets/phoenix/assets/images/cv_eda_selection.png)
361
+
362
+ ### Cluster-driven Drift and Performance Analysis
363
+
364
+ Break-apart your data into clusters of high drift or bad performance using HDBSCAN
365
+
366
+ ![HDBSCAN clusters sorted by drift](https://storage.googleapis.com/arize-assets/phoenix/assets/images/HDBSCAN_drift_analysis.png)
367
+
368
+ ### Exportable Clusters
369
+
370
+ Export your clusters to `parquet` files or dataframes for further analysis and fine-tuning.
371
+
372
+ ## RAG Introspection
373
+
374
+ [![Open in Colab](https://img.shields.io/static/v1?message=Open%20in%20Colab&logo=googlecolab&labelColor=grey&color=blue&logoColor=orange&label=%20)](https://colab.research.google.com/github/Arize-ai/phoenix/blob/main/tutorials/llama_index_search_and_retrieval_tutorial.ipynb) [![Open in GitHub](https://img.shields.io/static/v1?message=Open%20in%20GitHub&logo=github&labelColor=grey&color=blue&logoColor=white&label=%20)](https://github.com/Arize-ai/phoenix/blob/main/tutorials/llama_index_search_and_retrieval_tutorial.ipynb)
375
+
376
+ ![RAG Introspection](https://github.com/Arize-ai/phoenix-assets/blob/main/gifs/corpus_search_and_retrieval.gif?raw=true)
377
+
378
+ Search and retrieval is a critical component of many LLM Applications as it allows you to extend the LLM's capabilities to encompass knowledge about private data. This process is known as RAG (retrieval augmented generation) and often times a vector store is leveraged to store chunks of documents encoded as embeddings so that they can be retrieved at inference time.
379
+
380
+ To help you better understand your RAG application, Phoenix allows you to upload a corpus of your knowledge base along with your LLM application's inferences to help you troubleshoot hard to find bugs with retrieval.
381
+
382
+ ## Structured Data Analysis
383
+
384
+ [![Open in Colab](https://img.shields.io/static/v1?message=Open%20in%20Colab&logo=googlecolab&labelColor=grey&color=blue&logoColor=orange&label=%20)](https://colab.research.google.com/github/Arize-ai/phoenix/blob/main/tutorials/cc_fraud_tutorial.ipynb) [![Open in GitHub](https://img.shields.io/static/v1?message=Open%20in%20GitHub&logo=github&labelColor=grey&color=blue&logoColor=white&label=%20)](https://github.com/Arize-ai/phoenix/blob/main/tutorials/cc_fraud_tutorial.ipynb)
385
+
386
+ Phoenix provides a suite of tools for analyzing structured data. These tools allow you to perform A/B analysis, temporal drift analysis, and more.
387
+
388
+ ![Structured Data Analysis](https://github.com/Arize-ai/phoenix-assets/blob/main/gifs/cc_fraud_drift_10mb.gif?raw=true)
389
+
390
+ ```python
391
+ import pandas as pd
392
+ import phoenix as px
393
+
394
+ # Perform A/B analysis on your training and production datasets
395
+ train_df = pd.read_parquet(
396
+ "http://storage.googleapis.com/arize-assets/phoenix/datasets/structured/credit-card-fraud/credit_card_fraud_train.parquet",
397
+ )
398
+ prod_df = pd.read_parquet(
399
+ "http://storage.googleapis.com/arize-assets/phoenix/datasets/structured/credit-card-fraud/credit_card_fraud_production.parquet",
400
+ )
401
+
402
+ # Describe the data for analysis
403
+ schema = px.Schema(
404
+ prediction_id_column_name="prediction_id",
405
+ prediction_label_column_name="predicted_label",
406
+ prediction_score_column_name="predicted_score",
407
+ actual_label_column_name="actual_label",
408
+ timestamp_column_name="prediction_timestamp",
409
+ feature_column_names=feature_column_names,
410
+ tag_column_names=["age"],
411
+ )
412
+
413
+ # Define your production and training datasets.
414
+ prod_ds = px.Dataset(dataframe=prod_df, schema=schema, name="production")
415
+ train_ds = px.Dataset(dataframe=train_df, schema=schema, name="training")
416
+
417
+ # Launch Phoenix for analysis
418
+ session = px.launch_app(primary=prod_ds, reference=train_ds)
419
+ ```
420
+
421
+ ## Community
422
+
423
+ Join our community to connect with thousands of machine learning practitioners and ML observability enthusiasts.
424
+
425
+ - 🌍 Join our [Slack community](https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q).
426
+ - 💡 Ask questions and provide feedback in the _#phoenix-support_ channel.
427
+ - 🌟 Leave a star on our [GitHub](https://github.com/Arize-ai/phoenix).
428
+ - 🐞 Report bugs with [GitHub Issues](https://github.com/Arize-ai/phoenix/issues).
429
+ - 🐣 Follow us on [twitter](https://twitter.com/ArizePhoenix).
430
+ - 💌️ Sign up for our [mailing list](https://phoenix.arize.com/#updates).
431
+ - 🗺️ Check out our [roadmap](https://github.com/orgs/Arize-ai/projects/45) to see where we're heading next.
432
+ - 🎓 Learn the fundamentals of ML observability with our [introductory](https://arize.com/ml-observability-fundamentals/) and [advanced](https://arize.com/blog-course/) courses.
433
+
434
+ ## Thanks
435
+
436
+ - [UMAP](https://github.com/lmcinnes/umap) For unlocking the ability to visualize and reason about embeddings
437
+ - [HDBSCAN](https://github.com/scikit-learn-contrib/hdbscan) For providing a clustering algorithm to aid in the discovery of drift and performance degradation
438
+
439
+ ## Copyright, Patent, and License
440
+
441
+ Copyright 2023 Arize AI, Inc. All Rights Reserved.
442
+
443
+ Portions of this code are patent protected by one or more U.S. Patents. See [IP_NOTICE](https://github.com/Arize-ai/phoenix/blob/main/IP_NOTICE).
444
+
445
+ This software is licensed under the terms of the Elastic License 2.0 (ELv2). See [LICENSE](https://github.com/Arize-ai/phoenix/blob/main/LICENSE).