arize-phoenix 3.0.2__py3-none-any.whl → 3.1.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.1
2
2
  Name: arize-phoenix
3
- Version: 3.0.2
3
+ Version: 3.1.0
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
@@ -23,6 +23,7 @@ Requires-Dist: numpy
23
23
  Requires-Dist: openinference-instrumentation-langchain
24
24
  Requires-Dist: openinference-instrumentation-llama-index
25
25
  Requires-Dist: openinference-instrumentation-openai
26
+ Requires-Dist: openinference-semantic-conventions
26
27
  Requires-Dist: opentelemetry-exporter-otlp
27
28
  Requires-Dist: opentelemetry-proto
28
29
  Requires-Dist: opentelemetry-sdk
@@ -50,7 +51,7 @@ Requires-Dist: hatch; extra == 'dev'
50
51
  Requires-Dist: jupyter; extra == 'dev'
51
52
  Requires-Dist: langchain>=0.0.334; extra == 'dev'
52
53
  Requires-Dist: litellm>=1.0.3; extra == 'dev'
53
- Requires-Dist: llama-index<0.10.0; extra == 'dev'
54
+ Requires-Dist: llama-index>=0.10.3; extra == 'dev'
54
55
  Requires-Dist: nbqa; extra == 'dev'
55
56
  Requires-Dist: pandas-stubs<=2.0.2.230605; extra == 'dev'
56
57
  Requires-Dist: pre-commit; extra == 'dev'
@@ -63,7 +64,8 @@ Requires-Dist: strawberry-graphql[debug-server]==0.208.2; extra == 'dev'
63
64
  Provides-Extra: experimental
64
65
  Requires-Dist: tenacity; extra == 'experimental'
65
66
  Provides-Extra: llama-index
66
- Requires-Dist: llama-index==0.9.45; extra == 'llama-index'
67
+ Requires-Dist: llama-index==0.10.3; extra == 'llama-index'
68
+ Requires-Dist: openinference-instrumentation-llama-index>=1.0.0; extra == 'llama-index'
67
69
  Description-Content-Type: text/markdown
68
70
 
69
71
  <p align="center">
@@ -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=YKXrr5J7dV2n7ZhaRv0tigylRDtfOuvJC9Y4ouFZpzo,22
7
+ phoenix/version.py,sha256=YVoF76lT0p3dIsqphNnDWuqSia3gZP1S1eQYXZ9FbSE,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=gJyqQzpud5YjtoY8h4pgXvHDsdubGfqmEewLuZHPPmQ,10224
11
11
  phoenix/core/model.py,sha256=vQ6RxpUPlncezJvur5u6xBN0Lkrk2gW0cTyb-qqaSqA,4713
12
12
  phoenix/core/model_schema.py,sha256=rR9VdhL_oXxbprDTPQJBXs5hw5sMPQmzx__m6Kwsxug,50394
13
13
  phoenix/core/model_schema_adapter.py,sha256=3GkyzqUST4fYi-Bgs8qAam5hwMCdQRZTDLjZ9Bnzdm4,8268
14
- phoenix/core/traces.py,sha256=0-CApYIFoppwKGss70_-xX_s8FPI2ABfTyT7pyeI_eE,14007
14
+ phoenix/core/traces.py,sha256=I9xsQvEd4s7fZa1lquzBfnY7ZQoLcWwnT51wuuglnyM,14065
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
@@ -23,7 +23,7 @@ phoenix/experimental/evals/__init__.py,sha256=q96YKLMt2GJD9zL8sjugvWx1INfw40Wa7E
23
23
  phoenix/experimental/evals/evaluators.py,sha256=r7fXrS-l4gn58SUhLAZSfY3P8lxysouSVJwHddrZJ_Q,15956
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=wqsLtDVPckt4OYuyr1YzaIokqnhzfYf_bMhR5ythWww,18961
26
+ phoenix/experimental/evals/functions/classify.py,sha256=rIQLf0GRXPNT2d5Oni0lrpFrubBorAscjN0ievjWx9A,19092
27
27
  phoenix/experimental/evals/functions/executor.py,sha256=bM7PI2rcPukQQzZ2rWqN_-Kfo_a935YJj0bh1Red8Ps,13406
28
28
  phoenix/experimental/evals/functions/generate.py,sha256=8LnnPAjBM9yxitdkaGZ67OabuDTOWBF3fvinJ_uCFRg,5584
29
29
  phoenix/experimental/evals/functions/processing.py,sha256=F4xtLsulLV4a8CkuLldRddsCim75dSTIShEJUYN6I6w,1823
@@ -31,15 +31,15 @@ phoenix/experimental/evals/models/__init__.py,sha256=j1N7DhiOPbcaemtVBONcQ0miNnG
31
31
  phoenix/experimental/evals/models/anthropic.py,sha256=BZmLvepkSMj_opCWsZoL34a3yAwRdl7qbJB86DFR84E,6688
32
32
  phoenix/experimental/evals/models/base.py,sha256=RWz_Jzj3Z1fENl2WUXIz-4eMsk6HfYXc0K8IZ-BJss4,6306
33
33
  phoenix/experimental/evals/models/bedrock.py,sha256=nVOXRZr-iDwHEINozpO2bqZR2KEeDHNyj6jgQPONQYs,8565
