arize-phoenix 8.16.0__py3-none-any.whl → 8.17.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of arize-phoenix might be problematic. Click here for more details.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arize-phoenix
3
- Version: 8.16.0
3
+ Version: 8.17.0
4
4
  Summary: AI Observability and Evaluation
5
5
  Project-URL: Documentation, https://docs.arize.com/phoenix/
6
6
  Project-URL: Issues, https://github.com/Arize-ai/phoenix/issues
@@ -25,6 +25,7 @@ Requires-Dist: arize-phoenix-evals>=0.13.1
25
25
  Requires-Dist: arize-phoenix-otel>=0.5.1
26
26
  Requires-Dist: authlib
27
27
  Requires-Dist: cachetools
28
+ Requires-Dist: email-validator
28
29
  Requires-Dist: fastapi
29
30
  Requires-Dist: grpc-interceptor
30
31
  Requires-Dist: grpcio
@@ -1,12 +1,12 @@
1
1
  phoenix/__init__.py,sha256=X3eUEwd2rG8KKWWYVNNDJoqo08ihfjgHhlP29dcdNJE,5481
2
2
  phoenix/auth.py,sha256=VVMHrWN31tln3Zo4z6ofecrV4daiqJjLd8r85mqlxek,10939
3
- phoenix/config.py,sha256=dKSC-46EQrHVSYbUoQKoNOTTOGGWQC4tiiXe-UCLD2w,29483
3
+ phoenix/config.py,sha256=6er2AyJyE_yS1TWAq2f24ey602LxKvFtjN7EiQO135I,31986
4
4
  phoenix/datetime_utils.py,sha256=iJzNG6YJ6V7_u8B2iA7P2Z26FyxYbOPtx0dhJ7kNDHA,3398
5
5
  phoenix/exceptions.py,sha256=n2L2KKuecrdflB9MsCdAYCiSEvGJptIsfRkXMoJle7A,169
6
6
  phoenix/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
7
7
  phoenix/services.py,sha256=kpW1WL0kiB8XJsO6XycvZVJ-lBkNoenhQ7atCvBoSe8,5365
8
8
  phoenix/settings.py,sha256=ht-0oN-sMV6SPXrk7Tu1EZlngpAYkGNLYPhO8DyrdQI,661
9
- phoenix/version.py,sha256=8Y88o1ppfRymipiMCwswg_32f8DyFDkpHKDtot_1oLo,23
9
+ phoenix/version.py,sha256=hWhyK4gWB9C6FMw_RmHFf6RiapfXiyvD-HnSpdUasKs,23
10
10
  phoenix/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  phoenix/core/embedding_dimension.py,sha256=zKGbcvwOXgLf-yrJBpQyKtd-LEOPRKHnUToyAU8Owis,87
12
12
  phoenix/core/model.py,sha256=qBFraOtmwCCnWJltKNP18DDG0mULXigytlFsa6YOz6k,4837
@@ -18,7 +18,7 @@ phoenix/db/alembic.ini,sha256=GIS6HpHaKaJbbuahZg1Rc1D2_QqyCkV9r58wdARGf6w,3262
18
18
  phoenix/db/bulk_inserter.py,sha256=faNjuwLqqsw4ky8sa4D0h9u5TvEDTOjrccUW89L008E,12725
19
19
  phoenix/db/engines.py,sha256=esKGo_cqQLKKXNlfK7iQ7BtkOYY2xNsLdjvW2DddGjU,7321
20
20
  phoenix/db/enums.py,sha256=tt7iovXLhVTLZ3_LbHNGgcI44SnNjXfkKtLAZG57T54,428
21
- phoenix/db/facilitator.py,sha256=sAYqzBXYSVBKPTQVYrd7ZmtqMAr1zP9dVJwjfNGW7hc,4207
21
+ phoenix/db/facilitator.py,sha256=nteTD8XQSQ7a6aZBOw7ZKiJ72-_1TZXKVF4HS3fHdas,5675
22
22
  phoenix/db/helpers.py,sha256=daKbpY2QhTPo9a_T1xNHKI4WzWHkMmmrGIws7Hw-RZ4,4884
23
23
  phoenix/db/migrate.py,sha256=oUrXH8yEbcpL4eh09aSCuUiSrhFli0eT5D_j4ZmYChY,2797
24
24
  phoenix/db/models.py,sha256=TbHgtT7WWdkQK-OtLsUqp3MwP23HGV1IaSAWTqCf5ac,45707
