arize-phoenix 3.16.2__py3-none-any.whl → 3.17.0__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,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: arize-phoenix
3
- Version: 3.16.2
3
+ Version: 3.17.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
@@ -28,7 +28,7 @@ Requires-Dist: opentelemetry-exporter-otlp
28
28
  Requires-Dist: opentelemetry-proto
29
29
  Requires-Dist: opentelemetry-sdk
30
30
  Requires-Dist: pandas
31
- Requires-Dist: protobuf<5.0,>=3.20
31
+ Requires-Dist: protobuf<6.0,>=3.20
32
32
  Requires-Dist: psutil
33
33
  Requires-Dist: pyarrow
34
34
  Requires-Dist: requests
@@ -4,7 +4,7 @@ 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=6An59m8khxMeeR51SwvjJubBK8eqW_S7vJrujMumRKc,23
7
+ phoenix/version.py,sha256=F32Zg3huAZMeOvWPn4qsABGOLbZUEOYFrRV1BSJ2_8k,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
@@ -75,7 +75,7 @@ phoenix/server/api/input_types/SpanSort.py,sha256=3ken7KaDUwoZfhaSiP9QRhkNPgGrCY
75
75
  phoenix/server/api/input_types/TimeRange.py,sha256=yzx-gxj8mDeGLft1FzU_x1MVEgIG5Pt6-f8PUVDgipQ,522
76
76
  phoenix/server/api/input_types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
77
  phoenix/server/api/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
- phoenix/server/api/routers/evaluation_handler.py,sha256=IkVKe2CMEaHNb_k_eGq1PWBURfbhcg0KjI7m0Eh-9wc,3949
78
+ phoenix/server/api/routers/evaluation_handler.py,sha256=U7poPu9ezEEL5KEWXM-SX9LdvADpZiay1p6h4VAs08A,4058
79
79
  phoenix/server/api/routers/span_handler.py,sha256=IM4eiQ7GMU7JVyf0oMbrzEcItVudLy_CeYaWcwHOby4,2387
80
80
  phoenix/server/api/routers/trace_handler.py,sha256=0Y9QlePySJZyhKJLWM-m1e837HMZm5QcKR-iXshQdG4,2413
81
81
  phoenix/server/api/routers/utils.py,sha256=M41BoH-fl37izhRuN2aX7lWm7jOC20A_3uClv9TVUUY,583
@@ -110,7 +110,7 @@ phoenix/server/api/types/Retrieval.py,sha256=OhMK2ncjoyp5h1yjKhjlKpoTbQrMHuxmgSF
110
110
  phoenix/server/api/types/ScalarDriftMetricEnum.py,sha256=IUAcRPpgL41WdoIgK6cNk2Te38SspXGyEs-S1fY23_A,232
111
111
  phoenix/server/api/types/Segments.py,sha256=B6UUWjalZONjWjl_l61A6USPSu15ICXRgzZ4m3vA1yw,2921
112
112
  phoenix/server/api/types/SortDir.py,sha256=OUpXhlCzCxPoXSDkJJygEs9Rw9pMymfaZUG5zPTrw4Y,152
113
- phoenix/server/api/types/Span.py,sha256=SYcDsplqw4HcnK5sjCP6BpyL5Gh83NrQdHjfP-UxYsc,12731
113
+ phoenix/server/api/types/Span.py,sha256=mzqxbh-R6C_ax8jAL6IIjJytRtivo7XnkFTPxJISMzw,12252
114
114
  phoenix/server/api/types/TimeSeries.py,sha256=QbLfxHnwYsMsirpq4tx9us6ha7YtAVzK4m8mAL3fMt0,5200
115
115
  phoenix/server/api/types/UMAPPoints.py,sha256=8l9RJXi308qty4MdHb2pBbiU6ZuLbrRRxXNbPhXoxKI,1639
116
116
  phoenix/server/api/types/ValidationResult.py,sha256=pHwdYk4J7SJ5xhlWWHg_6qWkfk4rjOx-bSkGHvkDE3Q,142
@@ -157,7 +157,7 @@ phoenix/trace/dsl/__init__.py,sha256=WIQIjJg362XD3s50OsPJJ0xbDsGp41bSv7vDllLrPuA
157
157
  phoenix/trace/dsl/filter.py,sha256=paLpcSMnHdgCfcvcroaqOoCe2retAZ5ocp_5cNTnv9s,14167
158
158
  phoenix/trace/dsl/helpers.py,sha256=urPNmk_D2ZpoKxYWS5DQsQt0nb38O0CoG3wNjOit-yM,2610
