arize-phoenix 3.10.0__py3-none-any.whl → 3.11.1__py3-none-any.whl

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.

@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: arize-phoenix
3
- Version: 3.10.0
4
- Summary: ML Observability in your notebook
3
+ Version: 3.11.1
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
7
7
  Project-URL: Source, https://github.com/Arize-ai/phoenix
@@ -4,14 +4,14 @@ phoenix/datetime_utils.py,sha256=D955QLrkgrrSdUM6NyqbCeAu2SMsjhR5rHVQEsVUdng,277
4
4
  phoenix/exceptions.py,sha256=X5k9ipUDfwSCwZB-H5zFJLas86Gf9tAx0W4l5TZxp5k,108
5
5
  phoenix/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
6
6
  phoenix/services.py,sha256=f6AeyKTuOpy9RCcTCjVH3gx5nYZhbTMFOuv1WSUOB5o,4992
7
- phoenix/version.py,sha256=iKJAvc5i0UTDDSSefTGL0Tq-kWQ4S3OJJgvyaQfQNF8,23
7
+ phoenix/version.py,sha256=UuKR3QjWk9sJtn2huDFsPdSgtx1CgiEl2B4BUtVRd58,23
8
8
  phoenix/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  phoenix/core/embedding_dimension.py,sha256=zKGbcvwOXgLf-yrJBpQyKtd-LEOPRKHnUToyAU8Owis,87
10
10
  phoenix/core/model.py,sha256=C-kDATyJEgP-oqYVKOiQM76Ljs66F6VZdT93_b8kTGk,4725
11
11
  phoenix/core/model_schema.py,sha256=lQaTvKS34yurHOJ53YD020uURLfgG3dqKC1NLQftOjA,50222
12
12
  phoenix/core/model_schema_adapter.py,sha256=3GkyzqUST4fYi-Bgs8qAam5hwMCdQRZTDLjZ9Bnzdm4,8268
13
13
  phoenix/core/project.py,sha256=5bitRrQ-aG70k21ht0HUDJZkMl3dpI_HyLmBO7rLB-c,24673
14
- phoenix/core/traces.py,sha256=enZbpGW6Z7huxYhrFEd3x5LV13r24SkA8jl6oZdyh6o,5650
14
+ phoenix/core/traces.py,sha256=OnvOo4epNGMptOF1-O2FQgDV1c9TywQq5yqvj9ph3Mw,2902
15
15
  phoenix/datasets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  phoenix/datasets/dataset.py,sha256=scKVZ7zc6Dpc_ntt-pWhzY-KWqOJEwKePuyNnKSVTGE,30515
17
17
  phoenix/datasets/errors.py,sha256=cGp9vxnw4SewFoWBV3ZGMkhE0Kh73lPIv3Ppz_H_RoA,8261
@@ -103,13 +103,13 @@ phoenix/server/api/types/MimeType.py,sha256=VIUQBqveSctiRFStJjDUdZ85TeKhwNNEosMC
103
103
  phoenix/server/api/types/Model.py,sha256=IFhO2nouLQoMPNhl8vnm7nEXXSpr14CL3ihw8RnVWNY,7826
104
104
  phoenix/server/api/types/NumericRange.py,sha256=afEjgF97Go_OvmjMggbPBt-zGM8IONewAyEiKEHRds0,192
105
105
  phoenix/server/api/types/PerformanceMetric.py,sha256=W92B7OghEOgzFvmY0LCqpgavHaQggTGshdgfD0yqHX4,350
106
- phoenix/server/api/types/Project.py,sha256=EArem8TsGV0PLUS_Vm-z45gY6syzcnJPlY1Iu0FI0eQ,8109
106
+ phoenix/server/api/types/Project.py,sha256=MqzQicNm7IHiJom5IXJvbgnOqCBHZ8k_wGTB5rchtkU,8126
107
107
  phoenix/server/api/types/PromptResponse.py,sha256=Q8HKtpp8GpUOcxPCzZpkkokidDd6u0aZOv_SuPZZd5Q,630
108
108
  phoenix/server/api/types/Retrieval.py,sha256=OhMK2ncjoyp5h1yjKhjlKpoTbQrMHuxmgSFw-AO1rWw,285
109
109
  phoenix/server/api/types/ScalarDriftMetricEnum.py,sha256=IUAcRPpgL41WdoIgK6cNk2Te38SspXGyEs-S1fY23_A,232
110
110
  phoenix/server/api/types/Segments.py,sha256=B6UUWjalZONjWjl_l61A6USPSu15ICXRgzZ4m3vA1yw,2921