@@ -267,7 +267,7 @@ phoenix/server/api/types/MimeType.py,sha256=Zpi6zCalkSFgsvhzvOs-O1gYA04usAi9H__Q
267
267
  phoenix/server/api/types/Model.py,sha256=8UIFqMe1q-2ufBNg-gxHusV8wM1h-KbfLUeJjyVcMvQ,8081
268
268
  phoenix/server/api/types/NumericRange.py,sha256=afEjgF97Go_OvmjMggbPBt-zGM8IONewAyEiKEHRds0,192
269
269
  phoenix/server/api/types/PerformanceMetric.py,sha256=KFkmJDqP43eDUtARQOUqR7NYcxvL6Vh2uisHWU6H3ko,387
270
- phoenix/server/api/types/Project.py,sha256=qETsEdX0NR-qmRBrjfaFAoYOdOVUzk1oZ1nWoc1hwK0,19950
270
+ phoenix/server/api/types/Project.py,sha256=16G8f87uq8AtTT2TrfzCuuxoEm39R97woE6-F8QVrJA,20004
271
271
  phoenix/server/api/types/ProjectSession.py,sha256=fyfVtpUpFOTnBx8DFnH3dr7WXAssN0ooAgrQSSi7kEI,4677
272
272
  phoenix/server/api/types/Prompt.py,sha256=ccP4eq1e38xbF0afclGWLOuDpBVpNbJ3AOSRClF8yFQ,4955
273
273
  phoenix/server/api/types/PromptLabel.py,sha256=g3IDSPYRZwb0qpMAk93R6J96jgYULUYGOciTnpeh3sI,1321
@@ -314,10 +314,10 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
314
314
  phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
315
315
  phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
316
316
  phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
317
- phoenix/server/static/.vite/manifest.json,sha256=m2FtkLVDfW8sRomBw6eN0zj7L6vynDbgm8KnvAwQ2R8,2165
318
- phoenix/server/static/assets/components-DYW3PtZk.js,sha256=pCd4GL7crjFsMyaHrNkwRRKMLph1AOfBXXpRhLkf4OQ,444424
319
- phoenix/server/static/assets/index-DtECKZJO.js,sha256=esr8kNZx32NirX3O2SL1REwLbsT-cdUuc0LKIO6g8B4,60085
320
- phoenix/server/static/assets/pages-DDiYyoa9.js,sha256=8BOnQCv_5vq7OSUTpuLYGNShBjzPmlw2qPBLn4q4IVY,852245
317
+ phoenix/server/static/.vite/manifest.json,sha256=ghEcHjInhTsSyV3KcdqHqoal6lX1JOS0kM1UezSKhqc,2165
318
+ phoenix/server/static/assets/components-Q7vebP-x.js,sha256=Hbocxy5B5YnHXRDEnx18G_HHvFl3l23VSt4qYwmlGXk,444440
319
+ phoenix/server/static/assets/index-BhL6cAT9.js,sha256=h93ACC8qigkTxv1upsHSnDoU-W-yqeYC-vElfCMroOA,60085
320
+ phoenix/server/static/assets/pages-_MY_UD-t.js,sha256=a_sapSeF33uVHQy5Vw4HvMgxy1Mafp5ciXlmWvUBodY,852460
321
321
  phoenix/server/static/assets/vendor-BT2CVKel.js,sha256=LIV-43bFP85LEFu5QFr5WFcpwKYVMqop0ofrf0RzAVY,2492285
322
322
  phoenix/server/static/assets/vendor-Cg6lcjUC.css,sha256=nZrkr0u6NNElFGvpWHk9GTHeGoibCXCli1bE7mXZGZg,1816
323
323
  phoenix/server/static/assets/vendor-arizeai-Dzsaenki.js,sha256=NIKV6W5-cOcwg_FI772zlcl6kInoGOsiZyUbQczUxsU,194761
@@ -364,9 +364,9 @@ phoenix/utilities/project.py,sha256=auVpARXkDb-JgeX5f2aStyFIkeKvGwN9l7qrFeJMVxI,
364
364
  phoenix/utilities/re.py,sha256=6YyUWIkv0zc2SigsxfOWIHzdpjKA_TZo2iqKq7zJKvw,2081
365
365
  phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
366
366
  phoenix/utilities/template_formatters.py,sha256=gh9PJD6WEGw7TEYXfSst1UR4pWWwmjxMLrDVQ_CkpkQ,2779