159
159
  phoenix/trace/dsl/missing.py,sha256=BWPOHr2_tBkPDgVeq8GVXXVbNbJiBelu4NtwHBg6mTE,1435
160
- phoenix/trace/dsl/query.py,sha256=k0guhWBEo6L7ZJH5FJs2-iGSnWXdUUqu09gd-8M4CGg,14783
160
+ phoenix/trace/dsl/query.py,sha256=M-ihu9n9JrW-pn1iUW2WRTO1FqQ6Cce_BGjazK8ddKM,14788
161
161
  phoenix/trace/langchain/__init__.py,sha256=F37GfD1pd5Kuw7R7iRUM1zXXpO8xEcycNZh5dwqBXNk,109
162
162
  phoenix/trace/langchain/instrumentor.py,sha256=isW3KRRP55t3JeaipAJ_aS7N_3HtwScPCO67ymSLr0Y,1372
163
163
  phoenix/trace/llama_index/__init__.py,sha256=4fpR5702Qh2t5TaXIx584EkA-BveCPftXPOKvI0Oi3I,105
@@ -172,8 +172,8 @@ phoenix/utilities/error_handling.py,sha256=7b5rpGFj9EWZ8yrZK1IHvxB89suWk3lggDayU
172
172
  phoenix/utilities/logging.py,sha256=lDXd6EGaamBNcQxL4vP1au9-i_SXe0OraUDiJOcszSw,222
173
173
  phoenix/utilities/project.py,sha256=qWsvKnG1oKhOFUowXf9qiOL2ia7jaFe_ijFFHEt8GJo,431
174
174
  phoenix/utilities/span_store.py,sha256=13UK0rE4wQd70yl___WsDRnH0ru-xErng9_Ml7zfEwE,978
175
- arize_phoenix-3.16.2.dist-info/METADATA,sha256=woqWRuz22Oi3v7sZupUCnEuztlm4ahUYgjEwJADYOwM,29287
176
- arize_phoenix-3.16.2.dist-info/WHEEL,sha256=bq9SyP5NxIRA9EpQgMCd-9RmPHWvbH-4lTDGwxgIR64,87
177
- arize_phoenix-3.16.2.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
178
- arize_phoenix-3.16.2.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
179
- arize_phoenix-3.16.2.dist-info/RECORD,,
175
+ arize_phoenix-3.17.0.dist-info/METADATA,sha256=Isl2L7VzV0zwhr9508XMetyFJhsonEIy1wSwsr6gP20,29287
176
+ arize_phoenix-3.17.0.dist-info/WHEEL,sha256=bq9SyP5NxIRA9EpQgMCd-9RmPHWvbH-4lTDGwxgIR64,87
177
+ arize_phoenix-3.17.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
178
+ arize_phoenix-3.17.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
179
+ arize_phoenix-3.17.0.dist-info/RECORD,,
@@ -29,7 +29,7 @@ class EvaluationHandler(HTTPEndpoint):
29
29
  content_type = request.headers.get("content-type")
30
30
  project_name = request.headers.get("project-name", DEFAULT_PROJECT_NAME)
31
31
  if content_type == "application/x-pandas-arrow":
32
- return await self._process_pyarrow(request)
32
+ return await self._process_pyarrow(request, project_name)
33
33
  if content_type != "application/x-protobuf":
34
34
  return Response(
35
35
  content="Unsupported content type",
@@ -81,7 +81,7 @@ class EvaluationHandler(HTTPEndpoint):
81
81
  media_type="application/x-pandas-arrow",
82
82
  )
83
83
 
84
- async def _process_pyarrow(self, request: Request) -> Response:
84
+ async def _process_pyarrow(self, request: Request, project_name: str) -> Response:
85
85
  body = await request.body()
86
86
  try:
87
87
  reader = pa.ipc.open_stream(body)
@@ -101,9 +101,10 @@ class EvaluationHandler(HTTPEndpoint):
101
101
  background=BackgroundTask(
102
102
  self._add_evaluations,
103
103
  evaluations,
104
+ project_name,
104
105
  )
105
106
  )
106
107
 
107
- async def _add_evaluations(self, evaluations: Evaluations) -> None:
108
+ async def _add_evaluations(self, evaluations: Evaluations, project_name: str) -> None:
108
109
  for evaluation in encode_evaluations(evaluations):
109
- self.traces.put(evaluation)
110
+ self.traces.put(evaluation, project_name=project_name)
@@ -11,7 +11,6 @@ from strawberry import ID, UNSET
11
11
  from strawberry.types import Info
12
12
 
