arize-phoenix 2.3.0__py3-none-any.whl → 2.4.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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: arize-phoenix
3
- Version: 2.3.0
3
+ Version: 2.4.1
4
4
  Summary: ML Observability in your notebook
5
5
  Project-URL: Documentation, https://docs.arize.com/phoenix/
6
6
  Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
@@ -1,10 +1,10 @@
1
1
  phoenix/__init__.py,sha256=EEh0vZGRQS8686h34GQ64OjQoZ7neKYO_iO5j6Oa9Jw,1402
2
- phoenix/config.py,sha256=ErvGg22SSiuqPJtIX1WZE5KcM2lt6XOGZ__HwRg3JqA,2390
2
+ phoenix/config.py,sha256=DtifiPpPM9y0xqSunzeKCBXFPQHcqQs7Zw7M5ezStKQ,2444
3
3
  phoenix/datetime_utils.py,sha256=D955QLrkgrrSdUM6NyqbCeAu2SMsjhR5rHVQEsVUdng,2773
4
4
  phoenix/exceptions.py,sha256=igIWGAg3m8jm5YwQDeCY1p8ml_60A7zaGVXJ1yZhY9s,44
5
5
  phoenix/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
6
6
  phoenix/services.py,sha256=slL4Uu___QQSKEssgD738-WAld-kzVQnpW92uKLxV4E,4886
7
- phoenix/version.py,sha256=CpK8IH_dCUAwg9tqv7zm9FxbBFkxCnED1JUiRe7cftU,22
7
+ phoenix/version.py,sha256=LgDSW5laOqA_7i2VW0cZ9QumZREigUxs3ZCBzJ1EG0o,22
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/evals.py,sha256=OrHeYlh804rpcZIXTA6kan2mzSZMfgpphNNQdPMpNoM,7597
@@ -20,21 +20,21 @@ phoenix/datasets/schema.py,sha256=bF1d2Md6NyqQZuC4Ym5A52f2_IcazkyxGFZ11HPqSg0,66
20
20
  phoenix/datasets/validation.py,sha256=dZ9lCFUV0EY7HCkQkQBrs-GLAEIZdpOqUxwD5l4dp88,8294
21
21
  phoenix/experimental/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  phoenix/experimental/evals/__init__.py,sha256=q96YKLMt2GJD9zL8sjugvWx1INfw40Wa7E9OsHo2S4s,1885
23
- phoenix/experimental/evals/evaluators.py,sha256=5StEY2pAUWg2AmZSm6egPulMyBgFN3no6o-kaF_Kr5E,15778
23
+ phoenix/experimental/evals/evaluators.py,sha256=b-nudXEa8A9DF0HuiBQSvMmLvOOxaT-2k3UN8moQ-zE,15852
24
24
  phoenix/experimental/evals/retrievals.py,sha256=o3fqrsYbYZjyGj_jWkN_9VQVyXjLkDKDw5Ws7l8bwdI,3828
25
25
  phoenix/experimental/evals/functions/__init__.py,sha256=NNd0-_cmIopdV7vm3rspjfgM726qoQJ4DPq_vqbnaxQ,180
26
- phoenix/experimental/evals/functions/classify.py,sha256=nwGAKEmS9WF5A2QzaBUYlGdjcfpS7pa-QBsrT-OYLVk,18741
26
+ phoenix/experimental/evals/functions/classify.py,sha256=pcAJjkSGiE6zusOMvfcSCnNNjabs7O-Cs0C0h-6Y76Y,18985
27
27
  phoenix/experimental/evals/functions/executor.py,sha256=bM7PI2rcPukQQzZ2rWqN_-Kfo_a935YJj0bh1Red8Ps,13406
28
- phoenix/experimental/evals/functions/generate.py,sha256=sdr6TeXn5JLEKM0NqYtvq01Lq48Q7uatb0fsq5zQgVY,5310
28
+ phoenix/experimental/evals/functions/generate.py,sha256=E_yt3Td_LpNWQOSR-jYCxNG7vVfe7fxX9WYeBhApMzc,5412
29
29
  phoenix/experimental/evals/functions/processing.py,sha256=F4xtLsulLV4a8CkuLldRddsCim75dSTIShEJUYN6I6w,1823
30
30
  phoenix/experimental/evals/models/__init__.py,sha256=j1N7DhiOPbcaemtVBONcQ0miNnGQwEXz4u3P3Vwe6-4,320
31
31
  phoenix/experimental/evals/models/anthropic.py,sha256=Tcv8R-vTyY8sLAv1wIHeZdMCBtqhyayqMPJXRDc7blI,6267