111
111
  phoenix/server/api/types/SortDir.py,sha256=OUpXhlCzCxPoXSDkJJygEs9Rw9pMymfaZUG5zPTrw4Y,152
112
- phoenix/server/api/types/Span.py,sha256=mIczY_mMa-g7lOjvA2btAxtsD4lVIHAbxtMx38Hn5q4,12378
112
+ phoenix/server/api/types/Span.py,sha256=1o7DeeR7Ytj7XgXrS9Oy5N7ZjSOMXxEGCINs0sjh6Lc,12291
113
113
  phoenix/server/api/types/TimeSeries.py,sha256=QbLfxHnwYsMsirpq4tx9us6ha7YtAVzK4m8mAL3fMt0,5200
114
114
  phoenix/server/api/types/UMAPPoints.py,sha256=8l9RJXi308qty4MdHb2pBbiU6ZuLbrRRxXNbPhXoxKI,1639
115
115
  phoenix/server/api/types/ValidationResult.py,sha256=pHwdYk4J7SJ5xhlWWHg_6qWkfk4rjOx-bSkGHvkDE3Q,142
@@ -127,7 +127,7 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
127
127
  phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
128
128
  phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
129
129
  phoenix/server/static/index.css,sha256=KKGpx4iwF91VGRm0YN-4cn8oC-oIqC6HecoPf0x3ZM8,1885
130
- phoenix/server/static/index.js,sha256=NTBw2dg0KXyBdHg_1oGbpaKLD1kx1ZzGYMuMJpHIv2U,3175475
130
+ phoenix/server/static/index.js,sha256=OZGKVWu4fPQLtzthHYlixwpbUSsEsOIHzVkb2cFKHD0,3175609
131
131
  phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
132
132
  phoenix/server/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
133
133
  phoenix/server/templates/index.html,sha256=lO2wGA5XsftPg03rw_VcyaYf_4vegtlWbIT5ms4fA_c,1982
@@ -135,11 +135,11 @@ phoenix/session/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
135
135
  phoenix/session/client.py,sha256=9qlybwGGdPHql7n6Mye8feuh5_5AMq34xSajvcPn2yg,5853
136
136
  phoenix/session/data_extractor.py,sha256=0Kf-2mKY_YbYoD2fZkAYpKdFgsXrC3OKQ5d2iZsGgAI,1947
137
137
  phoenix/session/evaluation.py,sha256=YCv1XkWHi7vM_W5V7rorrrAxadv78wuMPeCVJvf5-oE,5444
138
- phoenix/session/session.py,sha256=elU_198oGobkmbAL_nACpzBCYCnCaEbYgja00toU7mc,24472
139
- phoenix/trace/__init__.py,sha256=4d_MqzUIFmlY9WWcFeTONJ4xL5mPGoWZaPM2TJ0ZDBQ,266
138
+ phoenix/session/session.py,sha256=1RV6FBNqNDDrPFYU2qLffmI4RCRKy22KCLZFcH9oqJA,24556
139
+ phoenix/trace/__init__.py,sha256=qMipNV47ahKsOOz8uQpoI4VnNRnjc5uh_0cJpL1ABvY,706
140
140
  phoenix/trace/errors.py,sha256=wB1z8qdPckngdfU-TORToekvg3344oNFAA83_hC2yFY,180
141
141
  phoenix/trace/evaluation_conventions.py,sha256=t8jydM3U0-T5YpiQKRJ3tWdWGlHtzKyttYdw-ddvPOk,1048
142
- phoenix/trace/exporter.py,sha256=O-9Arn-S_B9Me-jy4Qa84y6lvxKNoa8pczrsamPl3_Q,4871
142
+ phoenix/trace/exporter.py,sha256=vh2RO1CpP143HxIX94KV0qks8p1x66RE3Tgf8kcBCCg,4519
143
143
  phoenix/trace/fixtures.py,sha256=HOjuYOB_xtR7JUeLz7WpEroiGj4E5_SxVLSjBYUy8RQ,7055
144
144
  phoenix/trace/otel.py,sha256=mpuj_eOdBUPAcslpxk8XZflb9kkzpMJ8X9acJS8ACPA,15322
145
145
  phoenix/trace/schemas.py,sha256=6PVPnQIIDsWijwCwU19TGKG3xhFCYFY9K_5IqR5dWF4,5904
@@ -147,28 +147,26 @@ phoenix/trace/span_evaluations.py,sha256=T67grfU71iANMM0g6dp2OQ_ZjtkON2viZz95_U9
147
147
  phoenix/trace/span_json_decoder.py,sha256=IAFakPRqSMYxTPKYFMiXYxm7U-FipdN8_xbvapDS0Qc,3131