13
13
  import phoenix.trace.schemas as trace_schema
14
- from phoenix.config import DEFAULT_PROJECT_NAME
15
14
  from phoenix.core.project import Project, WrappedSpan
16
15
  from phoenix.metrics.retrieval_metrics import RetrievalMetrics
17
16
  from phoenix.server.api.context import Context
@@ -144,18 +143,11 @@ class Span:
144
143
  "an LLM, an evaluation may assess the helpfulness of its response with "
145
144
  "respect to its input."
146
145
  ) # type: ignore
147
- def span_evaluations(
148
- self,
149
- info: Info[Context, None],
150
- ) -> List[SpanEvaluation]:
151
- if not (traces := info.context.traces) or not (
152
- project := traces.get_project(DEFAULT_PROJECT_NAME)
153
- ):
154
- return []
146
+ def span_evaluations(self) -> List[SpanEvaluation]:
155
147
  span_id = SpanID(str(self.context.span_id))
156
148
  return [
157
149
  SpanEvaluation.from_pb_evaluation(evaluation)
158
- for evaluation in project.get_evaluations_by_span_id(span_id)
150
+ for evaluation in self.project.get_evaluations_by_span_id(span_id)
159
151
  ]
160
152
 
161
153
  @strawberry.field(
@@ -166,18 +158,11 @@ class Span:
166
158
  "a list, and each evaluation is identified by its document's (zero-based) "
167
159
  "index in that list."
168
160
  ) # type: ignore
169
- def document_evaluations(
170
- self,
171
- info: Info[Context, None],
172
- ) -> List[DocumentEvaluation]:
173
- if not (traces := info.context.traces) or not (
174
- project := traces.get_project(DEFAULT_PROJECT_NAME)
175
- ):
176
- return []
161
+ def document_evaluations(self) -> List[DocumentEvaluation]:
177
162
  span_id = SpanID(str(self.context.span_id))
178
163
  return [
179
164
  DocumentEvaluation.from_pb_evaluation(evaluation)
180
- for evaluation in project.get_document_evaluations_by_span_id(span_id)
165
+ for evaluation in self.project.get_document_evaluations_by_span_id(span_id)
181
166
  ]
182
167
 
183
168
  @strawberry.field(
@@ -185,7 +170,6 @@ class Span:
185
170
  ) # type: ignore
186
171
  def document_retrieval_metrics(
187
172
  self,
188
- info: Info[Context, None],
189
173
  evaluation_name: Optional[str] = UNSET,
190
174
  ) -> List[DocumentRetrievalMetrics]:
191
175
  if not self.num_documents:
@@ -14,6 +14,7 @@ from typing import (
14
14
  Mapping,
15
15
  Optional,
16
16
  Sequence,
17
+ Sized,
17
18
  Tuple,
18
19
  cast,
19
20
  )
@@ -125,7 +126,7 @@ class Explosion(Projection):
125
126
  return replace(self, primary_index_key=primary_index_key)
126
127
 
127
128
  def __call__(self, span: Span) -> Iterator[Dict[str, Any]]:
128
- if not isinstance(seq := self.value(span), Sequence):
129
+ if not isinstance(seq := self.value(span), Iterable):
129
130
  return
130
131
  has_mapping = False
131
132
  for item in seq:
@@ -193,7 +194,7 @@ class Concatenation(Projection):
193
194
  return replace(self, separator=separator)
194
195
 
195
196
  def __call__(self, span: Span) -> Iterator[Tuple[str, str]]:
196
- if not isinstance(seq := self.value(span), Sequence):
197
+ if not isinstance(seq := self.value(span), Iterable):
197
198
  return
198
199
  if not self.kwargs:
199
200
  yield self.key, self.separator.join(map(str, seq))
@@ -282,12 +283,12 @@ class SpanQuery:
282
283
  spans = filter(self._filter, spans)
283
284
  if self._explode:
284
285
  spans = filter(
285
- lambda span: (isinstance(seq := self._explode.value(span), Sequence) and len(seq)),
286
+ lambda span: (isinstance(seq := self._explode.value(span), Sized) and len(seq)),
286
287
  spans,
287
288
  )
288
289
  if self._concat:
289
290
  spans = filter(
290
- lambda span: (isinstance(seq := self._concat.value(span), Sequence) and len(seq)),
291
+ lambda span: (isinstance(seq := self._concat.value(span), Sized) and len(seq)),
291
292
  spans,
292
293
  )
293
294
  if not (self._select or self._explode or self._concat):
phoenix/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "3.16.2"
1
+ __version__ = "3.17.0"