367
- arize_phoenix-8.16.0.dist-info/METADATA,sha256=E428moGFaser1HoOe1s35af262IIZa9epelHBDQd3MM,21347
368
- arize_phoenix-8.16.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
369
- arize_phoenix-8.16.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
370
- arize_phoenix-8.16.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
371
- arize_phoenix-8.16.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
372
- arize_phoenix-8.16.0.dist-info/RECORD,,
367
+ arize_phoenix-8.17.0.dist-info/METADATA,sha256=UkV_uEtlg1LfG4ZMhiIUDxBQbjFxCGg34dcWUsyzefE,21378
368
+ arize_phoenix-8.17.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
369
+ arize_phoenix-8.17.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
370
+ arize_phoenix-8.17.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
371
+ arize_phoenix-8.17.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
372
+ arize_phoenix-8.17.0.dist-info/RECORD,,
phoenix/config.py CHANGED
@@ -10,6 +10,8 @@ from pathlib import Path
10
10
  from typing import Optional, cast, overload
11
11
  from urllib.parse import quote_plus, urlparse
12
12
 
13
+ from email_validator import EmailNotValidError, validate_email
14
+
13
15
  from phoenix.utilities.logging import log_a_list
14
16
 
15
17
  from .utilities.re import parse_env_headers
@@ -161,6 +163,17 @@ password reset emails. If this variable is left unspecified or contains no origi
161
163
  protection will not be enabled. In such cases, when a request includes `origin` or `referer`
162
164
  headers, those values will not be validated.