148
148
  phoenix/trace/span_json_encoder.py,sha256=LKITl8Evuv3Qb1_EPW4Kg4Yu9BU9vyE1WCe8P2rE1-s,1776
149
149
  phoenix/trace/trace_dataset.py,sha256=RpHIfZLbMmULOIb-fKXJkQLhIdC0sJlAOTjlyJppMYA,13776
150
- phoenix/trace/tracer.py,sha256=9V3eFwKd-eAyMZ9ZzX8HyrGZEVlWx0Ni-_v1LG3J1kY,3640
151
150
  phoenix/trace/utils.py,sha256=7LurVGXn245cjj4MJsc7v6jq4DSJkpK6YGBfIaSywuw,1307
152
151
  phoenix/trace/dsl/__init__.py,sha256=WIQIjJg362XD3s50OsPJJ0xbDsGp41bSv7vDllLrPuA,144
153
152
  phoenix/trace/dsl/filter.py,sha256=paLpcSMnHdgCfcvcroaqOoCe2retAZ5ocp_5cNTnv9s,14167
154
153
  phoenix/trace/dsl/helpers.py,sha256=CP6WaJpP7_WdI1Yoip7tDWcYDXZRg6xgNBRS2gojjMc,1728
155
154
  phoenix/trace/dsl/missing.py,sha256=BWPOHr2_tBkPDgVeq8GVXXVbNbJiBelu4NtwHBg6mTE,1435
156
155
  phoenix/trace/dsl/query.py,sha256=k0guhWBEo6L7ZJH5FJs2-iGSnWXdUUqu09gd-8M4CGg,14783
157
- phoenix/trace/langchain/__init__.py,sha256=aTKMFmEOgjx_6dnyplalgYi7PQnetablwrwpcUZqcGE,764
158
- phoenix/trace/langchain/instrumentor.py,sha256=95jtReVDtpymfK8eUGybevBJQWpbMnL9dg6XBgXmOQM,1420
159
- phoenix/trace/langchain/tracer.py,sha256=gq5RDgFexw-4qpwf701hGsZGcT6XdPjRIbI5aZdBI2I,1425
156
+ phoenix/trace/langchain/__init__.py,sha256=F37GfD1pd5Kuw7R7iRUM1zXXpO8xEcycNZh5dwqBXNk,109
157
+ phoenix/trace/langchain/instrumentor.py,sha256=iy4seCcuTZutNmq0HFmdjIEFfUlg0zDAYXKPY8ApEwQ,1302
160
158
  phoenix/trace/llama_index/__init__.py,sha256=4fpR5702Qh2t5TaXIx584EkA-BveCPftXPOKvI0Oi3I,105
161
- phoenix/trace/llama_index/callback.py,sha256=EWHcg2IckOWMVUi1n1CmcDXRoMDoLTgGZ1LkqP2_fCg,4499
159
+ phoenix/trace/llama_index/callback.py,sha256=1U9-Br1aQHVNJH9geFeSfwa3S4lxQLvxXm_5Sv0oSaM,4381
162
160
  phoenix/trace/openai/__init__.py,sha256=J3G0uqCxGdksUpaQVHds_Egv2drvh8UEqoLjiQAOveg,79
163
- phoenix/trace/openai/instrumentor.py,sha256=OJGwuLXVChFmMcuojQrfBFsXvx4YsAsGhgwtgLfEX4c,1318
161
+ phoenix/trace/openai/instrumentor.py,sha256=Z7iN3lV6bS6lVEohQmJyaEApRVszcrVy0AffG-_7Ju4,1200
164
162
  phoenix/trace/v1/__init__.py,sha256=-IbAD0ruESMjvQLvGAg9CTfjBUATFDx1OXseDPis6-0,88
165
163
  phoenix/trace/v1/evaluation_pb2.py,sha256=8sXvv2BW_vqD30MOMbmkeE2zpmm7ncik21kl3e-HzeQ,2254
166
164
  phoenix/trace/v1/evaluation_pb2.pyi,sha256=cCbbx06gwQmaH14s3J1X25TtaARh-k1abbxQdQCXGm8,4500
167
165
  phoenix/utilities/__init__.py,sha256=8w1Ivw0KO9YKWrhcdnO73cSVqP9VHAp0pSfsi_oDiuQ,672
168
166
  phoenix/utilities/error_handling.py,sha256=7b5rpGFj9EWZ8yrZK1IHvxB89suWk3lggDayUQcvZds,1946