34
- phoenix/experimental/evals/models/litellm.py,sha256=0c-eJFsx41W0MsqeUd4UPquLBKSZp3BRNhKhX2uFCAs,4123
35
- phoenix/experimental/evals/models/openai.py,sha256=R5DXvIVcASLsoOGQBOevOfpUx4j0dOIVPS3voE8CuuY,17367
34
+ phoenix/experimental/evals/models/litellm.py,sha256=Xo415fJehxIj32zpzVtvzQXADJURPUvNZJHmc_FAKvE,4759
35
+ phoenix/experimental/evals/models/openai.py,sha256=v2qkdFZc-u0ZAfxnV4v5UMWkMc9P3k4Gx1XaTnVFTz4,17922
36
36
  phoenix/experimental/evals/models/rate_limiters.py,sha256=5GVN0RQKt36Przg3-9jLgocRmyg-tbeO-cdbuLIx89w,10160
37
37
  phoenix/experimental/evals/models/vertex.py,sha256=1VAGJNoiUm56pP8G9Qvnf-4_Rl9u9NI7ToOKbWFNtpk,6226
38
- phoenix/experimental/evals/models/vertexai.py,sha256=_txsOP2RHyR3AnugeJRFUNvYm3xXvfMbWpULxTko4OA,4821
38
+ phoenix/experimental/evals/models/vertexai.py,sha256=nFN5isv1GPNsvUA4OxSnQd1hTMi-3BcxfDz1y7QcoA0,6189
39
39
  phoenix/experimental/evals/templates/__init__.py,sha256=GSJSoWJ4jwyoUANniidmWMUtXQhNQYbTJbfFqCvuYuo,1470
40
40
  phoenix/experimental/evals/templates/default_templates.py,sha256=dVKmoLwqgAyGcRuezz9WKnXSHhw7-qk1R8j6wSmqh0s,20722
41
41
  phoenix/experimental/evals/templates/template.py,sha256=ImFSaTPo9oalPNwq7cNdOCndrvuwLuIyIFKsgDVcoJE,6715
42
- phoenix/experimental/evals/utils/__init__.py,sha256=608EX7sG0f5oDG__II16J8xnFJiNpY9dI9AC8vXwR00,5601
42
+ phoenix/experimental/evals/utils/__init__.py,sha256=FE1tbb022t3pwn0CrprR7QXcIsgpsdsotV7-iB3khsI,5601
43
43
  phoenix/experimental/evals/utils/threads.py,sha256=ksI-egarPnlxit0qKKjtjZ2L82qGLxqxZ6s92O0eBA4,1005
44
44
  phoenix/metrics/README.md,sha256=5gekqTU-5gGdMwvcfNp2Wlu8p1ul9kGY_jq0XXQusoI,1964
45
45
  phoenix/metrics/__init__.py,sha256=sLp7td1GIt_0Z8dPUyP4L0-_4x9c871yAaGX30oMsvg,2433
@@ -70,7 +70,7 @@ phoenix/server/api/input_types/DimensionFilter.py,sha256=vcXgglSnZcB5pGh-6oEtRmG
70
70
  phoenix/server/api/input_types/DimensionInput.py,sha256=Vfx5FmiMKey4-EHDQsQRPzSAMRJMN5oVMLDUl4NKAa8,164
71
71
  phoenix/server/api/input_types/Granularity.py,sha256=6SVfZ5yTZYq1PI6vdpjfkBUc4YilLSkF-k6okuSNbbQ,2301
72
72
  phoenix/server/api/input_types/PerformanceMetricInput.py,sha256=fElsLTSEYYgGFGMYTEGcYid39tXUKFdV_JkdHavMcbA,591
73
- phoenix/server/api/input_types/SpanSort.py,sha256=9OxxFseY-9pwZ9rUJ71P-h_vpwYg5UAiy76x_pzHvPo,3537
73
+ phoenix/server/api/input_types/SpanSort.py,sha256=72oWhYLLIZLy7K5_tFhMg7RcmDgatqMB-ZoRJhHGIR0,3527
74
74
  phoenix/server/api/input_types/TimeRange.py,sha256=yzx-gxj8mDeGLft1FzU_x1MVEgIG5Pt6-f8PUVDgipQ,522
75
75
  phoenix/server/api/input_types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
76
  phoenix/server/api/routers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -109,7 +109,7 @@ phoenix/server/api/types/Retrieval.py,sha256=OhMK2ncjoyp5h1yjKhjlKpoTbQrMHuxmgSF
109
109
  phoenix/server/api/types/ScalarDriftMetricEnum.py,sha256=IUAcRPpgL41WdoIgK6cNk2Te38SspXGyEs-S1fY23_A,232
110
110
  phoenix/server/api/types/Segments.py,sha256=zogJI9MdmctBL7J-fDSR_8tUJLvuISlVYgCLnTaigKE,2937
111
111
  phoenix/server/api/types/SortDir.py,sha256=OUpXhlCzCxPoXSDkJJygEs9Rw9pMymfaZUG5zPTrw4Y,152
112
- phoenix/server/api/types/Span.py,sha256=QWWW2MmWD0bwiR-jAUtJJZ-GvZJhTFYq7qhus7tsz3A,11304
112
+ phoenix/server/api/types/Span.py,sha256=OvY4ffZa3KMnT3J9s0oLB0ghurYSJCWlK0YfoKkg-6s,11633
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
@@ -135,32 +135,30 @@ phoenix/session/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
135
135
  phoenix/session/client.py,sha256=lTV9Q4ljpV9wqasya4u3x7BCijrfAWKDm5akzrg0424,4885
136
136
  phoenix/session/data_extractor.py,sha256=V4ntT2FcmbV_-zobcbPR51HKWaDyMnXHj4Pmu7MZ0OQ,1664
137
137
  phoenix/session/evaluation.py,sha256=DaAtA0XYJbXRJO_StGywa-9APlz2ORSmCXzxrtn3rvI,4997
