arize-phoenix 5.9.0__py3-none-any.whl → 5.9.1__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.3
2
2
  Name: arize-phoenix
3
- Version: 5.9.0
3
+ Version: 5.9.1
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
@@ -1,12 +1,12 @@
1
1
  phoenix/__init__.py,sha256=X3eUEwd2rG8KKWWYVNNDJoqo08ihfjgHhlP29dcdNJE,5481
2
2
  phoenix/auth.py,sha256=JpkwJbis2INlIXWcQ-M_Nk5Ln9LBgHMdWNnaAQp0D2w,10940
3
- phoenix/config.py,sha256=wmHEfX2npXWSRtTR9-bz8gJUbfacjcs6w7DDSkvosro,24902
3
+ phoenix/config.py,sha256=kg1ABxnzgmBK2Uv277VLlY2_Hd3k8DGgZCKYUqSdwwI,25405
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=K8QUWqtzm0RvyvMi0shZurlcbRE1MiHY43oJIJLcGF0,22
9
+ phoenix/version.py,sha256=cJut-wsFrREu2PRwluu5_M66aMFR7RNxG41cS7q4-vM,22
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
@@ -178,7 +178,7 @@ phoenix/server/api/openapi/schema.py,sha256=S1nPq4iR578fPESWDAHNv9nlgh_go6zwTalL
178
178
  phoenix/server/api/routers/__init__.py,sha256=YIzHsIFOOXuCRbDkMUHx-McrANFJK5UfUn6a4BNIzmo,277
179
179
  phoenix/server/api/routers/auth.py,sha256=T774FE5mqrfRSSYo1snpR5NIp3YzAJnsLsY9FJB9GCA,11164
180
180
  phoenix/server/api/routers/embeddings.py,sha256=BpZGJee0pdL0W5Rp1L0b30dEtZTgJeVqXky8LgZ0ZXw,898
181
- phoenix/server/api/routers/oauth2.py,sha256=1CaWIraW0BiMXJozfQOwl4CeaTt1vEMkM4-9CrDYXko,15829
181
+ phoenix/server/api/routers/oauth2.py,sha256=bSrTZAAWW4WgZVwkr39xbo5jZEYL4w4wCbEe280M6f0,17157
182
182
  phoenix/server/api/routers/utils.py,sha256=M41BoH-fl37izhRuN2aX7lWm7jOC20A_3uClv9TVUUY,583
183
183
  phoenix/server/api/routers/v1/__init__.py,sha256=aLEHzzU8kQo4Oqsv2an35lH5VYUxAZQrcG7CXZA_Lx4,2214
184
184
  phoenix/server/api/routers/v1/datasets.py,sha256=tNh0CxAvSkWh-_5AwisGN1degQlUNGU3uufGa7MIbOw,36985
@@ -273,15 +273,15 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
273
273
  phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
274
274
  phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
275
275
  phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
276
- phoenix/server/static/.vite/manifest.json,sha256=drYYdxzc7lPintYMBx6grsZPJu_LTS14wcO1YPV9czI,1929
277
- phoenix/server/static/assets/components-DU-8CYbi.js,sha256=hpQ6qHZWCBf7gIjoHKojfNv55LJNFHFQANNmGliWgwY,305277
278
- phoenix/server/static/assets/index-D9E16vvV.js,sha256=2Gwt3D0BxvrcHaJI15yslYvTBtMFh5xQ1luBJaH_qK8,7285
279
- phoenix/server/static/assets/pages-t09OI1rC.js,sha256=CxCleMuzU5JpTjToelyWdbk0eCSMpxgaqFi7U9TradI,625540
280
- phoenix/server/static/assets/vendor-D04tenE6.js,sha256=1liYDMoq4OLBHuIMGkGVIxYkWQVmcM8FS1671XVr7gs,10898295
276
+ phoenix/server/static/.vite/manifest.json,sha256=ToIrbND1XCIzmfOfMwomFfDVuzLm9Guraz0xtvELOW8,1929
277
+ phoenix/server/static/assets/components-BcvRmBnN.js,sha256=NS45I5Vt1azRNaNNZWJDO2qv1m5junln5PSbZ62iIJo,306054
278
+ phoenix/server/static/assets/index-BF4RUiOz.js,sha256=0QMhyXmx-SNTtEoJnAUDoC4_TKd8qN4N1ABCtDA7jZ0,7285
279
+ phoenix/server/static/assets/pages-CM_Zho_x.js,sha256=4EimxhNy3yGgwydDhTH_1sWNrtPoaQc4mISioDsEUh8,628225
280
+ phoenix/server/static/assets/vendor-Bjm5T3cE.js,sha256=6kC6MC_f0HVJtmOO022zWk7ti6RIwD5eC_QBceDDjJU,10898295
281
281
  phoenix/server/static/assets/vendor-DxkFTwjz.css,sha256=nZrkr0u6NNElFGvpWHk9GTHeGoibCXCli1bE7mXZGZg,1816
