arize-phoenix 4.24.0__py3-none-any.whl → 4.25.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 (44) hide show
  1. {arize_phoenix-4.24.0.dist-info → arize_phoenix-4.25.0.dist-info}/METADATA +10 -6
  2. {arize_phoenix-4.24.0.dist-info → arize_phoenix-4.25.0.dist-info}/RECORD +44 -41
  3. phoenix/auth/__init__.py +0 -0
  4. phoenix/auth/utils.py +15 -0
  5. phoenix/db/engines.py +15 -2
  6. phoenix/db/insertion/dataset.py +1 -0
  7. phoenix/db/migrate.py +21 -10
  8. phoenix/db/migrations/future_versions/cd164e83824f_users_and_tokens.py +7 -6
  9. phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +4 -12
  10. phoenix/db/models.py +1 -1
  11. phoenix/inferences/fixtures.py +1 -0
  12. phoenix/inferences/inferences.py +1 -0
  13. phoenix/metrics/__init__.py +1 -0
  14. phoenix/server/api/context.py +14 -0
  15. phoenix/server/api/mutations/__init__.py +2 -0
  16. phoenix/server/api/mutations/api_key_mutations.py +119 -0
  17. phoenix/server/api/mutations/auth.py +7 -0
  18. phoenix/server/api/queries.py +7 -6
  19. phoenix/server/api/routers/v1/datasets.py +1 -0
  20. phoenix/server/api/routers/v1/spans.py +1 -1
  21. phoenix/server/api/types/UserRole.py +1 -1
  22. phoenix/server/app.py +36 -7
  23. phoenix/server/main.py +24 -19
  24. phoenix/server/static/.vite/manifest.json +31 -31
  25. phoenix/server/static/assets/{components-DzA9gIHT.js → components-1Ahruijo.js} +4 -4
  26. phoenix/server/static/assets/{index-BuTlV4Gk.js → index-BEE_RWJx.js} +2 -2
  27. phoenix/server/static/assets/{pages-DzkUGFGV.js → pages-CFS6mPnW.js} +263 -220
  28. phoenix/server/static/assets/{vendor-CIqy43_9.js → vendor-aSQri0vz.js} +58 -58
  29. phoenix/server/static/assets/{vendor-arizeai-B1YgcWL8.js → vendor-arizeai-CsdcB1NH.js} +1 -1
  30. phoenix/server/static/assets/{vendor-codemirror-_bcwCA1C.js → vendor-codemirror-CYHkhs7D.js} +1 -1
  31. phoenix/server/static/assets/{vendor-recharts-C3pM_Wlg.js → vendor-recharts-B0sannek.js} +1 -1
  32. phoenix/server/types.py +12 -4
  33. phoenix/services.py +1 -0
  34. phoenix/session/client.py +1 -1
  35. phoenix/session/evaluation.py +1 -0
  36. phoenix/session/session.py +2 -1
  37. phoenix/trace/fixtures.py +37 -0
  38. phoenix/trace/langchain/instrumentor.py +1 -1
  39. phoenix/trace/llama_index/callback.py +1 -0
  40. phoenix/trace/openai/instrumentor.py +1 -0
  41. phoenix/version.py +1 -1
  42. {arize_phoenix-4.24.0.dist-info → arize_phoenix-4.25.0.dist-info}/WHEEL +0 -0
  43. {arize_phoenix-4.24.0.dist-info → arize_phoenix-4.25.0.dist-info}/licenses/IP_NOTICE +0 -0
  44. {arize_phoenix-4.24.0.dist-info → arize_phoenix-4.25.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,119 @@
1
+ from datetime import datetime
2
+ from typing import Any, Dict, Optional
3
+
4
+ import jwt
5
+ import strawberry
6
+ from sqlalchemy import insert, select
7
+ from strawberry import UNSET
8
+ from strawberry.types import Info
9
+
10
+ from phoenix.db import models
11
+ from phoenix.server.api.context import Context
12
+ from phoenix.server.api.mutations.auth import HasSecret, IsAuthenticated
13
+ from phoenix.server.api.queries import Query
14
+ from phoenix.server.api.types.SystemApiKey import SystemApiKey
15
+
16
+
17
+ @strawberry.type
18
+ class CreateSystemApiKeyMutationPayload:
19
+ jwt: str
20
+ api_key: SystemApiKey
21
+ query: Query
22
+
23
+
24
+ @strawberry.input
25
+ class CreateApiKeyInput:
26
+ name: str
27
+ description: Optional[str] = UNSET
28
+ expires_at: Optional[datetime] = UNSET
29
+
30
+
31
+ @strawberry.type
32
+ class ApiKeyMutationMixin:
33
+ @strawberry.mutation(permission_classes=[HasSecret, IsAuthenticated]) # type: ignore
34
+ async def create_system_api_key(
35
+ self, info: Info[Context, None], input: CreateApiKeyInput
36
+ ) -> CreateSystemApiKeyMutationPayload:
37
+ # TODO(auth): safe guard against auth being disabled and secret not being set
38
+ async with info.context.db() as session:
39
+ # Get the system user - note this could be pushed into a dataloader
40
+ system_user = await session.scalar(
41
+ select(models.User)
42
+ .join(models.UserRole) # Join User with UserRole
43
+ .where(models.UserRole.name == "SYSTEM") # Filter where role is SYSTEM
44
+ .limit(1)
45
+ )
46
+ if system_user is None:
47
+ raise ValueError("System user not found")
48
+
49
+ insert_stmt = (
50
+ insert(models.APIKey)
51
+ .values(
52
+ user_id=system_user.id,
53
+ name=input.name,
54
+ description=input.description or None,
55
+ expires_at=input.expires_at or None,
56
+ )
57
+ .returning(models.APIKey)
58
+ )
59
+ api_key = await session.scalar(insert_stmt)
60
+ assert api_key is not None
61
+
62
+ encoded_jwt = create_jwt(
63
+ secret=info.context.get_secret(),
64
+ name=api_key.name,
65
+ id=api_key.id,
66
+ description=api_key.description,
67
+ iat=api_key.created_at,
68
+ exp=api_key.expires_at,
69
+ )
70
+ return CreateSystemApiKeyMutationPayload(
71
+ jwt=encoded_jwt,
72
+ api_key=SystemApiKey(
73
+ id_attr=api_key.id,
74
+ name=api_key.name,
75
+ description=api_key.description,
76
+ created_at=api_key.created_at,
77
+ expires_at=api_key.expires_at,
78
+ ),
79
+ query=Query(),
80
+ )
81
+
82
+
83
+ def create_jwt(
84
+ *,
85
+ secret: str,
86
+ algorithm: str = "HS256",
87
+ name: str,
88
+ description: Optional[str],
89
+ iat: datetime,
90
+ exp: Optional[datetime],
91
+ id: int,
92
+ ) -> str:
93
+ """Create a signed JSON Web Token for authentication
94
+
95
+ Args:
96
+ secret (str): the secret to sign with
97
+ name (str): name of the key / token
98
+ description (Optional[str]): description of the token
99
+ iat (datetime): the issued at time
100
+ exp (Optional[datetime]): the expiry, if set
101
+ id (int): the id of the key
102
+ algorithm (str, optional): the algorithm to use. Defaults to "HS256".
103
+
104
+ Returns:
105
+ str: The encoded JWT
106
+ """
107
+ payload: Dict[str, Any] = {
108
+ "name": name,
109
+ "description": description,
110
+ "iat": iat.utcnow(),
111
+ "id": id,
112
+ }
113
+ if exp is not None:
114
+ payload["exp"] = exp.utcnow()
115
+
116
+ # Encode the payload to create the JWT
117
+ token = jwt.encode(payload, secret, algorithm=algorithm)
118
+
119
+ return token
@@ -9,3 +9,10 @@ class IsAuthenticated(BasePermission):
9
9
 
10
10
  async def has_permission(self, source: Any, info: Info, **kwargs: Any) -> bool:
11
11
  return not info.context.read_only
12
+
13
+
14
+ class HasSecret(BasePermission):
15
+ message = "Application secret is not set"
16
+
17
+ async def has_permission(self, source: Any, info: Info, **kwargs: Any) -> bool:
18
+ return info.context.secret is not None
@@ -92,7 +92,8 @@ class Query:
92
92
  )
