arize-phoenix 11.21.0__py3-none-any.whl → 11.22.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.

Files changed (20) hide show
  1. {arize_phoenix-11.21.0.dist-info → arize_phoenix-11.22.0.dist-info}/METADATA +6 -3
  2. {arize_phoenix-11.21.0.dist-info → arize_phoenix-11.22.0.dist-info}/RECORD +20 -20
  3. phoenix/db/models.py +9 -2
  4. phoenix/server/api/queries.py +46 -34
  5. phoenix/server/cost_tracking/model_cost_manifest.json +3 -3
  6. phoenix/server/static/.vite/manifest.json +43 -43
  7. phoenix/server/static/assets/{components-BNcxEjYs.js → components-BpxtWe3X.js} +182 -180
  8. phoenix/server/static/assets/{index-CKIBKnVD.js → index-Bsnzoh7f.js} +22 -12
  9. phoenix/server/static/assets/{pages-3RoC-adr.js → pages-BLzMd6Fl.js} +443 -435
  10. phoenix/server/static/assets/{vendor-BbqekBfb.js → vendor-D9AxkwFX.js} +1 -1
  11. phoenix/server/static/assets/{vendor-arizeai-CEwHhYfL.js → vendor-arizeai-BSWqLnk0.js} +1 -1
  12. phoenix/server/static/assets/{vendor-codemirror-CHApHLLJ.js → vendor-codemirror-DQOFTPza.js} +3 -3
  13. phoenix/server/static/assets/{vendor-recharts-Bqf7C6Cm.js → vendor-recharts-BcJHP7DH.js} +1 -1
  14. phoenix/server/static/assets/{vendor-shiki-BQ88Q1b1.js → vendor-shiki-DTHqzvBl.js} +1 -1
  15. phoenix/server/templates/index.html +1 -1
  16. phoenix/version.py +1 -1
  17. {arize_phoenix-11.21.0.dist-info → arize_phoenix-11.22.0.dist-info}/WHEEL +0 -0
  18. {arize_phoenix-11.21.0.dist-info → arize_phoenix-11.22.0.dist-info}/entry_points.txt +0 -0
  19. {arize_phoenix-11.21.0.dist-info → arize_phoenix-11.22.0.dist-info}/licenses/IP_NOTICE +0 -0
  20. {arize_phoenix-11.21.0.dist-info → arize_phoenix-11.22.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arize-phoenix
3
- Version: 11.21.0
3
+ Version: 11.22.0
4
4
  Summary: AI Observability and Evaluation
5
5
  Project-URL: Documentation, https://arize.com/docs/phoenix/
6
6
  Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
@@ -38,6 +38,7 @@ Requires-Dist: opentelemetry-exporter-otlp
38
38
  Requires-Dist: opentelemetry-proto>=1.12.0
39
39
  Requires-Dist: opentelemetry-sdk
40
40
  Requires-Dist: opentelemetry-semantic-conventions
41
+ Requires-Dist: orjson
41
42
  Requires-Dist: pandas>=1.0
42
43
  Requires-Dist: prometheus-client
43
44
  Requires-Dist: protobuf>=4.25.8
@@ -167,7 +168,7 @@ Description-Content-Type: text/markdown
167
168
  <a target="_blank" href="https://github.com/Arize-ai/phoenix/tree/main/js/packages/phoenix-mcp">
168
169
  <img src="https://badge.mcpx.dev?status=on" title="MCP Enabled"/>
169
170
  </a>
170
- <a href="https://cursor.com/install-mcp?name=phoenix&config=eyJjb21tYW5kIjoibnB4IC15IEBhcml6ZWFpL3Bob2VuaXgtbWNwQGxhdGVzdCAtLWJhc2VVcmwgaHR0cDovL2xvY2FsaG9zdDo2MDA2IC0tYXBpS2V5IHlvdXItYXBpLWtleSJ9"><img src="https://cursor.com/deeplink/mcp-install-dark.svg" alt="Add Arize Phoenix MCP server to Cursor" height=20 /></a>
171
+ <a href="cursor://anysphere.cursor-deeplink/mcp/install?name=phoenix&config=eyJjb21tYW5kIjoibnB4IC15IEBhcml6ZWFpL3Bob2VuaXgtbWNwQGxhdGVzdCAtLWJhc2VVcmwgaHR0cHM6Ly9teS1waG9lbml4LmNvbSAtLWFwaUtleSB5b3VyLWFwaS1rZXkifQ%3D%3D"><img src="https://cursor.com/deeplink/mcp-install-dark.svg" alt="Add Arize Phoenix MCP server to Cursor" height=20 /></a>
171
172
  </p>
172
173
 
173
174
  Phoenix is an open-source AI observability platform designed for experimentation, evaluation, and troubleshooting. It provides:
@@ -254,14 +255,16 @@ Phoenix is built on top of OpenTelemetry and is vendor, language, and framework
254
255
  | Integration | Package | Version Badge |
255
256
  | --------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
256
257
  | [LangChain4j](https://github.com/Arize-ai/openinference/tree/main/java/instrumentation/openinference-instrumentation-langchain4j) | `openinference-instrumentation-langchain4j` | [![Maven Central](https://img.shields.io/maven-central/v/com.arize/openinference-instrumentation-langchain4j.svg)](https://central.sonatype.com/artifact/com.arize/openinference-instrumentation-langchain4j) |
258
+ | [SpringAI](https://central.sonatype.com/artifact/com.arize/openinference-instrumentation-springAI) | `openinference-instrumentation-springAI` | [![Maven Central](https://img.shields.io/maven-central/v/com.arize/openinference-instrumentation-springAI.svg)](https://central.sonatype.com/artifact/com.arize/openinference-instrumentation-springAI) |
257
259
 
258
260
  ### Platforms
259
261
 
260
262
  | Platform | Description | Docs |
261
263
  | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
264
+ | [BeeAI](https://docs.beeai.dev/observability/agents-traceability) | AI agent framework with built-in observability | [Integration Guide](https://docs.beeai.dev/observability/agents-traceability) |
262
265
  | [Dify](https://docs.dify.ai/en/guides/monitoring/integrate-external-ops-tools/integrate-phoenix) | Open-source LLM app development platform | [Integration Guide](https://docs.dify.ai/en/guides/monitoring/integrate-external-ops-tools/integrate-phoenix) |
266
+ | [Envoy AI Gateway](https://github.com/envoyproxy/ai-gateway) | AI Gateway built on Envoy Proxy for AI workloads | [Integration Guide](https://github.com/envoyproxy/ai-gateway/tree/main/cmd/aigw#opentelemetry-setup-with-phoenix) |
263
267
  | [LangFlow](https://arize.com/docs/phoenix/tracing/integrations-tracing/langflow) | Visual framework for building multi-agent and RAG applications | [Integration Guide](https://arize.com/docs/phoenix/tracing/integrations-tracing/langflow) |
264
- | [BeeAI](https://docs.beeai.dev/observability/agents-traceability) | AI agent framework with built-in observability | [Integration Guide](https://docs.beeai.dev/observability/agents-traceability) |
265
268
  | [LiteLLM Proxy](https://docs.litellm.ai/docs/observability/phoenix_integration#using-with-litellm-proxy) | Proxy server for LLMs | [Integration Guide](https://docs.litellm.ai/docs/observability/phoenix_integration#using-with-litellm-proxy) |
266
269
 
267
270
  ## Community
@@ -6,7 +6,7 @@ phoenix/exceptions.py,sha256=n2L2KKuecrdflB9MsCdAYCiSEvGJptIsfRkXMoJle7A,169
6
6
  phoenix/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
7
7
  phoenix/services.py,sha256=ngkyKGVatX3cO2WJdo2hKdaVKP-xJCMvqthvga6kJss,5196
8
8
  phoenix/settings.py,sha256=2kHfT3BNOVd4dAO1bq-syEQbHSG8oX2-7NhOwK2QREk,896
9
- phoenix/version.py,sha256=S2TiwHQgEbsL_ldKr5oOsMKO-n7_zvhjBACaqir74do,24
9
+ phoenix/version.py,sha256=Cc-A-8nyQYw0qQS2BVj0clf1uJ2Ig5KOVr65YywGwBk,24
10
10
  phoenix/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  phoenix/core/embedding_dimension.py,sha256=zKGbcvwOXgLf-yrJBpQyKtd-LEOPRKHnUToyAU8Owis,87
12
12
  phoenix/core/model.py,sha256=qBFraOtmwCCnWJltKNP18DDG0mULXigytlFsa6YOz6k,4837
@@ -22,7 +22,7 @@ phoenix/db/enums.py,sha256=w3O5YuJEEzVTwVDZb8b2UUFhU8yK_GosF081VVrrno0,188
22
22
  phoenix/db/facilitator.py,sha256=UIC-l14p3R8GFVWPmz04NY-CDm_zAynXCAuIYpj_W_g,20254
23
23
  phoenix/db/helpers.py,sha256=jqX13kO4qdGozDRdw6nME4BloPtzEQd0fweQpGHbj3I,15078
24
24
  phoenix/db/migrate.py,sha256=oUrXH8yEbcpL4eh09aSCuUiSrhFli0eT5D_j4ZmYChY,2797
25
- phoenix/db/models.py,sha256=bxyBRSST8rqBKcAyPyyDHmkv9AadaE3XmQnpcaMvvnk,61588
25
+ phoenix/db/models.py,sha256=5MHQA6oHD3O7YJyb3XryROn8VMfZh5zurYuPT1KqCrA,62045
26
26
  phoenix/db/pg_config.py,sha256=h6mB7qF7t4Zk6VGvAiyefHGVu74o-yJynaWzeE39k9Y,6001
27
27
  phoenix/db/insertion/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  phoenix/db/insertion/constants.py,sha256=8wifm7X-1XvroZ__R2Gc96NsgLhTDn0zXl4lehlXtcA,70
@@ -112,7 +112,7 @@ phoenix/server/api/auth.py,sha256=AyYhnZIbY9ALVjg2K6aC2UXSa3Pva5GVDBXyaZ3nD3o,27
112
112
  phoenix/server/api/context.py,sha256=mqsq_8Ru50e-PxKWNTzh9zptb1PFjYFUf58uW59UYL0,8996
113
113
  phoenix/server/api/exceptions.py,sha256=E2W0x63CBzc0CoQPptrLr9nZxPF9zIP8MCJ3RuJMddw,1322
114
114
  phoenix/server/api/interceptor.py,sha256=ykDnoC_apUd-llVli3m1CW18kNSIgjz2qZ6m5JmPDu8,1294
115
- phoenix/server/api/queries.py,sha256=RC-MS6x1gNqYhNQ6TnWA6zqDDnpiW4puKLBTrbtS8os,67102
115
+ phoenix/server/api/queries.py,sha256=rHV8gBqCwNjuDCtfKTfBcJB-eWxbJFivZzFV3mId1HY,67524
116
116
  phoenix/server/api/schema.py,sha256=fcs36xQwFF_Qe41_5cWR8wYpDvOrnbcyTeo5WNMbDsA,1702
117
117
  phoenix/server/api/subscriptions.py,sha256=U7JZl-FGfsaIhRkIFdeSQLqR7xCS7CY1h-21BOAcaqY,25439
118
118
  phoenix/server/api/utils.py,sha256=quCBRcusc6PUq9tJq7M8PgwFZp7nXgVAxtbw8feribY,833
@@ -362,7 +362,7 @@ phoenix/server/cost_tracking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
362
362
  phoenix/server/cost_tracking/cost_details_calculator.py,sha256=Tt0YcuLhgPuXKWJemWVmYQfG0xQUvH4VziIj6KcDnoA,8945
363
363
  phoenix/server/cost_tracking/cost_model_lookup.py,sha256=jhtVdnQBzrTUHeOGPWgOebk-Io5hpJ1vAgWOu8ojeJ4,6801
364
364
  phoenix/server/cost_tracking/helpers.py,sha256=Pk6ECjnYreTxrldtRwxnwFcxIPVsvDq_yAwDA_spkOc,2122
365
- phoenix/server/cost_tracking/model_cost_manifest.json,sha256=9y3c0YrYSYTZvwerCr6yAQD97YBTZ6GUZ4UykDvwfFU,63485
365
+ phoenix/server/cost_tracking/model_cost_manifest.json,sha256=kE8VrBbvdqDy1ijk8KWWs_76U-L_vcRUT5hVT418evY,63488
366
366
  phoenix/server/cost_tracking/regex_specificity.py,sha256=9kqWuQ68C-hlwW25hr7BhFlRt5y2Nnpy0Ax3n9UN6Xk,11622
367
367
  phoenix/server/cost_tracking/token_cost_calculator.py,sha256=2JEZnvusx2-xbhp8krp9EarjWuyGH2KO4e-ZwJX-K0s,1598
368
368
  phoenix/server/daemons/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -391,19 +391,19 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
391
391
  phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
392
392
  phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
393
393
  phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
394
- phoenix/server/static/.vite/manifest.json,sha256=VfeGEGEeidc2iRZCqPQ8Ae-XTEOyLCy0MQw8DsvFEc0,2328
395
- phoenix/server/static/assets/components-BNcxEjYs.js,sha256=1_lobSTCfokeUlK4ClEylCmZ4gMIpa_zCsgZYZDGF9w,658582
396
- phoenix/server/static/assets/index-CKIBKnVD.js,sha256=ig-C5VgtSHWxhrkqhMwj6k1WKTjCYXdYvqI30ajC3v0,63064
397
- phoenix/server/static/assets/pages-3RoC-adr.js,sha256=Y5BgOTRvJRpBKJJ4rBMi7iTM3TNRDFe_v0nlxUEpV-0,1224388
398
- phoenix/server/static/assets/vendor-BbqekBfb.js,sha256=8xINQdH4ikfrf8nr8mlO0B9YrKJ2FPecrA9qu5kPILo,2588857
394
+ phoenix/server/static/.vite/manifest.json,sha256=L9WBJyT2l2gR-LG3CyeiExo2Rup5jwoiQX8PIgFZNyU,2328
395
+ phoenix/server/static/assets/components-BpxtWe3X.js,sha256=KA4pvxdJLW1iYrdDdI58NVk6BTkX1TTQCBXmACsUsBQ,658851
396
+ phoenix/server/static/assets/index-Bsnzoh7f.js,sha256=3NN-kPtjv1osA0b7UBWCuFtzT4zTCLdj9JsmpjOPH4A,63323
397
+ phoenix/server/static/assets/pages-BLzMd6Fl.js,sha256=1bgG6yEdrcRROQgNBlNaWJobDvapV675AGUuuXWAOOM,1225308
399
398
  phoenix/server/static/assets/vendor-CqDb5u4o.css,sha256=zIyFiNJKxMaQk8AvtLgt1rR01oO10d1MFndSDKH9Clw,5517
400
- phoenix/server/static/assets/vendor-arizeai-CEwHhYfL.js,sha256=EIl1d9G6uPn7_Fc8YyAdxWmyV1Y7k1nN7VeJmI4MxtA,121514
401
- phoenix/server/static/assets/vendor-codemirror-CHApHLLJ.js,sha256=q9KKVgYlf8hMPLO3915yxYrRr-vW7abf22fLQcn7CEA,402623
402
- phoenix/server/static/assets/vendor-recharts-Bqf7C6Cm.js,sha256=MsKqIXTx4JHHa9EtfFlQ_QqHZOfc6ETZDxAP7sJlzoQ,231651
403
- phoenix/server/static/assets/vendor-shiki-BQ88Q1b1.js,sha256=5oAj5_AuRlfSv2GHNstkg5klTm5gj_WnPa8dJ_B5ReA,305160
399
+ phoenix/server/static/assets/vendor-D9AxkwFX.js,sha256=SuOEpE881hapHLT3Kz8kbY-x5364JUvccjPQEOUh6Vs,2588857
400
+ phoenix/server/static/assets/vendor-arizeai-BSWqLnk0.js,sha256=fbqahxqa0MRvPZMsiNti_6JuV7M8xhfMhF15HJra40A,121514
401
+ phoenix/server/static/assets/vendor-codemirror-DQOFTPza.js,sha256=IVQ83VKGbEPr6DRuXLH68WUZcss7fenyrxqpXUTkZOg,402623
402
+ phoenix/server/static/assets/vendor-recharts-BcJHP7DH.js,sha256=QJKmp5Lt1HRuPntAW_fGqMQiOU5ppTb5q1fkn0Qt8fw,231651
403
+ phoenix/server/static/assets/vendor-shiki-DTHqzvBl.js,sha256=pcfuXAtd0wyejOEhnTkSh01OyITMTSGI2UniPUMN5RE,305160
404
404
  phoenix/server/static/assets/vendor-three-BLWp5bic.js,sha256=vfSCVXS20jA0Ceo_O0mDxYBcROinWMdPE6RR4JXmtec,620972
405
405
  phoenix/server/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
406
- phoenix/server/templates/index.html,sha256=0sqTnrrfw-BxrXaj2PayCgOUu-MseC6eUGBJwZx7KO8,7116
406
+ phoenix/server/templates/index.html,sha256=QAYh0TG5mg-GvDQUR09aD9ebl9Sfq0fYAcfIa5G7J6E,7148
407
407
  phoenix/session/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
408
408
  phoenix/session/client.py,sha256=Bl0Ov1tPrKX2-wBr7Kr49hQHgdBtyVfdhlMKcd5tURM,35583
409
409
  phoenix/session/data_extractor.py,sha256=Y0RzYFaNy9fQj8PEIeQ76TBZ90_E1FW7bXu3K5x0EZY,2782
@@ -441,9 +441,9 @@ phoenix/utilities/project.py,sha256=auVpARXkDb-JgeX5f2aStyFIkeKvGwN9l7qrFeJMVxI,
441
441
  phoenix/utilities/re.py,sha256=6YyUWIkv0zc2SigsxfOWIHzdpjKA_TZo2iqKq7zJKvw,2081
442
442
  phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
443
443
  phoenix/utilities/template_formatters.py,sha256=gh9PJD6WEGw7TEYXfSst1UR4pWWwmjxMLrDVQ_CkpkQ,2779
444
- arize_phoenix-11.21.0.dist-info/METADATA,sha256=YdUThYDa8tZXg7RRzkuImDvvvGjvUtQFuv5tTUzHDWc,30950
445
- arize_phoenix-11.21.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
446
- arize_phoenix-11.21.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
447
- arize_phoenix-11.21.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
448
- arize_phoenix-11.21.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
449
- arize_phoenix-11.21.0.dist-info/RECORD,,
444
+ arize_phoenix-11.22.0.dist-info/METADATA,sha256=tGoY8S9yx3ezaQ7noUKioqq9B_nGHiEzpmvy-RiUdc4,31634
445
+ arize_phoenix-11.22.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
446
+ arize_phoenix-11.22.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
447
+ arize_phoenix-11.22.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
448
+ arize_phoenix-11.22.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
449
+ arize_phoenix-11.22.0.dist-info/RECORD,,
phoenix/db/models.py CHANGED
@@ -2,6 +2,7 @@ import re
2
2
  from datetime import datetime, timezone
3
3
  from typing import Any, Iterable, Literal, Optional, Sequence, TypedDict, cast
4
4
 
5
+ import orjson
5
6
  import sqlalchemy as sa
6
7
  import sqlalchemy.sql as sql
7
8
  from openinference.semconv.trace import RerankerAttributes, SpanAttributes
@@ -187,7 +188,10 @@ class JsonDict(TypeDecorator[dict[str, Any]]):
187
188
  impl = JSON_
188
189
 
189
190
  def process_bind_param(self, value: Optional[dict[str, Any]], _: Dialect) -> dict[str, Any]:
190
- return value if isinstance(value, dict) else {}
191
+ return orjson.loads(orjson.dumps(value)) if isinstance(value, dict) else {}
192
+
193
+ def process_result_value(self, value: Optional[Any], _: Dialect) -> Optional[dict[str, Any]]:
194
+ return orjson.loads(orjson.dumps(value)) if isinstance(value, dict) and value else value
191
195
 
192
196
 
193
197
  class JsonList(TypeDecorator[list[Any]]):
@@ -196,7 +200,10 @@ class JsonList(TypeDecorator[list[Any]]):
196
200
  impl = JSON_
197
201
 
198
202
  def process_bind_param(self, value: Optional[list[Any]], _: Dialect) -> list[Any]:
199
- return value if isinstance(value, list) else []
203
+ return orjson.loads(orjson.dumps(value)) if isinstance(value, list) else []
204
+
205
+ def process_result_value(self, value: Optional[Any], _: Dialect) -> Optional[list[Any]]:
206
+ return orjson.loads(orjson.dumps(value)) if isinstance(value, list) and value else value
200
207
 
201
208
 
202
209
  class UtcTimeStamp(TypeDecorator[datetime]):
@@ -7,8 +7,8 @@ from typing import cast as type_cast
7
7
  import numpy as np
8
8
  import numpy.typing as npt
9
9
  import strawberry
10
- from sqlalchemy import ColumnElement, String, and_, case, cast, distinct, func, select, text
11
- from sqlalchemy.orm import aliased, joinedload
10
+ from sqlalchemy import ColumnElement, String, and_, case, cast, func, select, text
11
+ from sqlalchemy.orm import aliased, joinedload, load_only
12
12
  from starlette.authentication import UnauthenticatedUser
13
13
  from strawberry import ID, UNSET
14
14
  from strawberry.relay import Connection, GlobalID, Node
@@ -375,41 +375,52 @@ class Query:
375
375
  raise BadRequest("Compare experiment IDs cannot contain the base experiment ID")
376
376
  if len(set(compare_experiment_ids)) < len(compare_experiment_ids):
377
377
  raise BadRequest("Compare experiment IDs must be unique")
378
- experiment_ids = [
379
- from_global_id_with_expected_type(experiment_id, models.Experiment.__name__)
380
- for experiment_id in (base_experiment_id, *compare_experiment_ids)
381
- ]
378
+
379
+ try:
380
+ base_experiment_rowid = from_global_id_with_expected_type(
381
+ base_experiment_id, models.Experiment.__name__
382
+ )
383
+ except ValueError:
384
+ raise BadRequest(f"Invalid base experiment ID: {base_experiment_id}")
385
+
386
+ compare_experiment_rowids = []
387
+ for compare_experiment_id in compare_experiment_ids:
388
+ try:
389
+ compare_experiment_rowids.append(
390
+ from_global_id_with_expected_type(
391
+ compare_experiment_id, models.Experiment.__name__
392
+ )
393
+ )
394
+ except ValueError:
395
+ raise BadRequest(f"Invalid compare experiment ID: {compare_experiment_id}")
396
+
397
+ experiment_rowids = [base_experiment_rowid, *compare_experiment_rowids]
398
+
382
399
  cursor = Cursor.from_string(after) if after else None
383
400
  page_size = first or 50
384
401
 
385
402
  async with info.context.db() as session:
386
- validation_result = (
387
- await session.execute(
403
+ experiments = (
404
+ await session.scalars(
388
405
  select(
389
- func.count(distinct(models.DatasetVersion.dataset_id)),
390
- func.max(models.DatasetVersion.dataset_id),
391
- func.max(models.DatasetVersion.id),
392
- func.count(models.Experiment.id),
393
- )
394
- .select_from(models.DatasetVersion)
395
- .join(
396
406
  models.Experiment,
397
- models.Experiment.dataset_version_id == models.DatasetVersion.id,
398
407
  )
399
- .where(
400
- models.Experiment.id.in_(experiment_ids),
408
+ .where(models.Experiment.id.in_(experiment_rowids))
409
+ .options(
410
+ load_only(
411
+ models.Experiment.dataset_id, models.Experiment.dataset_version_id
412
+ )
401
413
  )
402
414
  )
403
- ).first()
404
- if validation_result is None:
405
- raise NotFound("No experiments could be found for input IDs.")
406
-
407
- num_datasets, dataset_id, version_id, num_resolved_experiment_ids = validation_result
408
- if num_datasets != 1:
409
- raise BadRequest("Experiments must belong to the same dataset.")
410
- if num_resolved_experiment_ids != len(experiment_ids):
415
+ ).all()
416
+ if not experiments or len(experiments) < len(experiment_rowids):
411
417
  raise NotFound("Unable to resolve one or more experiment IDs.")
412
-
418
+ num_datasets = len(set(experiment.dataset_id for experiment in experiments))
419
+ if num_datasets > 1:
420
+ raise BadRequest("Experiments must belong to the same dataset.")
421
+ base_experiment = next(
422
+ experiment for experiment in experiments if experiment.id == base_experiment_rowid
423
+ )
413
424
  revision_ids = (
414
425
  select(func.max(models.DatasetExampleRevision.id))
415
426
  .join(
@@ -418,8 +429,9 @@ class Query:
418
429
  )
419
430
  .where(
420
431
  and_(
421
- models.DatasetExampleRevision.dataset_version_id <= version_id,
422
- models.DatasetExample.dataset_id == dataset_id,
432
+ models.DatasetExampleRevision.dataset_version_id
433
+ <= base_experiment.dataset_version_id,
434
+ models.DatasetExample.dataset_id == base_experiment.dataset_id,
423
435
  )
424
436
  )
425
437
  .group_by(models.DatasetExampleRevision.dataset_example_id)
@@ -447,7 +459,7 @@ class Query:
447
459
  examples_query = update_examples_query_with_filter_condition(
448
460
  query=examples_query,
449
461
  filter_condition=filter_condition,
450
- experiment_ids=experiment_ids,
462
+ experiment_ids=experiment_rowids,
451
463
  )
452
464
 
453
465
  examples = (await session.scalars(examples_query)).all()
@@ -466,7 +478,7 @@ class Query:
466
478
  models.ExperimentRun.dataset_example_id.in_(
467
479
  example.id for example in examples
468
480
  ),
469
- models.ExperimentRun.experiment_id.in_(experiment_ids),
481
+ models.ExperimentRun.experiment_id.in_(experiment_rowids),
470
482
  )
471
483
  )
472
484
  .options(joinedload(models.ExperimentRun.trace).load_only(models.Trace.trace_id))
@@ -479,7 +491,7 @@ class Query:
479
491
  cursors_and_nodes = []
480
492
  for example in examples:
481
493
  run_comparison_items = []
482
- for experiment_id in experiment_ids:
494
+ for experiment_id in experiment_rowids:
483
495
  run_comparison_items.append(
484
496
  RunComparisonItem(
485
497
  experiment_id=GlobalID(Experiment.__name__, str(experiment_id)),
@@ -496,7 +508,7 @@ class Query:
496
508
  example=DatasetExample(
497
509
  id_attr=example.id,
498
510
  created_at=example.created_at,
499
- version_id=version_id,
511
+ version_id=base_experiment.dataset_version_id,
500
512
  ),
501
513
  run_comparison_items=run_comparison_items,
502
514
  )
@@ -1491,7 +1503,7 @@ class Query:
1491
1503
  return None
1492
1504
 
1493
1505
  @strawberry.field
1494
- async def get_project_session_by_otel_id(
1506
+ async def get_project_session_by_id(
1495
1507
  self,
1496
1508
  info: Info[Context, None],
1497
1509
  session_id: str,
@@ -2182,17 +2182,17 @@
2182
2182
  "source": "litellm",
2183
2183
  "token_prices": [
2184
2184
  {
2185
- "base_rate": 5e-6,
2185
+ "base_rate": 1.25e-6,
2186
2186
  "is_prompt": true,
2187
2187
  "token_type": "input"
2188
2188
  },
2189
2189
  {
2190
- "base_rate": 0.00002,
2190
+ "base_rate": 0.00001,
2191
2191
  "is_prompt": false,
2192
2192
  "token_type": "output"
2193
2193
  },
2194
2194
  {
2195
- "base_rate": 1.25e-6,
2195
+ "base_rate": 1.25e-7,
2196
2196
  "is_prompt": true,
2197
2197
  "token_type": "cache_read"
2198
2198
  }
@@ -1,28 +1,32 @@
1
1
  {
2
- "_components-BNcxEjYs.js": {
3
- "file": "assets/components-BNcxEjYs.js",
2
+ "_components-BpxtWe3X.js": {
3
+ "file": "assets/components-BpxtWe3X.js",
4
4
  "name": "components",
5
5
  "imports": [
6
- "_vendor-BbqekBfb.js",
7
- "_pages-3RoC-adr.js",
8
- "_vendor-arizeai-CEwHhYfL.js",
9
- "_vendor-codemirror-CHApHLLJ.js",
6
+ "_vendor-D9AxkwFX.js",
7
+ "_pages-BLzMd6Fl.js",
8
+ "_vendor-arizeai-BSWqLnk0.js",
9
+ "_vendor-codemirror-DQOFTPza.js",
10
10
  "_vendor-three-BLWp5bic.js"
11
11
  ]
12
12
  },
13
- "_pages-3RoC-adr.js": {
14
- "file": "assets/pages-3RoC-adr.js",
13
+ "_pages-BLzMd6Fl.js": {
14
+ "file": "assets/pages-BLzMd6Fl.js",
15
15
  "name": "pages",
16
16
  "imports": [
17
- "_vendor-BbqekBfb.js",
18
- "_vendor-arizeai-CEwHhYfL.js",
19
- "_components-BNcxEjYs.js",
20
- "_vendor-codemirror-CHApHLLJ.js",
21
- "_vendor-recharts-Bqf7C6Cm.js"
17
+ "_vendor-D9AxkwFX.js",
18
+ "_vendor-arizeai-BSWqLnk0.js",
19
+ "_components-BpxtWe3X.js",
20
+ "_vendor-codemirror-DQOFTPza.js",
21
+ "_vendor-recharts-BcJHP7DH.js"
22
22
  ]
23
23
  },
24
- "_vendor-BbqekBfb.js": {
25
- "file": "assets/vendor-BbqekBfb.js",
24
+ "_vendor-CqDb5u4o.css": {
25
+ "file": "assets/vendor-CqDb5u4o.css",
26
+ "src": "_vendor-CqDb5u4o.css"
27
+ },
28
+ "_vendor-D9AxkwFX.js": {
29
+ "file": "assets/vendor-D9AxkwFX.js",
26
30
  "name": "vendor",
27
31
  "imports": [
28
32
  "_vendor-three-BLWp5bic.js"
@@ -31,43 +35,39 @@
31
35
  "assets/vendor-CqDb5u4o.css"
32
36
  ]
33
37
  },
34
- "_vendor-CqDb5u4o.css": {
35
- "file": "assets/vendor-CqDb5u4o.css",
36
- "src": "_vendor-CqDb5u4o.css"
37
- },
38
- "_vendor-arizeai-CEwHhYfL.js": {
39
- "file": "assets/vendor-arizeai-CEwHhYfL.js",
38
+ "_vendor-arizeai-BSWqLnk0.js": {
39
+ "file": "assets/vendor-arizeai-BSWqLnk0.js",
40
40
  "name": "vendor-arizeai",
41
41
  "imports": [
42
- "_vendor-BbqekBfb.js"
42
+ "_vendor-D9AxkwFX.js"
43
43
  ]
44
44
  },
45
- "_vendor-codemirror-CHApHLLJ.js": {
46
- "file": "assets/vendor-codemirror-CHApHLLJ.js",
45
+ "_vendor-codemirror-DQOFTPza.js": {
46
+ "file": "assets/vendor-codemirror-DQOFTPza.js",
47
47
  "name": "vendor-codemirror",
48
48
  "imports": [
49
- "_vendor-BbqekBfb.js",
50
- "_vendor-shiki-BQ88Q1b1.js"
49
+ "_vendor-D9AxkwFX.js",
50
+ "_vendor-shiki-DTHqzvBl.js"
51
51
  ],
52
52
  "dynamicImports": [
53
- "_vendor-shiki-BQ88Q1b1.js",
54
- "_vendor-shiki-BQ88Q1b1.js",
55
- "_vendor-shiki-BQ88Q1b1.js"
53
+ "_vendor-shiki-DTHqzvBl.js",
54
+ "_vendor-shiki-DTHqzvBl.js",
55
+ "_vendor-shiki-DTHqzvBl.js"
56
56
  ]
57
57
  },
58
- "_vendor-recharts-Bqf7C6Cm.js": {
59
- "file": "assets/vendor-recharts-Bqf7C6Cm.js",
58
+ "_vendor-recharts-BcJHP7DH.js": {
59
+ "file": "assets/vendor-recharts-BcJHP7DH.js",
60
60
  "name": "vendor-recharts",
61
61
  "imports": [
62
- "_vendor-BbqekBfb.js"
62
+ "_vendor-D9AxkwFX.js"
63
63
  ]
64
64
  },
65
- "_vendor-shiki-BQ88Q1b1.js": {
66
- "file": "assets/vendor-shiki-BQ88Q1b1.js",
65
+ "_vendor-shiki-DTHqzvBl.js": {
66
+ "file": "assets/vendor-shiki-DTHqzvBl.js",
67
67
  "name": "vendor-shiki",
68
68
  "isDynamicEntry": true,
69
69
  "imports": [
70
- "_vendor-BbqekBfb.js"
70
+ "_vendor-D9AxkwFX.js"
71
71
  ]
72
72
  },
73
73
  "_vendor-three-BLWp5bic.js": {
@@ -75,19 +75,19 @@
75
75
  "name": "vendor-three"
76
76
  },
77
77
  "index.tsx": {
78
- "file": "assets/index-CKIBKnVD.js",
78
+ "file": "assets/index-Bsnzoh7f.js",
79
79
  "name": "index",
80
80
  "src": "index.tsx",
81
81
  "isEntry": true,
82
82
  "imports": [
83
- "_vendor-BbqekBfb.js",
84
- "_vendor-arizeai-CEwHhYfL.js",
85
- "_pages-3RoC-adr.js",
86
- "_components-BNcxEjYs.js",
83
+ "_vendor-D9AxkwFX.js",
84
+ "_vendor-arizeai-BSWqLnk0.js",
85
+ "_pages-BLzMd6Fl.js",
86
+ "_components-BpxtWe3X.js",
87
87
  "_vendor-three-BLWp5bic.js",
88
- "_vendor-codemirror-CHApHLLJ.js",
89
- "_vendor-shiki-BQ88Q1b1.js",
90
- "_vendor-recharts-Bqf7C6Cm.js"
88
+ "_vendor-codemirror-DQOFTPza.js",
89
+ "_vendor-shiki-DTHqzvBl.js",
90
+ "_vendor-recharts-BcJHP7DH.js"
91
91
  ]
92
92
  }
93
93
  }