138
- phoenix/session/session.py,sha256=mrTAQkUFMGjN65ApYqRjhGXExbfxu2ODJcJ14MSDOLE,21719
138
+ phoenix/session/session.py,sha256=R83kPeiqLxEJTD6cTjJqqMjMV-iQzQFKw6rMXnbIxnc,21800
139
139
  phoenix/trace/__init__.py,sha256=4d_MqzUIFmlY9WWcFeTONJ4xL5mPGoWZaPM2TJ0ZDBQ,266
140
- phoenix/trace/errors.py,sha256=DbXSJnNErV7305tKv7pUWLD6jcVHJ6EBdSu4mZJ6IM4,112
140
+ phoenix/trace/errors.py,sha256=wB1z8qdPckngdfU-TORToekvg3344oNFAA83_hC2yFY,180
141
141
  phoenix/trace/evaluation_conventions.py,sha256=t8jydM3U0-T5YpiQKRJ3tWdWGlHtzKyttYdw-ddvPOk,1048
142
142
  phoenix/trace/exporter.py,sha256=O-9Arn-S_B9Me-jy4Qa84y6lvxKNoa8pczrsamPl3_Q,4871
143
- phoenix/trace/fixtures.py,sha256=LokNedhbGYxpzXznteO4m5QehvNYjzvoh231-CMJQeY,7113
144
- phoenix/trace/otel.py,sha256=lJoTvkCSFiPT4dFRLMZZgZfsOoTSATctW9lQk9J30ZI,14821
145
- phoenix/trace/schemas.py,sha256=QDBlM94faceTnloY_ZVo2BHWWnE5UGymefC0jmfj4ew,6011
146
- phoenix/trace/semantic_conventions.py,sha256=u6NG85ZhbreriZr8cqJaddldM_jUcew7JilszY7JUk8,4652
143
+ phoenix/trace/fixtures.py,sha256=HOjuYOB_xtR7JUeLz7WpEroiGj4E5_SxVLSjBYUy8RQ,7055
144
+ phoenix/trace/otel.py,sha256=naFWTwrqyIoeGJ5YMT9Fyhd44CEtQvpscVluDOXD6Fo,16744
145
+ phoenix/trace/schemas.py,sha256=zlAY8v-PLgEDqTgbmDxY3NJlCAmzj_3ZCJFebQOBz3M,6028
147
146
  phoenix/trace/span_evaluations.py,sha256=FvY9YRnKuYIzCa-H9P5SuDaI2DeqGnVCjNgclC2v3HA,12909
148
- phoenix/trace/span_json_decoder.py,sha256=nrIPkcgbCcNML-0OSjWC6fxIfBEMiP0n67yM_m-vegg,3068
149
- phoenix/trace/span_json_encoder.py,sha256=C5y7rkyOcV08oJC5t8TZqVxsKCZMJKad7bBQzAgLoDs,1763
150
- phoenix/trace/trace_dataset.py,sha256=KW0TzmhlKuX8PUPLV172iTK08myYE0QXUC75KiIqJ7k,13204
147
+ phoenix/trace/span_json_decoder.py,sha256=IAFakPRqSMYxTPKYFMiXYxm7U-FipdN8_xbvapDS0Qc,3131
148
+ phoenix/trace/span_json_encoder.py,sha256=hIDd1I6xm01kaNmeKjHOHyxUGI3uTg5J_Os1kXtAb6g,1755
149
+ phoenix/trace/trace_dataset.py,sha256=RpHIfZLbMmULOIb-fKXJkQLhIdC0sJlAOTjlyJppMYA,13776
151
150
  phoenix/trace/tracer.py,sha256=JDKlyvjy6AsQmaA60ycJ1hKXoUQU61jqPx3nvYr8xUc,3647
152
151
  phoenix/trace/utils.py,sha256=7LurVGXn245cjj4MJsc7v6jq4DSJkpK6YGBfIaSywuw,1307
153
152
  phoenix/trace/dsl/__init__.py,sha256=WIQIjJg362XD3s50OsPJJ0xbDsGp41bSv7vDllLrPuA,144
154
- phoenix/trace/dsl/filter.py,sha256=VwlzL4KsIoyYjjCSKXlOSyVm49WyYRlkK5zedXqZlcc,13136
155
- phoenix/trace/dsl/helpers.py,sha256=qxRS65NFUFVpLDd8IZVrZUH891MamLeXyfIIN1BJJ_c,1552
153
+ phoenix/trace/dsl/filter.py,sha256=fRPUIsucxXGJcbtei86ApSIjEP5PmdsONmYvT7EBu6w,14240
154
+ phoenix/trace/dsl/helpers.py,sha256=U71HmCecJQ_zHq0g2mFKbxrRuiJDkopskWMpFoBNP-Y,1722
156
155
  phoenix/trace/dsl/missing.py,sha256=BWPOHr2_tBkPDgVeq8GVXXVbNbJiBelu4NtwHBg6mTE,1435
157
- phoenix/trace/dsl/query.py,sha256=W6_e1o_JbucGWWv6pSUQFyIHcTuj7QuCBSuKXodRfCE,14773
156
+ phoenix/trace/dsl/query.py,sha256=XoFwKEALzGqUERy7B5fgD-n0s87zN6jRVrZgW6-jqRo,14819
158
157
  phoenix/trace/langchain/__init__.py,sha256=aTKMFmEOgjx_6dnyplalgYi7PQnetablwrwpcUZqcGE,764
159
158
  phoenix/trace/langchain/instrumentor.py,sha256=rmqdaEh2rwyZnaddns4RC2WQnj7TbCnJjETgoiwWvzs,1163
160
159
  phoenix/trace/langchain/tracer.py,sha256=fSjtPc5VxaZK63x3ob3DAW7eM2kfOZWgbSQ9dmhhtsw,1424
