arize-phoenix 10.10.0__py3-none-any.whl → 10.12.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.4
2
2
  Name: arize-phoenix
3
- Version: 10.10.0
3
+ Version: 10.12.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
@@ -108,7 +108,7 @@ Requires-Dist: tox-uv==1.11.3; extra == 'dev'
108
108
  Requires-Dist: tox==4.18.1; extra == 'dev'
109
109
  Requires-Dist: types-jsonschema; extra == 'dev'
110
110
  Requires-Dist: types-tabulate; extra == 'dev'
111
- Requires-Dist: uv==0.4.8; extra == 'dev'
111
+ Requires-Dist: uv==0.7.12; extra == 'dev'
112
112
  Requires-Dist: uvloop; (platform_system != 'Windows') and extra == 'dev'
113
113
  Provides-Extra: embeddings
114
114
  Requires-Dist: fast-hdbscan>=0.2.0; extra == 'embeddings'
@@ -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=x87BX7hWGQQZbrW_vrYqFR_izCGfO9gFc--JXUG4Tdk,754
9
- phoenix/version.py,sha256=iP2iq6azkvKNWyZGbbMP-neuljcKozm4vbYLd6OYWHg,24
9
+ phoenix/version.py,sha256=pBrSaHNsQ4T1_xrksWp-HQLyHewcLal4iOxu8yfGX7M,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
@@ -56,8 +56,8 @@ phoenix/db/types/identifier.py,sha256=Opr3_1di6e5ncrBDn30WfBSr-jN_VGBnkkA4BMuSoy
56
56
  phoenix/db/types/model_provider.py,sha256=vrG0yIQqy-SwvRJ1aGJqpCjPZ29vRAi6550CnvSyj2E,221
57
57
  phoenix/db/types/trace_retention.py,sha256=fyqAQCvDiD7mpJ_WUqbPyQvuSdERof4DpKpHLJsdROk,9897
58
58
  phoenix/experiments/__init__.py,sha256=6JGwgUd7xCbGpuHqYZlsmErmYvVgv7N_j43bn3dUqsk,123
59
- phoenix/experiments/functions.py,sha256=JVhHImgta_ILxXbV17hFSo0k8O0qCIoHC-JDNwKw5Mg,38257
60
- phoenix/experiments/tracing.py,sha256=bpw9OtrBxjOZKkpf4-Fmn3uCUXUrlhCjHPN9XqW6cp0,2888
59
+ phoenix/experiments/functions.py,sha256=QoNkMW_EamcFyDBwq4WzKkmHVXD5ZFW9MlUaGRssrTQ,38227
60
+ phoenix/experiments/tracing.py,sha256=seNh9rBH-rtQe8_FPI_VJj1rbo3ADcP6wDvERkMoxNc,2858
61
61
  phoenix/experiments/types.py,sha256=yntt6fnAny1U4Q9Y5Mm4ZYIb9319OaJovl-kyXFtGQE,23475
62
62
  phoenix/experiments/utils.py,sha256=MZ1-OnTcavk_KUtbfGqt55Fk9TGtJpYG_K71WsN-zDk,785
63
63
  phoenix/experiments/evaluators/__init__.py,sha256=CPWW1EiufLqc0JWghE4wVAPG_z6Wt4mD_-yf_4IckB4,772
@@ -101,7 +101,7 @@ phoenix/server/oauth2.py,sha256=GvUqZBoZ5dG-l2G1RMl1SUcN10jNAjaMXFznMSWz2Zs,3336
101
101
  phoenix/server/prometheus.py,sha256=1KjvSfjSa2-BPjDybVMM_Kag316CsN-Zwt64YNr_snc,7825
102
102
  phoenix/server/rate_limiters.py,sha256=cFc73D2NaxqNZZDbwfIDw4So-fRVOJPBtqxOZ8Qky_s,7155
103
103
  phoenix/server/retention.py,sha256=MQe1FWuc_NxhqgIq5q2hfFhWT8ddAmpppgI74xYEQ6c,3064
104
- phoenix/server/telemetry.py,sha256=yKAAEy9rvdLvQ-BCINM-H3U6hxlXq2bM8FkiQ_4VazU,2785
104
+ phoenix/server/telemetry.py,sha256=4EluDDrhdDPxAjaW6lVSbi73xkB5XeUCZWOmZGdk0hg,2755
105
105
  phoenix/server/thread_server.py,sha256=Ea2AWreN1lwJsT2wYvGaRaiXrzBqH4kgkZpx0FO5Ocw,2144
106
106
  phoenix/server/types.py,sha256=b17xahdt6uwDdUYul0xctu7TbBC65AjarlhUzOiXFNE,7443
107
107
  phoenix/server/api/README.md,sha256=Pyq1PLPgTzXAswrfIhGXrjI3Skq8it2jTVnanT6Ba4Q,1162
@@ -110,7 +110,7 @@ phoenix/server/api/auth.py,sha256=cvKH2FQLL7PasiqZMHgu9P4qchhEG7a7P9Nxy35FoIQ,15
110
110
  phoenix/server/api/context.py,sha256=oxNmVIIyycl22iQZjv59lU1inwlo-Povxe2Ok7t54mw,6954
111
111
  phoenix/server/api/exceptions.py,sha256=TA0JuY2YRnj35qGuMSQ8d0ToHum9gWm9W--3fSKHrX0,1171
112
112
  phoenix/server/api/interceptor.py,sha256=ykDnoC_apUd-llVli3m1CW18kNSIgjz2qZ6m5JmPDu8,1294
113
- phoenix/server/api/queries.py,sha256=kbQg3Uy64EbsOzVQvqXSz44Bfv2qyXWk2b5EYfuGCEY,41039
113
+ phoenix/server/api/queries.py,sha256=_Ae8W6Y9O3_6gFdWjwVXIiX2kVvN8Ev_VcIQgO4x_88,41278
114
114
  phoenix/server/api/schema.py,sha256=fcs36xQwFF_Qe41_5cWR8wYpDvOrnbcyTeo5WNMbDsA,1702
115
115
  phoenix/server/api/subscriptions.py,sha256=73s6TzwI2M_bjIZDYwgohdI_13iv7pgpLCvZYNuExnw,23777
116
116
  phoenix/server/api/utils.py,sha256=quCBRcusc6PUq9tJq7M8PgwFZp7nXgVAxtbw8feribY,833