169
167
  phoenix/utilities/logging.py,sha256=lDXd6EGaamBNcQxL4vP1au9-i_SXe0OraUDiJOcszSw,222
170
- arize_phoenix-3.10.0.dist-info/METADATA,sha256=ZQfN5x4w8Pd7EdgjWDKFr_2JnQjl8MSr-ZpRx-OoeJ8,29082
171
- arize_phoenix-3.10.0.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87
172
- arize_phoenix-3.10.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
173
- arize_phoenix-3.10.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
174
- arize_phoenix-3.10.0.dist-info/RECORD,,
168
+ arize_phoenix-3.11.1.dist-info/METADATA,sha256=CxX1LnZOSawfGoh1H2Q222Rw7PWanWDpxUUzbAKWMAo,29080
169
+ arize_phoenix-3.11.1.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87
170
+ arize_phoenix-3.11.1.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
171
+ arize_phoenix-3.11.1.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
172
+ arize_phoenix-3.11.1.dist-info/RECORD,,
phoenix/core/traces.py CHANGED
@@ -1,10 +1,9 @@
1
1
  import weakref
2
2
  from collections import defaultdict
3
- from datetime import datetime
4
3
  from queue import SimpleQueue
5
4
  from threading import RLock, Thread
6
5
  from types import MethodType
7
- from typing import DefaultDict, Iterable, Iterator, Optional, Tuple, Union
6
+ from typing import DefaultDict, Iterator, Optional, Tuple, Union
8
7
 
9
8
  from typing_extensions import assert_never
10
9
 
@@ -13,10 +12,9 @@ from phoenix.core.project import (
13
12
  DEFAULT_PROJECT_NAME,
14
13
  END_OF_QUEUE,
15
14
  Project,
16
- WrappedSpan,
17
15
  _ProjectName,
18
16
  )
19
- from phoenix.trace.schemas import Span, SpanID, TraceID
17
+ from phoenix.trace.schemas import Span
20
18
 
21
19
  _SpanItem = Tuple[Span, _ProjectName]
22
20
  _EvalItem = Tuple[pb.Evaluation, _ProjectName]
@@ -45,76 +43,6 @@ class Traces:
45
43
  projects = tuple(self._projects.items())
46
44
  yield from projects
47
45
 
