arize-phoenix 11.33.0__py3-none-any.whl → 11.34.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 (26) hide show
  1. {arize_phoenix-11.33.0.dist-info → arize_phoenix-11.34.0.dist-info}/METADATA +1 -1
  2. {arize_phoenix-11.33.0.dist-info → arize_phoenix-11.34.0.dist-info}/RECORD +26 -26
  3. phoenix/config.py +44 -0
  4. phoenix/db/bulk_inserter.py +111 -116
  5. phoenix/server/api/routers/v1/documents.py +1 -1
  6. phoenix/server/api/routers/v1/evaluations.py +4 -4
  7. phoenix/server/api/routers/v1/spans.py +2 -2
  8. phoenix/server/api/routers/v1/traces.py +18 -3
  9. phoenix/server/app.py +56 -18
  10. phoenix/server/daemons/span_cost_calculator.py +10 -8
  11. phoenix/server/grpc_server.py +9 -9
  12. phoenix/server/prometheus.py +30 -6
  13. phoenix/server/static/.vite/manifest.json +39 -39
  14. phoenix/server/static/assets/{components-YTHUASXI.js → components-CdQiQTvs.js} +1 -1
  15. phoenix/server/static/assets/{index-CugQp26L.js → index-B1VuXYRI.js} +2 -2
  16. phoenix/server/static/assets/{pages-4Qu8GNlt.js → pages-CnfZ3RhB.js} +498 -494
  17. phoenix/server/static/assets/{vendor-CRRxHwSp.js → vendor-Cfrr9FCF.js} +135 -135
  18. phoenix/server/static/assets/{vendor-arizeai-CUN6lRd9.js → vendor-arizeai-Dz0kN-lQ.js} +1 -1
  19. phoenix/server/static/assets/{vendor-codemirror-sJXwoqrE.js → vendor-codemirror-ClqtONZQ.js} +11 -11
  20. phoenix/server/static/assets/{vendor-recharts-BT_PeGhc.js → vendor-recharts-D6kvOpmb.js} +1 -1
  21. phoenix/server/static/assets/{vendor-shiki-1F3op0QC.js → vendor-shiki-xSOiKxt0.js} +1 -1
  22. phoenix/version.py +1 -1
  23. {arize_phoenix-11.33.0.dist-info → arize_phoenix-11.34.0.dist-info}/WHEEL +0 -0
  24. {arize_phoenix-11.33.0.dist-info → arize_phoenix-11.34.0.dist-info}/entry_points.txt +0 -0
  25. {arize_phoenix-11.33.0.dist-info → arize_phoenix-11.34.0.dist-info}/licenses/IP_NOTICE +0 -0
  26. {arize_phoenix-11.33.0.dist-info → arize_phoenix-11.34.0.dist-info}/licenses/LICENSE +0 -0
@@ -18,6 +18,7 @@ from starlette.status import (
18
18
  HTTP_404_NOT_FOUND,
19
19
  HTTP_415_UNSUPPORTED_MEDIA_TYPE,
20
20
  HTTP_422_UNPROCESSABLE_ENTITY,
21
+ HTTP_503_SERVICE_UNAVAILABLE,
21
22
  )
22
23
  from strawberry.relay import GlobalID
23
24
 
@@ -29,6 +30,7 @@ from phoenix.server.api.types.node import from_global_id_with_expected_type
29
30
  from phoenix.server.authorization import is_not_locked
30
31
  from phoenix.server.bearer_auth import PhoenixUser
31
32
  from phoenix.server.dml_event import SpanDeleteEvent, TraceAnnotationInsertEvent
33
+ from phoenix.server.prometheus import SPAN_QUEUE_REJECTIONS
32
34
  from phoenix.trace.otel import decode_otlp_span
33
35
  from phoenix.utilities.project import get_project_name
34
36
 
@@ -42,9 +44,18 @@ from .utils import (
42
44
  router = APIRouter(tags=["traces"])
43
45
 
44
46
 
47
+ def is_not_at_capacity(request: Request) -> None:
48
+ if request.app.state.span_queue_is_full():
49
+ SPAN_QUEUE_REJECTIONS.inc()
50
+ raise HTTPException(
51
+ detail="Server is at capacity and cannot process more requests",
52
+ status_code=HTTP_503_SERVICE_UNAVAILABLE,
53
+ )
54
+
55
+
45
56
  @router.post(
46
57
  "/traces",
47
- dependencies=[Depends(is_not_locked)],
58
+ dependencies=[Depends(is_not_locked), Depends(is_not_at_capacity)],
48
59
  operation_id="addTraces",
49
60
  summary="Send traces",
50
61
  responses=add_errors_to_responses(
@@ -56,6 +67,10 @@ router = APIRouter(tags=["traces"])
56
67
  ),
57
68
  },
58
69
  {"status_code": HTTP_422_UNPROCESSABLE_ENTITY, "description": "Invalid request body"},
70
+ {
71
+ "status_code": HTTP_503_SERVICE_UNAVAILABLE,
72
+ "description": "Server is at capacity and cannot process more requests",
73
+ },
59
74
  ]
60
75
  ),