@@ -158,7 +158,7 @@ phoenix/server/api/helpers/__init__.py,sha256=m2-xaSPqUiSs91k62JaRDjFNfl-1byxBfY
158
158
  phoenix/server/api/helpers/annotations.py,sha256=9gMXKpMTfWEChoSCnvdWYuyB0hlSnNOp-qUdar9Vono,262
159
159
  phoenix/server/api/helpers/dataset_helpers.py,sha256=DoMBTg-qXTnC_K4Evx1WKpCCYgRbITpVqyY-8efJRf0,8984
160
160
  phoenix/server/api/helpers/experiment_run_filters.py,sha256=DOnVwrmn39eAkk2mwuZP8kIcAnR5jrOgllEwWSjsw94,29893
161
- phoenix/server/api/helpers/playground_clients.py,sha256=ycvccG8bzwtIeU0LQpR6IMOn3B3DftmCwqfuYYZ7YYM,47957
161
+ phoenix/server/api/helpers/playground_clients.py,sha256=laFDXVnj-n5-nze5OeJSLT5nwdz2IWFTVccKNcLqK7U,47932
162
162
  phoenix/server/api/helpers/playground_registry.py,sha256=CPLMziFB2wmr-dfbx7VbzO2f8YIG_k5RftzvGXYGQ1w,2570
163
163
  phoenix/server/api/helpers/playground_spans.py,sha256=QpXwPl_fFNwm_iA1A77XApUyXMl1aDmonw8aXuNZ_4k,17132
164
164
  phoenix/server/api/helpers/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -178,6 +178,7 @@ phoenix/server/api/input_types/CreateSpanAnnotationInput.py,sha256=BtPB8udqnpK7k
178
178
  phoenix/server/api/input_types/CreateTraceAnnotationInput.py,sha256=GBzOwRw_GNQq3RwS5kDp32j55VI1czOmvEmRESqCsRQ,625
179
179
  phoenix/server/api/input_types/DataQualityMetricInput.py,sha256=WPWRlqSejOnxlLqsbEwPCDgz8ocsyGSb-9SptdCjZEc,1361
180
180
  phoenix/server/api/input_types/DatasetExampleInput.py,sha256=9oJ6pCFxFd02IWJuK4YAUvz-jCgFGDUCDDb2--GAzCw,289
181
+ phoenix/server/api/input_types/DatasetFilter.py,sha256=jPJ82ktyvflM7jFlhaMRrY2DjdyOcPBiTO8KMeFKgaE,233
181
182
  phoenix/server/api/input_types/DatasetSort.py,sha256=KDKjx5L8WFNwx7O-g1pDzCMMwY-ErgDd1_HkkZBAvCY,333
182
183
  phoenix/server/api/input_types/DatasetVersionSort.py,sha256=w9HyP9rQKsZGiGc2f33ZNmiO9g7FN8r77T7GA85kb40,344
183
184
  phoenix/server/api/input_types/DeleteAnnotationsInput.py,sha256=nuTcbeRt54XCYc87URI1_ZTTnIBK25EwRJCgNLJqvAM,141
@@ -241,7 +242,7 @@ phoenix/server/api/routers/v1/experiments.py,sha256=V9_sxqLTE1MKGFu9H3FEdGKr70lY
241
242
  phoenix/server/api/routers/v1/models.py,sha256=p3gJN-9SWiUYTUTft4bZMsZVCBNTb4nN1Foy68eRZzQ,1997
242
243
  phoenix/server/api/routers/v1/projects.py,sha256=LFWxHYPRZy-1EvroNylL635vU1UuDbcuRo1oD26yBnw,12551
243
244
  phoenix/server/api/routers/v1/prompts.py,sha256=aBOUBwLDzZDIzJQkxJcR8ZKnakNJOLMwzsLKINSs1mA,26545
244
- phoenix/server/api/routers/v1/spans.py,sha256=MxZ9RvZqc8JGgcDAgH_S9rTc9YfXOEF_j9kqBf3z4qY,38379
245
+ phoenix/server/api/routers/v1/spans.py,sha256=HhZtXsNTdOmMXWtMkz3VUb3aqpGsVAU5XOYi2KfvGMc,44106
245
246
  phoenix/server/api/routers/v1/traces.py,sha256=DfzeszQvtlrVxvurJLaWJJAhkCZ4BodLwpFuBYPwN5Q,8206
246
247
  phoenix/server/api/routers/v1/users.py,sha256=ZcW3if0L8-lUusTzET7fhlhvnmiCICDrGimzB7i3irc,11947
247
248
  phoenix/server/api/routers/v1/utils.py,sha256=oXIOGPzPTkE0ZWUTRCoRIQQ7wTzoSwtWFaUSjlGBqts,4960
@@ -294,7 +295,7 @@ phoenix/server/api/types/MimeType.py,sha256=Zpi6zCalkSFgsvhzvOs-O1gYA04usAi9H__Q
294
295
  phoenix/server/api/types/Model.py,sha256=8UIFqMe1q-2ufBNg-gxHusV8wM1h-KbfLUeJjyVcMvQ,8081
295
296
  phoenix/server/api/types/NumericRange.py,sha256=afEjgF97Go_OvmjMggbPBt-zGM8IONewAyEiKEHRds0,192
296
297
  phoenix/server/api/types/PerformanceMetric.py,sha256=KFkmJDqP43eDUtARQOUqR7NYcxvL6Vh2uisHWU6H3ko,387
297
- phoenix/server/api/types/Project.py,sha256=l1mz-j0ECEuW6aQrSMtDaLiosysjecs-tRqpxXqNBWQ,28804
298
+ phoenix/server/api/types/Project.py,sha256=FulRsgTWcvZEyiV3lzJ505HMa9Eq7aoQr3OkbPWH2Ws,29864
298
299
  phoenix/server/api/types/ProjectSession.py,sha256=fyfVtpUpFOTnBx8DFnH3dr7WXAssN0ooAgrQSSi7kEI,4677
299
300
  phoenix/server/api/types/ProjectTraceRetentionPolicy.py,sha256=tYy2kgalPDyuaYZr0VUHjH0YpXaiF_QOzg5yfaV_c7c,3782
300
301
  phoenix/server/api/types/Prompt.py,sha256=ccP4eq1e38xbF0afclGWLOuDpBVpNbJ3AOSRClF8yFQ,4955
@@ -349,10 +350,10 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
349
350
  phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
350
351
  phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
351
352
  phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
