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.
- {arize_phoenix-4.24.0.dist-info → arize_phoenix-4.25.0.dist-info}/METADATA +10 -6
- {arize_phoenix-4.24.0.dist-info → arize_phoenix-4.25.0.dist-info}/RECORD +44 -41
- phoenix/auth/__init__.py +0 -0
- phoenix/auth/utils.py +15 -0
- phoenix/db/engines.py +15 -2
- phoenix/db/insertion/dataset.py +1 -0
- phoenix/db/migrate.py +21 -10
- phoenix/db/migrations/future_versions/cd164e83824f_users_and_tokens.py +7 -6
- phoenix/db/migrations/versions/3be8647b87d8_add_token_columns_to_spans_table.py +4 -12
- phoenix/db/models.py +1 -1
- phoenix/inferences/fixtures.py +1 -0
- phoenix/inferences/inferences.py +1 -0
- phoenix/metrics/__init__.py +1 -0
- phoenix/server/api/context.py +14 -0
- phoenix/server/api/mutations/__init__.py +2 -0
- phoenix/server/api/mutations/api_key_mutations.py +119 -0
- phoenix/server/api/mutations/auth.py +7 -0
- phoenix/server/api/queries.py +7 -6
- phoenix/server/api/routers/v1/datasets.py +1 -0
- phoenix/server/api/routers/v1/spans.py +1 -1
- phoenix/server/api/types/UserRole.py +1 -1
- phoenix/server/app.py +36 -7
- phoenix/server/main.py +24 -19
- phoenix/server/static/.vite/manifest.json +31 -31
- phoenix/server/static/assets/{components-DzA9gIHT.js → components-1Ahruijo.js} +4 -4
- phoenix/server/static/assets/{index-BuTlV4Gk.js → index-BEE_RWJx.js} +2 -2
- phoenix/server/static/assets/{pages-DzkUGFGV.js → pages-CFS6mPnW.js} +263 -220
- phoenix/server/static/assets/{vendor-CIqy43_9.js → vendor-aSQri0vz.js} +58 -58
- phoenix/server/static/assets/{vendor-arizeai-B1YgcWL8.js → vendor-arizeai-CsdcB1NH.js} +1 -1
- phoenix/server/static/assets/{vendor-codemirror-_bcwCA1C.js → vendor-codemirror-CYHkhs7D.js} +1 -1
- phoenix/server/static/assets/{vendor-recharts-C3pM_Wlg.js → vendor-recharts-B0sannek.js} +1 -1
- phoenix/server/types.py +12 -4
- phoenix/services.py +1 -0
- phoenix/session/client.py +1 -1
- phoenix/session/evaluation.py +1 -0
- phoenix/session/session.py +2 -1
- phoenix/trace/fixtures.py +37 -0
- phoenix/trace/langchain/instrumentor.py +1 -1
- phoenix/trace/llama_index/callback.py +1 -0
- phoenix/trace/openai/instrumentor.py +1 -0
- phoenix/version.py +1 -1
- {arize_phoenix-4.24.0.dist-info → arize_phoenix-4.25.0.dist-info}/WHEEL +0 -0
- {arize_phoenix-4.24.0.dist-info → arize_phoenix-4.25.0.dist-info}/licenses/IP_NOTICE +0 -0
- {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
|
phoenix/server/api/queries.py
CHANGED
|
@@ -92,7 +92,8 @@ class Query:
|
|
|
92
92
|
)
|
|
93
93
|
stmt = (
|
|
94
94
|
select(models.User)
|
|
95
|
-
.
|
|
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
|
-
|
|
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.
|
|
124
|
+
select(models.UserRole).where(models.UserRole.name != "SYSTEM")
|
|
124
125
|
)
|
|
125
126
|
return [
|
|
126
127
|
UserRole(
|
|
127
128
|
id_attr=role.id,
|
|
128
|
-
|
|
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.
|
|
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.
|
|
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)
|
|
@@ -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=
|
|
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=[])
|
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
|
-
|
|
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
|
|
258
|
-
|
|
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
|
-
|
|
435
|
+
startup_callbacks: Iterable[Callable[[], None]] = (),
|
|
436
|
+
shutdown_callbacks: Iterable[Callable[[], None]] = (),
|
|
437
|
+
secret: Optional[str] = None,
|
|
412
438
|
) -> FastAPI:
|
|
413
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
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-
|
|
3
|
-
"file": "assets/components-
|
|
2
|
+
"_components-1Ahruijo.js": {
|
|
3
|
+
"file": "assets/components-1Ahruijo.js",
|
|
4
4
|
"name": "components",
|
|
5
5
|
"imports": [
|
|
6
|
-
"_vendor-
|
|
7
|
-
"_vendor-arizeai-
|
|
8
|
-
"_pages-
|
|
6
|
+
"_vendor-aSQri0vz.js",
|
|
7
|
+
"_vendor-arizeai-CsdcB1NH.js",
|
|
8
|
+
"_pages-CFS6mPnW.js",
|
|
9
9
|
"_vendor-three-DwGkEfCM.js",
|
|
10
|
-
"_vendor-codemirror-
|
|
10
|
+
"_vendor-codemirror-CYHkhs7D.js"
|
|
11
11
|
]
|
|
12
12
|
},
|
|
13
|
-
"_pages-
|
|
14
|
-
"file": "assets/pages-
|
|
13
|
+
"_pages-CFS6mPnW.js": {
|
|
14
|
+
"file": "assets/pages-CFS6mPnW.js",
|
|
15
15
|
"name": "pages",
|
|
16
16
|
"imports": [
|
|
17
|
-
"_vendor-
|
|
18
|
-
"_components-
|
|
19
|
-
"_vendor-arizeai-
|
|
20
|
-
"_vendor-recharts-
|
|
21
|
-
"_vendor-codemirror-
|
|
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-
|
|
29
|
-
"file": "assets/vendor-
|
|
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-
|
|
39
|
-
"file": "assets/vendor-arizeai-
|
|
38
|
+
"_vendor-arizeai-CsdcB1NH.js": {
|
|
39
|
+
"file": "assets/vendor-arizeai-CsdcB1NH.js",
|
|
40
40
|
"name": "vendor-arizeai",
|
|
41
41
|
"imports": [
|
|
42
|
-
"_vendor-
|
|
42
|
+
"_vendor-aSQri0vz.js"
|
|
43
43
|
]
|
|
44
44
|
},
|
|
45
|
-
"_vendor-codemirror-
|
|
46
|
-
"file": "assets/vendor-codemirror-
|
|
45
|
+
"_vendor-codemirror-CYHkhs7D.js": {
|
|
46
|
+
"file": "assets/vendor-codemirror-CYHkhs7D.js",
|
|
47
47
|
"name": "vendor-codemirror",
|
|
48
48
|
"imports": [
|
|
49
|
-
"_vendor-
|
|
49
|
+
"_vendor-aSQri0vz.js"
|
|
50
50
|
]
|
|
51
51
|
},
|
|
52
|
-
"_vendor-recharts-
|
|
53
|
-
"file": "assets/vendor-recharts-
|
|
52
|
+
"_vendor-recharts-B0sannek.js": {
|
|
53
|
+
"file": "assets/vendor-recharts-B0sannek.js",
|
|
54
54
|
"name": "vendor-recharts",
|
|
55
55
|
"imports": [
|
|
56
|
-
"_vendor-
|
|
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-
|
|
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-
|
|
70
|
-
"_vendor-arizeai-
|
|
71
|
-
"_pages-
|
|
72
|
-
"_components-
|
|
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-
|
|
75
|
-
"_vendor-codemirror-
|
|
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-
|
|
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:
|
|
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: ${
|
|
309
|
-
`,children:
|
|
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,
|
|
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(
|
|
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,{}));
|