48
- def get_trace(self, trace_id: TraceID) -> Iterator[WrappedSpan]:
49
- with self._lock:
50
- if not (project := self._projects.get(DEFAULT_PROJECT_NAME)):
51
- return
52
- yield from project.get_trace(trace_id)
53
-
54
- def get_spans(
55
- self,
56
- start_time: Optional[datetime] = None,
57
- stop_time: Optional[datetime] = None,
58
- root_spans_only: Optional[bool] = False,
59
- span_ids: Optional[Iterable[SpanID]] = None,
60
- ) -> Iterator[WrappedSpan]:
61
- with self._lock:
62
- if not (project := self._projects.get(DEFAULT_PROJECT_NAME)):
63
- return
64
- yield from project.get_spans(start_time, stop_time, root_spans_only, span_ids)
65
-
66
- def get_num_documents(self, span_id: SpanID) -> int:
67
- with self._lock:
68
- if not (project := self._projects.get(DEFAULT_PROJECT_NAME)):
69
- return 0
70
- return project.get_num_documents(span_id)
71
-
72
- def root_span_latency_ms_quantiles(self, *probabilities: float) -> Iterator[Optional[float]]:
73
- """Root span latency quantiles in milliseconds"""
74
- with self._lock:
75
- if not (project := self._projects.get(DEFAULT_PROJECT_NAME)):
76
- for _ in probabilities:
77
- yield None
78
- return
79
- for probability in probabilities:
80
- yield project.root_span_latency_ms_quantiles(probability)
81
-
82
- def get_descendant_spans(self, span_id: SpanID) -> Iterator[WrappedSpan]:
83
- with self._lock:
84
- if not (project := self._projects.get(DEFAULT_PROJECT_NAME)):
85
- return
86
- yield from project.get_descendant_spans(span_id)
87
-
88
- @property
89
- def last_updated_at(self) -> Optional[datetime]:
90
- with self._lock:
91
- if not (project := self._projects.get(DEFAULT_PROJECT_NAME)):
92
- return None
93
- return project.last_updated_at
94
-
95
- @property
96
- def span_count(self) -> int:
97
- """Total number of spans"""
98
- project_name = DEFAULT_PROJECT_NAME
99
- with self._lock:
100
- if not (project := self._projects.get(project_name)):
101
- return 0
102
- return project.span_count()
103
-
104
- @property
105
- def token_count_total(self) -> int:
106
- with self._lock:
107
- if not (project := self._projects.get(DEFAULT_PROJECT_NAME)):
108
- return 0
109
- return project.token_count_total
110
-
111
- @property
112
- def right_open_time_range(self) -> Tuple[Optional[datetime], Optional[datetime]]:
113
- with self._lock:
114
- if not (project := self._projects.get(DEFAULT_PROJECT_NAME)):
115
- return None, None
116
- return project.right_open_time_range
117
-
118
46
  def put(
119
47
  self,
120
48
  item: Union[Span, pb.Evaluation],
@@ -112,7 +112,7 @@ class Project(Node):
112
112
  spans = filter(predicate, spans)
113
113
  if sort:
114
114
  spans = sort(spans, evals=project)
115
- data = list(map(to_gql_span, spans))
115
+ data = [to_gql_span(span, project) for span in spans]
116
116
  return connection_from_list(data=data, args=args)
117
117
 
118
118
  @strawberry.field(
@@ -10,7 +10,7 @@ from strawberry import ID, UNSET
10
10
  from strawberry.types import Info
11
11
 
12
12
  import phoenix.trace.schemas as trace_schema
13
- from phoenix.core.project import DEFAULT_PROJECT_NAME, WrappedSpan
13
+ from phoenix.core.project import DEFAULT_PROJECT_NAME, Project, WrappedSpan
14
14
  from phoenix.metrics.retrieval_metrics import RetrievalMetrics
15
15
  from phoenix.server.api.context import Context
16
16
  from phoenix.server.api.types.DocumentRetrievalMetrics import DocumentRetrievalMetrics
@@ -95,6 +95,7 @@ class SpanEvent:
95
95
 
96
96
  @strawberry.type
97
97
  class Span:
98
+ project: strawberry.Private[Project]
98
99
  name: str
99
100
  status_code: SpanStatusCode
100
101
  status_message: str
@@ -185,14 +186,10 @@ class Span:
185
186
  info: Info[Context, None],
186
187
  evaluation_name: Optional[str] = UNSET,
187
188
  ) -> List[DocumentRetrievalMetrics]:
188
- if (
189
- not self.num_documents
190
- or not (traces := info.context.traces)
191
- or not (project := traces.get_project(DEFAULT_PROJECT_NAME))
192
- ):
189
+ if not self.num_documents:
193
190
  return []
194
191
  span_id = SpanID(str(self.context.span_id))
195
- all_document_evaluation_names = project.get_document_evaluation_names(span_id)
192
+ all_document_evaluation_names = self.project.get_document_evaluation_names(span_id)
196
193
  if not all_document_evaluation_names:
197
194
  return []
198
195
  if evaluation_name is UNSET:
@@ -203,7 +200,7 @@ class Span:
203
200
  evaluation_names = [evaluation_name]
204
201
  retrieval_metrics = []
205
202
  for name in evaluation_names:
206
- evaluation_scores = project.get_document_evaluation_scores(
203
+ evaluation_scores = self.project.get_document_evaluation_scores(
207
204
  span_id=span_id,
208
205
  evaluation_name=name,
209
206
  num_documents=self.num_documents,
@@ -223,20 +220,20 @@ class Span:
223
220
  self,
224
221
  info: Info[Context, None],
225
222
  ) -> List["Span"]:
226
- if (traces := info.context.traces) is None:
227
- return []
228
223
  return [
229
- to_gql_span(span) for span in traces.get_descendant_spans(SpanID(self.context.span_id))
224
+ to_gql_span(span, self.project)
225
+ for span in self.project.get_descendant_spans(SpanID(self.context.span_id))
230
226
  ]
231
227
 
232
228
 
233
- def to_gql_span(span: WrappedSpan) -> "Span":
229
+ def to_gql_span(span: WrappedSpan, project: Project) -> "Span":
234
230
  events: List[SpanEvent] = list(map(SpanEvent.from_event, span.events))
235
231
  input_value = cast(Optional[str], span.attributes.get(INPUT_VALUE))
236
232
  output_value = cast(Optional[str], span.attributes.get(OUTPUT_VALUE))
237
233
  retrieval_documents = span.attributes.get(RETRIEVAL_DOCUMENTS)
238
234
  num_documents = len(retrieval_documents) if isinstance(retrieval_documents, Sized) else None
239
235
  return Span(
236
+ project=project,
240
237
  name=span.name,
241
238
  status_code=SpanStatusCode(span.status_code),
242
239
  status_message=span.status_message,