161
- phoenix/trace/llama_index/__init__.py,sha256=wCcQgD9CG5TA8i-1XsSed4ZzwHTUmqZwegQAV_FqEng,178
162
- phoenix/trace/llama_index/callback.py,sha256=MHgUNJSG6ecxZ8SZ_9LdcKnAAWmNI-U5pySFyXqubjM,1694
163
- phoenix/trace/llama_index/debug_callback.py,sha256=SKToD9q_QADSGTJ5lhilqRVKaUnUSRXUvURCzN4by2U,1367
160
+ phoenix/trace/llama_index/__init__.py,sha256=4fpR5702Qh2t5TaXIx584EkA-BveCPftXPOKvI0Oi3I,105
161
+ phoenix/trace/llama_index/callback.py,sha256=YKCZZtFwAwasZt9qNSJO6dj97Jt2eN_PBakUYWrCleE,3574
164
162
  phoenix/trace/openai/__init__.py,sha256=J3G0uqCxGdksUpaQVHds_Egv2drvh8UEqoLjiQAOveg,79
165
163
  phoenix/trace/openai/instrumentor.py,sha256=Lre96YfPxs5iM3frZfwdAh94LUpyYw_RZpSF0XmPtKw,1061
166
164
  phoenix/trace/v1/__init__.py,sha256=-IbAD0ruESMjvQLvGAg9CTfjBUATFDx1OXseDPis6-0,88
@@ -169,8 +167,8 @@ phoenix/trace/v1/evaluation_pb2.pyi,sha256=cCbbx06gwQmaH14s3J1X25TtaARh-k1abbxQd
169
167
  phoenix/utilities/__init__.py,sha256=3TVirVnjIGyaCFuJCqeZO4tjlzQ_chZgYM0itIwsEpE,656
170
168
  phoenix/utilities/error_handling.py,sha256=7b5rpGFj9EWZ8yrZK1IHvxB89suWk3lggDayUQcvZds,1946
171
169
  phoenix/utilities/logging.py,sha256=lDXd6EGaamBNcQxL4vP1au9-i_SXe0OraUDiJOcszSw,222