282
- phoenix/server/static/assets/vendor-arizeai-D3NxMQw0.js,sha256=vjsrjVC9vpWkP-kgNOp_gl7gCWb2zerFfwdsxs-MVC8,307005
283
- phoenix/server/static/assets/vendor-codemirror-XTiZSlqq.js,sha256=MAk9T3tMbEr5K06haVZk4gP29zwSgBmbCjaPqBcML5s,392711
284
- phoenix/server/static/assets/vendor-recharts-p0L0neVs.js,sha256=20Rz5qJ4pS4Rr7S14U7NFPEuVt15OA43-IW_nDX83kk,282859
282
+ phoenix/server/static/assets/vendor-arizeai-CQhWGEdL.js,sha256=CaTXxr2IuxlTr_R58IRptZyzFgZDsWALFfWfVmhU85Y,307005
283
+ phoenix/server/static/assets/vendor-codemirror-CdtiO80y.js,sha256=Dw-1RGNxuzb-klAW-Gs7uFkocAVBxjmCCUc31sn4V8g,392711
284
+ phoenix/server/static/assets/vendor-recharts-BqWon6Py.js,sha256=AHlTyMC6UvNgLHOhSfFBal2Knb8azXGzH2qlLuShoYs,282859
285
285
  phoenix/server/static/assets/vendor-three-DwGkEfCM.js,sha256=0D12ZgKzfKCTSdSTKJBFR2RZO_xxeMXrqDp0AszZqHY,620972
286
286
  phoenix/server/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
287
287
  phoenix/server/templates/index.html,sha256=ram6sfy2obf_F053ay35V30v-mnRWZ86rK-PstXLy1c,4457
@@ -322,9 +322,9 @@ phoenix/utilities/project.py,sha256=auVpARXkDb-JgeX5f2aStyFIkeKvGwN9l7qrFeJMVxI,
322
322
  phoenix/utilities/re.py,sha256=x8Xbk-Wa6qDMAtUd_7JtZvKtrYEuMY-bchB0n163_5c,2006
323
323
  phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
324
324
  phoenix/utilities/template_formatters.py,sha256=JuOyvukMPLDHa1uVNw0kCFBUnIxy02dwAWNZimdIZU4,2423
325
- arize_phoenix-5.9.0.dist-info/METADATA,sha256=6nzmQsogHQ_iojZREFcMzcmV0lbegRpIS5l6U6yCfUY,22613
326
- arize_phoenix-5.9.0.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
327
- arize_phoenix-5.9.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
328
- arize_phoenix-5.9.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
329
- arize_phoenix-5.9.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
330
- arize_phoenix-5.9.0.dist-info/RECORD,,
325
+ arize_phoenix-5.9.1.dist-info/METADATA,sha256=7a966eolx4IkP09ctz4Iif96WmGCrGrCQlmTS7hdGK4,22613
326
+ arize_phoenix-5.9.1.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
327
+ arize_phoenix-5.9.1.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
328
+ arize_phoenix-5.9.1.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
329
+ arize_phoenix-5.9.1.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
330
+ arize_phoenix-5.9.1.dist-info/RECORD,,
phoenix/config.py CHANGED
@@ -559,7 +559,19 @@ def get_env_host() -> str:
559
559
 
560
560
 
561
561
  def get_env_host_root_path() -> str:
562
- return os.getenv(ENV_PHOENIX_HOST_ROOT_PATH) or HOST_ROOT_PATH
562
+ if (host_root_path := os.getenv(ENV_PHOENIX_HOST_ROOT_PATH)) is None:
563
+ return HOST_ROOT_PATH
564
+ if not host_root_path.startswith("/"):
565
+ raise ValueError(
566
+ f"Invalid value for environment variable {ENV_PHOENIX_HOST_ROOT_PATH}: "
567
+ f"{host_root_path}. Value must start with '/'"
568
+ )
569
+ if host_root_path.endswith("/"):
570
+ raise ValueError(
571
+ f"Invalid value for environment variable {ENV_PHOENIX_HOST_ROOT_PATH}: "
572
+ f"{host_root_path}. Value cannot end with '/'"
573
+ )
574
+ return host_root_path
563
575
 