163
165
  """
166
+ ENV_PHOENIX_ADMINS = "PHOENIX_ADMINS"
167
+ """
168
+ A semicolon-separated list of username and email address pairs to create as admin users on startup.
169
+ The format is `username=email`, e.g., `John Doe=john@example.com;Doe, Jane=jane@example.com`.
170
+ The password for each user will be randomly generated and will need to be reset. The application
171
+ will not start if this environment variable is set but cannot be parsed or contains invalid emails.
172
+ If the username or email address already exists in the database, the user record will not be
173
+ modified, e.g., changed from non-admin to admin. Changing this environment variable for the next
174
+ startup will not undo any records created in previous startups.
175
+ """
176
+
164
177
 
165
178
  # SMTP settings
166
179
  ENV_PHOENIX_SMTP_HOSTNAME = "PHOENIX_SMTP_HOSTNAME"
@@ -429,6 +442,51 @@ def get_env_csrf_trusted_origins() -> list[str]:
429
442
  return sorted(set(origins))
430
443
 
431
444
 
445
+ def get_env_admins() -> dict[str, str]:
446
+ """
447
+ Parse the PHOENIX_ADMINS environment variable to extract the comma separated pairs of
448
+ username and email. The last equal sign (=) in each pair is used to separate the username from
449
+ the email.
450
+
451
+ Returns:
452
+ dict: A dictionary mapping email addresses to usernames
453
+
454
+ Raises:
455
+ ValueError: If the environment variable cannot be parsed or contains invalid email addresses
456
+ """
457
+ if not (env_value := getenv(ENV_PHOENIX_ADMINS)):
458
+ return {}
459
+ usernames = set()
460
+ emails = set()
461
+ ans = {}
462
+ for pair in env_value.split(";"):
463
+ pair = pair.strip()
464
+ if not pair:
465
+ continue
466
+ # Find the last equals sign to separate username from email
467
+ # This allows usernames to contain equals signs
468
+ last_equals_pos = pair.rfind("=")
469
+ if last_equals_pos == -1:
470
+ raise ValueError(
471
+ f"Invalid format in {ENV_PHOENIX_ADMINS}: '{pair}'. "
472
+ f"Expected format: 'username=email'"
473
+ )
474
+ username = pair[:last_equals_pos].strip()
475
+ email_addr = pair[last_equals_pos + 1 :].strip()
476
+ try:
477
+ email_addr = validate_email(email_addr, check_deliverability=False).normalized
478
+ except EmailNotValidError:
479
+ raise ValueError(f"Invalid email in {ENV_PHOENIX_ADMINS}: '{email_addr}'")
480
+ if username in usernames:
481
+ raise ValueError(f"Duplicate username in {ENV_PHOENIX_ADMINS}: '{username}'")
482
+ if email_addr in emails:
483
+ raise ValueError(f"Duplicate email in {ENV_PHOENIX_ADMINS}: '{email_addr}'")
484
+ usernames.add(username)
485
+ emails.add(email_addr)
486
+ ans[email_addr] = username
487
+ return ans
488
+
489
+
432
490
  def get_env_smtp_username() -> str:
433
491
  return getenv(ENV_PHOENIX_SMTP_USERNAME, "")
434
492
 
phoenix/db/facilitator.py CHANGED
@@ -19,7 +19,10 @@ from phoenix.auth import (
19
19
  DEFAULT_SYSTEM_USERNAME,
20
20
  compute_password_hash,
21
21
  )
22
- from phoenix.config import get_env_default_admin_initial_password
22
+ from phoenix.config import (
23
+ get_env_admins,
24
+ get_env_default_admin_initial_password,
25
+ )
23
26
  from phoenix.db import models
24
27
  from phoenix.db.enums import COLUMN_ENUMS, UserRole
25
28
  from phoenix.server.types import DbSessionFactory
@@ -37,13 +40,13 @@ class Facilitator:
37
40
  self._db = db
38
41
 
39
42
  async def __call__(self) -> None:
40
- async with self._db() as session:
41
- for fn in (
42
- _ensure_enums,
43
- _ensure_user_roles,
44
- ):
45
- async with session.begin_nested():
46
- await fn(session)
43
+ for fn in (
44
+ _ensure_enums,
45
+ _ensure_user_roles,
46
+ _ensure_admins,
47
+ ):
48
+ async with self._db() as session:
49
+ await fn(session)
47
50
 
48
51
 
49
52
  async def _ensure_enums(session: AsyncSession) -> None:
@@ -111,3 +114,42 @@ async def _ensure_user_roles(session: AsyncSession) -> None:
111
114
  )
112
115
  session.add(admin_user)
113
116
  await session.flush()
117
+
118
+
119
+ async def _ensure_admins(session: AsyncSession) -> None:
120
+ """
121
+ Ensure that all startup admin users are present in the database. If any are missing, they will
122
+ be added. Existing records will not be modified.
123
+ """
124
+ if not (admins := get_env_admins()):
125
+ return
126
+ existing_emails = set(
127
+ await session.scalars(select(models.User.email).where(models.User.email.in_(admins.keys())))
128
+ )
129
+ admins = {email: username for email, username in admins.items() if email not in existing_emails}
130
+ if not admins:
131
+ return
132
+ existing_usernames = set(
133
+ await session.scalars(
134
+ select(models.User.username).where(models.User.username.in_(admins.values()))
135
+ )
136
+ )
137
+ admins = {
138
+ email: username for email, username in admins.items() if username not in existing_usernames
139
+ }
140
+ if not admins:
141
+ return
142
+ admin_role_id = await session.scalar(
143
+ select(models.UserRole.id).filter_by(name=UserRole.ADMIN.value)
144
+ )
145
+ assert admin_role_id is not None, "Admin role not found in database"
146
+ for email, username in admins.items():
147
+ values = dict(
148
+ user_role_id=admin_role_id,
149
+ username=username,
150
+ email=email,
151
+ password_salt=secrets.token_bytes(DEFAULT_SECRET_LENGTH),
152
+ password_hash=secrets.token_bytes(DEFAULT_SECRET_LENGTH),
153
+ reset_password=True,
154
+ )
155
+ await session.execute(insert(models.User).values(values))
@@ -37,6 +37,8 @@ from phoenix.server.api.types.Trace import Trace
37
37
  from phoenix.server.api.types.ValidationResult import ValidationResult
38
38
  from phoenix.trace.dsl import SpanFilter
39
39
 
40
+ DEFAULT_PAGE_SIZE = 30
41
+
40
42
 
41
43
  @strawberry.type
42
44
  class Project(Node):
@@ -215,7 +217,7 @@ class Project(Node):
215
217
  self,
216
218
  info: Info[Context, None],
217
219
  time_range: Optional[TimeRange] = UNSET,
218
- first: Optional[int] = 50,
220
+ first: Optional[int] = DEFAULT_PAGE_SIZE,
219
221
  last: Optional[int] = UNSET,
220
222
  after: Optional[CursorString] = UNSET,
221
223
  before: Optional[CursorString] = UNSET,
@@ -299,7 +301,7 @@ class Project(Node):
299
301
  self,
300
302
  info: Info[Context, None],
301
303
  time_range: Optional[TimeRange] = UNSET,
302
- first: Optional[int] = 50,
304
+ first: Optional[int] = DEFAULT_PAGE_SIZE,
303
305
  after: Optional[CursorString] = UNSET,
304
306
  sort: Optional[ProjectSessionSort] = UNSET,
305
307
  filter_io_substring: Optional[str] = UNSET,
@@ -1,22 +1,22 @@
1
1
  {
2
- "_components-DYW3PtZk.js": {
3
- "file": "assets/components-DYW3PtZk.js",
2
+ "_components-Q7vebP-x.js": {
3
+ "file": "assets/components-Q7vebP-x.js",
4
4
  "name": "components",
5
5
  "imports": [
6
6
  "_vendor-BT2CVKel.js",
7
- "_pages-DDiYyoa9.js",
7
+ "_pages-_MY_UD-t.js",
8
8
  "_vendor-arizeai-Dzsaenki.js",
9
9
  "_vendor-codemirror-D2R3PB3i.js",
10
10
  "_vendor-three-C5WAXd5r.js"
11
11
  ]
12
12
  },
13
- "_pages-DDiYyoa9.js": {
14
- "file": "assets/pages-DDiYyoa9.js",
13
+ "_pages-_MY_UD-t.js": {
14
+ "file": "assets/pages-_MY_UD-t.js",
15
15
  "name": "pages",
16
16
  "imports": [
17
17
  "_vendor-BT2CVKel.js",
18
18
  "_vendor-arizeai-Dzsaenki.js",
19
- "_components-DYW3PtZk.js",
19
+ "_components-Q7vebP-x.js",
20
20
  "_vendor-codemirror-D2R3PB3i.js",
21
21
  "_vendor-recharts-DetvdWCF.js"
22
22
  ]
@@ -69,15 +69,15 @@
69
69
  "name": "vendor-three"
70
70
  },
71
71
  "index.tsx": {
72
- "file": "assets/index-DtECKZJO.js",
72
+ "file": "assets/index-BhL6cAT9.js",
73
73
  "name": "index",
74
74
  "src": "index.tsx",
75
75
  "isEntry": true,
76
76
  "imports": [
77
77
  "_vendor-BT2CVKel.js",
78
78
  "_vendor-arizeai-Dzsaenki.js",
79
- "_pages-DDiYyoa9.js",
80
- "_components-DYW3PtZk.js",
79
+ "_pages-_MY_UD-t.js",
80
+ "_components-Q7vebP-x.js",
81
81
  "_vendor-three-C5WAXd5r.js",
82
82
  "_vendor-codemirror-D2R3PB3i.js",
83
83
  "_vendor-shiki-dzrzjP7E.js",
@@ -1,4 +1,4 @@
1
- import{r as p,R as U,j as e,u as ya,a as Te,e as i1,s as D1,b as V1,c as Ke,d as Q1,f as fi,g as ve,h as bi,i as Ci,k as q1,l as s,m as vi,n as ze,C as s1,o as Qe,p as qe,q as yi,t as Li,v as N,w as cn,L as La,x as wa,y as xa,z as de,A as v,B as h1,D as dn,E as g,F as ka,$ as wi,G as Sa,H as Ma,I as q,J as xi,K as un,M as ki,N as Si,O as B,P as X1,Q as O,S as H,T as R,U as Ta,V as za,W as Mi,X as f1,Y as Ia,Z as Ti,_ as zi,a0 as Ii,a1 as Ai,a2 as Ei,a3 as Di,a4 as Vi,a5 as Pi,a6 as Oi,a7 as b1,a8 as _i,a9 as Fi,aa as Ni,ab as Ri,ac as Se,ad as Y1,ae as J1,af as en,ag as F,ah as _e,ai as Nn,aj as $i,ak as Hi,al as Aa,am as Ki,an as Bi,ao as Zi,ap as ji,aq as Gi,ar as Ui,as as Wi,at as Qi,au as qi,av as Xi,aw as _,ax as mn,ay as Yi,az as Ji,aA as er,aB as nr,aC as ar,aD as Rn,aE as Ee,aF as Ea,aG as tr,aH as ir,aI as Da,aJ as rr,aK as or,aL as gn,aM as lr,aN as sr,aO as cr,aP as dr,aQ as ur,aR as $n,aS as mr,aT as gr,aU as pr,aV as P1,aW as hr,aX as fr,aY as br,aZ as Cr,a_ as vr,a$ as yr,b0 as Lr,b1 as wr,b2 as xr}from"./vendor-BT2CVKel.js";import{a as Hn,R as kr,b as Sr,c as Mr,m as Tr,T as zr,u as Ir}from"./pages-DDiYyoa9.js";import{u as Ar,_ as Va,a as ge,T as re,E as Pa,b as Fe,c as pe,d as Er,A as Xe,D as C1,e as Dr,f as ce,g as Vr,C as v1,P as pn,h as Oa,i as Pr,F as _a,I as Or,j as _r,k as Fr,l as Nr,m as Rr,n as $r,o as Hr,p as Kr,q as Fa,r as Na,s as Br,t as Zr}from"./vendor-arizeai-Dzsaenki.js";import{L as Ra,a as $a,d as je,E as hn,k as Ha,b as Ka,l as nn,h as jr,j as Gr,c as Ur,e as Wr,f as Qr,s as qr,g as Ye,i as Je,R as e1,p as Xr,m as Yr}from"./vendor-codemirror-D2R3PB3i.js";import{V as Jr}from"./vendor-three-C5WAXd5r.js";const Ba=function(){var n={defaultValue:null,kind:"LocalArgument",name:"clusters"},a={defaultValue:null,kind:"LocalArgument",name:"dataQualityMetricColumnName"},t={defaultValue:null,kind:"LocalArgument",name:"fetchDataQualityMetric"},i={defaultValue:null,kind:"LocalArgument",name:"fetchPerformanceMetric"},r={defaultValue:null,kind:"LocalArgument",name:"performanceMetric"},o=[{alias:null,args:null,kind:"ScalarField",name:"primaryValue",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"referenceValue",storageKey:null}],l=[{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:o,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:o,storageKey:null}]}],storageKey:null}];return{fragment:{argumentDefinitions:[n,a,t,i,r],kind:"Fragment",metadata:null,name:"pointCloudStore_clusterMetricsQuery",selections:l,type:"Query",abstractKey:null},kind:"Request",operation:{argumentDefinitions:[n,t,a,i,r],kind:"Operation",name:"pointCloudStore_clusterMetricsQuery",selections:l},params:{cacheID:"86666967012812887ac0a0149d2d2535",id:null,metadata:{},name:"pointCloudStore_clusterMetricsQuery",operationKind:"query",text:`query pointCloudStore_clusterMetricsQuery(
1
+ import{r as p,R as U,j as e,u as ya,a as Te,e as i1,s as D1,b as V1,c as Ke,d as Q1,f as fi,g as ve,h as bi,i as Ci,k as q1,l as s,m as vi,n as ze,C as s1,o as Qe,p as qe,q as yi,t as Li,v as N,w as cn,L as La,x as wa,y as xa,z as de,A as v,B as h1,D as dn,E as g,F as ka,$ as wi,G as Sa,H as Ma,I as q,J as xi,K as un,M as ki,N as Si,O as B,P as X1,Q as O,S as H,T as R,U as Ta,V as za,W as Mi,X as f1,Y as Ia,Z as Ti,_ as zi,a0 as Ii,a1 as Ai,a2 as Ei,a3 as Di,a4 as Vi,a5 as Pi,a6 as Oi,a7 as b1,a8 as _i,a9 as Fi,aa as Ni,ab as Ri,ac as Se,ad as Y1,ae as J1,af as en,ag as F,ah as _e,ai as Nn,aj as $i,ak as Hi,al as Aa,am as Ki,an as Bi,ao as Zi,ap as ji,aq as Gi,ar as Ui,as as Wi,at as Qi,au as qi,av as Xi,aw as _,ax as mn,ay as Yi,az as Ji,aA as er,aB as nr,aC as ar,aD as Rn,aE as Ee,aF as Ea,aG as tr,aH as ir,aI as Da,aJ as rr,aK as or,aL as gn,aM as lr,aN as sr,aO as cr,aP as dr,aQ as ur,aR as $n,aS as mr,aT as gr,aU as pr,aV as P1,aW as hr,aX as fr,aY as br,aZ as Cr,a_ as vr,a$ as yr,b0 as Lr,b1 as wr,b2 as xr}from"./vendor-BT2CVKel.js";import{a as Hn,R as kr,b as Sr,c as Mr,m as Tr,T as zr,u as Ir}from"./pages-_MY_UD-t.js";import{u as Ar,_ as Va,a as ge,T as re,E as Pa,b as Fe,c as pe,d as Er,A as Xe,D as C1,e as Dr,f as ce,g as Vr,C as v1,P as pn,h as Oa,i as Pr,F as _a,I as Or,j as _r,k as Fr,l as Nr,m as Rr,n as $r,o as Hr,p as Kr,q as Fa,r as Na,s as Br,t as Zr}from"./vendor-arizeai-Dzsaenki.js";import{L as Ra,a as $a,d as je,E as hn,k as Ha,b as Ka,l as nn,h as jr,j as Gr,c as Ur,e as Wr,f as Qr,s as qr,g as Ye,i as Je,R as e1,p as Xr,m as Yr}from"./vendor-codemirror-D2R3PB3i.js";import{V as Jr}from"./vendor-three-C5WAXd5r.js";const Ba=function(){var n={defaultValue:null,kind:"LocalArgument",name:"clusters"},a={defaultValue:null,kind:"LocalArgument",name:"dataQualityMetricColumnName"},t={defaultValue:null,kind:"LocalArgument",name:"fetchDataQualityMetric"},i={defaultValue:null,kind:"LocalArgument",name:"fetchPerformanceMetric"},r={defaultValue:null,kind:"LocalArgument",name:"performanceMetric"},o=[{alias:null,args:null,kind:"ScalarField",name:"primaryValue",storageKey:null},{alias:null,args:null,kind:"ScalarField",name:"referenceValue",storageKey:null}],l=[{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:o,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:o,storageKey:null}]}],storageKey:null}];return{fragment:{argumentDefinitions:[n,a,t,i,r],kind:"Fragment",metadata:null,name:"pointCloudStore_clusterMetricsQuery",selections:l,type:"Query",abstractKey:null},kind:"Request",operation:{argumentDefinitions:[n,t,a,i,r],kind:"Operation",name:"pointCloudStore_clusterMetricsQuery",selections:l},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
@@ -1756,7 +1756,8 @@ fragment ViewerContext_viewer on Query {
1756
1756
  word-wrap: break-word;
1757
1757
  `;function ma(n,a){return n.length>a?`${n.slice(0,a)}...`:n}function Q0({json:n,maxLength:a,space:t=0,disableTitle:i=!1,collapseSingleKey:r=!0}){const o=typeof a=="number",l=p.useMemo(()=>JSON.stringify(n,null,t),[n,t]),c=p.useMemo(()=>JSON.stringify(n,null,2),[n]),d=i?void 0:c;if(!J(n))return console.warn("JSONText component received a non-object value",n),e("span",{title:d,children:String(n)});const m=n;if(Object.keys(m).length===0)return e("span",{title:d,children:"--"});if(Object.keys(m).length===1&&r){const b=Object.keys(m)[0],C=m[b];if(typeof C=="string"){const L=o?ma(C,a):C;return e("span",{title:d,children:L})}}const u=o?ma(l,a):l;return e(o?"span":"pre",{title:d,css:o?void 0:W0,children:u})}const q0=100;function k4({getValue:n}){const a=n();return e(Q0,{json:a,maxLength:q0})}const X0=g`
1758
1758
  position: relative;
1759
- min-height: 75px;
1759
+ height: 100%;
1760
+ min-height: 100%;
1760
1761
  .controls {
1761
1762
  transition: opacity 0.2s ease-in-out;
1762
1763
  opacity: 0;
@@ -1,4 +1,4 @@
1
- import{r as t,j as o,bo as z,l as c,O as w,R as P,E as b,cx as k,ei as S,ej as F,ek as L,el as l,v as C,em as E}from"./vendor-BT2CVKel.js";import{c as R,x as I,D as j,M as A,N as T}from"./vendor-arizeai-Dzsaenki.js";import{L as _,r as D,d as O,e as G,F as M,f as N,P as V,h as q,M as m,g as U,D as W,i as B,E as J,j as K,k as $,p as H,l as Q,n as p,o as Y,q as X,s as Z,S as oo,t as lo,v as ao,w as ro,x as co,y as u,z as f,A as y,B as go,C as eo,G as bo,H as no,I as io,J as so,K as to,N as mo,O as po,Q as uo,U as fo,V as yo,W as vo,X as ho,Y as xo,Z as zo,_ as wo,$ as Po,a0 as ko,a1 as So,a2 as Fo,a3 as Lo,a4 as Co,a5 as Eo,a6 as Ro,a7 as Io,a8 as jo,a9 as Ao,aa as To,ab as _o,ac as Do,ad as Oo,ae as Go,af as Mo}from"./pages-DDiYyoa9.js";import{z as No,dP as Vo,by as qo,R as Uo,dQ as Wo,dR as Bo}from"./components-DYW3PtZk.js";import"./vendor-three-C5WAXd5r.js";import"./vendor-codemirror-D2R3PB3i.js";import"./vendor-shiki-dzrzjP7E.js";import"./vendor-recharts-DetvdWCF.js";(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const g of r)if(g.type==="childList")for(const n of g.addedNodes)n.tagName==="LINK"&&n.rel==="modulepreload"&&s(n)}).observe(document,{childList:!0,subtree:!0});function i(r){const g={};return r.integrity&&(g.integrity=r.integrity),r.referrerPolicy&&(g.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?g.credentials="include":r.crossOrigin==="anonymous"?g.credentials="omit":g.credentials="same-origin",g}function s(r){if(r.ep)return;r.ep=!0;const g=i(r);fetch(r.href,g)}})();const v="arize-phoenix-feature-flags",d={__RESET__:!1};function Jo(){const a=localStorage.getItem(v);if(!a)return d;try{const e=JSON.parse(a);return Object.assign({},d,e)}catch{return d}}const h=t.createContext(null);function Ko(){const a=P.useContext(h);if(a===null)throw new Error("useFeatureFlags must be used within a FeatureFlagsProvider");return a}function $o(a){const[e,i]=t.useState(Jo()),s=r=>{localStorage.setItem(v,JSON.stringify(r)),i(r)};return o(h.Provider,{value:{featureFlags:e,setFeatureFlags:s},children:o(Ho,{children:a.children})})}function Ho(a){const{children:e}=a,{featureFlags:i,setFeatureFlags:s}=Ko(),[r,g]=t.useState(!1);return z("ctrl+shift+f",()=>g(!0)),c(w,{children:[e,o(j,{type:"modal",isDismissable:!0,onDismiss:()=>g(!1),children:r&&o(R,{title:"Feature Flags",children:o(No,{height:"size-1000",padding:"size-100",children:Object.keys(i).map(n=>o(I,{isSelected:i[n],onChange:x=>s({...i,[n]:x}),children:n},n))})})})]})}const Qo=b`
1
+ import{r as t,j as o,bo as z,l as c,O as w,R as P,E as b,cx as k,ei as S,ej as F,ek as L,el as l,v as C,em as E}from"./vendor-BT2CVKel.js";import{c as R,x as I,D as j,M as A,N as T}from"./vendor-arizeai-Dzsaenki.js";import{L as _,r as D,d as O,e as G,F as M,f as N,P as V,h as q,M as m,g as U,D as W,i as B,E as J,j as K,k as $,p as H,l as Q,n as p,o as Y,q as X,s as Z,S as oo,t as lo,v as ao,w as ro,x as co,y as u,z as f,A as y,B as go,C as eo,G as bo,H as no,I as io,J as so,K as to,N as mo,O as po,Q as uo,U as fo,V as yo,W as vo,X as ho,Y as xo,Z as zo,_ as wo,$ as Po,a0 as ko,a1 as So,a2 as Fo,a3 as Lo,a4 as Co,a5 as Eo,a6 as Ro,a7 as Io,a8 as jo,a9 as Ao,aa as To,ab as _o,ac as Do,ad as Oo,ae as Go,af as Mo}from"./pages-_MY_UD-t.js";import{z as No,dP as Vo,by as qo,R as Uo,dQ as Wo,dR as Bo}from"./components-Q7vebP-x.js";import"./vendor-three-C5WAXd5r.js";import"./vendor-codemirror-D2R3PB3i.js";import"./vendor-shiki-dzrzjP7E.js";import"./vendor-recharts-DetvdWCF.js";(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const g of r)if(g.type==="childList")for(const n of g.addedNodes)n.tagName==="LINK"&&n.rel==="modulepreload"&&s(n)}).observe(document,{childList:!0,subtree:!0});function i(r){const g={};return r.integrity&&(g.integrity=r.integrity),r.referrerPolicy&&(g.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?g.credentials="include":r.crossOrigin==="anonymous"?g.credentials="omit":g.credentials="same-origin",g}function s(r){if(r.ep)return;r.ep=!0;const g=i(r);fetch(r.href,g)}})();const v="arize-phoenix-feature-flags",d={__RESET__:!1};function Jo(){const a=localStorage.getItem(v);if(!a)return d;try{const e=JSON.parse(a);return Object.assign({},d,e)}catch{return d}}const h=t.createContext(null);function Ko(){const a=P.useContext(h);if(a===null)throw new Error("useFeatureFlags must be used within a FeatureFlagsProvider");return a}function $o(a){const[e,i]=t.useState(Jo()),s=r=>{localStorage.setItem(v,JSON.stringify(r)),i(r)};return o(h.Provider,{value:{featureFlags:e,setFeatureFlags:s},children:o(Ho,{children:a.children})})}function Ho(a){const{children:e}=a,{featureFlags:i,setFeatureFlags:s}=Ko(),[r,g]=t.useState(!1);return z("ctrl+shift+f",()=>g(!0)),c(w,{children:[e,o(j,{type:"modal",isDismissable:!0,onDismiss:()=>g(!1),children:r&&o(R,{title:"Feature Flags",children:o(No,{height:"size-1000",padding:"size-100",children:Object.keys(i).map(n=>o(I,{isSelected:i[n],onChange:x=>s({...i,[n]:x}),children:n},n))})})})]})}const Qo=b`
2
2
  :root {
3
3
  --ac-global-dimension-scale-factor: 1;
4
4
  --ac-global-dimension-size-0: 0px;