32
- phoenix/experimental/evals/models/base.py,sha256=aSE3Al3MsLvzNKuN2e-z6O-RB5mgpisH4UQqwNQcqp0,7734
32
+ phoenix/experimental/evals/models/base.py,sha256=412CN7R3LcUSRd8dJjz6xwRXZqBBRq5HK5MNP4RVhHA,7785
33
33
  phoenix/experimental/evals/models/bedrock.py,sha256=CRPmBuSLc_nRnKKWLHhGMxdWEISIKUJM1tzIlOQ_qWM,7927
34
34
  phoenix/experimental/evals/models/litellm.py,sha256=YvlYeAV-gG0IxFoVJ_OuRYwVwQ0LEtYBuWmp-uPGrNU,4368
35
- phoenix/experimental/evals/models/openai.py,sha256=Kl2uES3HRcZGFqblfBQZ6D1BpDffuLZDAqVTjhrSXXQ,17101
35
+ phoenix/experimental/evals/models/openai.py,sha256=EcTkv1DqdrtMNhyfiUTzD5gDbEZVUI_zQyrDgsnuYig,17168
36
36
  phoenix/experimental/evals/models/rate_limiters.py,sha256=5GVN0RQKt36Przg3-9jLgocRmyg-tbeO-cdbuLIx89w,10160
37
- phoenix/experimental/evals/models/vertex.py,sha256=nwTIjVn4gGFfoKfGqUGwPD9GLJaBM4HLXDnMNs9hSrw,5407
37
+ phoenix/experimental/evals/models/vertex.py,sha256=LevfIUl85ZpwfKMcpck4Tt057Od89VO1Iw_wJSgFq-k,6417
38
38
  phoenix/experimental/evals/models/vertexai.py,sha256=NfBpQq0l7XzP-wDEDsK27IRiQBzA1GXEdfwlAf8leX4,5609
39
39
  phoenix/experimental/evals/templates/__init__.py,sha256=GSJSoWJ4jwyoUANniidmWMUtXQhNQYbTJbfFqCvuYuo,1470
40
40
  phoenix/experimental/evals/templates/default_templates.py,sha256=RgiSD6xnN8UO5tCHsounk44XqqHuAX1hXQL3Z3Mw99g,21208
@@ -125,21 +125,21 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
125
125
  phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
126
126
  phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
127
127
  phoenix/server/static/index.css,sha256=KKGpx4iwF91VGRm0YN-4cn8oC-oIqC6HecoPf0x3ZM8,1885
128
- phoenix/server/static/index.js,sha256=gP89MKs13uK-k9A_hQFQM6E03GPltzNoEFgaAHaAgBs,3257264
128
+ phoenix/server/static/index.js,sha256=fmq95YEmj2bkWIA2x96bf7iV5ZisW1k8EtwAIsy4jD4,3259870
129
129
  phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
130
130
  phoenix/server/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
131
  phoenix/server/templates/index.html,sha256=_ZVGz2JYDgJjCL2kxSbVjN1qY7drKYerVIXNfmcW30k,1765
132
132
  phoenix/session/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
133
- phoenix/session/evaluation.py,sha256=88wSWlUi71RDHZksRE3hG91GHq8rMRYXirkyA3IbM8Y,4681
133
+ phoenix/session/evaluation.py,sha256=s5OivScAMSj8qfU4IexpmbyKvcGBj_nt-GP_13_o-iY,4843
134
134
  phoenix/session/session.py,sha256=WL0lUGnBp9ZJHOwkLPkf32QvmHOThC5VIERa4SP0o_E,17815
135
- phoenix/trace/__init__.py,sha256=lnuxATMemAqjURYqOfIo_HyCo5oIWIVTy98XAsiS1d8,215
135
+ phoenix/trace/__init__.py,sha256=4d_MqzUIFmlY9WWcFeTONJ4xL5mPGoWZaPM2TJ0ZDBQ,266
136
136
  phoenix/trace/evaluation_conventions.py,sha256=t8jydM3U0-T5YpiQKRJ3tWdWGlHtzKyttYdw-ddvPOk,1048
137
137
  phoenix/trace/exporter.py,sha256=z3xrGJhIRh7XMy4Q1FkR3KmFZym-GX0XxLTZ6eSnN0Q,4347
138
138
  phoenix/trace/fixtures.py,sha256=lFuhPe-di54BmCT-RxS95m3e2-z1YBOo8CxsqYSgDD8,6341
139
139
  phoenix/trace/otel.py,sha256=Efc6S0IuvI-NEJ_Mv1VWEzQS94-lR_6nJ3ecTzwmyQ4,13933
140
140
  phoenix/trace/schemas.py,sha256=m1wVlYFT6qL3FovD3TtTYsEgN6OHvv52gNdJkoPCmuY,5400