564
576
 
565
577
  def get_env_collector_endpoint() -> Optional[str]:
@@ -14,7 +14,7 @@ from sqlalchemy import Boolean, and_, case, cast, func, insert, or_, select, upd
14
14
  from sqlalchemy.ext.asyncio import AsyncSession
15
15
  from sqlalchemy.orm import joinedload
16
16
  from sqlean.dbapi2 import IntegrityError # type: ignore[import-untyped]
17
- from starlette.datastructures import URL
17
+ from starlette.datastructures import URL, URLPath
18
18
  from starlette.responses import RedirectResponse
19
19
  from starlette.routing import Router
20
20
  from starlette.status import HTTP_302_FOUND
@@ -86,8 +86,16 @@ async def login(
86
86
  if not isinstance(
87
87
  oauth2_client := request.app.state.oauth2_clients.get_client(idp_name), OAuth2Client
88
88
  ):
89
- return _redirect_to_login(error=f"Unknown IDP: {idp_name}.")
90
- origin_url = _get_origin_url(request)
89
+ return _redirect_to_login(request=request, error=f"Unknown IDP: {idp_name}.")
90
+ if (referer := request.headers.get("referer")) is not None:
91
+ # if the referer header is present, use it as the origin URL
92
+ parsed_url = urlparse(referer)
93
+ origin_url = _append_root_path_if_exists(
94
+ request=request, base_url=f"{parsed_url.scheme}://{parsed_url.netloc}"
95
+ )
96
+ else:
97
+ # fall back to the base url as the origin URL
98
+ origin_url = str(request.base_url)
91
99
  authorization_url_data = await oauth2_client.create_authorization_url(
92
100
  redirect_uri=_get_create_tokens_endpoint(
93
101
  request=request, origin_url=origin_url, idp_name=idp_name
@@ -124,22 +132,22 @@ async def create_tokens(
124
132
  ) -> RedirectResponse:
125
133
  secret = request.app.state.get_secret()
126
134
  if state != stored_state:
127
- return _redirect_to_login(error=_INVALID_OAUTH2_STATE_MESSAGE)
135
+ return _redirect_to_login(request=request, error=_INVALID_OAUTH2_STATE_MESSAGE)
128
136
  try:
129
137
  payload = _parse_state_payload(secret=secret, state=state)
130
138
  except JoseError:
131
- return _redirect_to_login(error=_INVALID_OAUTH2_STATE_MESSAGE)
139
+ return _redirect_to_login(request=request, error=_INVALID_OAUTH2_STATE_MESSAGE)
132
140
  if (return_url := payload.get("return_url")) is not None and not _is_relative_url(
133
141
  unquote(return_url)
134
142
  ):
135
- return _redirect_to_login(error="Attempting login with unsafe return URL.")
143
+ return _redirect_to_login(request=request, error="Attempting login with unsafe return URL.")
136
144
  assert isinstance(access_token_expiry := request.app.state.access_token_expiry, timedelta)
137
145
  assert isinstance(refresh_token_expiry := request.app.state.refresh_token_expiry, timedelta)
138
146
  token_store: TokenStore = request.app.state.get_token_store()
139
147
  if not isinstance(
140
148
  oauth2_client := request.app.state.oauth2_clients.get_client(idp_name), OAuth2Client
141
149
  ):
142
- return _redirect_to_login(error=f"Unknown IDP: {idp_name}.")
150
+ return _redirect_to_login(request=request, error=f"Unknown IDP: {idp_name}.")
143
151
  try:
144
152
  token_data = await oauth2_client.fetch_access_token(
145
153
  state=state,
@@ -149,11 +157,12 @@ async def create_tokens(
149
157
  ),
150
158
  )
151
159
  except OAuthError as error:
152
- return _redirect_to_login(error=str(error))
160
+ return _redirect_to_login(request=request, error=str(error))
153
161
  _validate_token_data(token_data)
154
162
  if "id_token" not in token_data:
155
163
  return _redirect_to_login(
156
- error=f"OAuth2 IDP {idp_name} does not appear to support OpenID Connect."
164
+ request=request,
165
+ error=f"OAuth2 IDP {idp_name} does not appear to support OpenID Connect.",
157
166
  )
158
167
  user_info = await oauth2_client.parse_id_token(token_data, nonce=stored_nonce)
159
168
  user_info = _parse_user_info(user_info)
@@ -165,14 +174,18 @@ async def create_tokens(
165
174
  user_info=user_info,
166
175
  )
167
176
  except EmailAlreadyInUse as error:
168
- return _redirect_to_login(error=str(error))
177
+ return _redirect_to_login(request=request, error=str(error))
169
178
  access_token, refresh_token = await create_access_and_refresh_tokens(
170
179
  user=user,
171
180
  token_store=token_store,
172
181
  access_token_expiry=access_token_expiry,
173
182
  refresh_token_expiry=refresh_token_expiry,
174
183
  )
175
- response = RedirectResponse(url=return_url or "/", status_code=HTTP_302_FOUND)
184
+ redirect_path = _prepend_root_path_if_exists(request=request, path=return_url or "/")
185
+ response = RedirectResponse(
186
+ url=redirect_path,
187
+ status_code=HTTP_302_FOUND,
188
+ )
176
189
  response = set_access_token_cookie(
177
190
  response=response, access_token=access_token, max_age=access_token_expiry
178
191
  )
@@ -352,17 +365,46 @@ class EmailAlreadyInUse(Exception):
352
365
  pass
353
366
 
354
367
 
355
- def _redirect_to_login(*, error: str) -> RedirectResponse:
368
+ def _redirect_to_login(*, request: Request, error: str) -> RedirectResponse:
356
369
  """
357
370
  Creates a RedirectResponse to the login page to display an error message.
358
371
  """
359
- url = URL("/login").include_query_params(error=error)
372
+ login_path = _prepend_root_path_if_exists(request=request, path="/login")
373
+ url = URL(login_path).include_query_params(error=error)
360
374
  response = RedirectResponse(url=url)
361
375
  response = delete_oauth2_state_cookie(response)
362
376
  response = delete_oauth2_nonce_cookie(response)
363
377
  return response
364
378
 
365
379
 
380
+ def _prepend_root_path_if_exists(*, request: Request, path: str) -> str:
381
+ """
382
+ If a root path is configured, prepends it to the input path.
383
+ """
384
+ if not path.startswith("/"):
385
+ raise ValueError("path must start with a forward slash")
386
+ root_path = _get_root_path(request=request)
387
+ if root_path.endswith("/"):
388
+ root_path = root_path.rstrip("/")
389
+ return root_path + path
390
+
391
+
392
+ def _append_root_path_if_exists(*, request: Request, base_url: str) -> str:
393
+ """
394
+ If a root path is configured, appends it to the input base url.
395
+ """
396
+ if not (root_path := _get_root_path(request=request)):
397
+ return base_url
398
+ return str(URLPath(root_path).make_absolute_url(base_url=base_url))
399
+
400
+
401
+ def _get_root_path(*, request: Request) -> str:
402
+ """
403
+ Gets the root path from the request.
404
+ """
405
+ return str(request.scope.get("root_path", ""))
406
+
407
+
366
408
  def _get_create_tokens_endpoint(*, request: Request, origin_url: str, idp_name: str) -> str:
367
409
  """
368
410
  Gets the endpoint for create tokens route.
@@ -427,16 +469,6 @@ def _with_random_suffix(string: str) -> str:
427
469
  return f"{string}-{randrange(10_000, 100_000)}"
428
470
 
429
471
 
430
- def _get_origin_url(request: Request) -> str:
431
- """
432
- Infers the origin URL from the request.
433
- """
434
- if (referer := request.headers.get("referer")) is None:
435
- return str(request.base_url)
436
- parsed_url = urlparse(referer)
437
- return f"{parsed_url.scheme}://{parsed_url.netloc}"
438
-
439
-
440
472
  def _is_oauth2_state_payload(maybe_state_payload: Any) -> TypeGuard[_OAuth2StatePayload]:
441
473
  """
442
474
  Determines whether the given object is an OAuth2 state payload.
@@ -1,32 +1,32 @@
1
1
  {
2
- "_components-DU-8CYbi.js": {
3
- "file": "assets/components-DU-8CYbi.js",
2
+ "_components-BcvRmBnN.js": {
3
+ "file": "assets/components-BcvRmBnN.js",
4
4
  "name": "components",
5
5
  "imports": [
6
- "_vendor-D04tenE6.js",
7
- "_vendor-arizeai-D3NxMQw0.js",
8
- "_vendor-codemirror-XTiZSlqq.js",
9
- "_pages-t09OI1rC.js",
6
+ "_vendor-Bjm5T3cE.js",
7
+ "_vendor-arizeai-CQhWGEdL.js",
8
+ "_vendor-codemirror-CdtiO80y.js",
9
+ "_pages-CM_Zho_x.js",
10
10
  "_vendor-three-DwGkEfCM.js"
11
11
  ]
12
12
  },
13
- "_pages-t09OI1rC.js": {
14
- "file": "assets/pages-t09OI1rC.js",
13
+ "_pages-CM_Zho_x.js": {
14
+ "file": "assets/pages-CM_Zho_x.js",
15
15
  "name": "pages",
16
16
  "imports": [
17
- "_vendor-D04tenE6.js",
18
- "_vendor-arizeai-D3NxMQw0.js",
19
- "_components-DU-8CYbi.js",
20
- "_vendor-recharts-p0L0neVs.js",
21
- "_vendor-codemirror-XTiZSlqq.js"
17
+ "_vendor-Bjm5T3cE.js",
18
+ "_vendor-arizeai-CQhWGEdL.js",
19
+ "_components-BcvRmBnN.js",
20
+ "_vendor-recharts-BqWon6Py.js",
21
+ "_vendor-codemirror-CdtiO80y.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-D04tenE6.js": {
29
- "file": "assets/vendor-D04tenE6.js",
28
+ "_vendor-Bjm5T3cE.js": {
29
+ "file": "assets/vendor-Bjm5T3cE.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-D3NxMQw0.js": {
39
- "file": "assets/vendor-arizeai-D3NxMQw0.js",
38
+ "_vendor-arizeai-CQhWGEdL.js": {
39
+ "file": "assets/vendor-arizeai-CQhWGEdL.js",
40
40
  "name": "vendor-arizeai",
41
41
  "imports": [
42
- "_vendor-D04tenE6.js"
42
+ "_vendor-Bjm5T3cE.js"
43
43
  ]
44
44
  },
45
- "_vendor-codemirror-XTiZSlqq.js": {
46
- "file": "assets/vendor-codemirror-XTiZSlqq.js",
45
+ "_vendor-codemirror-CdtiO80y.js": {
46
+ "file": "assets/vendor-codemirror-CdtiO80y.js",
47
47
  "name": "vendor-codemirror",
48
48
  "imports": [
49
- "_vendor-D04tenE6.js"
49
+ "_vendor-Bjm5T3cE.js"
50
50
  ]
51
51
  },
52
- "_vendor-recharts-p0L0neVs.js": {
53
- "file": "assets/vendor-recharts-p0L0neVs.js",
52
+ "_vendor-recharts-BqWon6Py.js": {
53
+ "file": "assets/vendor-recharts-BqWon6Py.js",
54
54
  "name": "vendor-recharts",
55
55
  "imports": [
56
- "_vendor-D04tenE6.js"
56
+ "_vendor-Bjm5T3cE.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-D9E16vvV.js",
64
+ "file": "assets/index-BF4RUiOz.js",
65
65
  "name": "index",
66
66
  "src": "index.tsx",
67
67
  "isEntry": true,
68
68
  "imports": [
69
- "_vendor-D04tenE6.js",
70
- "_vendor-arizeai-D3NxMQw0.js",
71
- "_pages-t09OI1rC.js",
72
- "_components-DU-8CYbi.js",
69
+ "_vendor-Bjm5T3cE.js",
70
+ "_vendor-arizeai-CQhWGEdL.js",
71
+ "_pages-CM_Zho_x.js",
72
+ "_components-BcvRmBnN.js",
73
73
  "_vendor-three-DwGkEfCM.js",
74
- "_vendor-recharts-p0L0neVs.js",
75
- "_vendor-codemirror-XTiZSlqq.js"
74
+ "_vendor-recharts-BqWon6Py.js",
75
+ "_vendor-codemirror-CdtiO80y.js"
76
76
  ]
77
77
  }
78
78
  }