93
93
  stmt = (
94
94
  select(models.User)
95
- .where(models.UserRole.role != "SYSTEM")
95
+ .join(models.UserRole)
96
+ .where(models.UserRole.name != "SYSTEM")
96
97
  .order_by(models.User.email)
97
98
  .options(joinedload(models.User.role))
98
99
  )
@@ -106,7 +107,7 @@ class Query:
106
107
  created_at=user.created_at,
107
108
  role=UserRole(
108
109
  id_attr=user.role.id,
109
- role=user.role.role,
110
+ name=user.role.name,
110
111
  ),
111
112
  )
112
113
  async for user in users
@@ -120,12 +121,12 @@ class Query:
120
121
  ) -> List[UserRole]:
121
122
  async with info.context.db() as session:
122
123
  roles = await session.scalars(
123
- select(models.UserRole).where(models.UserRole.role != "SYSTEM")
124
+ select(models.UserRole).where(models.UserRole.name != "SYSTEM")
124
125
  )
125
126
  return [
126
127
  UserRole(
127
128
  id_attr=role.id,
128
- role=role.role,
129
+ name=role.name,
129
130
  )
130
131
  for role in roles
131
132
  ]
@@ -137,7 +138,7 @@ class Query:
137
138
  select(models.APIKey)
138
139
  .join(models.User)
139
140
  .join(models.UserRole)
140
- .where(models.UserRole.role != "SYSTEM")
141
+ .where(models.UserRole.name != "SYSTEM")
141
142
  )
142
143
  async with info.context.db() as session:
143
144
  api_keys = await session.scalars(stmt)
@@ -160,7 +161,7 @@ class Query:
160
161
  select(models.APIKey)
161
162
  .join(models.User)
162
163
  .join(models.UserRole)
163
- .where(models.UserRole.role == "SYSTEM")
164
+ .where(models.UserRole.name == "SYSTEM")
164
165
  )
165
166
  async with info.context.db() as session:
166
167
  api_keys = await session.scalars(stmt)
@@ -71,6 +71,7 @@ from .utils import (
71
71
  )
72
72
 
73
73
  logger = logging.getLogger(__name__)
74
+ logger.addHandler(logging.NullHandler())
74
75
 
75
76
  DATASET_NODE_NAME = DatasetNodeType.__name__
76
77
  DATASET_VERSION_NODE_NAME = DatasetVersionNodeType.__name__
@@ -196,7 +196,7 @@ class AnnotateSpansResponseBody(ResponseBody[List[InsertedSpanAnnotation]]):
196
196
  async def annotate_spans(
197
197
  request: Request,
198
198
  request_body: AnnotateSpansRequestBody,
199
- sync: bool = Query(default=True, description="If true, fulfill request synchronously."),
199
+ sync: bool = Query(default=False, description="If true, fulfill request synchronously."),
200
200
  ) -> AnnotateSpansResponseBody:
201
201
  if not request_body.data:
202
202
  return AnnotateSpansResponseBody(data=[])
@@ -5,4 +5,4 @@ from strawberry.relay import Node, NodeID
5
5
  @strawberry.type
6
6
  class UserRole(Node):
7
7
  id_attr: NodeID[int]
8
- role: str
8
+ name: str
phoenix/server/app.py CHANGED
@@ -100,6 +100,7 @@ if TYPE_CHECKING:
100
100
  from opentelemetry.trace import TracerProvider
101
101
 
102
102
  logger = logging.getLogger(__name__)
103
+ logger.addHandler(logging.NullHandler())
103
104
 
104
105
  router = APIRouter(include_in_schema=False)
105
106
 
@@ -229,7 +230,8 @@ def _lifespan(
229
230
  dml_event_handler: DmlEventHandler,
230
231
  tracer_provider: Optional["TracerProvider"] = None,
231
232
  enable_prometheus: bool = False,
232
- clean_ups: Iterable[Callable[[], None]] = (),
233
+ startup_callbacks: Iterable[Callable[[], None]] = (),
234
+ shutdown_callbacks: Iterable[Callable[[], None]] = (),
233
235
  read_only: bool = False,
234
236
  ) -> StatefulLifespan[FastAPI]:
235
237
  @contextlib.asynccontextmanager
@@ -247,6 +249,8 @@ def _lifespan(
247
249
  tracer_provider=tracer_provider,
248
250
  enable_prometheus=enable_prometheus,
249
251
  ), dml_event_handler:
252
+ for callback in startup_callbacks:
253
+ callback()
250
254
  yield {
251
255
  "event_queue": dml_event_handler,
252
256
  "enqueue": enqueue,
@@ -254,8 +258,8 @@ def _lifespan(
254
258
  "queue_evaluation_for_bulk_insert": queue_evaluation,
255
259
  "enqueue_operation": enqueue_operation,
256
260
  }
257
- for clean_up in clean_ups:
258
- clean_up()
261
+ for callback in shutdown_callbacks:
262
+ callback()
259
263
 
260
264
  return lifespan
261
265
 
@@ -276,7 +280,26 @@ def create_graphql_router(
276
280
  cache_for_dataloaders: Optional[CacheForDataLoaders] = None,
277
281
  event_queue: CanPutItem[DmlEvent],
278
282
  read_only: bool = False,
283
+ secret: Optional[str] = None,
279
284
  ) -> GraphQLRouter: # type: ignore[type-arg]
285
+ """Creates the GraphQL router.
286
+
287
+ Args:
288
+ schema (BaseSchema): The GraphQL schema.
289
+ db (DbSessionFactory): The database session factory pointing to a SQL database.
290
+ model (Model): The Model representing inferences (legacy)
291
+ export_path (Path): the file path to export data to for download (legacy)
292
+ last_updated_at (CanGetLastUpdatedAt): How to get the last updated timestamp for updates.
293
+ event_queue (CanPutItem[DmlEvent]): The event queue for DML events.
294
+ corpus (Optional[Model], optional): the corpus for UMAP projection. Defaults to None.
295
+ cache_for_dataloaders (Optional[CacheForDataLoaders], optional): GraphQL data loaders.
296
+ read_only (bool, optional): Marks the app as read-only. Defaults to False.
297
+ secret (Optional[str], optional): The application secret for auth. Defaults to None.
298
+
299
+ Returns:
300
+ GraphQLRouter: The router mounted at /graphql
301
+ """
302
+
280
303
  def get_context() -> Context:
281
304
  return Context(
282
305
  db=db,
@@ -336,6 +359,7 @@ def create_graphql_router(
336
359
  ),
337
360
  cache_for_dataloaders=cache_for_dataloaders,
338
361
  read_only=read_only,
362
+ secret=secret,
339
363
  )
340
364
 
341
365
  return GraphQLRouter(
@@ -408,9 +432,12 @@ def create_app(
408
432
  initial_spans: Optional[Iterable[Union[Span, Tuple[Span, str]]]] = None,
409
433
  initial_evaluations: Optional[Iterable[pb.Evaluation]] = None,
410
434
  serve_ui: bool = True,
411
- clean_up_callbacks: List[Callable[[], None]] = [],
435
+ startup_callbacks: Iterable[Callable[[], None]] = (),
436
+ shutdown_callbacks: Iterable[Callable[[], None]] = (),
437
+ secret: Optional[str] = None,
412
438
  ) -> FastAPI:
413
- clean_ups: List[Callable[[], None]] = clean_up_callbacks # To be called at app shutdown.
439
+ startup_callbacks_list: List[Callable[[], None]] = list(startup_callbacks)
440
+ shutdown_callbacks_list: List[Callable[[], None]] = list(shutdown_callbacks)
414
441
  initial_batch_of_spans: Iterable[Tuple[Span, str]] = (
415
442
  ()
416
443
  if initial_spans is None
@@ -472,6 +499,7 @@ def create_app(
472
499
  event_queue=dml_event_handler,
473
500
  cache_for_dataloaders=cache_for_dataloaders,
474
501
  read_only=read_only,
502
+ secret=secret,
475
503
  )
476
504
  if enable_prometheus:
477
505
  from phoenix.server.prometheus import PrometheusMiddleware
@@ -489,7 +517,8 @@ def create_app(
489
517
  dml_event_handler=dml_event_handler,
490
518
  tracer_provider=tracer_provider,
491
519
  enable_prometheus=enable_prometheus,
492
- clean_ups=clean_ups,
520
+ shutdown_callbacks=shutdown_callbacks_list,
521
+ startup_callbacks=startup_callbacks_list,
493
522
  ),
494
523
  middleware=[
495
524
  Middleware(HeadersMiddleware),
@@ -532,5 +561,5 @@ def create_app(
532
561
 
533
562
  FastAPIInstrumentor().instrument(tracer_provider=tracer_provider)
534
563
  FastAPIInstrumentor.instrument_app(app, tracer_provider=tracer_provider)
535
- clean_ups.append(FastAPIInstrumentor().uninstrument)
564
+ shutdown_callbacks_list.append(FastAPIInstrumentor().uninstrument)
536
565
  return app
phoenix/server/main.py CHANGED
@@ -1,13 +1,16 @@
1
1
  import atexit
2
+ import codecs
2
3
  import logging
3
4
  import os
5
+ import sys
4
6
  from argparse import ArgumentParser
5
- from pathlib import Path, PosixPath
7
+ from importlib.metadata import version
8
+ from pathlib import Path
6
9
  from threading import Thread
7
10
  from time import sleep, time
8
11
  from typing import List, Optional
12
+ from urllib.parse import urljoin
9
13
 
10
- import pkg_resources
11
14
  from uvicorn import Config, Server
12
15
 
13
16
  import phoenix.trace.v1 as pb
@@ -53,6 +56,7 @@ from phoenix.trace.otel import decode_otlp_span, encode_span_to_otlp
53
56
  from phoenix.trace.schemas import Span
54
57
 
55
58
  logger = logging.getLogger(__name__)
59
+ logger.addHandler(logging.NullHandler())
56
60
 
57
61
  _WELCOME_MESSAGE = """
58
62
 
@@ -137,6 +141,7 @@ if __name__ == "__main__":
137
141
  parser.add_argument("--debug", action="store_true")
138
142
  # Whether the app is running in a development environment
139
143
  parser.add_argument("--dev", action="store_true")
144
+ parser.add_argument("--no-ui", action="store_true")
140
145
  subparsers = parser.add_subparsers(dest="command", required=True)
141
146
  serve_parser = subparsers.add_parser("serve")
142
147
  datasets_parser = subparsers.add_parser("datasets")
@@ -218,7 +223,7 @@ if __name__ == "__main__":
218
223
  reference_inferences,
219
224
  )
220
225
 
221
- authentication_enabled, auth_secret = get_auth_settings()
226
+ authentication_enabled, secret = get_auth_settings()
222
227
 
223
228
  fixture_spans: List[Span] = []
224
229
  fixture_evals: List[pb.Evaluation] = []
@@ -255,6 +260,18 @@ if __name__ == "__main__":
255
260
  engine = create_engine_and_run_migrations(db_connection_str)
256
261
  instrumentation_cleanups = instrument_engine_if_enabled(engine)
257
262
  factory = DbSessionFactory(db=_db(engine), dialect=engine.dialect.name)
263
+ # Print information about the server
264
+ msg = _WELCOME_MESSAGE.format(
265
+ version=version("arize-phoenix"),
266
+ ui_path=urljoin(f"http://{host}:{port}", host_root_path),
267
+ grpc_path=f"http://{host}:{get_env_grpc_port()}",
268
+ http_path=urljoin(urljoin(f"http://{host}:{port}", host_root_path), "v1/traces"),
269
+ storage=get_printable_db_url(db_connection_str),
270
+ )
271
+ if authentication_enabled:
272
+ msg += _EXPERIMENTAL_WARNING.format(auth_enabled=True)
273
+ if sys.platform.startswith("win"):
274
+ msg = codecs.encode(msg, "ascii", errors="ignore").decode("ascii").strip()
258
275
  app = create_app(
259
276
  db=factory,
260
277
  export_path=export_path,
@@ -266,29 +283,17 @@ if __name__ == "__main__":
266
283
  else create_model_from_inferences(corpus_inferences),
267
284
  debug=args.debug,
268
285
  dev=args.dev,
286
+ serve_ui=not args.no_ui,
269
287
  read_only=read_only,
270
288
  enable_prometheus=enable_prometheus,
271
289
  initial_spans=fixture_spans,
272
290
  initial_evaluations=fixture_evals,
273
- clean_up_callbacks=instrumentation_cleanups,
291
+ startup_callbacks=[lambda: print(msg)],
292
+ shutdown_callbacks=instrumentation_cleanups,
293
+ secret=secret,
274
294
  )
275
295
  server = Server(config=Config(app, host=host, port=port, root_path=host_root_path)) # type: ignore
276
296
  Thread(target=_write_pid_file_when_ready, args=(server,), daemon=True).start()
277
297
 
278
- # Print information about the server
279
- phoenix_version = pkg_resources.get_distribution("arize-phoenix").version
280
- print(
281
- _WELCOME_MESSAGE.format(
282
- version=phoenix_version,
283
- ui_path=PosixPath(f"http://{host}:{port}", host_root_path),
284
- grpc_path=f"http://{host}:{get_env_grpc_port()}",
285
- http_path=PosixPath(f"http://{host}:{port}", host_root_path, "v1/traces"),
286
- storage=get_printable_db_url(db_connection_str),
287
- )
288
- )
289
-
290
- if authentication_enabled:
291
- print(_EXPERIMENTAL_WARNING.format(auth_enabled=authentication_enabled))
292
-
293
298
  # Start the server
294
299
  server.run()
@@ -1,32 +1,32 @@
1
1
  {
2
- "_components-DzA9gIHT.js": {
3
- "file": "assets/components-DzA9gIHT.js",
2
+ "_components-1Ahruijo.js": {
3
+ "file": "assets/components-1Ahruijo.js",
4
4
  "name": "components",
5
5
  "imports": [
6
- "_vendor-CIqy43_9.js",
7
- "_vendor-arizeai-B1YgcWL8.js",
8
- "_pages-DzkUGFGV.js",
6
+ "_vendor-aSQri0vz.js",
7
+ "_vendor-arizeai-CsdcB1NH.js",
8
+ "_pages-CFS6mPnW.js",
9
9
  "_vendor-three-DwGkEfCM.js",
10
- "_vendor-codemirror-_bcwCA1C.js"
10
+ "_vendor-codemirror-CYHkhs7D.js"
11
11
  ]
12
12
  },
13
- "_pages-DzkUGFGV.js": {
14
- "file": "assets/pages-DzkUGFGV.js",
13
+ "_pages-CFS6mPnW.js": {
14
+ "file": "assets/pages-CFS6mPnW.js",
15
15
  "name": "pages",
16
16
  "imports": [
17
- "_vendor-CIqy43_9.js",
18
- "_components-DzA9gIHT.js",
19
- "_vendor-arizeai-B1YgcWL8.js",
20
- "_vendor-recharts-C3pM_Wlg.js",
21
- "_vendor-codemirror-_bcwCA1C.js"
17
+ "_vendor-aSQri0vz.js",
18
+ "_components-1Ahruijo.js",
19
+ "_vendor-arizeai-CsdcB1NH.js",
20
+ "_vendor-recharts-B0sannek.js",
21
+ "_vendor-codemirror-CYHkhs7D.js"
22
22
  ]
23
23
  },
24
24
  "_vendor-!~{003}~.js": {
25
25
  "file": "assets/vendor-DxkFTwjz.css",
26
26
  "src": "_vendor-!~{003}~.js"
27
27
  },
28
- "_vendor-CIqy43_9.js": {
29
- "file": "assets/vendor-CIqy43_9.js",
28
+ "_vendor-aSQri0vz.js": {
29
+ "file": "assets/vendor-aSQri0vz.js",
30
30
  "name": "vendor",
31
31
  "imports": [
32
32
  "_vendor-three-DwGkEfCM.js"
@@ -35,25 +35,25 @@
35
35
  "assets/vendor-DxkFTwjz.css"
36
36
  ]
37
37
  },
38
- "_vendor-arizeai-B1YgcWL8.js": {
39
- "file": "assets/vendor-arizeai-B1YgcWL8.js",
38
+ "_vendor-arizeai-CsdcB1NH.js": {
39
+ "file": "assets/vendor-arizeai-CsdcB1NH.js",
40
40
  "name": "vendor-arizeai",
41
41
  "imports": [
42
- "_vendor-CIqy43_9.js"
42
+ "_vendor-aSQri0vz.js"
43
43
  ]
44
44
  },
45
- "_vendor-codemirror-_bcwCA1C.js": {
46
- "file": "assets/vendor-codemirror-_bcwCA1C.js",
45
+ "_vendor-codemirror-CYHkhs7D.js": {
46
+ "file": "assets/vendor-codemirror-CYHkhs7D.js",
47
47
  "name": "vendor-codemirror",
48
48
  "imports": [
49
- "_vendor-CIqy43_9.js"
49
+ "_vendor-aSQri0vz.js"
50
50
  ]
51
51
  },
52
- "_vendor-recharts-C3pM_Wlg.js": {
53
- "file": "assets/vendor-recharts-C3pM_Wlg.js",
52
+ "_vendor-recharts-B0sannek.js": {
53
+ "file": "assets/vendor-recharts-B0sannek.js",
54
54
  "name": "vendor-recharts",
55
55
  "imports": [
56
- "_vendor-CIqy43_9.js"
56
+ "_vendor-aSQri0vz.js"
57
57
  ]
58
58
  },
59
59
  "_vendor-three-DwGkEfCM.js": {
@@ -61,18 +61,18 @@
61
61
  "name": "vendor-three"
62
62
  },
63
63
  "index.tsx": {
64
- "file": "assets/index-BuTlV4Gk.js",
64
+ "file": "assets/index-BEE_RWJx.js",
65
65
  "name": "index",
66
66
  "src": "index.tsx",
67
67
  "isEntry": true,
68
68
  "imports": [
69
- "_vendor-CIqy43_9.js",
70
- "_vendor-arizeai-B1YgcWL8.js",
71
- "_pages-DzkUGFGV.js",
72
- "_components-DzA9gIHT.js",
69
+ "_vendor-aSQri0vz.js",
70
+ "_vendor-arizeai-CsdcB1NH.js",
71
+ "_pages-CFS6mPnW.js",
72
+ "_components-1Ahruijo.js",
73
73
  "_vendor-three-DwGkEfCM.js",
74
- "_vendor-recharts-C3pM_Wlg.js",
75
- "_vendor-codemirror-_bcwCA1C.js"
74
+ "_vendor-recharts-B0sannek.js",
75
+ "_vendor-codemirror-CYHkhs7D.js"
76
76
  ]
77
77
  }
78
78
  }
@@ -1,4 +1,4 @@
1
- import{c as je,p as Dt,d as qe,r as p,j as n,R as W,n as Fn,a as we,C as De,b as U,s as Et,e as Ft,f as ie,g as Se,h as Ke,i as Te,k as Le,l as Vt,m as _t,o as ae,q as Pt,t as Nt,u as Rt,v as s,w as m,x as Fe,$ as P,L as Vn,y as Ot,z as Kt,A as At,B as zt,D as cn,F as Ve,E as se,G as $t,H as Gt,I as _n,S as Bt,J as Qt,Q as dn,K as Ht,M as Ut,N as Zt,P as Ae,O as Pn,T as jt,U as qt,V as Wt,W as Jt,X as Xt,Y as Yt,Z as ea,_ as na,a0 as ta,a1 as We,a2 as Q,a3 as Nn,a4 as aa,a5 as ra,a6 as ia,a7 as la,a8 as oa}from"./vendor-CIqy43_9.js";import{u as sa,_ as q,a as _e,b as $,c as N,T as R,F as Rn,d as Z,I,e as w,f as G,A as ca,g as On,h as C,i as D,j as z,k as da,l as ua,P as ma,R as H,m as Pe,n as pa,o as ga,L as Je,p as J,q as X,r as Ne,s as ha,t as Kn,E as An,v as fa,w as La,x as ya,y as va,z as ba,B as Ca}from"./vendor-arizeai-B1YgcWL8.js";import{u as ka}from"./pages-DzkUGFGV.js";import{V as xa}from"./vendor-three-DwGkEfCM.js";import{j as zn,E as $n,l as Gn,a as Bn,R as Xe,n as Ye,p as wa}from"./vendor-codemirror-_bcwCA1C.js";const Sa=e=>{const t=a=>({markdownDisplayMode:"text",setMarkdownDisplayMode:r=>{a({markdownDisplayMode:r})},traceStreamingEnabled:!0,setTraceStreamingEnabled:r=>{a({traceStreamingEnabled:r})},showSpanAside:!0,setShowSpanAside:r=>{a({showSpanAside:r})},showMetricsInTraceTree:!0,setShowMetricsInTraceTree:r=>{a({showMetricsInTraceTree:r})},...e});return je()(Dt(qe(t),{name:"arize-phoenix-preferences"}))},Qn=p.createContext(null);function Rl({children:e,...t}){const a=p.useRef();return a.current||(a.current=Sa(t)),n(Qn.Provider,{value:a.current,children:e})}function be(e,t){const a=W.useContext(Qn);if(!a)throw new Error("Missing PreferencesContext.Provider in the tree");return Fn(a,e,t)}var A=(e=>(e.primary="primary",e.reference="reference",e.corpus="corpus",e))(A||{});function V(e){throw new Error("Unreachable")}function en(e){return typeof e=="number"||e===null}function Ma(e){return typeof e=="string"||e===null}function Ol(e){return Array.isArray(e)?e.every(t=>typeof t=="string"):!1}function Ta(e){return typeof e=="object"&&e!==null}const nn=p.createContext(null);function Re(){const e=W.useContext(nn);if(e===null)throw new Error("useInferences must be used within a InferencesProvider");return e}function Kl(e){return n(nn.Provider,{value:{primaryInferences:e.primaryInferences,referenceInferences:e.referenceInferences,corpusInferences:e.corpusInferences,getInferencesNameByRole:t=>{var a,r;switch(t){case A.primary:return e.primaryInferences.name;case A.reference:return((a=e.referenceInferences)==null?void 0:a.name)??"reference";case A.corpus:return((r=e.corpusInferences)==null?void 0:r.name)??"corpus";default:V()}}},children:e.children})}const Hn=function(){var e={defaultValue:null,kind:"LocalArgument",name:"clusters"},t={defaultValue:null,kind:"LocalArgument",name:"dataQualityMetricColumnName"},a={defaultValue:null,kind:"LocalArgument",name:"fetchDataQualityMetric"},r={defaultValue:null,kind:"LocalArgument",name:"fetchPerformanceMetric"},i={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:[e,t,a,r,i],kind:"Fragment",metadata:null,name:"pointCloudStore_clusterMetricsQuery",selections:o,type:"Query",abstractKey:null},kind:"Request",operation:{argumentDefinitions:[e,a,t,r,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{c as je,p as Dt,d as qe,r as p,j as n,R as W,n as Fn,a as we,C as De,b as U,s as Et,e as Ft,f as ie,g as Se,h as Ke,i as Te,k as Le,l as Vt,m as _t,o as ae,q as Pt,t as Nt,u as Rt,v as s,w as m,x as Fe,$ as P,L as Vn,y as Ot,z as Kt,A as At,B as zt,D as cn,F as Ve,E as se,G as $t,H as Gt,I as _n,S as Bt,J as Qt,Q as dn,K as Ht,M as Ut,N as Zt,P as Ae,O as Pn,T as jt,U as qt,V as Wt,W as Jt,X as Xt,Y as Yt,Z as ea,_ as na,a0 as ta,a1 as We,a2 as Q,a3 as Nn,a4 as aa,a5 as ra,a6 as ia,a7 as la,a8 as oa}from"./vendor-aSQri0vz.js";import{u as sa,_ as q,a as _e,b as $,c as N,T as R,F as Rn,d as Z,I,e as w,f as G,A as ca,g as On,h as C,i as D,j as z,k as da,l as ua,P as ma,R as H,m as Pe,n as pa,o as ga,L as Je,p as J,q as X,r as Ne,s as ha,t as Kn,E as An,v as fa,w as La,x as ya,y as va,z as ba,B as Ca}from"./vendor-arizeai-CsdcB1NH.js";import{u as ka}from"./pages-CFS6mPnW.js";import{V as xa}from"./vendor-three-DwGkEfCM.js";import{j as zn,E as $n,l as Gn,a as Bn,R as Xe,n as Ye,p as wa}from"./vendor-codemirror-CYHkhs7D.js";const Sa=e=>{const t=a=>({markdownDisplayMode:"text",setMarkdownDisplayMode:r=>{a({markdownDisplayMode:r})},traceStreamingEnabled:!0,setTraceStreamingEnabled:r=>{a({traceStreamingEnabled:r})},showSpanAside:!0,setShowSpanAside:r=>{a({showSpanAside:r})},showMetricsInTraceTree:!0,setShowMetricsInTraceTree:r=>{a({showMetricsInTraceTree:r})},...e});return je()(Dt(qe(t),{name:"arize-phoenix-preferences"}))},Qn=p.createContext(null);function Rl({children:e,...t}){const a=p.useRef();return a.current||(a.current=Sa(t)),n(Qn.Provider,{value:a.current,children:e})}function be(e,t){const a=W.useContext(Qn);if(!a)throw new Error("Missing PreferencesContext.Provider in the tree");return Fn(a,e,t)}var A=(e=>(e.primary="primary",e.reference="reference",e.corpus="corpus",e))(A||{});function V(e){throw new Error("Unreachable")}function en(e){return typeof e=="number"||e===null}function Ma(e){return typeof e=="string"||e===null}function Ol(e){return Array.isArray(e)?e.every(t=>typeof t=="string"):!1}function Ta(e){return typeof e=="object"&&e!==null}const nn=p.createContext(null);function Re(){const e=W.useContext(nn);if(e===null)throw new Error("useInferences must be used within a InferencesProvider");return e}function Kl(e){return n(nn.Provider,{value:{primaryInferences:e.primaryInferences,referenceInferences:e.referenceInferences,corpusInferences:e.corpusInferences,getInferencesNameByRole:t=>{var a,r;switch(t){case A.primary:return e.primaryInferences.name;case A.reference:return((a=e.referenceInferences)==null?void 0:a.name)??"reference";case A.corpus:return((r=e.corpusInferences)==null?void 0:r.name)??"corpus";default:V()}}},children:e.children})}const Hn=function(){var e={defaultValue:null,kind:"LocalArgument",name:"clusters"},t={defaultValue:null,kind:"LocalArgument",name:"dataQualityMetricColumnName"},a={defaultValue:null,kind:"LocalArgument",name:"fetchDataQualityMetric"},r={defaultValue:null,kind:"LocalArgument",name:"fetchPerformanceMetric"},i={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:[e,t,a,r,i],kind:"Fragment",metadata:null,name:"pointCloudStore_clusterMetricsQuery",selections:o,type:"Query",abstractKey:null},kind:"Request",operation:{argumentDefinitions:[e,a,t,r,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
@@ -303,10 +303,10 @@ fragment ModelSchemaTable_dimensions_4sIU9C on Query {
303
303
  padding: ${e.spacing.margin8}px;
304
304
  gap: ${e.spacing.margin4}px;
305
305
  border-top: 1px solid var(--ac-global-color-grey-300);
306
- `;function Xa(){return n("tbody",{className:"is-empty",children:n("tr",{children:n("td",{colSpan:100,css:e=>m`
306
+ `;function Xa(e){const{message:t="No Data"}=e;return n("tbody",{className:"is-empty",children:n("tr",{children:n("td",{colSpan:100,css:a=>m`
307
307
  text-align: center;
308
- padding: ${e.spacing.margin24}px ${e.spacing.margin24}px !important;
309
- `,children:"No Data"})})})}function st({columns:e,data:t}){const a=Ot({columns:e,data:t,getCoreRowModel:Kt(),getPaginationRowModel:At(),getSortedRowModel:zt()}),r=a.getRowModel().rows,l=r.length>0?n("tbody",{children:r.map(o=>n("tr",{children:o.getVisibleCells().map(d=>n("td",{children:cn(d.column.columnDef.cell,d.getContext())},d.id))},o.id))}):n(Xa,{});return s(Ve,{children:[s("table",{css:ot,children:[n("thead",{children:a.getHeaderGroups().map(o=>n("tr",{children:o.headers.map(d=>n("th",{colSpan:d.colSpan,children:d.isPlaceholder?null:n("div",{children:cn(d.column.columnDef.header,d.getContext())})},d.id))},o.id))}),l]}),s("div",{css:Ja,children:[n(G,{variant:"default",size:"compact",onClick:a.previousPage,disabled:!a.getCanPreviousPage(),"aria-label":"Previous Page",icon:n(I,{svg:n(w.ArrowIosBackOutline,{})})}),n(G,{variant:"default",size:"compact",onClick:a.nextPage,disabled:!a.getCanNextPage(),"aria-label":"Next Page",icon:n(I,{svg:n(w.ArrowIosForwardOutline,{})})})]})]})}function ct(e){return Math.abs(e)<1e6?se(",")(e):se("0.2s")(e)}function me(e){const t=Math.abs(e);return t===0?"0.00":t<.01?se(".2e")(e):t<1e3?se("0.2f")(e):se("0.2s")(e)}function Ya(e){return se(".2f")(e)+"%"}function Ze(e){return Number.isInteger(e)?ct(e):me(e)}function Oe(e){return t=>typeof t!="number"?"--":e(t)}const er=Oe(ct),dt=Oe(me),Cn=Oe(Ze),nr=Oe(Ya);function ve({getValue:e}){const t=e();if(!en(t))throw new Error("IntCell only supports number or null values.");return n("span",{title:t!=null?String(t):"",children:dt(t)})}const tr=m`
308
+ padding: ${a.spacing.margin24}px ${a.spacing.margin24}px !important;
309
+ `,children:t})})})}function st({columns:e,data:t}){const a=Ot({columns:e,data:t,getCoreRowModel:Kt(),getPaginationRowModel:At(),getSortedRowModel:zt()}),r=a.getRowModel().rows,l=r.length>0?n("tbody",{children:r.map(o=>n("tr",{children:o.getVisibleCells().map(d=>n("td",{children:cn(d.column.columnDef.cell,d.getContext())},d.id))},o.id))}):n(Xa,{});return s(Ve,{children:[s("table",{css:ot,children:[n("thead",{children:a.getHeaderGroups().map(o=>n("tr",{children:o.headers.map(d=>n("th",{colSpan:d.colSpan,children:d.isPlaceholder?null:n("div",{children:cn(d.column.columnDef.header,d.getContext())})},d.id))},o.id))}),l]}),s("div",{css:Ja,children:[n(G,{variant:"default",size:"compact",onClick:a.previousPage,disabled:!a.getCanPreviousPage(),"aria-label":"Previous Page",icon:n(I,{svg:n(w.ArrowIosBackOutline,{})})}),n(G,{variant:"default",size:"compact",onClick:a.nextPage,disabled:!a.getCanNextPage(),"aria-label":"Next Page",icon:n(I,{svg:n(w.ArrowIosForwardOutline,{})})})]})]})}function ct(e){return Math.abs(e)<1e6?se(",")(e):se("0.2s")(e)}function me(e){const t=Math.abs(e);return t===0?"0.00":t<.01?se(".2e")(e):t<1e3?se("0.2f")(e):se("0.2s")(e)}function Ya(e){return se(".2f")(e)+"%"}function Ze(e){return Number.isInteger(e)?ct(e):me(e)}function Oe(e){return t=>typeof t!="number"?"--":e(t)}const er=Oe(ct),dt=Oe(me),Cn=Oe(Ze),nr=Oe(Ya);function ve({getValue:e}){const t=e();if(!en(t))throw new Error("IntCell only supports number or null values.");return n("span",{title:t!=null?String(t):"",children:dt(t)})}const tr=m`
310
310
  float: right;
311
311
  `;function ar({getValue:e}){const t=e();if(!en(t))throw new Error("IntCell only supports number or null values.");return n("span",{title:t!=null?String(t):"",css:tr,children:er(t)})}function rr({getValue:e}){const t=e();if(!en(t))throw new Error("IntCell only supports number or null values.");return n("span",{title:t!=null?String(t):"",children:nr(t)})}const kn=100;function ir(e){return e.length>kn?`${e.slice(0,kn)}...`:e}function e1({getValue:e}){const t=e(),a=t!=null&&typeof t=="string"?ir(t):"--";return n("span",{title:String(t),children:a})}function n1({getValue:e}){const t=e(),a=t!=null&&typeof t=="string"?t:"--";return n("pre",{style:{whiteSpace:"pre-wrap"},children:a})}const lr=m`
312
312
  margin: 0;
@@ -1,4 +1,4 @@
1
- import{r as d,j as e,d2 as F,v as s,F as P,R as v,w as E,aO as S,d3 as L,d4 as R,d5 as a,d6 as w,d7 as z,b as A,d8 as j}from"./vendor-CIqy43_9.js";import{S as C,j as k,Z as $,U as _,t as O,a4 as I}from"./vendor-arizeai-B1YgcWL8.js";import{L as T,E as D,h as N,M as G,a as m,D as M,d as U,b as B,e as q,P as J,c as K,T as W,p as H,f as u,g as V,i as Y,j as g,k as Z,l as h,m as b,n as Q,o as X,q as ee,r as re,s as ae,A as te,S as oe,F as ne}from"./pages-DzkUGFGV.js";import{b3 as se,d as ie,R as le,b4 as ce,b5 as de}from"./components-DzA9gIHT.js";import"./vendor-three-DwGkEfCM.js";import"./vendor-recharts-C3pM_Wlg.js";import"./vendor-codemirror-_bcwCA1C.js";(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const t of document.querySelectorAll('link[rel="modulepreload"]'))c(t);new MutationObserver(t=>{for(const o of t)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&c(i)}).observe(document,{childList:!0,subtree:!0});function l(t){const o={};return t.integrity&&(o.integrity=t.integrity),t.referrerPolicy&&(o.referrerPolicy=t.referrerPolicy),t.crossOrigin==="use-credentials"?o.credentials="include":t.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function c(t){if(t.ep)return;t.ep=!0;const o=l(t);fetch(t.href,o)}})();const x="arize-phoenix-feature-flags",p={__CLEAR__:!0};function pe(){const r=localStorage.getItem(x);if(!r)return p;try{const n=JSON.parse(r);return Object.assign({},p,n)}catch{return p}}const f=d.createContext(null);function me(){const r=v.useContext(f);if(r===null)throw new Error("useFeatureFlags must be used within a FeatureFlagsProvider");return r}function ue(r){const[n,l]=d.useState(pe()),c=t=>{localStorage.setItem(x,JSON.stringify(t)),l(t)};return e(f.Provider,{value:{featureFlags:n,setFeatureFlags:c},children:e(ge,{children:r.children})})}function ge(r){const{children:n}=r,{featureFlags:l,setFeatureFlags:c}=me(),[t,o]=d.useState(!1);return F("ctrl+shift+f",()=>o(!0)),s(P,{children:[n,e(_,{type:"modal",isDismissable:!0,onDismiss:()=>o(!1),children:t&&e(C,{title:"Feature Flags",children:e(k,{height:"size-1000",padding:"size-100",children:Object.keys(l).map(i=>e($,{isSelected:l[i],onChange:y=>c({...l,[i]:y}),children:i},i))})})})]})}function he(){return e(S,{styles:r=>E`
1
+ import{r as d,j as e,d3 as P,v as s,F,R as v,w as E,aP as S,d4 as L,d5 as R,d6 as a,d7 as w,d8 as z,b as A,d9 as j}from"./vendor-aSQri0vz.js";import{S as C,j as k,Z as $,U as _,t as I,a4 as O}from"./vendor-arizeai-CsdcB1NH.js";import{L as T,E as D,h as N,M as G,a as m,D as M,d as U,b as B,e as q,P as J,c as K,T as W,p as H,f as u,g as V,i as Y,j as g,k as Z,l as h,m as b,n as Q,o as X,q as ee,r as re,s as ae,A as te,S as oe,F as ne}from"./pages-CFS6mPnW.js";import{b3 as se,d as ie,R as le,b4 as ce,b5 as de}from"./components-1Ahruijo.js";import"./vendor-three-DwGkEfCM.js";import"./vendor-recharts-B0sannek.js";import"./vendor-codemirror-CYHkhs7D.js";(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const t of document.querySelectorAll('link[rel="modulepreload"]'))c(t);new MutationObserver(t=>{for(const o of t)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&c(i)}).observe(document,{childList:!0,subtree:!0});function l(t){const o={};return t.integrity&&(o.integrity=t.integrity),t.referrerPolicy&&(o.referrerPolicy=t.referrerPolicy),t.crossOrigin==="use-credentials"?o.credentials="include":t.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function c(t){if(t.ep)return;t.ep=!0;const o=l(t);fetch(t.href,o)}})();const x="arize-phoenix-feature-flags",p={__CLEAR__:!0};function pe(){const r=localStorage.getItem(x);if(!r)return p;try{const n=JSON.parse(r);return Object.assign({},p,n)}catch{return p}}const f=d.createContext(null);function me(){const r=v.useContext(f);if(r===null)throw new Error("useFeatureFlags must be used within a FeatureFlagsProvider");return r}function ue(r){const[n,l]=d.useState(pe()),c=t=>{localStorage.setItem(x,JSON.stringify(t)),l(t)};return e(f.Provider,{value:{featureFlags:n,setFeatureFlags:c},children:e(ge,{children:r.children})})}function ge(r){const{children:n}=r,{featureFlags:l,setFeatureFlags:c}=me(),[t,o]=d.useState(!1);return P("ctrl+shift+f",()=>o(!0)),s(F,{children:[n,e(_,{type:"modal",isDismissable:!0,onDismiss:()=>o(!1),children:t&&e(C,{title:"Feature Flags",children:e(k,{height:"size-1000",padding:"size-100",children:Object.keys(l).map(i=>e($,{isSelected:l[i],onChange:y=>c({...l,[i]:y}),children:i},i))})})})]})}function he(){return e(S,{styles:r=>E`
2
2
  body {
3
3
  background-color: var(--ac-global-color-grey-75);
4
4
  color: var(--ac-global-text-color-900);
@@ -97,4 +97,4 @@ import{r as d,j as e,d2 as F,v as s,F as P,R as v,w as E,aO as S,d3 as L,d4 as R
97
97
  --px-corpus-color: #92969c;
98
98
  --px-corpus-color--transparent: #92969c63;
99
99
  }
100
- `})}const be=L(R(s(a,{path:"/",element:e(T,{}),errorElement:e(D,{}),children:[e(a,{index:!0,loader:N}),s(a,{path:"/model",handle:{crumb:()=>"model"},element:e(G,{}),children:[e(a,{index:!0,element:e(m,{})}),e(a,{element:e(m,{}),children:e(a,{path:"dimensions",children:e(a,{path:":dimensionId",element:e(M,{}),loader:U})})}),e(a,{path:"embeddings",children:e(a,{path:":embeddingDimensionId",element:e(B,{}),loader:q,handle:{crumb:r=>r.embedding.name}})})]}),s(a,{path:"/projects",handle:{crumb:()=>"projects"},element:e(J,{}),children:[e(a,{index:!0,element:e(K,{})}),s(a,{path:":projectId",element:e(W,{}),loader:H,handle:{crumb:r=>r.project.name},children:[e(a,{index:!0,element:e(u,{})}),e(a,{element:e(u,{}),children:e(a,{path:"traces/:traceId",element:e(V,{})})})]})]}),s(a,{path:"/datasets",handle:{crumb:()=>"datasets"},children:[e(a,{index:!0,element:e(Y,{})}),s(a,{path:":datasetId",loader:g,handle:{crumb:r=>r.dataset.name},children:[s(a,{element:e(Z,{}),loader:g,children:[e(a,{index:!0,element:e(h,{}),loader:b}),e(a,{path:"experiments",element:e(h,{}),loader:b}),e(a,{path:"examples",element:e(Q,{}),loader:X,children:e(a,{path:":exampleId",element:e(ee,{})})})]}),e(a,{path:"compare",handle:{crumb:()=>"compare"},loader:re,element:e(ae,{})})]})]}),e(a,{path:"/apis",element:e(te,{}),handle:{crumb:()=>"APIs"}}),e(a,{path:"/settings",element:e(oe,{}),handle:{crumb:()=>"Settings"}})]})),{basename:window.Config.basename});function xe(){return e(w,{router:be})}function fe(){return e(ne,{children:e(se,{children:e(ye,{})})})}function ye(){const{theme:r}=ie();return e(I,{theme:r,children:e(z,{theme:O,children:s(A.RelayEnvironmentProvider,{environment:le,children:[e(he,{}),e(ue,{children:e(ce,{children:e(d.Suspense,{children:e(de,{children:e(xe,{})})})})})]})})})}const Fe=document.getElementById("root"),Pe=j.createRoot(Fe);Pe.render(e(fe,{}));
100
+ `})}const be=L(R(s(a,{path:"/",element:e(T,{}),errorElement:e(D,{}),children:[e(a,{index:!0,loader:N}),s(a,{path:"/model",handle:{crumb:()=>"model"},element:e(G,{}),children:[e(a,{index:!0,element:e(m,{})}),e(a,{element:e(m,{}),children:e(a,{path:"dimensions",children:e(a,{path:":dimensionId",element:e(M,{}),loader:U})})}),e(a,{path:"embeddings",children:e(a,{path:":embeddingDimensionId",element:e(B,{}),loader:q,handle:{crumb:r=>r.embedding.name}})})]}),s(a,{path:"/projects",handle:{crumb:()=>"projects"},element:e(J,{}),children:[e(a,{index:!0,element:e(K,{})}),s(a,{path:":projectId",element:e(W,{}),loader:H,handle:{crumb:r=>r.project.name},children:[e(a,{index:!0,element:e(u,{})}),e(a,{element:e(u,{}),children:e(a,{path:"traces/:traceId",element:e(V,{})})})]})]}),s(a,{path:"/datasets",handle:{crumb:()=>"datasets"},children:[e(a,{index:!0,element:e(Y,{})}),s(a,{path:":datasetId",loader:g,handle:{crumb:r=>r.dataset.name},children:[s(a,{element:e(Z,{}),loader:g,children:[e(a,{index:!0,element:e(h,{}),loader:b}),e(a,{path:"experiments",element:e(h,{}),loader:b}),e(a,{path:"examples",element:e(Q,{}),loader:X,children:e(a,{path:":exampleId",element:e(ee,{})})})]}),e(a,{path:"compare",handle:{crumb:()=>"compare"},loader:re,element:e(ae,{})})]})]}),e(a,{path:"/apis",element:e(te,{}),handle:{crumb:()=>"APIs"}}),e(a,{path:"/settings",element:e(oe,{}),handle:{crumb:()=>"Settings"}})]})),{basename:window.Config.basename});function xe(){return e(w,{router:be})}function fe(){return e(ne,{children:e(se,{children:e(ye,{})})})}function ye(){const{theme:r}=ie();return e(O,{theme:r,children:e(z,{theme:I,children:s(A.RelayEnvironmentProvider,{environment:le,children:[e(he,{}),e(ue,{children:e(ce,{children:e(d.Suspense,{children:e(de,{children:e(xe,{})})})})})]})})})}const Pe=document.getElementById("root"),Fe=j.createRoot(Pe);Fe.render(e(fe,{}));