141
141
  phoenix/trace/semantic_conventions.py,sha256=u6NG85ZhbreriZr8cqJaddldM_jUcew7JilszY7JUk8,4652
142
- phoenix/trace/span_evaluations.py,sha256=9RTJ8BFhXDJNtqErWRlMj65FG7wJiI41YTgB7vYLqcY,8429
142
+ phoenix/trace/span_evaluations.py,sha256=k6bwsa040AihvxTpve33MpkPN3gT8z_kSROpmJwOeCs,12579
143
143
  phoenix/trace/span_json_decoder.py,sha256=Xv-0uCsHgwzQb0dqTa7CuuDeXAPaXjQICyCFK3ZQaSs,3089
144
144
  phoenix/trace/span_json_encoder.py,sha256=C5y7rkyOcV08oJC5t8TZqVxsKCZMJKad7bBQzAgLoDs,1763
145
145
  phoenix/trace/trace_dataset.py,sha256=nFclw-wuY_q7hqpqe7fEVVH67yAku9qJ5EiJ61lz0WM,8691
@@ -154,7 +154,7 @@ phoenix/trace/langchain/__init__.py,sha256=vAjrmrreetV7L5IL8VH_9efG9VJunJTgT0iKy
154
154
  phoenix/trace/langchain/instrumentor.py,sha256=HkNKbFNclTYjRXBM8qU4qvZHdyw06J9bhwgE7JnqbNI,1323
155
155
  phoenix/trace/langchain/tracer.py,sha256=1Oz3orSDpZX1pZKwtZbeM_f9tiAhQb7Of8ARjRlKVQY,16827
156
156
  phoenix/trace/llama_index/__init__.py,sha256=wCcQgD9CG5TA8i-1XsSed4ZzwHTUmqZwegQAV_FqEng,178
157
- phoenix/trace/llama_index/callback.py,sha256=YW3qqzWZUEs9aiDx-2628Eae_rct_Yb-DDzT9dV_xiI,27061
157
+ phoenix/trace/llama_index/callback.py,sha256=ARi33dYQtBsY3_h9eE5ZLoM7OXQfYtoZ1--571zILgg,27570
158
158
  phoenix/trace/llama_index/debug_callback.py,sha256=SKToD9q_QADSGTJ5lhilqRVKaUnUSRXUvURCzN4by2U,1367
159
159
  phoenix/trace/llama_index/streaming.py,sha256=5cTtr8evvcEAB88Xb4ih3WEw0xAF4x5W9PehUX9l5_0,3258
160
160
  phoenix/trace/openai/__init__.py,sha256=J3G0uqCxGdksUpaQVHds_Egv2drvh8UEqoLjiQAOveg,79
@@ -165,8 +165,8 @@ phoenix/trace/v1/evaluation_pb2.pyi,sha256=cCbbx06gwQmaH14s3J1X25TtaARh-k1abbxQd
165
165
  phoenix/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
166
166
  phoenix/utilities/error_handling.py,sha256=7b5rpGFj9EWZ8yrZK1IHvxB89suWk3lggDayUQcvZds,1946
167
167
  phoenix/utilities/logging.py,sha256=lDXd6EGaamBNcQxL4vP1au9-i_SXe0OraUDiJOcszSw,222
168
- arize_phoenix-2.3.0.dist-info/METADATA,sha256=Lyr9-JJt7O9Suuc59sOvEmRunTdLn8u8TxeCcwCU-FQ,26479
169
- arize_phoenix-2.3.0.dist-info/WHEEL,sha256=mRYSEL3Ih6g5a_CVMIcwiF__0Ae4_gLYh01YFNwiq1k,87
170
- arize_phoenix-2.3.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
171
- arize_phoenix-2.3.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
172
- arize_phoenix-2.3.0.dist-info/RECORD,,
168
+ arize_phoenix-2.4.1.dist-info/METADATA,sha256=r8ce8SoT9PsPr5nGQxVs8MfGDTmxeJRY1AkyKcpNz_0,26479
169
+ arize_phoenix-2.4.1.dist-info/WHEEL,sha256=mRYSEL3Ih6g5a_CVMIcwiF__0Ae4_gLYh01YFNwiq1k,87
170
+ arize_phoenix-2.4.1.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
171
+ arize_phoenix-2.4.1.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
172
+ arize_phoenix-2.4.1.dist-info/RECORD,,
phoenix/config.py CHANGED
@@ -40,6 +40,7 @@ for path in (
40
40
  ROOT_DIR := Path.home().resolve() / ".phoenix",
41
41
  EXPORT_DIR := ROOT_DIR / "exports",
42
42
  DATASET_DIR := ROOT_DIR / "datasets",
43
+ TRACE_DATASET_DIR := ROOT_DIR / "trace_datasets",
43
44
  ):