352
- phoenix/server/static/.vite/manifest.json,sha256=Nzhf7R0NbqznSCZs5V6LGLwYZTIbkW46IrFOEDJ-3mg,2165
353
- phoenix/server/static/assets/components-DIL5A2s_.js,sha256=miQjkcjqWNAp1Al_LDLktYsxVLOLp-SUG1ZsRMpUKR8,565838
354
- phoenix/server/static/assets/index-BX0gVSKm.js,sha256=u_1-bgu97bGqnohPdwhMhbq4vYoP6zxtIfV8iHPyeoE,61125
355
- phoenix/server/static/assets/pages-DNp2bYa0.js,sha256=THBjLCdQk5yTcZvUXFe5gMcb5GjGOd50v0bjQAYhmN0,1053391
353
+ phoenix/server/static/.vite/manifest.json,sha256=Y9B-iAYwgBxlFRmn9uT4BxZ3nISaTwSMJJiISSAYh8s,2165
354
+ phoenix/server/static/assets/components-CKFZdR5A.js,sha256=AOSKJmIJf-eGIIvuvZNIevW5CcPmHrbMAqtci-tbNYE,565838
355
+ phoenix/server/static/assets/index-D3uXREcK.js,sha256=vwzEn-uC6iBPUZ_gE2H8CCvcm2YLKQmO9mX1f6MuagQ,61125
356
+ phoenix/server/static/assets/pages-BEpY_9Jm.js,sha256=9uRMswtZ_NAVOR7Q6-zrg0DDtN7rljEmqO7VdAMpQMg,1054967
356
357
  phoenix/server/static/assets/vendor-ARQZvmz5.js,sha256=U_VQSuHOpuX7DxntJS2ckfxW2a4hV-E3MCqeJSxwdCY,2735976
357
358
  phoenix/server/static/assets/vendor-WIZid84E.css,sha256=spZD2r7XL5GfLO13ln-IuXfnjAref8l6g_n_AvxxOlI,5517
358
359
  phoenix/server/static/assets/vendor-arizeai-Ct6kvW4e.js,sha256=n_v4BAgm9-OaJMlQTf0OtLfPmPBdagnu85gVuds43sM,181771
@@ -374,7 +375,7 @@ phoenix/trace/evaluation_conventions.py,sha256=t8jydM3U0-T5YpiQKRJ3tWdWGlHtzKytt
374
375
  phoenix/trace/exporter.py,sha256=bUXh8fjJIbHurrnt4bAm-cCWqUN5FqNsIc8DZzzklkQ,4695
375
376
  phoenix/trace/fixtures.py,sha256=1c7fsyvmxC53Fib9T_Qxp_Ly3OZdDbkLQ0XpFzikEjk,20298
376
377
  phoenix/trace/otel.py,sha256=RJSbAuzS4KBS0t-fntXQaaYwv7FmIXRMrw65DI67z8k,10622
377
- phoenix/trace/projects.py,sha256=URKEHEaxnr3uHM4nn8kcVN6tcn4MXAt_OEca4TPDtco,2208
378
+ phoenix/trace/projects.py,sha256=9dKv1aiKL4IYMFsg2xnC6EOIRO0YHtkR5o9ALHbMK9g,2178
378
379
  phoenix/trace/schemas.py,sha256=Su6e567Bei9oo6PsWO2srTcPAj9C2bMgbGtx64Sgqeg,6332
379
380
  phoenix/trace/span_evaluations.py,sha256=x3nye9r2SQk1mrR3N05YbuWsgUKpMWwTRBtJTDBSj3Y,13156
380
381
  phoenix/trace/span_json_decoder.py,sha256=J1_oDViuUoC4vxPg61U4EOZC1uEMcCzoj-kVjOFEE8k,3224
@@ -399,9 +400,9 @@ phoenix/utilities/project.py,sha256=auVpARXkDb-JgeX5f2aStyFIkeKvGwN9l7qrFeJMVxI,
399
400
  phoenix/utilities/re.py,sha256=6YyUWIkv0zc2SigsxfOWIHzdpjKA_TZo2iqKq7zJKvw,2081
400
401
  phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
401
402
  phoenix/utilities/template_formatters.py,sha256=gh9PJD6WEGw7TEYXfSst1UR4pWWwmjxMLrDVQ_CkpkQ,2779
402
- arize_phoenix-10.10.0.dist-info/METADATA,sha256=89fGE5LtrTKVOChcvrZFVwjvxyibIi9CjsjE0FtHUNI,27005
403
- arize_phoenix-10.10.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
404
- arize_phoenix-10.10.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
405
- arize_phoenix-10.10.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
406
- arize_phoenix-10.10.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
407
- arize_phoenix-10.10.0.dist-info/RECORD,,
403
+ arize_phoenix-10.12.0.dist-info/METADATA,sha256=B2JAKsJ0YoxMzZ5_4AeWU8DW0UScmfnOXNnR3trLnwg,27006
404
+ arize_phoenix-10.12.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
405
+ arize_phoenix-10.12.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
406
+ arize_phoenix-10.12.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
407
+ arize_phoenix-10.12.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
408
+ arize_phoenix-10.12.0.dist-info/RECORD,,
@@ -25,7 +25,7 @@ from openinference.semconv.trace import (
25
25
  )
26
26
  from opentelemetry.context import Context
27
27
  from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
28
- from opentelemetry.sdk.resources import Resource # type: ignore[attr-defined]
28
+ from opentelemetry.sdk.resources import Resource
29
29
  from opentelemetry.sdk.trace import Span
30
30
  from opentelemetry.sdk.trace.export import SimpleSpanProcessor
31
31
  from opentelemetry.trace import Status, StatusCode, Tracer
@@ -6,7 +6,7 @@ from contextvars import ContextVar
6
6
  from threading import Lock
7
7
  from typing import Any, Optional
8
8
 
9
- from opentelemetry.sdk.resources import Resource # type: ignore[attr-defined]
9
+ from opentelemetry.sdk.resources import Resource
10
10
  from opentelemetry.sdk.trace import ReadableSpan
11
11
  from opentelemetry.trace import INVALID_TRACE_ID
12
12
  from wrapt import apply_patch, resolve_path, wrap_function_wrapper
@@ -359,7 +359,6 @@ class OpenAIBaseStreamingClient(PlaygroundStreamingClient):
359
359
  ):
360
360
  if (usage := chunk.usage) is not None:
361
361
  token_usage = usage