172
- arize_phoenix-3.0.2.dist-info/METADATA,sha256=80fEGOl8VUcS4B1STEVmDITkrkYytJtE6f9d7VmkyhI,28555
173
- arize_phoenix-3.0.2.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87
174
- arize_phoenix-3.0.2.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
175
- arize_phoenix-3.0.2.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
176
- arize_phoenix-3.0.2.dist-info/RECORD,,
170
+ arize_phoenix-3.1.0.dist-info/METADATA,sha256=REf61_QdSCtku8jKwT3K_Pdaseow4atJjtb7htsYWno,28694
171
+ arize_phoenix-3.1.0.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87
172
+ arize_phoenix-3.1.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
173
+ arize_phoenix-3.1.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
174
+ arize_phoenix-3.1.0.dist-info/RECORD,,
phoenix/core/traces.py CHANGED
@@ -20,12 +20,13 @@ from typing import (
20
20
 
21
21
  import opentelemetry.proto.trace.v1.trace_pb2 as otlp
22
22
  from ddsketch import DDSketch
23
+ from openinference.semconv.trace import SpanAttributes
23
24
  from sortedcontainers import SortedKeyList
24
25
  from typing_extensions import TypeAlias
25
26
  from wrapt import ObjectProxy
26
27
 
28
+ import phoenix.trace.schemas
27
29
  from phoenix.datetime_utils import right_open_time_range
28
- from phoenix.trace import semantic_conventions
29
30
  from phoenix.trace.otel import decode
30
31
  from phoenix.trace.schemas import (
31
32
  ATTRIBUTE_PREFIX,
@@ -33,12 +34,10 @@ from phoenix.trace.schemas import (
33
34
  CONTEXT_PREFIX,
34
35
  ComputedAttributes,
35
36
  Span,
36
- SpanAttributes,
37
37
  SpanID,
38
38
  SpanStatusCode,
39
39
  TraceID,
40
40
  )
41
- from phoenix.trace.semantic_conventions import RETRIEVAL_DOCUMENTS
42
41
 
43
42
  END_OF_QUEUE = None # sentinel value for queue termination
44
43
 
@@ -50,9 +49,9 @@ SPAN_ID = CONTEXT_PREFIX + "span_id"
50
49
  PARENT_ID = "parent_id"
51
50
  START_TIME = "start_time"
52
51
  END_TIME = "end_time"
53
- LLM_TOKEN_COUNT_TOTAL = ATTRIBUTE_PREFIX + semantic_conventions.LLM_TOKEN_COUNT_TOTAL
54
- LLM_TOKEN_COUNT_PROMPT = ATTRIBUTE_PREFIX + semantic_conventions.LLM_TOKEN_COUNT_PROMPT
55
- LLM_TOKEN_COUNT_COMPLETION = ATTRIBUTE_PREFIX + semantic_conventions.LLM_TOKEN_COUNT_COMPLETION
52
+ LLM_TOKEN_COUNT_TOTAL = ATTRIBUTE_PREFIX + SpanAttributes.LLM_TOKEN_COUNT_TOTAL
53
+ LLM_TOKEN_COUNT_PROMPT = ATTRIBUTE_PREFIX + SpanAttributes.LLM_TOKEN_COUNT_PROMPT
54
+ LLM_TOKEN_COUNT_COMPLETION = ATTRIBUTE_PREFIX + SpanAttributes.LLM_TOKEN_COUNT_COMPLETION
56
55
 
57
56
 
58
57
  class ReadableSpan(ObjectProxy): # type: ignore
@@ -73,7 +72,9 @@ class ReadableSpan(ObjectProxy): # type: ignore
73
72
  @property
74
73
  def span(self) -> Span:
75
74
  span = decode(self._self_otlp_span)
76
- span.attributes.update(cast(SpanAttributes, self._self_computed_values))
75
+ span.attributes.update(
76
+ cast(phoenix.trace.schemas.SpanAttributes, self._self_computed_values)
77
+ )
77
78
  # TODO: compute latency rank percent (which can change depending on how
78
79
  # many spans already ingested).
79
80
  return span
@@ -333,9 +334,13 @@ class Traces:
333
334
  self._token_count_total -= existing_span[LLM_TOKEN_COUNT_TOTAL] or 0
334
335
  self._token_count_total += new_span[LLM_TOKEN_COUNT_TOTAL] or 0
335
336
  # Update number of documents
336
- num_documents_update = len(new_span.attributes.get(RETRIEVAL_DOCUMENTS) or ())
337
+ num_documents_update = len(
338
+ new_span.attributes.get(SpanAttributes.RETRIEVAL_DOCUMENTS) or ()
339
+ )
337
340
  if existing_span:
338
- num_documents_update -= len(existing_span.attributes.get(RETRIEVAL_DOCUMENTS) or ())
341
+ num_documents_update -= len(
342
+ existing_span.attributes.get(SpanAttributes.RETRIEVAL_DOCUMENTS) or ()
343
+ )
339
344
  if num_documents_update:
340
345
  self._num_documents[span_id] += num_documents_update
341
346
  # Process previously orphaned spans, if any.
@@ -19,6 +19,7 @@ from typing import (
19
19
  )
20
20
 
21
21
  import pandas as pd
22
+ from openinference.semconv.trace import DocumentAttributes, SpanAttributes
22
23
  from pandas import DataFrame
23
24
  from typing_extensions import TypeAlias
24
25
 
@@ -41,9 +42,12 @@ from phoenix.experimental.evals.utils import (
41
42
  parse_openai_function_call,
42
43
  snap_to_rail,
43
44
  )
44
- from phoenix.trace.semantic_conventions import DOCUMENT_CONTENT, INPUT_VALUE, RETRIEVAL_DOCUMENTS
45
45
  from phoenix.utilities.logging import printif
46
46
 
47
+ DOCUMENT_CONTENT = DocumentAttributes.DOCUMENT_CONTENT
48
+ INPUT_VALUE = SpanAttributes.INPUT_VALUE
49
+ RETRIEVAL_DOCUMENTS = SpanAttributes.RETRIEVAL_DOCUMENTS
50
+
47
51
  logger = logging.getLogger(__name__)
48
52
 
49
53
 
@@ -1,4 +1,5 @@
1
1
  import logging
2
+ import warnings
2
3
  from dataclasses import dataclass, field
3
4
  from typing import TYPE_CHECKING, Any, Dict, List, Optional
4
5
 
@@ -12,7 +13,7 @@ logger = logging.getLogger(__name__)
12
13
 
13
14
  @dataclass
14
15
  class LiteLLMModel(BaseEvalModel):
15
- model_name: str = "gpt-3.5-turbo"
16
+ model: str = "gpt-3.5-turbo"
16
17
  """The model name to use."""
17
18
  temperature: float = 0.0
18
19
  """What sampling temperature to use."""
@@ -34,22 +35,42 @@ class LiteLLMModel(BaseEvalModel):
34
35
  max_content_size: Optional[int] = None
35
36
  """If you're using a fine-tuned model, set this to the maximum content size"""
36
37
 
38
+ # Deprecated fields
39
+ model_name: Optional[str] = None
40
+ """
41
+ .. deprecated:: 3.0.0
42
+ use `model` instead. This will be removed in a future release.
43
+ """
44
+
37
45
  def __post_init__(self) -> None:
46
+ self._migrate_model_name()
38
47
  self._init_environment()
39
48
  self._init_model_encoding()
40
49
 
50
+ def _migrate_model_name(self) -> None:
51
+ if self.model_name is not None:
52
+ warning_message = "The `model_name` field is deprecated. Use `model` instead. \
53
+ This will be removed in a future release."
54
+ warnings.warn(
55
+ warning_message,
56
+ DeprecationWarning,
57
+ )
58
+ print(warning_message)
59
+ self.model = self.model_name
60
+ self.model_name = None
61
+
41
62
  def _init_environment(self) -> None:
42
63
  try:
43
64
  import litellm
44
65
  from litellm import validate_environment
45
66
 
46
67
  self._litellm = litellm
47
- env_info = validate_environment(self._litellm.utils.get_llm_provider(self.model_name))
68
+ env_info = validate_environment(self._litellm.utils.get_llm_provider(self.model))
48
69
 
49
70
  if not env_info["keys_in_environment"]:
50
71
  raise RuntimeError(
51
72
  f"Missing environment variable(s): '{str(env_info['missing_keys'])}', for "
52
- f"model: {self.model_name}. \nFor additional information about the right "
73
+ f"model: {self.model}. \nFor additional information about the right "
53
74
  "environment variables for specific model providers:\n"
54
75
  "https://docs.litellm.ai/docs/completion/input#provider-specific-params."
55
76
  )
@@ -67,14 +88,14 @@ class LiteLLMModel(BaseEvalModel):
67
88
 
68
89
  @property
69
90
  def max_context_size(self) -> int:
70
- context_size = self.max_content_size or self._litellm.get_max_tokens(self.model_name).get(
91
+ context_size = self.max_content_size or self._litellm.get_max_tokens(self.model).get(
71
92
  "max_tokens", None
72
93
  )
73
94
 
74
95
  if context_size is None:
75
96
  raise ValueError(
76
- "Can't determine maximum context size. An unknown model name was "
77
- + f"used: {self.model_name}."
97
+ "Can't determine maximum context size. An unknown model was "
98
+ + f"used: {self.model}."
78
99
  )
79
100
 
80
101
  return context_size
@@ -84,11 +105,11 @@ class LiteLLMModel(BaseEvalModel):
84
105
  raise NotImplementedError
85
106
 
86
107
  def get_tokens_from_text(self, text: str) -> List[int]:
87
- result: List[int] = self._encoding(model=self.model_name, text=text)
108
+ result: List[int] = self._encoding(model=self.model, text=text)
88
109
  return result
89
110
 
90
111
  def get_text_from_tokens(self, tokens: List[int]) -> str:
91
- return str(self._decoding(model=self.model_name, tokens=tokens))
112
+ return str(self._decoding(model=self.model, tokens=tokens))
92
113
 
93
114
  async def _async_generate(self, prompt: str, **kwargs: Dict[str, Any]) -> str:
94
115
  return self._generate(prompt, **kwargs)
@@ -96,7 +117,7 @@ class LiteLLMModel(BaseEvalModel):
96
117
  def _generate(self, prompt: str, **kwargs: Dict[str, Any]) -> str:
97
118
  messages = self._get_messages_from_prompt(prompt)
98
119
  response = self._litellm.completion(
99
- model=self.model_name,
120
+ model=self.model,
100
121
  messages=messages,
101
122
  temperature=self.temperature,
102
123
  max_tokens=self.max_tokens,
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  import os
3
+ import warnings
3
4
  from dataclasses import dataclass, field, fields
4
5
  from typing import (
5
6
  TYPE_CHECKING,
@@ -64,8 +65,10 @@ class OpenAIModel(BaseEvalModel):
64
65
  An optional base URL to use for the OpenAI API. If not provided, will default
65
66
  to what's configured in OpenAI
66
67
  """
67
- model_name: str = "gpt-4"
68
- """Model name to use. In of azure, this is the deployment name such as gpt-35-instant"""
68
+ model: str = "gpt-4"
69
+ """
70
+ Model name to use. In of azure, this is the deployment name such as gpt-35-instant
71
+ """
69
72
  temperature: float = 0.0
70
73
  """What sampling temperature to use."""
71
74
  max_tokens: int = 256
@@ -106,7 +109,15 @@ class OpenAIModel(BaseEvalModel):
106
109
  azure_ad_token: Optional[str] = field(default=None)
107
110
  azure_ad_token_provider: Optional[Callable[[], str]] = field(default=None)
108
111
 
112
+ # Deprecated fields
113
+ model_name: Optional[str] = field(default=None)
114
+ """
115
+ .. deprecated:: 3.0.0
116
+ use `model` instead. This will be removed
117
+ """
118
+
109
119
  def __post_init__(self) -> None:
120
+ self._migrate_model_name()
110
121
  self._init_environment()
111
122
  self._init_open_ai()
112
123
  self._init_tiktoken()
@@ -115,6 +126,17 @@ class OpenAIModel(BaseEvalModel):
115
126
  def reload_client(self) -> None:
116
127
  self._init_open_ai()
117
128
 
129
+ def _migrate_model_name(self) -> None:
130
+ if self.model_name:
131
+ warning_message = "The `model_name` field is deprecated. Use `model` instead. \
132
+ This will be removed in a future release."
133
+ print(
134
+ warning_message,
135
+ )
136
+ warnings.warn(warning_message, DeprecationWarning)
137
+ self.model = self.model_name
138
+ self.model_name = None
139
+
118
140
  def _init_environment(self) -> None:
119
141
  try:
120
142
  import openai
@@ -141,9 +163,7 @@ class OpenAIModel(BaseEvalModel):
141
163
  # For Azure, you need to provide the endpoint and the endpoint
142
164
  self._is_azure = bool(self.azure_endpoint)
143
165
 
144
- self._model_uses_legacy_completion_api = self.model_name.startswith(
145
- LEGACY_COMPLETION_API_MODELS
146
- )
166
+ self._model_uses_legacy_completion_api = self.model.startswith(LEGACY_COMPLETION_API_MODELS)
147
167
  if self.api_key is None:
148
168
  api_key = os.getenv(OPENAI_API_KEY_ENVVAR_NAME)
149
169
  if api_key is None:
@@ -203,7 +223,7 @@ class OpenAIModel(BaseEvalModel):
203
223
 
204
224
  def _init_tiktoken(self) -> None:
205
225
  try:
206
- encoding = self._tiktoken.encoding_for_model(self.model_name)
226
+ encoding = self._tiktoken.encoding_for_model(self.model)
207
227
  except KeyError:
208
228
  encoding = self._tiktoken.get_encoding("cl100k_base")
209
229
  self._tiktoken_encoding = encoding
@@ -333,20 +353,20 @@ class OpenAIModel(BaseEvalModel):
333
353
 
334
354
  @property
335
355
  def max_context_size(self) -> int:
336
- model_name = self.model_name
356
+ model = self.model
337
357
  # handling finetuned models
338
- if "ft-" in model_name:
339
- model_name = self.model_name.split(":")[0]
340
- if model_name == "gpt-4":
358
+ if "ft-" in model:
359
+ model = self.model.split(":")[0]
360
+ if model == "gpt-4":
341
361
  # Map gpt-4 to the current default
342
- model_name = "gpt-4-0613"
362
+ model = "gpt-4-0613"
343
363
 
344
- context_size = MODEL_TOKEN_LIMIT_MAPPING.get(model_name, None)
364
+ context_size = MODEL_TOKEN_LIMIT_MAPPING.get(model, None)
345
365
 
346
366
  if context_size is None:
347
367
  raise ValueError(
348
368
  "Can't determine maximum context size. An unknown model name was "
349
- f"used: {model_name}. Please provide a valid OpenAI model name. "
369
+ f"used: {model}. Please provide a valid OpenAI model name. "
350
370
  "Known models are: " + ", ".join(MODEL_TOKEN_LIMIT_MAPPING.keys())
351
371
  )
352
372
 
@@ -355,7 +375,7 @@ class OpenAIModel(BaseEvalModel):
355
375
  @property
356
376
  def public_invocation_params(self) -> Dict[str, Any]:
357
377
  return {
358
- **({"model": self.model_name}),
378
+ **({"model": self.model}),
359
379
  **self._default_params,
360
380
  **self.model_kwargs,
361
381
  }
@@ -388,8 +408,8 @@ class OpenAIModel(BaseEvalModel):
388
408
 
389
409
  Official documentation: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb
390
410
  """ # noqa
391
- model_name = self.model_name
392
- if model_name == "gpt-3.5-turbo-0301":
411
+ model = self.model
412
+ if model == "gpt-3.5-turbo-0301":
393
413
  tokens_per_message = 4 # every message follows <|start|>{role/name}\n{content}<|end|>\n
394
414
  tokens_per_name = -1 # if there's a name, the role is omitted
395
415
  else:
@@ -1,3 +1,5 @@
1
+ import logging
2
+ import warnings
1
3
  from dataclasses import dataclass
2
4
  from typing import TYPE_CHECKING, Any, Dict, List, Optional
3
5
 
@@ -6,6 +8,7 @@ from phoenix.experimental.evals.models.base import BaseEvalModel
6
8
  if TYPE_CHECKING:
7
9
  from google.auth.credentials import Credentials # type:ignore
8
10
 
11
+ logger = logging.getLogger(__name__)
9
12
 
10
13
  MINIMUM_VERTEX_AI_VERSION = "1.33.0"
11
14
 
@@ -18,9 +21,9 @@ class VertexAIModel(BaseEvalModel):
18
21
  "location (str): The default location to use when making API calls. If not "
19
22
  "set defaults to us-central-1."
20
23
  credentials: Optional["Credentials"] = None
21
- model_name: str = "text-bison"
22
- tuned_model_name: Optional[str] = None
23
- "The name of a tuned model. If provided, model_name is ignored."
24
+ model: str = "text-bison"
25
+ tuned_model: Optional[str] = None
26
+ "The name of a tuned model. If provided, model is ignored."
24
27
  max_retries: int = 6
25
28
  """Maximum number of retries to make when generating."""
26
29
  retry_min_seconds: int = 10
@@ -40,11 +43,50 @@ class VertexAIModel(BaseEvalModel):
40
43
  "How the model selects tokens for output, the next token is selected from "
41
44
  "among the top-k most probable tokens. Top-k is ignored for Codey models."
42
45
 
46
+ # Deprecated fields
47
+ model_name: Optional[str] = None
48
+ """
49
+ .. deprecated:: 3.0.0
50
+ use `model` instead. This will be removed in a future release.
51
+ """
52
+ tuned_model_name: Optional[str] = None
53
+ """
54
+ .. deprecated:: 3.0.0
55
+ use `tuned_model` instead. This will be removed in a future release.
56
+ """
57
+
43
58
  def __post_init__(self) -> None:
59
+ self._migrate_model_name()
44
60
  self._init_environment()
45
61
  self._init_vertex_ai()
46
62
  self._instantiate_model()
47
63
 
64
+ def _migrate_model_name(self) -> None:
65
+ if self.model_name is not None:
66
+ warning_message = (
67
+ "The `model_name` field is deprecated. Use `model` instead. "
68
+ + "This will be removed in a future release."
69
+ )
70
+ warnings.warn(
71
+ warning_message,
72
+ DeprecationWarning,
73
+ )
74
+ print(warning_message)
75
+ self.model = self.model_name
76
+ self.model_name = None
77
+ if self.tuned_model_name is not None:
78
+ warning_message = (
79
+ "`tuned_model_name` field is deprecated. Use `tuned_model` instead. "
80
+ + "This will be removed in a future release."
81
+ )
82
+ warnings.warn(
83
+ warning_message,
84
+ DeprecationWarning,
85
+ )
86
+ print(warning_message)
87
+ self.tuned_model = self.tuned_model_name
88
+ self.tuned_model_name = None
89
+
48
90
  def _init_environment(self) -> None:
49
91
  try:
50
92
  import google.api_core.exceptions as google_exceptions # type:ignore
@@ -72,10 +114,10 @@ class VertexAIModel(BaseEvalModel):
72
114
 
73
115
  model = TextGenerationModel
74
116
 
75
- if self.tuned_model_name:
76
- self._model = model.get_tuned_model(self.tuned_model_name)
117
+ if self.tuned_model:
118
+ self._model = model.get_tuned_model(self.tuned_model)
77
119
  else:
78
- self._model = model.from_pretrained(self.model_name)
120
+ self._model = model.from_pretrained(self.model)
79
121
 
80
122
  def verbose_generation_info(self) -> str:
81
123
  return f"VertexAI invocation parameters: {self.invocation_params}"
@@ -93,7 +135,7 @@ class VertexAIModel(BaseEvalModel):
93
135
 
94
136
  @property
95
137
  def is_codey_model(self) -> bool:
96
- return is_codey_model(self.tuned_model_name or self.model_name)
138
+ return is_codey_model(self.tuned_model or self.model)
97
139
 
98
140
  @property
99
141
  def _init_params(self) -> Dict[str, Any]:
@@ -32,7 +32,7 @@ def download_benchmark_dataset(task: str, dataset_name: str) -> pd.DataFrame:
32
32
  pandas.DataFrame: A pandas dataframe containing the data.
33
33
  """
34
34
  jsonl_file_name = f"{dataset_name}.jsonl"
35
- url = f"http://storage.googleapis.com/arize-assets/phoenix/evals/{task}/{jsonl_file_name}.zip"
35
+ url = f"http://storage.googleapis.com/arize-phoenix-assets/evals/{task}/{jsonl_file_name}.zip"
36
36
  try:
37
37
  with urlopen(url) as response:
38
38
  zip_byte_stream = BytesIO(response.read())
@@ -4,6 +4,7 @@ from typing import Any, Iterable, Iterator, Optional, Protocol
4
4
 
5
5
  import pandas as pd
6
6
  import strawberry
7
+ from openinference.semconv.trace import SpanAttributes
7
8
  from strawberry import UNSET
8
9
  from typing_extensions import assert_never
9
10
 
@@ -13,7 +14,6 @@ from phoenix.core.traces import (
13
14
  START_TIME,
14
15
  )
15
16
  from phoenix.server.api.types.SortDir import SortDir
16
- from phoenix.trace import semantic_conventions
17
17
  from phoenix.trace.schemas import ComputedAttributes, Span, SpanID
18
18
 
19
19
 
@@ -22,9 +22,9 @@ class SpanColumn(Enum):
22
22
  startTime = START_TIME
23
23
  endTime = END_TIME
24
24
  latencyMs = ComputedAttributes.LATENCY_MS.value
25
- tokenCountTotal = semantic_conventions.LLM_TOKEN_COUNT_TOTAL
26
- tokenCountPrompt = semantic_conventions.LLM_TOKEN_COUNT_PROMPT
27
- tokenCountCompletion = semantic_conventions.LLM_TOKEN_COUNT_COMPLETION
25
+ tokenCountTotal = SpanAttributes.LLM_TOKEN_COUNT_TOTAL
26
+ tokenCountPrompt = SpanAttributes.LLM_TOKEN_COUNT_PROMPT
27
+ tokenCountCompletion = SpanAttributes.LLM_TOKEN_COUNT_COMPLETION
28
28
  cumulativeTokenCountTotal = ComputedAttributes.CUMULATIVE_LLM_TOKEN_COUNT_TOTAL.value
29
29
  cumulativeTokenCountPrompt = ComputedAttributes.CUMULATIVE_LLM_TOKEN_COUNT_PROMPT.value
30
30
  cumulativeTokenCountCompletion = ComputedAttributes.CUMULATIVE_LLM_TOKEN_COUNT_COMPLETION.value
@@ -5,6 +5,7 @@ from enum import Enum
5
5
  from typing import Any, DefaultDict, Dict, List, Mapping, Optional, Sized, cast
6
6
 
7
7
  import strawberry
8
+ from openinference.semconv.trace import EmbeddingAttributes, SpanAttributes
8
9
  from strawberry import ID, UNSET
9
10
  from strawberry.types import Info
10
11
 
@@ -15,19 +16,17 @@ from phoenix.server.api.types.DocumentRetrievalMetrics import DocumentRetrievalM
15
16
  from phoenix.server.api.types.Evaluation import DocumentEvaluation, SpanEvaluation
16
17
  from phoenix.server.api.types.MimeType import MimeType
17
18
  from phoenix.trace.schemas import ComputedAttributes, SpanID
18
- from phoenix.trace.semantic_conventions import (
19
- EMBEDDING_EMBEDDINGS,
20
- EMBEDDING_VECTOR,
21
- EXCEPTION_MESSAGE,
22
- INPUT_MIME_TYPE,
23
- INPUT_VALUE,
24
- LLM_TOKEN_COUNT_COMPLETION,
25
- LLM_TOKEN_COUNT_PROMPT,
26
- LLM_TOKEN_COUNT_TOTAL,
27
- OUTPUT_MIME_TYPE,
28
- OUTPUT_VALUE,
29
- RETRIEVAL_DOCUMENTS,
30
- )
19
+
20
+ EMBEDDING_EMBEDDINGS = SpanAttributes.EMBEDDING_EMBEDDINGS
21
+ EMBEDDING_VECTOR = EmbeddingAttributes.EMBEDDING_VECTOR
22
+ INPUT_MIME_TYPE = SpanAttributes.INPUT_MIME_TYPE
23
+ INPUT_VALUE = SpanAttributes.INPUT_VALUE
24
+ LLM_TOKEN_COUNT_COMPLETION = SpanAttributes.LLM_TOKEN_COUNT_COMPLETION
25
+ LLM_TOKEN_COUNT_PROMPT = SpanAttributes.LLM_TOKEN_COUNT_PROMPT
26
+ LLM_TOKEN_COUNT_TOTAL = SpanAttributes.LLM_TOKEN_COUNT_TOTAL
27
+ OUTPUT_MIME_TYPE = SpanAttributes.OUTPUT_MIME_TYPE
28
+ OUTPUT_VALUE = SpanAttributes.OUTPUT_VALUE
29
+ RETRIEVAL_DOCUMENTS = SpanAttributes.RETRIEVAL_DOCUMENTS
31
30
 
32
31
 
33
32
  @strawberry.enum
@@ -87,7 +86,7 @@ class SpanEvent:
87
86
  ) -> "SpanEvent":
88
87
  return SpanEvent(
89
88
  name=event.name,
90
- message=cast(str, event.attributes.get(EXCEPTION_MESSAGE) or ""),
89
+ message=cast(str, event.attributes.get(trace_schema.EXCEPTION_MESSAGE) or ""),
91
90
  timestamp=event.timestamp,
92
91
  )
93
92