61
76
  openapi_extra={
@@ -145,7 +160,7 @@ async def annotate_traces(
145
160
 
146
161
  precursors = [d.as_precursor(user_id=user_id) for d in request_body.data]
147
162
  if not sync:
148
- await request.state.enqueue(*precursors)
163
+ await request.state.enqueue_annotations(*precursors)
149
164
  return AnnotateTracesResponseBody(data=[])
150
165
 
151
166
  trace_ids = {p.trace_id for p in precursors}
@@ -193,7 +208,7 @@ async def _add_spans(req: ExportTraceServiceRequest, state: State) -> None:
193
208
  for scope_span in resource_spans.scope_spans:
194
209
  for otlp_span in scope_span.spans:
195
210
  span = await run_in_threadpool(decode_otlp_span, otlp_span)
196
- await state.queue_span_for_bulk_insert(span, project_name)
211
+ await state.enqueue_span(span, project_name)
197
212
 
198
213
 
199
214
  @router.delete(
phoenix/server/app.py CHANGED
@@ -4,7 +4,6 @@ import importlib
4
4
  import json
5
5
  import logging
6
6
  import os
7
- from collections.abc import AsyncIterator, Awaitable, Callable, Iterable, Sequence
8
7
  from contextlib import AbstractAsyncContextManager, AsyncExitStack
9
8
  from dataclasses import dataclass, field
10
9
  from datetime import datetime, timedelta, timezone
@@ -14,9 +13,14 @@ from types import MethodType
14
13
  from typing import (
15
14
  TYPE_CHECKING,
16
15
  Any,
16
+ AsyncIterator,
17
+ Awaitable,
18
+ Callable,
19
+ Iterable,
17
20
  NamedTuple,
18
21
  Optional,
19
22
  Protocol,
23
+ Sequence,
20
24
  TypedDict,
21
25
  Union,
22
26
  cast,
@@ -64,6 +68,7 @@ from phoenix.config import (
64
68
  get_env_grpc_interceptor_paths,
65
69
  get_env_host,
66
70
  get_env_host_root_path,
71
+ get_env_max_spans_queue_size,
67
72
  get_env_port,
68
73
  get_env_support_email,
69
74
  server_instrumentation_is_enabled,
@@ -157,6 +162,7 @@ from phoenix.server.grpc_server import GrpcServer
157
162
  from phoenix.server.jwt_store import JwtStore
158
163
  from phoenix.server.middleware.gzip import GZipMiddleware
159
164
  from phoenix.server.oauth2 import OAuth2Clients
165
+ from phoenix.server.prometheus import SPAN_QUEUE_REJECTIONS
160
166
  from phoenix.server.retention import TraceDataSweeper
161
167
  from phoenix.server.telemetry import initialize_opentelemetry_tracer_provider
162
168
  from phoenix.server.types import (
@@ -433,13 +439,13 @@ class Scaffolder(DaemonTask):
433
439
  def __init__(
434
440
  self,
435
441
  config: ScaffolderConfig,
436
- queue_span: Callable[[Span, ProjectName], Awaitable[None]],
437
- queue_evaluation: Callable[[pb.Evaluation], Awaitable[None]],
442
+ enqueue_span: Callable[[Span, ProjectName], Awaitable[None]],
443
+ enqueue_evaluation: Callable[[pb.Evaluation], Awaitable[None]],
438
444
  ) -> None:
439
445
  super().__init__()
440
446
  self._db = config.db
441
- self._queue_span = queue_span
442
- self._queue_evaluation = queue_evaluation
447
+ self._enqueue_span = enqueue_span
448
+ self._enqueue_evaluation = enqueue_evaluation
443
449
  self._tracing_fixtures = [
444
450
  get_trace_fixture_by_name(name) for name in set(config.tracing_fixture_names)
445
451
  ]
@@ -510,9 +516,9 @@ class Scaffolder(DaemonTask):
510
516
  project_name = fixture.project_name or fixture.name
511
517
  logger.info(f"Loading '{project_name}' fixtures...")
512
518
  for span in fixture_spans:
513
- await self._queue_span(span, project_name)
519
+ await self._enqueue_span(span, project_name)
514
520
  for evaluation in fixture_evals:
515
- await self._queue_evaluation(evaluation)
521
+ await self._enqueue_evaluation(evaluation)
516
522
 
517
523
  except FileNotFoundError:
518
524
  logger.warning(f"Fixture file not found for '{fixture.name}'")
@@ -535,6 +541,32 @@ class Scaffolder(DaemonTask):
535
541
  logger.error(f"Error processing dataset fixture: {e}")
536
542
 
537
543
 
544
+ class _CapacityIndicator(Protocol):
545
+ @property
546
+ def is_full(self) -> bool: ...
547
+
548
+
549
+ class CapacityInterceptor(AsyncServerInterceptor):
550
+ def __init__(self, indicator: _CapacityIndicator):
551
+ self._indicator = indicator
552
+
553
+ @override
554
+ async def intercept(
555
+ self,
556
+ method: Callable[[Any, grpc.aio.ServicerContext], Awaitable[Any]],
557
+ request_or_iterator: Any,
558
+ context: grpc.aio.ServicerContext,
559
+ method_name: str,
560
+ ) -> Any:
561
+ if self._indicator.is_full:
562
+ SPAN_QUEUE_REJECTIONS.inc()
563
+ context.set_code(grpc.StatusCode.RESOURCE_EXHAUSTED)
564
+ context.set_details("Server is at capacity and cannot process more requests")
565
+ return
566
+
567
+ return await method(request_or_iterator, context)
568
+
569
+
538
570
  def _lifespan(
539
571
  *,
540
572
  db: DbSessionFactory,
@@ -561,18 +593,23 @@ def _lifespan(
561
593
  db.lock = asyncio.Lock() if db.dialect is SupportedSQLDialect.SQLITE else None
562
594
  async with AsyncExitStack() as stack:
563
595
  (
564
- enqueue,
565
- queue_span,
566
- queue_evaluation,
596
+ enqueue_annotations,
597
+ enqueue_span,
598
+ enqueue_evaluation,
567
599
  enqueue_operation,
568
600
  ) = await stack.enter_async_context(bulk_inserter)
601
+ interceptors = [
602
+ CapacityInterceptor(bulk_inserter),
603
+ *user_grpc_interceptors(),
604
+ *grpc_interceptors,
605
+ ]
569
606
  grpc_server = GrpcServer(
570
- queue_span,
607
+ enqueue_span,
571
608
  disabled=read_only,
572
609
  tracer_provider=tracer_provider,
573
610
  enable_prometheus=enable_prometheus,
574
611
  token_store=token_store,
575
- interceptors=user_grpc_interceptors() + list(grpc_interceptors),
612
+ interceptors=interceptors,
576
613
  )
577
614
  await stack.enter_async_context(grpc_server)
578
615
  await stack.enter_async_context(dml_event_handler)
@@ -584,17 +621,17 @@ def _lifespan(
584
621
  if scaffolder_config:
585
622
  scaffolder = Scaffolder(
586
623
  config=scaffolder_config,
587
- queue_span=queue_span,
588
- queue_evaluation=queue_evaluation,
624
+ enqueue_span=enqueue_span,
625
+ enqueue_evaluation=enqueue_evaluation,
589
626
  )
590
627
  await stack.enter_async_context(scaffolder)
591
628
  if isinstance(token_store, AbstractAsyncContextManager):
592
629
  await stack.enter_async_context(token_store)
593
630
  yield {
594
631
  "event_queue": dml_event_handler,
595
- "enqueue": enqueue,
596
- "queue_span_for_bulk_insert": queue_span,
597
- "queue_evaluation_for_bulk_insert": queue_evaluation,
632
+ "enqueue_annotations": enqueue_annotations,
633
+ "enqueue_span": enqueue_span,
634
+ "enqueue_evaluation": enqueue_evaluation,
598
635
  "enqueue_operation": enqueue_operation,
599
636
  }
600
637
  for callback in shutdown_callbacks:
@@ -989,11 +1026,11 @@ def create_app(
989
1026
  span_cost_calculator = SpanCostCalculator(db, generative_model_store)
990
1027
  bulk_inserter = bulk_inserter_factory(
991
1028
  db,
992
- enable_prometheus=enable_prometheus,
993
1029
  span_cost_calculator=span_cost_calculator,
994
1030
  event_queue=dml_event_handler,
995
1031
  initial_batch_of_spans=initial_batch_of_spans,
996
1032
  initial_batch_of_evaluations=initial_batch_of_evaluations,
1033
+ max_spans_queue_size=get_env_max_spans_queue_size(),
997
1034
  )
998
1035
  tracer_provider = None
999
1036
  graphql_schema_extensions: list[Union[type[SchemaExtension], SchemaExtension]] = []
@@ -1124,6 +1161,7 @@ def create_app(
1124
1161
  app.state.db = db
1125
1162
  app.state.email_sender = email_sender
1126
1163
  app.state.span_cost_calculator = span_cost_calculator
1164
+ app.state.span_queue_is_full = lambda: bulk_inserter.is_full
1127
1165
  app = _add_get_secret_method(app=app, secret=secret)
1128
1166
  app = _add_get_token_store_method(app=app, token_store=token_store)
1129
1167
  if tracer_provider:
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  from asyncio import sleep
5
+ from collections import deque
5
6
  from datetime import datetime
6
7
  from typing import Any, Mapping, NamedTuple, Optional
7
8
 
@@ -35,21 +36,25 @@ class SpanCostCalculator(DaemonTask):
35
36
  super().__init__()
36
37
  self._db = db
37
38
  self._model_store = model_store
38
- self._queue: list[SpanCostCalculatorQueueItem] = []
39
+ self._queue: deque[SpanCostCalculatorQueueItem] = deque()
40
+ self._max_items_per_transaction = 1000
39
41
 
40
42
  async def _run(self) -> None:
41
43
  while self._running:
44
+ num_items_to_insert = min(self._max_items_per_transaction, len(self._queue))
42
45
  try:
43
- await self._insert_costs()
46
+ await self._insert_costs(num_items_to_insert)
44
47
  except Exception as e:
45
48
  logger.exception(f"Failed to insert costs: {e}")
46
49
  await sleep(self._SLEEP_INTERVAL)
47
50
 
48
- async def _insert_costs(self) -> None:
49
- if not self._queue:
51
+ async def _insert_costs(self, num_items_to_insert: int) -> None:
52
+ if not num_items_to_insert or not self._queue:
50
53
  return
51
54
  costs: list[models.SpanCost] = []
52
- for item in self._queue:
55
+ while num_items_to_insert > 0:
56
+ num_items_to_insert -= 1
57
+ item = self._queue.popleft()
53
58
  try:
54
59
  cost = self.calculate_cost(item.span_start_time, item.attributes)
55
60
  except Exception as e:
@@ -65,9 +70,6 @@ class SpanCostCalculator(DaemonTask):
65
70
  session.add_all(costs)
66
71
  except Exception as e:
67
72
  logger.exception(f"Failed to insert costs: {e}")
68
- finally:
69
- # Clear the queue after processing
70
- self._queue.clear()
71
73
 
72
74
  def put_nowait(self, item: SpanCostCalculatorQueueItem) -> None:
73
75
  self._queue.append(item)
@@ -1,5 +1,4 @@
1
- from collections.abc import Awaitable, Callable
2
- from typing import TYPE_CHECKING, Any, Iterable, Optional
1
+ from typing import TYPE_CHECKING, Any, Awaitable, Callable, Iterable, Optional
3
2
 
4
3
  import grpc
5
4
  from grpc.aio import RpcContext, Server, ServerInterceptor
@@ -11,6 +10,7 @@ from opentelemetry.proto.collector.trace.v1.trace_service_pb2_grpc import (
11
10
  TraceServiceServicer,
12
11
  add_TraceServiceServicer_to_server,
13
12
  )
13
+ from starlette.concurrency import run_in_threadpool
14
14
  from typing_extensions import TypeAlias
15
15
 
16
16
  from phoenix.auth import CanReadToken
@@ -34,10 +34,10 @@ ProjectName: TypeAlias = str
34
34
  class Servicer(TraceServiceServicer): # type: ignore[misc,unused-ignore]
35
35
  def __init__(
36
36
  self,
37
- callback: Callable[[Span, ProjectName], Awaitable[None]],
37
+ enqueue_span: Callable[[Span, ProjectName], Awaitable[None]],
38
38
  ) -> None:
39
39
  super().__init__()
40
- self._callback = callback
40
+ self._enqueue_span = enqueue_span
41
41
 
42
42
  async def Export(
43
43
  self,
@@ -48,22 +48,22 @@ class Servicer(TraceServiceServicer): # type: ignore[misc,unused-ignore]
48
48
  project_name = get_project_name(resource_spans.resource.attributes)
49
49
  for scope_span in resource_spans.scope_spans:
50
50
  for otlp_span in scope_span.spans:
51
- span = decode_otlp_span(otlp_span)
52
- await self._callback(span, project_name)
51
+ span = await run_in_threadpool(decode_otlp_span, otlp_span)
52
+ await self._enqueue_span(span, project_name)
53
53
  return ExportTraceServiceResponse()
54
54
 
55
55
 
56
56
  class GrpcServer:
57
57
  def __init__(
58
58
  self,
59
- callback: Callable[[Span, ProjectName], Awaitable[None]],
59
+ enqueue_span: Callable[[Span, ProjectName], Awaitable[None]],
60
60
  tracer_provider: Optional["TracerProvider"] = None,
61
61
  enable_prometheus: bool = False,
62
62
  disabled: bool = False,
63
63
  token_store: Optional[CanReadToken] = None,
64
64
  interceptors: Iterable[ServerInterceptor] = (),
65
65
  ) -> None:
66
- self._callback = callback
66
+ self._enqueue_span = enqueue_span
67
67
  self._server: Optional[Server] = None
68
68
  self._tracer_provider = tracer_provider
69
69
  self._enable_prometheus = enable_prometheus
@@ -106,7 +106,7 @@ class GrpcServer:
106
106
  server.add_secure_port(f"[::]:{get_env_grpc_port()}", server_credentials)
107
107
  else:
108
108
  server.add_insecure_port(f"[::]:{get_env_grpc_port()}")
109
- add_TraceServiceServicer_to_server(Servicer(self._callback), server) # type: ignore[no-untyped-call,unused-ignore]
109
+ add_TraceServiceServicer_to_server(Servicer(self._enqueue_span), server) # type: ignore[no-untyped-call,unused-ignore]
110
110
  await server.start()
111
111
  self._server = server
112
112
 
@@ -9,6 +9,7 @@ import psutil
9
9
  from prometheus_client import (
10
10
  Counter,
11
11
  Gauge,
12
+ Histogram,
12
13
  Summary,
13
14
  start_http_server,
14
15
  )
@@ -36,14 +37,19 @@ CPU_METRIC = Gauge(
36
37
  name="cpu_usage_percent",
37
38
  documentation="CPU usage percent",
38
39
  )
39
- BULK_LOADER_INSERTION_TIME = Summary(
40
- name="bulk_loader_insertion_time_seconds_summary",
41
- documentation="Summary of database insertion time (seconds)",
40
+ BULK_LOADER_SPAN_INSERTION_TIME = Histogram(
41
+ namespace="phoenix",
42
+ name="bulk_loader_span_insertion_time_seconds",
43
+ documentation="Histogram of span database insertion time (seconds)",
44
+ buckets=[0.5, 1.0, 2.0, 5.0, 10.0, 30.0, 60.0, 180.0], # 500ms to 3min
42
45
  )
43
- BULK_LOADER_SPAN_INSERTIONS = Counter(
44
- name="bulk_loader_span_insertions_total",
45
- documentation="Total count of bulk loader span insertions",
46
+
47
+ BULK_LOADER_SPAN_EXCEPTIONS = Counter(
48
+ namespace="phoenix",
49
+ name="bulk_loader_span_exceptions_total",
50
+ documentation="Total count of span insertion exceptions",
46
51
  )
52
+
47
53
  BULK_LOADER_EVALUATION_INSERTIONS = Counter(
48
54
  name="bulk_loader_evaluation_insertions_total",
49
55
  documentation="Total count of bulk loader evaluation insertions",
@@ -95,6 +101,24 @@ DB_DISK_USAGE_WARNING_EMAIL_ERRORS = Counter(
95
101
  documentation="Total count of database disk usage warning email send errors",
96
102
  )
97
103
 
104
+ SPAN_QUEUE_REJECTIONS = Counter(
105
+ namespace="phoenix",
106
+ name="span_queue_rejections_total",
107
+ documentation="Total count of requests rejected due to span queue being full",
108
+ )
109
+
110
+ SPAN_QUEUE_SIZE = Gauge(
111
+ namespace="phoenix",
112
+ name="span_queue_size",
113
+ documentation="Current number of spans in the processing queue",
114
+ )
115
+
116
+ BULK_LOADER_LAST_ACTIVITY = Gauge(
117
+ namespace="phoenix",
118
+ name="bulk_loader_last_activity_timestamp_seconds",
119
+ documentation="Unix timestamp when bulk loader last processed items",
120
+ )
121
+
98
122
 
99
123
  class PrometheusMiddleware(BaseHTTPMiddleware):
100
124
  async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response:
@@ -1,32 +1,32 @@
1
1
  {
2
- "_components-YTHUASXI.js": {
3
- "file": "assets/components-YTHUASXI.js",
2
+ "_components-CdQiQTvs.js": {
3
+ "file": "assets/components-CdQiQTvs.js",
4
4
  "name": "components",
5
5
  "imports": [
6
- "_vendor-CRRxHwSp.js",
7
- "_pages-4Qu8GNlt.js",
8
- "_vendor-arizeai-CUN6lRd9.js",
9
- "_vendor-codemirror-sJXwoqrE.js",
6
+ "_vendor-Cfrr9FCF.js",
7
+ "_pages-CnfZ3RhB.js",
8
+ "_vendor-arizeai-Dz0kN-lQ.js",
9
+ "_vendor-codemirror-ClqtONZQ.js",
10
10
  "_vendor-three-BLWp5bic.js"
11
11
  ]
12
12
  },
13
- "_pages-4Qu8GNlt.js": {
14
- "file": "assets/pages-4Qu8GNlt.js",
13
+ "_pages-CnfZ3RhB.js": {
14
+ "file": "assets/pages-CnfZ3RhB.js",
15
15
  "name": "pages",
16
16
  "imports": [
17
- "_vendor-CRRxHwSp.js",
18
- "_vendor-arizeai-CUN6lRd9.js",
19
- "_components-YTHUASXI.js",
20
- "_vendor-codemirror-sJXwoqrE.js",
21
- "_vendor-recharts-BT_PeGhc.js"
17
+ "_vendor-Cfrr9FCF.js",
18
+ "_vendor-arizeai-Dz0kN-lQ.js",
19
+ "_components-CdQiQTvs.js",
20
+ "_vendor-codemirror-ClqtONZQ.js",
21
+ "_vendor-recharts-D6kvOpmb.js"
22
22
  ]
23
23
  },
24
24
  "_vendor-BGzfc4EU.css": {
25
25
  "file": "assets/vendor-BGzfc4EU.css",
26
26
  "src": "_vendor-BGzfc4EU.css"
27
27
  },
28
- "_vendor-CRRxHwSp.js": {
29
- "file": "assets/vendor-CRRxHwSp.js",
28
+ "_vendor-Cfrr9FCF.js": {
29
+ "file": "assets/vendor-Cfrr9FCF.js",
30
30
  "name": "vendor",
31
31
  "imports": [
32
32
  "_vendor-three-BLWp5bic.js"
@@ -35,39 +35,39 @@
35
35
  "assets/vendor-BGzfc4EU.css"
36
36
  ]
37
37
  },
38
- "_vendor-arizeai-CUN6lRd9.js": {
39
- "file": "assets/vendor-arizeai-CUN6lRd9.js",
38
+ "_vendor-arizeai-Dz0kN-lQ.js": {
39
+ "file": "assets/vendor-arizeai-Dz0kN-lQ.js",
40
40
  "name": "vendor-arizeai",
41
41
  "imports": [
42
- "_vendor-CRRxHwSp.js"
42
+ "_vendor-Cfrr9FCF.js"
43
43
  ]
44
44
  },
45
- "_vendor-codemirror-sJXwoqrE.js": {
46
- "file": "assets/vendor-codemirror-sJXwoqrE.js",
45
+ "_vendor-codemirror-ClqtONZQ.js": {
46
+ "file": "assets/vendor-codemirror-ClqtONZQ.js",
47
47
  "name": "vendor-codemirror",
48
48
  "imports": [
49
- "_vendor-CRRxHwSp.js",
50
- "_vendor-shiki-1F3op0QC.js"
49
+ "_vendor-Cfrr9FCF.js",
50
+ "_vendor-shiki-xSOiKxt0.js"
51
51
  ],
52
52
  "dynamicImports": [
53
- "_vendor-shiki-1F3op0QC.js",
54
- "_vendor-shiki-1F3op0QC.js",
55
- "_vendor-shiki-1F3op0QC.js"
53
+ "_vendor-shiki-xSOiKxt0.js",
54
+ "_vendor-shiki-xSOiKxt0.js",
55
+ "_vendor-shiki-xSOiKxt0.js"
56
56
  ]
57
57
  },
58
- "_vendor-recharts-BT_PeGhc.js": {
59
- "file": "assets/vendor-recharts-BT_PeGhc.js",
58
+ "_vendor-recharts-D6kvOpmb.js": {
59
+ "file": "assets/vendor-recharts-D6kvOpmb.js",
60
60
  "name": "vendor-recharts",
61
61
  "imports": [
62
- "_vendor-CRRxHwSp.js"
62
+ "_vendor-Cfrr9FCF.js"
63
63
  ]
64
64
  },
65
- "_vendor-shiki-1F3op0QC.js": {
66
- "file": "assets/vendor-shiki-1F3op0QC.js",
65
+ "_vendor-shiki-xSOiKxt0.js": {
66
+ "file": "assets/vendor-shiki-xSOiKxt0.js",
67
67
  "name": "vendor-shiki",
68
68
  "isDynamicEntry": true,
69
69
  "imports": [
70
- "_vendor-CRRxHwSp.js"
70
+ "_vendor-Cfrr9FCF.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-CugQp26L.js",
78
+ "file": "assets/index-B1VuXYRI.js",
79
79
  "name": "index",
80
80
  "src": "index.tsx",
81
81
  "isEntry": true,
82
82
  "imports": [
83
- "_vendor-CRRxHwSp.js",
84
- "_vendor-arizeai-CUN6lRd9.js",
85
- "_pages-4Qu8GNlt.js",
86
- "_components-YTHUASXI.js",
83
+ "_vendor-Cfrr9FCF.js",
84
+ "_vendor-arizeai-Dz0kN-lQ.js",
85
+ "_pages-CnfZ3RhB.js",
86
+ "_components-CdQiQTvs.js",
87
87
  "_vendor-three-BLWp5bic.js",
88
- "_vendor-codemirror-sJXwoqrE.js",
89
- "_vendor-shiki-1F3op0QC.js",
90
- "_vendor-recharts-BT_PeGhc.js"
88
+ "_vendor-codemirror-ClqtONZQ.js",
89
+ "_vendor-shiki-xSOiKxt0.js",
90
+ "_vendor-recharts-D6kvOpmb.js"
91
91
  ]
92
92
  }
93
93
  }
@@ -1,4 +1,4 @@
1
- import{r as m,j as e,u as ut,a as un,e as Yn,s as za,b as Ma,c as En,d as Qa,f as xo,g as Je,h as To,i as Ao,k as Wa,l as s,m as Ln,p as ua,n as Bn,R as rn,o as z,q as gt,t as Dn,v as Io,C as ta,w as zo,x as Mo,L as Kl,y as Pl,z as Vl,A as Be,B as on,D as q,E as Fo,F as pn,G as Eo,H as Do,I as Ue,J as tn,K as j,M as _o,N as ce,O as wn,P as Pn,Q as Rl,S as An,T as ga,U as p,V as Ol,$ as R,W as Ko,X as V,Y as Nl,Z as $l,_ as Po,a0 as Me,a1 as Vo,a2 as Ro,a3 as Sn,a4 as Oo,a5 as U,a6 as bn,a7 as K,a8 as Z,a9 as W,aa as Bl,ab as Hl,ac as No,ad as jl,ae as $o,af as Zl,ag as Bo,ah as Ho,ai as Ul,aj as jo,ak as Zo,al as Uo,am as Gl,an as Go,ao as Qo,ap as Wo,aq as Ie,ar as Ql,as as _e,at as qo,au as Xo,av as Re,aw as qa,ax as Xa,ay as Ya,az as $,aA as sn,aB as Qt,aC as Wl,aD as ql,aE as Yo,aF as Jo,aG as e1,aH as n1,aI as a1,aJ as t1,aK as Xl,aL as l1,aM as i1,aN as r1,aO as o1,aP as s1,aQ as c1,aR as d1,aS as mt,aT as te,aU as u1,aV as g1,aW as Yl,aX as m1,aY as p1,aZ as Oe,a_ as Jl,a$ as Wt,b0 as h1,b1 as ei,b2 as he,b3 as f1,b4 as ma,b5 as b1,b6 as y1,b7 as v1,b8 as C1,b9 as qt,ba as ni,bb as k1,bc as L1,bd as w1,be as S1,bf as ye,bg as x1,bh as pt,bi as T1,bj as A1,bk as pa,bl as I1,bm as z1,bn as M1,bo as F1,bp as ai,bq as E1,br as D1,bs as _1,bt as K1,bu as P1,bv as V1,bw as R1,bx as Xt,by as O1,bz as Fa,bA as N1,bB as $1,bC as B1,bD as H1,bE as j1,bF as Z1,bG as U1,bH as G1,bI as Q1,bJ as Jn}from"./vendor-CRRxHwSp.js";import{a as Yt,R as W1,b as q1,c as X1,m as Y1,T as J1,A as es,S as ns,d as as,e as ts,f as ls,u as is}from"./pages-4Qu8GNlt.js";import{u as rs,_ as os,F as ti,I as ss,a as cs,b as ds,c as us,d as gs,e as ms,f as ps,P as hs,g as fs,h as bs,i as ys,T as vs,j as Cs}from"./vendor-arizeai-CUN6lRd9.js";import{L as li,a as ii,j as ri,E as ht,k as oi,d as si,l as Ja,b as ci,h as ks,c as Ls,e as ws,f as Ss,g as xs,i as Ts,s as As,m as Hn,n as jn,R as Zn,p as Is,o as zs}from"./vendor-codemirror-sJXwoqrE.js";import{V as Ms}from"./vendor-three-BLWp5bic.js";const di=(function(){var n={defaultValue:null,kind:"LocalArgument",name:"clusters"},a={defaultValue:null,kind:"LocalArgument",name:"dataQualityMetricColumnName"},t={defaultValue:null,kind:"LocalArgument",name:"fetchDataQualityMetric"},l={defaultValue:null,kind:"LocalArgument",name:"fetchPerformanceMetric"},i={defaultValue:null,kind:"LocalArgument",name:"performanceMetric"},r=[{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:r,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:r,storageKey:null}]}],storageKey:null}];return{fragment:{argumentDefinitions:[n,a,t,l,i],kind:"Fragment",metadata:null,name:"pointCloudStore_clusterMetricsQuery",selections:o,type:"Query",abstractKey:null},kind:"Request",operation:{argumentDefinitions:[n,t,a,l,i],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 m,j as e,u as ut,a as un,e as Yn,s as za,b as Ma,c as En,d as Qa,f as xo,g as Je,h as To,i as Ao,k as Wa,l as s,m as Ln,p as ua,n as Bn,R as rn,o as z,q as gt,t as Dn,v as Io,C as ta,w as zo,x as Mo,L as Kl,y as Pl,z as Vl,A as Be,B as on,D as q,E as Fo,F as pn,G as Eo,H as Do,I as Ue,J as tn,K as j,M as _o,N as ce,O as wn,P as Pn,Q as Rl,S as An,T as ga,U as p,V as Ol,$ as R,W as Ko,X as V,Y as Nl,Z as $l,_ as Po,a0 as Me,a1 as Vo,a2 as Ro,a3 as Sn,a4 as Oo,a5 as U,a6 as bn,a7 as K,a8 as Z,a9 as W,aa as Bl,ab as Hl,ac as No,ad as jl,ae as $o,af as Zl,ag as Bo,ah as Ho,ai as Ul,aj as jo,ak as Zo,al as Uo,am as Gl,an as Go,ao as Qo,ap as Wo,aq as Ie,ar as Ql,as as _e,at as qo,au as Xo,av as Re,aw as qa,ax as Xa,ay as Ya,az as $,aA as sn,aB as Qt,aC as Wl,aD as ql,aE as Yo,aF as Jo,aG as e1,aH as n1,aI as a1,aJ as t1,aK as Xl,aL as l1,aM as i1,aN as r1,aO as o1,aP as s1,aQ as c1,aR as d1,aS as mt,aT as te,aU as u1,aV as g1,aW as Yl,aX as m1,aY as p1,aZ as Oe,a_ as Jl,a$ as Wt,b0 as h1,b1 as ei,b2 as he,b3 as f1,b4 as ma,b5 as b1,b6 as y1,b7 as v1,b8 as C1,b9 as qt,ba as ni,bb as k1,bc as L1,bd as w1,be as S1,bf as ye,bg as x1,bh as pt,bi as T1,bj as A1,bk as pa,bl as I1,bm as z1,bn as M1,bo as F1,bp as ai,bq as E1,br as D1,bs as _1,bt as K1,bu as P1,bv as V1,bw as R1,bx as Xt,by as O1,bz as Fa,bA as N1,bB as $1,bC as B1,bD as H1,bE as j1,bF as Z1,bG as U1,bH as G1,bI as Q1,bJ as Jn}from"./vendor-Cfrr9FCF.js";import{a as Yt,R as W1,b as q1,c as X1,m as Y1,T as J1,A as es,S as ns,d as as,e as ts,f as ls,u as is}from"./pages-CnfZ3RhB.js";import{u as rs,_ as os,F as ti,I as ss,a as cs,b as ds,c as us,d as gs,e as ms,f as ps,P as hs,g as fs,h as bs,i as ys,T as vs,j as Cs}from"./vendor-arizeai-Dz0kN-lQ.js";import{L as li,a as ii,j as ri,E as ht,k as oi,d as si,l as Ja,b as ci,h as ks,c as Ls,e as ws,f as Ss,g as xs,i as Ts,s as As,m as Hn,n as jn,R as Zn,p as Is,o as zs}from"./vendor-codemirror-ClqtONZQ.js";import{V as Ms}from"./vendor-three-BLWp5bic.js";const di=(function(){var n={defaultValue:null,kind:"LocalArgument",name:"clusters"},a={defaultValue:null,kind:"LocalArgument",name:"dataQualityMetricColumnName"},t={defaultValue:null,kind:"LocalArgument",name:"fetchDataQualityMetric"},l={defaultValue:null,kind:"LocalArgument",name:"fetchPerformanceMetric"},i={defaultValue:null,kind:"LocalArgument",name:"performanceMetric"},r=[{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:r,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:r,storageKey:null}]}],storageKey:null}];return{fragment:{argumentDefinitions:[n,a,t,l,i],kind:"Fragment",metadata:null,name:"pointCloudStore_clusterMetricsQuery",selections:o,type:"Query",abstractKey:null},kind:"Request",operation:{argumentDefinitions:[n,t,a,l,i],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{U as g,j as o,d0 as f,eF as v,eG as h,eH as y,l as c,co as x,eI as a,r as z,o as w,eJ as P}from"./vendor-CRRxHwSp.js";import{r as k,s as S}from"./vendor-arizeai-CUN6lRd9.js";import{L,g as C,r as R,h as E,i as I,F as j,j as A,P as D,k as F,M as t,l as T,D as G,n as M,E as O,o as _,p as V,q as N,s as W,t as d,v as q,w as U,x as B,y as $,z as H,B as J,C as K,G as Q,H as X,I as Y,J as Z,K as m,N as p,O as oo,Q as ao,U as lo,V as ro,W as co,X as go,Y as eo,Z as bo,_ as no,$ as io,a0 as so,a1 as to,a2 as mo,a3 as po,a4 as uo,a5 as fo,a6 as vo,a7 as ho,a8 as yo,a9 as xo,aa as zo,ab as wo,ac as Po,ad as ko,ae as So,af as Lo,ag as Co,ah as Ro,ai as Eo,aj as Io,ak as jo,al as Ao,am as Do,an as Fo,ao as To,ap as Go,aq as Mo,ar as Oo,as as _o,at as Vo,au as n,av as No,aw as Wo,ax as qo,ay as Uo,az as Bo,aA as $o,aB as Ho}from"./pages-4Qu8GNlt.js";import{fU as Jo,cO as Ko,U as Qo,fV as Xo,fW as Yo}from"./components-YTHUASXI.js";import"./vendor-three-BLWp5bic.js";import"./vendor-codemirror-sJXwoqrE.js";import"./vendor-shiki-1F3op0QC.js";import"./vendor-recharts-BT_PeGhc.js";(function(){const b=document.createElement("link").relList;if(b&&b.supports&&b.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const e of r)if(e.type==="childList")for(const i of e.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&s(i)}).observe(document,{childList:!0,subtree:!0});function u(r){const e={};return r.integrity&&(e.integrity=r.integrity),r.referrerPolicy&&(e.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?e.credentials="include":r.crossOrigin==="anonymous"?e.credentials="omit":e.credentials="same-origin",e}function s(r){if(r.ep)return;r.ep=!0;const e=u(r);fetch(r.href,e)}})();const Zo=g`
1
+ import{U as g,j as o,d0 as f,eG as v,eH as h,eI as y,l as c,cp as x,eJ as a,r as z,o as w,eK as P}from"./vendor-Cfrr9FCF.js";import{r as k,s as S}from"./vendor-arizeai-Dz0kN-lQ.js";import{L,g as C,r as R,h as E,i as I,F as j,j as A,P as D,k as F,M as t,l as T,D as G,n as M,E as O,o as _,p as V,q as N,s as W,t as d,v as q,w as U,x as B,y as K,z as $,B as H,C as J,G as Q,H as X,I as Y,J as Z,K as m,N as p,O as oo,Q as ao,U as lo,V as ro,W as co,X as go,Y as eo,Z as bo,_ as no,$ as io,a0 as so,a1 as to,a2 as mo,a3 as po,a4 as uo,a5 as fo,a6 as vo,a7 as ho,a8 as yo,a9 as xo,aa as zo,ab as wo,ac as Po,ad as ko,ae as So,af as Lo,ag as Co,ah as Ro,ai as Eo,aj as Io,ak as jo,al as Ao,am as Do,an as Fo,ao as To,ap as Go,aq as Mo,ar as Oo,as as _o,at as Vo,au as n,av as No,aw as Wo,ax as qo,ay as Uo,az as Bo,aA as Ko,aB as $o}from"./pages-CnfZ3RhB.js";import{fU as Ho,cO as Jo,U as Qo,fV as Xo,fW as Yo}from"./components-CdQiQTvs.js";import"./vendor-three-BLWp5bic.js";import"./vendor-codemirror-ClqtONZQ.js";import"./vendor-shiki-xSOiKxt0.js";import"./vendor-recharts-D6kvOpmb.js";(function(){const b=document.createElement("link").relList;if(b&&b.supports&&b.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const e of r)if(e.type==="childList")for(const i of e.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&s(i)}).observe(document,{childList:!0,subtree:!0});function u(r){const e={};return r.integrity&&(e.integrity=r.integrity),r.referrerPolicy&&(e.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?e.credentials="include":r.crossOrigin==="anonymous"?e.credentials="omit":e.credentials="same-origin",e}function s(r){if(r.ep)return;r.ep=!0;const e=u(r);fetch(r.href,e)}})();const Zo=g`
2
2
  :root,
3
3
  .ac-theme {
4
4
  --ac-global-dimension-scale-factor: 1;
@@ -1252,4 +1252,4 @@ import{U as g,j as o,d0 as f,eF as v,eG as h,eH as y,l as c,co as x,eI as a,r as
1252
1252
  font-family: "Geist Mono", monospace;
1253
1253
  font-optical-sizing: auto;
1254
1254
  }
1255
- `;function sa(){const{theme:l="dark"}=k();return o(f,{styles:g(aa,oa,l==="dark"?la:ra,ca(l),Zo,ga,ea,ba,na,ia)})}const ta=v(h(c(a,{path:"/",errorElement:o(n,{}),children:[o(a,{path:"/v1/*",element:o(x,{to:"/",replace:!0})}),o(a,{path:"/login",element:o(L,{})}),o(a,{path:"/logout",element:o(C,{})}),o(a,{path:"/reset-password",element:o(E,{}),loader:R}),o(a,{path:"/reset-password-with-token",element:o(I,{})}),o(a,{path:"/forgot-password",element:o(j,{})}),o(a,{element:o(Uo,{}),loader:A,children:c(a,{element:o(qo,{}),children:[o(a,{path:"/profile",handle:{crumb:()=>"profile"},element:o(D,{})}),o(a,{index:!0,loader:F}),c(a,{path:"/model",handle:{crumb:()=>"model"},element:o(_,{}),children:[o(a,{index:!0,element:o(t,{})}),o(a,{element:o(t,{}),children:o(a,{path:"dimensions",children:o(a,{path:":dimensionId",element:o(G,{}),loader:T})})}),o(a,{path:"embeddings",children:o(a,{path:":embeddingDimensionId",element:o(O,{}),loader:M,handle:{crumb:l=>l.embedding.name}})})]}),c(a,{path:"/projects",handle:{crumb:()=>"Projects"},element:o(Y,{}),children:[o(a,{index:!0,element:o(V,{})}),c(a,{path:":projectId",loader:N,handle:{crumb:l=>l.project.name},element:o(X,{}),children:[o(a,{index:!0,element:o(W,{})}),c(a,{element:o(Q,{}),children:[o(a,{path:"traces",element:o(q,{}),children:o(a,{path:":traceId",element:o(d,{})})}),o(a,{path:"spans",element:o(U,{}),children:o(a,{path:":traceId",element:o(d,{})})}),o(a,{path:"sessions",element:o(H,{}),children:o(a,{path:":sessionId",element:o($,{}),loader:B})}),o(a,{path:"config",element:o(J,{})}),o(a,{path:"metrics",element:o(K,{})})]})]})]}),c(a,{path:"/datasets",handle:{crumb:()=>"Datasets"},children:[o(a,{index:!0,element:o(Z,{})}),c(a,{path:":datasetId",loader:m,handle:{crumb:l=>l.dataset.name},children:[c(a,{element:o(eo,{}),loader:m,children:[o(a,{index:!0,element:o(p,{})}),o(a,{path:"experiments",element:o(p,{})}),o(a,{path:"examples",element:o(lo,{}),loader:oo,children:o(a,{path:":exampleId",element:o(ao,{})})}),o(a,{path:"versions",element:o(co,{}),loader:ro}),o(a,{path:"evaluators",element:o(go,{})})]}),o(a,{path:"compare",element:o(no,{}),loader:bo,handle:{crumb:()=>"compare"}})]})]}),c(a,{path:"/playground",handle:{crumb:()=>"Playground"},children:[o(a,{index:!0,element:o(io,{})}),o(a,{path:"spans/:spanId",element:o(to,{}),loader:so,handle:{crumb:l=>l.span.__typename==="Span"?`span ${l.span.spanId}`:"span unknown"}})]}),c(a,{path:"/prompts",handle:{crumb:()=>"Prompts"},children:[o(a,{index:!0,element:o(po,{}),loader:mo}),c(a,{path:":promptId",loader:uo,shouldRevalidate:()=>!0,handle:{crumb:l=>l.prompt.__typename==="Prompt"?l.prompt.name:"unknown"},children:[c(a,{element:o(Po,{}),children:[o(a,{index:!0,element:o(fo,{})}),o(a,{path:"versions",loader:vo,element:o(xo,{}),children:o(a,{path:":versionId",loader:ho,element:o(yo,{})})}),o(a,{path:"config",element:o(wo,{}),loader:zo})]}),o(a,{path:"playground",element:o(So,{}),loader:ko,handle:{crumb:()=>"playground"}})]})]}),o(a,{path:"/apis",element:o(Lo,{}),handle:{crumb:()=>"APIs"}}),o(a,{path:"/support",element:o(Co,{}),handle:{crumb:()=>"Support"}}),c(a,{path:"/settings",element:o(_o,{}),handle:{crumb:()=>"Settings"},children:[o(a,{path:"general",loader:Ro,element:o(Eo,{}),handle:{crumb:()=>"General"}}),o(a,{path:"providers",loader:Io,element:o(jo,{}),handle:{crumb:()=>"AI Providers"}}),o(a,{path:"models",loader:Ao,element:o(Do,{}),handle:{crumb:()=>"Models"}}),o(a,{path:"annotations",loader:Fo,element:o(To,{}),handle:{crumb:()=>"Annotations"}}),o(a,{path:"data",element:o(Mo,{}),handle:{crumb:()=>"Data Retention"},loader:Go}),o(a,{path:"prompts",element:o(Oo,{}),handle:{crumb:()=>"Prompts"}})]}),o(a,{path:"/redirects/spans/:span_otel_id",loader:Vo,errorElement:o(n,{})}),o(a,{path:"/redirects/traces/:trace_otel_id",loader:No,errorElement:o(n,{})}),o(a,{path:"/redirects/sessions/:session_id",loader:Wo,errorElement:o(n,{})})]})})]})),{basename:window.Config.basename});function da(){return o(y,{router:ta})}function ma(){return o(Bo,{children:o(Jo,{children:o(pa,{})})})}function pa(){const{theme:l}=Ko();return o(S,{theme:l,mountGlobalStyles:!1,children:c(w.RelayEnvironmentProvider,{environment:Qo,children:[o(sa,{}),o($o,{children:o(Xo,{children:o(Ho,{children:o(z.Suspense,{children:o(Yo,{children:o(da,{})})})})})})]})})}const ua=document.getElementById("root"),fa=P.createRoot(ua);fa.render(o(ma,{}));
1255
+ `;function sa(){const{theme:l="dark"}=k();return o(f,{styles:g(aa,oa,l==="dark"?la:ra,ca(l),Zo,ga,ea,ba,na,ia)})}const ta=v(h(c(a,{path:"/",errorElement:o(n,{}),children:[o(a,{path:"/v1/*",element:o(x,{to:"/",replace:!0})}),o(a,{path:"/login",element:o(L,{})}),o(a,{path:"/logout",element:o(C,{})}),o(a,{path:"/reset-password",element:o(E,{}),loader:R}),o(a,{path:"/reset-password-with-token",element:o(I,{})}),o(a,{path:"/forgot-password",element:o(j,{})}),o(a,{element:o(Uo,{}),loader:A,children:c(a,{element:o(qo,{}),children:[o(a,{path:"/profile",handle:{crumb:()=>"profile"},element:o(D,{})}),o(a,{index:!0,loader:F}),c(a,{path:"/model",handle:{crumb:()=>"model"},element:o(_,{}),children:[o(a,{index:!0,element:o(t,{})}),o(a,{element:o(t,{}),children:o(a,{path:"dimensions",children:o(a,{path:":dimensionId",element:o(G,{}),loader:T})})}),o(a,{path:"embeddings",children:o(a,{path:":embeddingDimensionId",element:o(O,{}),loader:M,handle:{crumb:l=>l.embedding.name}})})]}),c(a,{path:"/projects",handle:{crumb:()=>"Projects"},element:o(Y,{}),children:[o(a,{index:!0,element:o(V,{})}),c(a,{path:":projectId",loader:N,handle:{crumb:l=>l.project.name},element:o(X,{}),children:[o(a,{index:!0,element:o(W,{})}),c(a,{element:o(Q,{}),children:[o(a,{path:"traces",element:o(q,{}),children:o(a,{path:":traceId",element:o(d,{})})}),o(a,{path:"spans",element:o(U,{}),children:o(a,{path:":traceId",element:o(d,{})})}),o(a,{path:"sessions",element:o($,{}),children:o(a,{path:":sessionId",element:o(K,{}),loader:B})}),o(a,{path:"config",element:o(H,{})}),o(a,{path:"metrics",element:o(J,{})})]})]})]}),c(a,{path:"/datasets",handle:{crumb:()=>"Datasets"},children:[o(a,{index:!0,element:o(Z,{})}),c(a,{path:":datasetId",loader:m,handle:{crumb:l=>l.dataset.name},children:[c(a,{element:o(eo,{}),loader:m,children:[o(a,{index:!0,element:o(p,{})}),o(a,{path:"experiments",element:o(p,{})}),o(a,{path:"examples",element:o(lo,{}),loader:oo,children:o(a,{path:":exampleId",element:o(ao,{})})}),o(a,{path:"versions",element:o(co,{}),loader:ro}),o(a,{path:"evaluators",element:o(go,{})})]}),o(a,{path:"compare",element:o(no,{}),loader:bo,handle:{crumb:()=>"compare"}})]})]}),c(a,{path:"/playground",handle:{crumb:()=>"Playground"},children:[o(a,{index:!0,element:o(io,{})}),o(a,{path:"spans/:spanId",element:o(to,{}),loader:so,handle:{crumb:l=>l.span.__typename==="Span"?`span ${l.span.spanId}`:"span unknown"}})]}),c(a,{path:"/prompts",handle:{crumb:()=>"Prompts"},children:[o(a,{index:!0,element:o(po,{}),loader:mo}),c(a,{path:":promptId",loader:uo,shouldRevalidate:()=>!0,handle:{crumb:l=>l.prompt.__typename==="Prompt"?l.prompt.name:"unknown"},children:[c(a,{element:o(Po,{}),children:[o(a,{index:!0,element:o(fo,{})}),o(a,{path:"versions",loader:vo,element:o(xo,{}),children:o(a,{path:":versionId",loader:ho,element:o(yo,{})})}),o(a,{path:"config",element:o(wo,{}),loader:zo})]}),o(a,{path:"playground",element:o(So,{}),loader:ko,handle:{crumb:()=>"playground"}})]})]}),o(a,{path:"/apis",element:o(Lo,{}),handle:{crumb:()=>"APIs"}}),o(a,{path:"/support",element:o(Co,{}),handle:{crumb:()=>"Support"}}),c(a,{path:"/settings",element:o(_o,{}),handle:{crumb:()=>"Settings"},children:[o(a,{path:"general",loader:Ro,element:o(Eo,{}),handle:{crumb:()=>"General"}}),o(a,{path:"providers",loader:Io,element:o(jo,{}),handle:{crumb:()=>"AI Providers"}}),o(a,{path:"models",loader:Ao,element:o(Do,{}),handle:{crumb:()=>"Models"}}),o(a,{path:"annotations",loader:Fo,element:o(To,{}),handle:{crumb:()=>"Annotations"}}),o(a,{path:"data",element:o(Mo,{}),handle:{crumb:()=>"Data Retention"},loader:Go}),o(a,{path:"prompts",element:o(Oo,{}),handle:{crumb:()=>"Prompts"}})]}),o(a,{path:"/redirects/spans/:span_otel_id",loader:Vo,errorElement:o(n,{})}),o(a,{path:"/redirects/traces/:trace_otel_id",loader:No,errorElement:o(n,{})}),o(a,{path:"/redirects/sessions/:session_id",loader:Wo,errorElement:o(n,{})})]})})]})),{basename:window.Config.basename});function da(){return o(y,{router:ta})}function ma(){return o(Bo,{children:o(Ho,{children:o(pa,{})})})}function pa(){const{theme:l}=Jo();return o(S,{theme:l,mountGlobalStyles:!1,children:c(w.RelayEnvironmentProvider,{environment:Qo,children:[o(sa,{}),o(Ko,{children:o(Xo,{children:o($o,{children:o(z.Suspense,{children:o(Yo,{children:o(da,{})})})})})})]})})}const ua=document.getElementById("root"),fa=P.createRoot(ua);fa.render(o(ma,{}));