362
- continue
363
362
  if not chunk.choices:
364
363
  # for Azure, initial chunk contains the content filter
365
364
  continue
@@ -0,0 +1,14 @@
1
+ from enum import Enum
2
+
3
+ import strawberry
4
+
5
+
6
+ @strawberry.enum
7
+ class DatasetFilterColumn(Enum):
8
+ name = "name"
9
+
10
+
11
+ @strawberry.input(description="A filter for datasets")
12
+ class DatasetFilter:
13
+ col: DatasetFilterColumn
14
+ value: str
@@ -41,6 +41,7 @@ from phoenix.server.api.helpers.playground_clients import initialize_playground_
41
41
  from phoenix.server.api.helpers.playground_registry import PLAYGROUND_CLIENT_REGISTRY
42
42
  from phoenix.server.api.input_types.ClusterInput import ClusterInput
43
43
  from phoenix.server.api.input_types.Coordinates import InputCoordinate2D, InputCoordinate3D
44
+ from phoenix.server.api.input_types.DatasetFilter import DatasetFilter
44
45
  from phoenix.server.api.input_types.DatasetSort import DatasetSort
45
46
  from phoenix.server.api.input_types.InvocationParameters import InvocationParameter
46
47
  from phoenix.server.api.input_types.ProjectFilter import ProjectFilter
@@ -285,6 +286,7 @@ class Query:
285
286
  after: Optional[CursorString] = UNSET,
286
287
  before: Optional[CursorString] = UNSET,
287
288
  sort: Optional[DatasetSort] = UNSET,
289
+ filter: Optional[DatasetFilter] = UNSET,
288
290
  ) -> Connection[Dataset]:
289
291
  args = ConnectionArgs(
290
292
  first=first,
@@ -296,6 +298,8 @@ class Query:
296
298
  if sort:
297
299
  sort_col = getattr(models.Dataset, sort.col.value)
298
300
  stmt = stmt.order_by(sort_col.desc() if sort.dir is SortDir.desc else sort_col.asc())
301
+ if filter:
302
+ stmt = stmt.where(getattr(models.Dataset, filter.col.value).ilike(f"%{filter.value}%"))
299
303
  async with info.context.db() as session:
300
304
  datasets = await session.scalars(stmt)
301
305
  return connection_from_list(
@@ -1,3 +1,4 @@
1
+ import json
1
2
  import warnings
2
3
  from asyncio import get_running_loop
3
4
  from collections.abc import AsyncIterator
@@ -12,7 +13,12 @@ from pydantic import BaseModel, Field
12
13
  from sqlalchemy import select
13
14
  from starlette.requests import Request
14
15
  from starlette.responses import Response, StreamingResponse
15
- from starlette.status import HTTP_404_NOT_FOUND, HTTP_422_UNPROCESSABLE_ENTITY
16
+ from starlette.status import (
17
+ HTTP_202_ACCEPTED,
18
+ HTTP_400_BAD_REQUEST,
19
+ HTTP_404_NOT_FOUND,
20
+ HTTP_422_UNPROCESSABLE_ENTITY,
21
+ )
16
22
  from strawberry.relay import GlobalID
17
23
 
18
24
  from phoenix.config import DEFAULT_PROJECT_NAME
@@ -26,6 +32,19 @@ from phoenix.server.bearer_auth import PhoenixUser
26
32
  from phoenix.server.dml_event import SpanAnnotationInsertEvent
27
33
  from phoenix.trace.attributes import flatten
28
34
  from phoenix.trace.dsl import SpanQuery as SpanQuery_
35
+ from phoenix.trace.schemas import (
36
+ Span as SpanForInsertion,
37
+ )
38
+ from phoenix.trace.schemas import (
39
+ SpanContext as InsertionSpanContext,
40
+ )
41
+ from phoenix.trace.schemas import (
42
+ SpanEvent as InternalSpanEvent,
43
+ )
44
+ from phoenix.trace.schemas import (
45
+ SpanKind,
46
+ SpanStatusCode,
47
+ )
29
48
  from phoenix.utilities.json import encode_df_as_json_string
30
49
 
31
50
  from .models import V1RoutesBaseModel
@@ -393,7 +412,9 @@ class SpanEvent(V1RoutesBaseModel):
393
412
 
394
413
 
395
414
  class Span(V1RoutesBaseModel):
396
- id: str = Field(description="Span Global ID, distinct from the OpenTelemetry span ID")
415
+ id: str = Field(
416
+ default="", description="Span Global ID, distinct from the OpenTelemetry span ID"
417
+ )
397
418
  name: str = Field(description="Name of the span operation")
398
419
  context: SpanContext = Field(description="Span context containing trace_id and span_id")
399
420
  span_kind: str = Field(description="Type of work that the span encapsulates")
@@ -440,7 +461,7 @@ async def query_spans_handler(
440
461
  )
441
462
  end_time = request_body.end_time or request_body.stop_time
442
463
  try:
443
- span_queries = [SpanQuery_.from_dict(query.dict()) for query in queries]
464
+ span_queries = [SpanQuery_.from_dict(query.model_dump()) for query in queries]
444
465
  except Exception as e:
445
466
  raise HTTPException(
446
467
  detail=f"Invalid query: {e}",
@@ -956,3 +977,143 @@ async def annotate_spans(
956
977
  for id_ in inserted_ids
957
978
  ]
958
979
  )
980
+
981
+
982
+ class CreateSpansRequestBody(RequestBody[list[Span]]):
983
+ data: list[Span]
984
+
985
+
986
+ class CreateSpansResponseBody(V1RoutesBaseModel):
987
+ total_received: int = Field(description="Total number of spans received")
988
+ total_queued: int = Field(description="Number of spans successfully queued for insertion")
989
+
990
+
991
+ @router.post(
992
+ "/projects/{project_identifier}/spans",
993
+ operation_id="createSpans",
994
+ summary="Create spans",
995
+ description=(
996
+ "Submit spans to be inserted into a project. If any spans are invalid or "
997
+ "duplicates, no spans will be inserted."
998
+ ),
999
+ responses=add_errors_to_responses([HTTP_404_NOT_FOUND, HTTP_400_BAD_REQUEST]),
1000
+ status_code=HTTP_202_ACCEPTED,
1001
+ )
1002
+ async def create_spans(
1003
+ request: Request,
1004
+ request_body: CreateSpansRequestBody,
1005
+ project_identifier: str = Path(
1006
+ description=(
1007
+ "The project identifier: either project ID or project name. If using a project name, "
1008
+ "it cannot contain slash (/), question mark (?), or pound sign (#) characters."
1009
+ )
1010
+ ),
1011
+ ) -> CreateSpansResponseBody:
1012
+ def convert_api_span_for_insertion(api_span: Span) -> SpanForInsertion:
1013
+ """
1014
+ Convert from API Span to phoenix.trace.schemas.Span
1015
+ Note: The 'id' field has a default empty string and is ignored during insertion.
1016
+ """
1017
+ try:
1018
+ span_kind = SpanKind(api_span.span_kind.upper())
1019
+ except ValueError:
1020
+ span_kind = SpanKind.UNKNOWN
1021
+
1022
+ try:
1023
+ status_code = SpanStatusCode(api_span.status_code.upper())
1024
+ except ValueError:
1025
+ status_code = SpanStatusCode.UNSET
1026
+
1027
+ internal_events: list[InternalSpanEvent] = []
1028
+ for event in api_span.events:
1029
+ if event.timestamp:
1030
+ internal_events.append(
1031
+ InternalSpanEvent(
1032
+ name=event.name, timestamp=event.timestamp, attributes=event.attributes
1033
+ )
1034
+ )
1035
+
1036
+ # Add back the openinference.span.kind attribute since it's stored separately in the API
1037
+ attributes = dict(api_span.attributes)
1038
+ attributes["openinference.span.kind"] = api_span.span_kind
1039
+
1040
+ # Create span for insertion - note we ignore the 'id' field as it's server-generated
1041
+ return SpanForInsertion(
1042
+ name=api_span.name,
1043
+ context=InsertionSpanContext(
1044
+ trace_id=api_span.context.trace_id, span_id=api_span.context.span_id
1045
+ ),
1046
+ span_kind=span_kind,
1047
+ parent_id=api_span.parent_id,
1048
+ start_time=api_span.start_time,
1049
+ end_time=api_span.end_time,
1050
+ status_code=status_code,
1051
+ status_message=api_span.status_message,
1052
+ attributes=attributes,
1053
+ events=internal_events,
1054
+ conversation=None, # Unused
1055
+ )
1056
+
1057
+ async with request.app.state.db() as session:
1058
+ project = await _get_project_by_identifier(session, project_identifier)
1059
+
1060
+ total_received = len(request_body.data)
1061
+ duplicate_spans: list[dict[str, str]] = []
1062
+ invalid_spans: list[dict[str, str]] = []
1063
+ spans_to_queue: list[tuple[SpanForInsertion, str]] = []
1064
+
1065
+ existing_span_ids: set[str] = set()
1066
+ span_ids = [span.context.span_id for span in request_body.data]
1067
+ async with request.app.state.db() as session:
1068
+ existing_result = await session.execute(
1069
+ select(models.Span.span_id).where(models.Span.span_id.in_(span_ids))
1070
+ )
1071
+ existing_span_ids = {row[0] for row in existing_result}
1072
+
1073
+ for api_span in request_body.data:
1074
+ # Check if it's a duplicate
1075
+ if api_span.context.span_id in existing_span_ids:
1076
+ duplicate_spans.append(
1077
+ {
1078
+ "span_id": api_span.context.span_id,
1079
+ "trace_id": api_span.context.trace_id,
1080
+ }
1081
+ )
1082
+ continue
1083
+
1084
+ try:
1085
+ span_for_insertion = convert_api_span_for_insertion(api_span)
1086
+ spans_to_queue.append((span_for_insertion, project.name))
1087
+ except Exception as e:
1088
+ invalid_spans.append(
1089
+ {
1090
+ "span_id": api_span.context.span_id,
1091
+ "trace_id": api_span.context.trace_id,
1092
+ "error": str(e),
1093
+ }
1094
+ )
1095
+
1096
+ # If there are any duplicates or invalid spans, reject the entire request
1097
+ if duplicate_spans or invalid_spans:
1098
+ error_detail = {
1099
+ "error": "Request contains invalid or duplicate spans",
1100
+ "total_received": total_received,
1101
+ "total_queued": 0, # No spans are queued when there are validation errors
1102
+ "total_duplicates": len(duplicate_spans),
1103
+ "total_invalid": len(invalid_spans),
1104
+ "duplicate_spans": duplicate_spans,
1105
+ "invalid_spans": invalid_spans,
1106
+ }
1107
+ raise HTTPException(
1108
+ status_code=HTTP_400_BAD_REQUEST,
1109
+ detail=json.dumps(error_detail),
1110
+ )
1111
+
1112
+ # All spans are valid, queue them all
1113
+ for span_for_insertion, project_name in spans_to_queue:
1114
+ await request.state.queue_span_for_bulk_insert(span_for_insertion, project_name)
1115
+
1116
+ return CreateSpansResponseBody(
1117
+ total_received=total_received,
1118
+ total_queued=len(spans_to_queue),
1119
+ )
@@ -326,8 +326,27 @@ class Project(Node):
326
326
  after: Optional[CursorString] = UNSET,
327
327
  sort: Optional[ProjectSessionSort] = UNSET,
328
328
  filter_io_substring: Optional[str] = UNSET,
329
+ session_id: Optional[str] = UNSET,
329
330
  ) -> Connection[ProjectSession]:
330
331
  table = models.ProjectSession
332
+ if session_id:
333
+ async with info.context.db() as session:
334
+ ans = await session.scalar(
335
+ select(table).filter_by(
336
+ session_id=session_id,
337
+ project_id=self.project_rowid,
338
+ )
339
+ )
340
+ if ans:
341
+ return connection_from_list(
342
+ data=[to_gql_project_session(ans)],
343
+ args=ConnectionArgs(),
344
+ )
345
+ elif not filter_io_substring:
346
+ return connection_from_list(
347
+ data=[],
348
+ args=ConnectionArgs(),
349
+ )
331
350
  stmt = select(table).filter_by(project_id=self.project_rowid)
332
351
  if time_range:
333
352
  if time_range.start:
@@ -335,9 +354,9 @@ class Project(Node):
335
354
  if time_range.end:
336
355
  stmt = stmt.where(table.start_time < time_range.end)
337
356
  if filter_io_substring:
338
- filter_subq = (
339
- stmt.with_only_columns(distinct(table.id).label("id"))
340
- .join_from(table, models.Trace)
357
+ filter_stmt = (
358
+ select(distinct(models.Trace.project_session_rowid).label("id"))
359
+ .filter_by(project_rowid=self.project_rowid)
341
360
  .join_from(models.Trace, models.Span)
342
361
  .where(models.Span.parent_id.is_(None))
343
362
  .where(
@@ -352,7 +371,13 @@ class Project(Node):
352
371
  ),
353
372
  )
354
373
  )
355
- ).subquery()
374
+ )
375
+ if time_range:
376
+ if time_range.start:
377
+ filter_stmt = filter_stmt.where(time_range.start <= models.Trace.start_time)
378
+ if time_range.end:
379
+ filter_stmt = filter_stmt.where(models.Trace.start_time < time_range.end)
380
+ filter_subq = filter_stmt.subquery()
356
381
  stmt = stmt.join(filter_subq, table.id == filter_subq.c.id)
