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.
- {arize_phoenix-3.0.2.dist-info → arize_phoenix-3.1.0.dist-info}/METADATA +5 -3
- {arize_phoenix-3.0.2.dist-info → arize_phoenix-3.1.0.dist-info}/RECORD +27 -29
- phoenix/core/traces.py +14 -9
- phoenix/experimental/evals/functions/classify.py +5 -1
- phoenix/experimental/evals/models/litellm.py +30 -9
- phoenix/experimental/evals/models/openai.py +36 -16
- phoenix/experimental/evals/models/vertexai.py +49 -7
- phoenix/experimental/evals/utils/__init__.py +1 -1
- phoenix/server/api/input_types/SpanSort.py +4 -4
- phoenix/server/api/types/Span.py +13 -14
- phoenix/session/session.py +4 -1
- phoenix/trace/dsl/filter.py +40 -7
- phoenix/trace/dsl/helpers.py +7 -7
- phoenix/trace/dsl/query.py +3 -1
- phoenix/trace/errors.py +4 -0
- phoenix/trace/fixtures.py +0 -2
- phoenix/trace/llama_index/__init__.py +1 -2
- phoenix/trace/llama_index/callback.py +50 -15
- phoenix/trace/otel.py +52 -14
- phoenix/trace/schemas.py +4 -6
- phoenix/trace/span_json_decoder.py +6 -5
- phoenix/trace/span_json_encoder.py +1 -6
- phoenix/trace/trace_dataset.py +24 -14
- phoenix/version.py +1 -1
- phoenix/trace/llama_index/debug_callback.py +0 -50
- phoenix/trace/semantic_conventions.py +0 -172
- {arize_phoenix-3.0.2.dist-info → arize_phoenix-3.1.0.dist-info}/WHEEL +0 -0
- {arize_phoenix-3.0.2.dist-info → arize_phoenix-3.1.0.dist-info}/licenses/IP_NOTICE +0 -0
- {arize_phoenix-3.0.2.dist-info → arize_phoenix-3.1.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: arize-phoenix
|
|
3
|
-
Version: 3.0
|
|
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
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
35
|
-
phoenix/experimental/evals/models/openai.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
144
|
-
phoenix/trace/otel.py,sha256=
|
|
145
|
-
phoenix/trace/schemas.py,sha256=
|
|
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=
|
|
149
|
-
phoenix/trace/span_json_encoder.py,sha256=
|
|
150
|
-
phoenix/trace/trace_dataset.py,sha256=
|
|
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=
|
|
155
|
-
phoenix/trace/dsl/helpers.py,sha256=
|
|
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=
|
|
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=
|
|
162
|
-
phoenix/trace/llama_index/callback.py,sha256=
|
|
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.
|
|
173
|
-
arize_phoenix-3.0.
|
|
174
|
-
arize_phoenix-3.0.
|
|
175
|
-
arize_phoenix-3.0.
|
|
176
|
-
arize_phoenix-3.0.
|
|
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 +
|
|
54
|
-
LLM_TOKEN_COUNT_PROMPT = ATTRIBUTE_PREFIX +
|
|
55
|
-
LLM_TOKEN_COUNT_COMPLETION = ATTRIBUTE_PREFIX +
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
77
|
-
+ f"used: {self.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
68
|
-
"""
|
|
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.
|
|
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.
|
|
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
|
-
|
|
356
|
+
model = self.model
|
|
337
357
|
# handling finetuned models
|
|
338
|
-
if "ft-" in
|
|
339
|
-
|
|
340
|
-
if
|
|
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
|
-
|
|
362
|
+
model = "gpt-4-0613"
|
|
343
363
|
|
|
344
|
-
context_size = MODEL_TOKEN_LIMIT_MAPPING.get(
|
|
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: {
|
|
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.
|
|
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
|
-
|
|
392
|
-
if
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
"The name of a tuned model. If provided,
|
|
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.
|
|
76
|
-
self._model = model.get_tuned_model(self.
|
|
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.
|
|
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.
|
|
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/
|
|
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 =
|
|
26
|
-
tokenCountPrompt =
|
|
27
|
-
tokenCountCompletion =
|
|
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
|
phoenix/server/api/types/Span.py
CHANGED
|
@@ -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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|