44
45
  path.mkdir(parents=True, exist_ok=True)
45
46
 
@@ -36,6 +36,9 @@ class LLMEvaluator:
36
36
  self._model = model
37
37
  self._template = template
38
38
 
39
+ def reload_client(self) -> None:
40
+ self._model.reload_client()
41
+
39
42
  def evaluate(
40
43
  self,
41
44
  record: Record,
@@ -127,6 +127,9 @@ def llm_classify(
127
127
  from the entries in the rails argument or "NOT_PARSABLE" if the model's output could
128
128
  not be parsed.
129
129
  """
130
+ # clients need to be reloaded to ensure that async evals work properly
131
+ model.reload_client()
132
+
130
133
  tqdm_bar_format = get_tqdm_progress_bar_formatter("llm_classify")
131
134
  use_openai_function_call = (
132
135
  use_function_calling_if_available
@@ -385,6 +388,9 @@ def run_evals(
385
388
  List[DataFrame]: A list of dataframes, one for each evaluator, all of
386
389
  which have the same number of rows as the input dataframe.
387
390
  """
391
+ # clients need to be reloaded to ensure that async evals work properly
392
+ for evaluator in evaluators:
393
+ evaluator.reload_client()
388
394
 
389
395
  async def _arun_eval(
390
396
  payload: RunEvalsPayload,
@@ -78,6 +78,9 @@ def llm_generate(
78
78
  represents the generated output
79
79
 
80
80
  """
81
+ # clients need to be reloaded to ensure that async evals work properly
82
+ model.reload_client()
83
+
81
84
  tqdm_bar_format = get_tqdm_progress_bar_formatter("llm_generate")
82
85
  output_parser = output_parser or _no_op_parser
83
86
  template = normalize_prompt_template(template)
@@ -61,6 +61,9 @@ class BaseEvalModel(ABC):
61
61
  _verbose: bool = False
62
62
  _rate_limiter: RateLimiter = field(default_factory=RateLimiter)
63
63
 
64
+ def reload_client(self) -> None:
65
+ pass
66
+
64
67
  def _retry(
65
68
  self,
66
69
  error_types: List[Type[BaseException]],
@@ -107,6 +107,9 @@ class OpenAIModel(BaseEvalModel):
107
107
  self._init_tiktoken()
108
108
  self._init_rate_limiter()
109
109
 
110
+ def reload_client(self) -> None:
111
+ self._init_open_ai()
112
+
110
113
  def _init_environment(self) -> None:
111
114
  try:
112
115
  import httpx
@@ -4,6 +4,7 @@ from typing import TYPE_CHECKING, Any, Dict, List
4
4
 
5
5
  from phoenix.experimental.evals.models.base import BaseEvalModel
6
6
  from phoenix.experimental.evals.models.rate_limiters import RateLimiter
7
+ from phoenix.utilities.logging import printif
7
8
 
8
9
  if TYPE_CHECKING:
9
10
  from tiktoken import Encoding
@@ -125,8 +126,7 @@ class GeminiModel(BaseEvalModel):
125
126
  response = self._model.generate_content(
126
127
  contents=prompt, generation_config=generation_config, **kwargs
127
128
  )
128
- candidate = response.candidates[0]
129
- return candidate.text
129
+ return self._parse_response_candidates(response)
130
130
 
131
131
  return _completion_with_retry(**kwargs)
132
132
 
@@ -149,7 +149,29 @@ class GeminiModel(BaseEvalModel):
149
149
  response = await self._model.generate_content_async(
150
150
  contents=prompt, generation_config=generation_config, **kwargs
151
151
  )
152
- candidate = response.candidates[0]
153
- return candidate.text
152
+ return self._parse_response_candidates(response)
154
153
 
155
154
  return await _completion_with_retry(**kwargs)
155
+
156
+ def _parse_response_candidates(self, response: Any) -> Any:
157
+ if hasattr(response, "candidates"):
158
+ if isinstance(response.candidates, list) and len(response.candidates) > 0:
159
+ try:
160
+ candidate = response.candidates[0].text
161
+ except ValueError:
162
+ printif(
163
+ self._verbose, "The 'candidates' object does not have a 'text' attribute."
164
+ )
165
+ printif(self._verbose, response.candidates[0])
166
+ candidate = ""
167
+ else:
168
+ printif(
169
+ self._verbose,
170
+ "The 'candidates' attribute of 'response' is either not a list or is empty.",
171
+ )
172
+ printif(self._verbose, response)
173
+ candidate = ""
174
+ else:
175
+ printif(self._verbose, "The 'response' object does not have a 'candidates' attribute.")
176
+ candidate = ""
177
+ return candidate