357
382
  if sort:
358
383
  key: ColumnElement[Any]
@@ -1,22 +1,22 @@
1
1
  {
2
- "_components-DIL5A2s_.js": {
3
- "file": "assets/components-DIL5A2s_.js",
2
+ "_components-CKFZdR5A.js": {
3
+ "file": "assets/components-CKFZdR5A.js",
4
4
  "name": "components",
5
5
  "imports": [
6
6
  "_vendor-ARQZvmz5.js",
7
- "_pages-DNp2bYa0.js",
7
+ "_pages-BEpY_9Jm.js",
8
8
  "_vendor-arizeai-Ct6kvW4e.js",
9
9
  "_vendor-codemirror-BxoXtD6f.js",
10
10
  "_vendor-three-C5WAXd5r.js"
11
11
  ]
12
12
  },
13
- "_pages-DNp2bYa0.js": {
14
- "file": "assets/pages-DNp2bYa0.js",
13
+ "_pages-BEpY_9Jm.js": {
14
+ "file": "assets/pages-BEpY_9Jm.js",
15
15
  "name": "pages",
16
16
  "imports": [
17
17
  "_vendor-ARQZvmz5.js",
18
18
  "_vendor-arizeai-Ct6kvW4e.js",
19
- "_components-DIL5A2s_.js",
19
+ "_components-CKFZdR5A.js",
20
20
  "_vendor-codemirror-BxoXtD6f.js",
21
21
  "_vendor-recharts-Cl8AO7Np.js"
22
22
  ]
@@ -69,15 +69,15 @@
69
69
  "name": "vendor-three"
70
70
  },
71
71
  "index.tsx": {
72
- "file": "assets/index-BX0gVSKm.js",
72
+ "file": "assets/index-D3uXREcK.js",
73
73
  "name": "index",
74
74
  "src": "index.tsx",
75
75
  "isEntry": true,
76
76
  "imports": [
77
77
  "_vendor-ARQZvmz5.js",
78
78
  "_vendor-arizeai-Ct6kvW4e.js",
79
- "_pages-DNp2bYa0.js",
80
- "_components-DIL5A2s_.js",
79
+ "_pages-BEpY_9Jm.js",
80
+ "_components-CKFZdR5A.js",
81
81
  "_vendor-three-C5WAXd5r.js",
82
82
  "_vendor-codemirror-BxoXtD6f.js",
83
83
  "_vendor-shiki-BpqODMgR.js",
@@ -1,4 +1,4 @@
1
- import{r as p,j as e,u as za,a as Ne,e as vn,s as Jn,b as ea,c as nn,d as fa,f as pr,g as ze,h as hr,i as fr,k as ba,l as s,m as Xe,p as Pn,n as un,R as Oe,o as O,q as Fa,t as an,v as br,C as Sn,w as yr,x as Cr,L as Xt,y as Yt,z as Jt,A as Se,B as L,D as Vn,E as Ea,F as m,G as e1,$ as vr,H as n1,I as Z,J as a1,K as Re,M as Lr,N as kr,O as Dn,P as wr,Q,S as Ue,T as P,U as H,V as X,W as t1,X as i1,Y as Sr,Z as r1,_ as xr,a0 as l1,a1 as Ar,a2 as Mr,a3 as Tr,a4 as Ir,a5 as zr,a6 as Fr,a7 as Er,a8 as _r,a9 as Pr,aa as gn,ab as o1,ac as Ve,ad as Vr,ae as Dr,af as Te,ag as ya,ah as Ca,ai as va,aj as B,ak as Ye,al as ht,am as Kr,an as Or,ao as Rr,ap as Nr,aq as $r,ar as Br,as as Hr,at as jr,au as s1,av as Zr,aw as Ur,ax as Gr,ay as Wr,az as qr,aA as Qr,aB as Xr,aC as Le,aD as c1,aE as _e,aF as _a,aG as Yr,aH as Jr,aI as el,aJ as nl,aK as al,aL as ft,aM as tl,aN as Pa,aO as il,aP as tn,aQ as rl,aR as Va,aS as ll,aT as ol,aU as sl,aV as Kn,aW as cl,aX as dl,aY as ul,aZ as gl,a_ as ml,a$ as pl,b0 as hl,b1 as fl,b2 as bl,b3 as yl,b4 as Cl,b5 as vl,b6 as Ll,b7 as kl,b8 as bt,b9 as wl,ba as Sl,bb as xl,bc as na,bd as Al,be as Ml,bf as Tl,bg as Il,bh as zl,bi as Fl,bj as El,bk as _l,bl as Pl}from"./vendor-ARQZvmz5.js";import{a as yt,R as Vl,b as Dl,c as Kl,m as Ol,T as Rl,A as Nl,S as $l,d as Bl,e as Hl,f as jl,u as Zl}from"./pages-DNp2bYa0.js";import{u as Ul,_ as d1,a as Ce,T as oe,E as u1,b as ve,c as g1,d as Ge,e as Gl,D as Da,f as Wl,C as m1,F as p1,I as ql,g as Ql,h as Xl,i as Yl,j as Jl,k as eo,l as no,P as ao,m as to,n as io,o as ro,p as lo,q as oo,r as so}from"./vendor-arizeai-Ct6kvW4e.js";import{L as h1,a as f1,d as on,E as Ka,k as b1,b as y1,l as La,h as co,j as uo,c as go,e as mo,f as po,s as ho,g as mn,i as pn,R as hn,p as fo,m as bo}from"./vendor-codemirror-BxoXtD6f.js";import{V as yo}from"./vendor-three-C5WAXd5r.js";const C1=function(){var n={defaultValue:null,kind:"LocalArgument",name:"clusters"},a={defaultValue:null,kind:"LocalArgument",name:"dataQualityMetricColumnName"},t={defaultValue:null,kind:"LocalArgument",name:"fetchDataQualityMetric"},i={defaultValue:null,kind:"LocalArgument",name:"fetchPerformanceMetric"},r={defaultValue:null,kind:"LocalArgument",name:"performanceMetric"},l=[{alias:null,args:null,kind:"ScalarField",name:"primaryValue",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"referenceValue",storageKey:null}],o=[{alias:null,args:[{kind:"Variable",name:"clusters",variableName:"clusters"}],concreteType:"Cluster",kind:"LinkedField",name:"clusters",plural:!0,selections:[{alias:null,args:null,kind:"ScalarField",name:"id",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"eventIds",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"driftRatio",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"primaryToCorpusRatio",storageKey:null},{condition:"fetchDataQualityMetric",kind:"Condition",passingValue:!0,selections:[{alias:null,args:[{fields:[{kind:"Variable",name:"columnName",variableName:"dataQualityMetricColumnName"},{kind:"Literal",name:"metric",value:"mean"}],kind:"ObjectValue",name:"metric"}],concreteType:"DatasetValues",kind:"LinkedField",name:"dataQualityMetric",plural:!1,selections:l,storageKey:null}]},{condition:"fetchPerformanceMetric",kind:"Condition",passingValue:!0,selections:[{alias:null,args:[{fields:[{kind:"Variable",name:"metric",variableName:"performanceMetric"}],kind:"ObjectValue",name:"metric"}],concreteType:"DatasetValues",kind:"LinkedField",name:"performanceMetric",plural:!1,selections:l,storageKey:null}]}],storageKey:null}];return{fragment:{argumentDefinitions:[n,a,t,i,r],kind:"Fragment",metadata:null,name:"pointCloudStore_clusterMetricsQuery",selections:o,type:"Query",abstractKey:null},kind:"Request",operation:{argumentDefinitions:[n,t,a,i,r],kind:"Operation",name:"pointCloudStore_clusterMetricsQuery",selections:o},params:{cacheID:"86666967012812887ac0a0149d2d2535",id:null,metadata:{},name:"pointCloudStore_clusterMetricsQuery",operationKind:"query",text:`query pointCloudStore_clusterMetricsQuery(
1
+ import{r as p,j as e,u as za,a as Ne,e as vn,s as Jn,b as ea,c as nn,d as fa,f as pr,g as ze,h as hr,i as fr,k as ba,l as s,m as Xe,p as Pn,n as un,R as Oe,o as O,q as Fa,t as an,v as br,C as Sn,w as yr,x as Cr,L as Xt,y as Yt,z as Jt,A as Se,B as L,D as Vn,E as Ea,F as m,G as e1,$ as vr,H as n1,I as Z,J as a1,K as Re,M as Lr,N as kr,O as Dn,P as wr,Q,S as Ue,T as P,U as H,V as X,W as t1,X as i1,Y as Sr,Z as r1,_ as xr,a0 as l1,a1 as Ar,a2 as Mr,a3 as Tr,a4 as Ir,a5 as zr,a6 as Fr,a7 as Er,a8 as _r,a9 as Pr,aa as gn,ab as o1,ac as Ve,ad as Vr,ae as Dr,af as Te,ag as ya,ah as Ca,ai as va,aj as B,ak as Ye,al as ht,am as Kr,an as Or,ao as Rr,ap as Nr,aq as $r,ar as Br,as as Hr,at as jr,au as s1,av as Zr,aw as Ur,ax as Gr,ay as Wr,az as qr,aA as Qr,aB as Xr,aC as Le,aD as c1,aE as _e,aF as _a,aG as Yr,aH as Jr,aI as el,aJ as nl,aK as al,aL as ft,aM as tl,aN as Pa,aO as il,aP as tn,aQ as rl,aR as Va,aS as ll,aT as ol,aU as sl,aV as Kn,aW as cl,aX as dl,aY as ul,aZ as gl,a_ as ml,a$ as pl,b0 as hl,b1 as fl,b2 as bl,b3 as yl,b4 as Cl,b5 as vl,b6 as Ll,b7 as kl,b8 as bt,b9 as wl,ba as Sl,bb as xl,bc as na,bd as Al,be as Ml,bf as Tl,bg as Il,bh as zl,bi as Fl,bj as El,bk as _l,bl as Pl}from"./vendor-ARQZvmz5.js";import{a as yt,R as Vl,b as Dl,c as Kl,m as Ol,T as Rl,A as Nl,S as $l,d as Bl,e as Hl,f as jl,u as Zl}from"./pages-BEpY_9Jm.js";import{u as Ul,_ as d1,a as Ce,T as oe,E as u1,b as ve,c as g1,d as Ge,e as Gl,D as Da,f as Wl,C as m1,F as p1,I as ql,g as Ql,h as Xl,i as Yl,j as Jl,k as eo,l as no,P as ao,m as to,n as io,o as ro,p as lo,q as oo,r as so}from"./vendor-arizeai-Ct6kvW4e.js";import{L as h1,a as f1,d as on,E as Ka,k as b1,b as y1,l as La,h as co,j as uo,c as go,e as mo,f as po,s as ho,g as mn,i as pn,R as hn,p as fo,m as bo}from"./vendor-codemirror-BxoXtD6f.js";import{V as yo}from"./vendor-three-C5WAXd5r.js";const C1=function(){var n={defaultValue:null,kind:"LocalArgument",name:"clusters"},a={defaultValue:null,kind:"LocalArgument",name:"dataQualityMetricColumnName"},t={defaultValue:null,kind:"LocalArgument",name:"fetchDataQualityMetric"},i={defaultValue:null,kind:"LocalArgument",name:"fetchPerformanceMetric"},r={defaultValue:null,kind:"LocalArgument",name:"performanceMetric"},l=[{alias:null,args:null,kind:"ScalarField",name:"primaryValue",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"referenceValue",storageKey:null}],o=[{alias:null,args:[{kind:"Variable",name:"clusters",variableName:"clusters"}],concreteType:"Cluster",kind:"LinkedField",name:"clusters",plural:!0,selections:[{alias:null,args:null,kind:"ScalarField",name:"id",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"eventIds",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"driftRatio",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"primaryToCorpusRatio",storageKey:null},{condition:"fetchDataQualityMetric",kind:"Condition",passingValue:!0,selections:[{alias:null,args:[{fields:[{kind:"Variable",name:"columnName",variableName:"dataQualityMetricColumnName"},{kind:"Literal",name:"metric",value:"mean"}],kind:"ObjectValue",name:"metric"}],concreteType:"DatasetValues",kind:"LinkedField",name:"dataQualityMetric",plural:!1,selections:l,storageKey:null}]},{condition:"fetchPerformanceMetric",kind:"Condition",passingValue:!0,selections:[{alias:null,args:[{fields:[{kind:"Variable",name:"metric",variableName:"performanceMetric"}],kind:"ObjectValue",name:"metric"}],concreteType:"DatasetValues",kind:"LinkedField",name:"performanceMetric",plural:!1,selections:l,storageKey:null}]}],storageKey:null}];return{fragment:{argumentDefinitions:[n,a,t,i,r],kind:"Fragment",metadata:null,name:"pointCloudStore_clusterMetricsQuery",selections:o,type:"Query",abstractKey:null},kind:"Request",operation:{argumentDefinitions:[n,t,a,i,r],kind:"Operation",name:"pointCloudStore_clusterMetricsQuery",selections:o},params:{cacheID:"86666967012812887ac0a0149d2d2535",id:null,metadata:{},name:"pointCloudStore_clusterMetricsQuery",operationKind:"query",text:`query pointCloudStore_clusterMetricsQuery(
2
2
  $clusters: [ClusterInput!]!
3
3
  $fetchDataQualityMetric: Boolean!
4
4
  $dataQualityMetricColumnName: String
@@ -1,4 +1,4 @@
1
- import{F as e,j as o,cA as f,ew as v,ex as y,ey as h,l as r,bY as x,ez as a,r as z,o as w,eA as P}from"./vendor-ARQZvmz5.js";import{H as k,J as S}from"./vendor-arizeai-Ct6kvW4e.js";import{L,g as j,r as C,h as R,i as I,F as E,j as A,P as D,k as T,M as s,l as F,D as O,n as G,E as M,o as N,p as q,q as V,s as _,t,v as W,w as B,x as H,y as J,z as $,B as K,C as U,G as Y,H as Q,I as X,J as Z,K as oo,N as ao,O as lo,Q as ro,U as co,V as d,W as m,X as p,Y as go,Z as eo,_ as bo,$ as no,a0 as io,a1 as so,a2 as to,a3 as mo,a4 as po,a5 as uo,a6 as fo,a7 as vo,a8 as yo,a9 as ho,aa as xo,ab as zo,ac as wo,ad as Po,ae as ko,af as So,ag as Lo,ah as jo,ai as Co,aj as Ro,ak as Io,al as Eo,am as Ao,an as Do,ao as To,ap as Fo,aq as Oo,ar as Go,as as Mo,at as No,au as qo,av as Vo,aw as _o,ax as Wo,ay as Bo}from"./pages-DNp2bYa0.js";import{eH as Ho,cp as Jo,R as $o,eI as Ko,eJ as Uo}from"./components-DIL5A2s_.js";import"./vendor-three-C5WAXd5r.js";import"./vendor-codemirror-BxoXtD6f.js";import"./vendor-shiki-BpqODMgR.js";import"./vendor-recharts-Cl8AO7Np.js";(function(){const b=document.createElement("link").relList;if(b&&b.supports&&b.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))i(c);new MutationObserver(c=>{for(const g of c)if(g.type==="childList")for(const n of g.addedNodes)n.tagName==="LINK"&&n.rel==="modulepreload"&&i(n)}).observe(document,{childList:!0,subtree:!0});function u(c){const g={};return c.integrity&&(g.integrity=c.integrity),c.referrerPolicy&&(g.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?g.credentials="include":c.crossOrigin==="anonymous"?g.credentials="omit":g.credentials="same-origin",g}function i(c){if(c.ep)return;c.ep=!0;const g=u(c);fetch(c.href,g)}})();const Yo=e`
1
+ import{F as e,j as o,cA as f,ew as v,ex as y,ey as h,l as r,bY as x,ez as a,r as z,o as w,eA as P}from"./vendor-ARQZvmz5.js";import{H as k,J as S}from"./vendor-arizeai-Ct6kvW4e.js";import{L,g as j,r as C,h as R,i as I,F as E,j as A,P as D,k as T,M as s,l as F,D as O,n as G,E as M,o as N,p as q,q as V,s as _,t,v as W,w as B,x as H,y as J,z as $,B as K,C as U,G as Y,H as Q,I as X,J as Z,K as oo,N as ao,O as lo,Q as ro,U as co,V as d,W as m,X as p,Y as go,Z as eo,_ as bo,$ as no,a0 as io,a1 as so,a2 as to,a3 as mo,a4 as po,a5 as uo,a6 as fo,a7 as vo,a8 as yo,a9 as ho,aa as xo,ab as zo,ac as wo,ad as Po,ae as ko,af as So,ag as Lo,ah as jo,ai as Co,aj as Ro,ak as Io,al as Eo,am as Ao,an as Do,ao as To,ap as Fo,aq as Oo,ar as Go,as as Mo,at as No,au as qo,av as Vo,aw as _o,ax as Wo,ay as Bo}from"./pages-BEpY_9Jm.js";import{eH as Ho,cp as Jo,R as $o,eI as Ko,eJ as Uo}from"./components-CKFZdR5A.js";import"./vendor-three-C5WAXd5r.js";import"./vendor-codemirror-BxoXtD6f.js";import"./vendor-shiki-BpqODMgR.js";import"./vendor-recharts-Cl8AO7Np.js";(function(){const b=document.createElement("link").relList;if(b&&b.supports&&b.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))i(c);new MutationObserver(c=>{for(const g of c)if(g.type==="childList")for(const n of g.addedNodes)n.tagName==="LINK"&&n.rel==="modulepreload"&&i(n)}).observe(document,{childList:!0,subtree:!0});function u(c){const g={};return c.integrity&&(g.integrity=c.integrity),c.referrerPolicy&&(g.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?g.credentials="include":c.crossOrigin==="anonymous"?g.credentials="omit":g.credentials="same-origin",g}function i(c){if(c.ep)return;c.ep=!0;const g=u(c);fetch(c.href,g)}})();const Yo=e`
2
2
  :root {
3
3
  --ac-global-dimension-scale-factor: 1;
4
4
  --ac-global-dimension-size-0: 0px;