arize-phoenix 8.24.2__py3-none-any.whl → 8.26.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-8.24.2.dist-info → arize_phoenix-8.26.0.dist-info}/METADATA +1 -1
- {arize_phoenix-8.24.2.dist-info → arize_phoenix-8.26.0.dist-info}/RECORD +20 -20
- phoenix/config.py +48 -0
- phoenix/db/facilitator.py +19 -0
- phoenix/server/api/helpers/playground_clients.py +6 -0
- phoenix/server/bearer_auth.py +25 -0
- phoenix/server/static/.vite/manifest.json +40 -40
- phoenix/server/static/assets/{components-QHKgM10W.js → components-B5CAbHpr.js} +212 -198
- phoenix/server/static/assets/{index-CECPiJ0C.js → index-DIP5WhNE.js} +10 -10
- phoenix/server/static/assets/{pages-9uBMaRZz.js → pages-cfOsoZi6.js} +344 -325
- phoenix/server/static/assets/{vendor-C3H3sezv.js → vendor-DCvpCpca.js} +126 -126
- phoenix/server/static/assets/{vendor-arizeai-DT8pwHfH.js → vendor-arizeai-Ce3Kd6MM.js} +1 -1
- phoenix/server/static/assets/{vendor-codemirror-DvimrGxD.js → vendor-codemirror-CoZ2wzq8.js} +1 -1
- phoenix/server/static/assets/{vendor-recharts-DuSQBcYW.js → vendor-recharts-Bv0CPtHC.js} +1 -1
- phoenix/server/static/assets/{vendor-shiki-i05Hmswh.js → vendor-shiki-CkOPKXne.js} +1 -1
- phoenix/version.py +1 -1
- {arize_phoenix-8.24.2.dist-info → arize_phoenix-8.26.0.dist-info}/WHEEL +0 -0
- {arize_phoenix-8.24.2.dist-info → arize_phoenix-8.26.0.dist-info}/entry_points.txt +0 -0
- {arize_phoenix-8.24.2.dist-info → arize_phoenix-8.26.0.dist-info}/licenses/IP_NOTICE +0 -0
- {arize_phoenix-8.24.2.dist-info → arize_phoenix-8.26.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -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=
|
|
3
|
+
phoenix/config.py,sha256=GQUQ5l5IplbseE86-eVutD5pgU4uwxz3qCclb8tfmjg,39965
|
|
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=x87BX7hWGQQZbrW_vrYqFR_izCGfO9gFc--JXUG4Tdk,754
|
|
9
|
-
phoenix/version.py,sha256=
|
|
9
|
+
phoenix/version.py,sha256=BXfuOm4YfpVYO9mbewzWBZMWjGUwIkmqobIy44BKJiw,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=gxcP2aNy_JyKHv1MO4d2UM47GTMy1jDcN-FQETZ3iNA,7348
|
|
20
20
|
phoenix/db/enums.py,sha256=tt7iovXLhVTLZ3_LbHNGgcI44SnNjXfkKtLAZG57T54,428
|
|
21
|
-
phoenix/db/facilitator.py,sha256
|
|
21
|
+
phoenix/db/facilitator.py,sha256=6CeUMNTkNXrdviSQspY9ktFpVX-JHXcMJz6L0PuHxrI,7481
|
|
22
22
|
phoenix/db/helpers.py,sha256=rbbHcl-STzcEpcXCYx6jbKzko7r3ggrWHHsXjZ48HsM,5352
|
|
23
23
|
phoenix/db/migrate.py,sha256=oUrXH8yEbcpL4eh09aSCuUiSrhFli0eT5D_j4ZmYChY,2797
|
|
24
24
|
phoenix/db/models.py,sha256=TbHgtT7WWdkQK-OtLsUqp3MwP23HGV1IaSAWTqCf5ac,45707
|
|
@@ -81,7 +81,7 @@ phoenix/pointcloud/projectors.py,sha256=TQgwc9cJDjJkin1WZyZzgl3HsYrLLiyWD7Czy4jN
|
|
|
81
81
|
phoenix/pointcloud/umap_parameters.py,sha256=db_WEPoamuWtopZx7tQfAXPnoE0MS8FkAV0_ThjEx_Q,1735
|
|
82
82
|
phoenix/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
83
83
|
phoenix/server/app.py,sha256=f9H8ekaGiMwCMbSf2kbQIUFKywY2VmaIuJgPlrC7obU,40221
|
|
84
|
-
phoenix/server/bearer_auth.py,sha256=
|
|
84
|
+
phoenix/server/bearer_auth.py,sha256=9AY0-aOSHm-B7OYB-20jFA7bETAA6S1_W1za42A8Yt8,6804
|
|
85
85
|
phoenix/server/dml_event.py,sha256=MjJmVEKytq75chBOSyvYDusUnEbg1pHpIjR3pZkUaJA,2838
|
|
86
86
|
phoenix/server/dml_event_handler.py,sha256=EZLXmCvx4pJrCkz29gxwKwmvmUkTtPCHw6klR-XM8qE,8258
|
|
87
87
|
phoenix/server/grpc_server.py,sha256=SknR-iLIUqU9swiAyLhbCUREA1obOM6w49xgdK1AQDs,3839
|
|
@@ -144,7 +144,7 @@ phoenix/server/api/dataloaders/cache/two_tier_cache.py,sha256=cmo8FUT3E91R139IEz
|
|
|
144
144
|
phoenix/server/api/helpers/__init__.py,sha256=m2-xaSPqUiSs91k62JaRDjFNfl-1byxBfY-m_Vxw16U,272
|
|
145
145
|
phoenix/server/api/helpers/dataset_helpers.py,sha256=DoMBTg-qXTnC_K4Evx1WKpCCYgRbITpVqyY-8efJRf0,8984
|
|
146
146
|
phoenix/server/api/helpers/experiment_run_filters.py,sha256=DOnVwrmn39eAkk2mwuZP8kIcAnR5jrOgllEwWSjsw94,29893
|
|
147
|
-
phoenix/server/api/helpers/playground_clients.py,sha256
|
|
147
|
+
phoenix/server/api/helpers/playground_clients.py,sha256=tHwW-HbnoxU-EXXVvmY_1lbYh3Mv7QKw-e9KnREc7m4,41814
|
|
148
148
|
phoenix/server/api/helpers/playground_registry.py,sha256=CPLMziFB2wmr-dfbx7VbzO2f8YIG_k5RftzvGXYGQ1w,2570
|
|
149
149
|
phoenix/server/api/helpers/playground_spans.py,sha256=PjGNDc7cpqn5lmRM6TO_J1eVRGlgsNdQ8IT--5JVz0o,16881
|
|
150
150
|
phoenix/server/api/helpers/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -316,16 +316,16 @@ phoenix/server/static/apple-touch-icon-76x76.png,sha256=CT_xT12I0u2i0WU8JzBZBuOQ
|
|
|
316
316
|
phoenix/server/static/apple-touch-icon.png,sha256=fOfpjqGpWYbJ0eAurKsyoZP1EAs6ZVooBJ_SGk2ZkDs,3801
|
|
317
317
|
phoenix/server/static/favicon.ico,sha256=bY0vvCKRftemZfPShwZtE93DiiQdaYaozkPGwNFr6H8,34494
|
|
318
318
|
phoenix/server/static/modernizr.js,sha256=mvK-XtkNqjOral-QvzoqsyOMECXIMu5BQwSVN_wcU9c,2564
|
|
319
|
-
phoenix/server/static/.vite/manifest.json,sha256=
|
|
320
|
-
phoenix/server/static/assets/components-
|
|
321
|
-
phoenix/server/static/assets/index-
|
|
322
|
-
phoenix/server/static/assets/pages-
|
|
323
|
-
phoenix/server/static/assets/vendor-C3H3sezv.js,sha256=Ask2DJPiTV2k5gNIopK_nOQFKCysUP5Z7h1gWVsFB3c,2510162
|
|
319
|
+
phoenix/server/static/.vite/manifest.json,sha256=sE9Qo2ZhJ-1E7Hq5qRAUh6RJ5-gsaKgfSw0on-FTxKk,2165
|
|
320
|
+
phoenix/server/static/assets/components-B5CAbHpr.js,sha256=6HSyPEbZMgpSX6AS-_5GeHljISBieEpf_pQWO9iZD-o,456228
|
|
321
|
+
phoenix/server/static/assets/index-DIP5WhNE.js,sha256=abTUAQ-m29l7y5iitSlPD-rlP_BWAkbWl2ZlasrYcuQ,60460
|
|
322
|
+
phoenix/server/static/assets/pages-cfOsoZi6.js,sha256=d5WiYECyTU9hfDyLnFhM5_SfXF7Tb5q-dUPLscrBuuw,864853
|
|
324
323
|
phoenix/server/static/assets/vendor-Cg6lcjUC.css,sha256=nZrkr0u6NNElFGvpWHk9GTHeGoibCXCli1bE7mXZGZg,1816
|
|
325
|
-
phoenix/server/static/assets/vendor-
|
|
326
|
-
phoenix/server/static/assets/vendor-
|
|
327
|
-
phoenix/server/static/assets/vendor-
|
|
328
|
-
phoenix/server/static/assets/vendor-
|
|
324
|
+
phoenix/server/static/assets/vendor-DCvpCpca.js,sha256=8Snf_3RF5d8AxOBi-kGMeDNPf8prJ8VWOhd4oU0nGBo,2509995
|
|
325
|
+
phoenix/server/static/assets/vendor-arizeai-Ce3Kd6MM.js,sha256=WzCM-aYW4CaJeIyMBIklvRMUmK2Q7s0uPEuREvDjv10,193248
|
|
326
|
+
phoenix/server/static/assets/vendor-codemirror-CoZ2wzq8.js,sha256=hq3lk1J62vpLjaHAL3XRZTbkFcX3AxUgpXDo9nVYe3M,781264
|
|
327
|
+
phoenix/server/static/assets/vendor-recharts-Bv0CPtHC.js,sha256=F4Ydc5zEhNsvutA3zczt0Um0BD8R6hqePl_BY3qlRbw,282109
|
|
328
|
+
phoenix/server/static/assets/vendor-shiki-CkOPKXne.js,sha256=ExRd8OKRnvIMlflZge41ha5B9bKa_K3SOc8-Uj2Eb90,8980312
|
|
329
329
|
phoenix/server/static/assets/vendor-three-C5WAXd5r.js,sha256=ELkg06u70N7h8oFmvqdoHyPuUf9VgGEWeT4LKFx4VWo,620975
|
|
330
330
|
phoenix/server/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
331
331
|
phoenix/server/templates/index.html,sha256=e8_jdi7Eo19SK7DI_gglkTW094D17E0VAegoMmmmvIc,4330
|
|
@@ -366,9 +366,9 @@ phoenix/utilities/project.py,sha256=auVpARXkDb-JgeX5f2aStyFIkeKvGwN9l7qrFeJMVxI,
|
|
|
366
366
|
phoenix/utilities/re.py,sha256=6YyUWIkv0zc2SigsxfOWIHzdpjKA_TZo2iqKq7zJKvw,2081
|
|
367
367
|
phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
368
368
|
phoenix/utilities/template_formatters.py,sha256=gh9PJD6WEGw7TEYXfSst1UR4pWWwmjxMLrDVQ_CkpkQ,2779
|
|
369
|
-
arize_phoenix-8.
|
|
370
|
-
arize_phoenix-8.
|
|
371
|
-
arize_phoenix-8.
|
|
372
|
-
arize_phoenix-8.
|
|
373
|
-
arize_phoenix-8.
|
|
374
|
-
arize_phoenix-8.
|
|
369
|
+
arize_phoenix-8.26.0.dist-info/METADATA,sha256=gZ8LxB1KtJL2NK_NslQ8Y48U_Gl84BDQxKBX46Is0uU,24495
|
|
370
|
+
arize_phoenix-8.26.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
371
|
+
arize_phoenix-8.26.0.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
|
|
372
|
+
arize_phoenix-8.26.0.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
|
|
373
|
+
arize_phoenix-8.26.0.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
|
|
374
|
+
arize_phoenix-8.26.0.dist-info/RECORD,,
|
phoenix/config.py
CHANGED
|
@@ -144,6 +144,17 @@ ENV_PHOENIX_SERVER_INSTRUMENTATION_OTLP_TRACE_COLLECTOR_GRPC_ENDPOINT = (
|
|
|
144
144
|
ENV_PHOENIX_ENABLE_AUTH = "PHOENIX_ENABLE_AUTH"
|
|
145
145
|
ENV_PHOENIX_DISABLE_RATE_LIMIT = "PHOENIX_DISABLE_RATE_LIMIT"
|
|
146
146
|
ENV_PHOENIX_SECRET = "PHOENIX_SECRET"
|
|
147
|
+
"""
|
|
148
|
+
The secret key used for signing JWTs. It must be at least 32 characters long and include at least
|
|
149
|
+
one digit and one lowercase letter.
|
|
150
|
+
"""
|
|
151
|
+
ENV_PHOENIX_ADMIN_SECRET = "PHOENIX_ADMIN_SECRET"
|
|
152
|
+
"""
|
|
153
|
+
A secret key that can be used as a bearer token instead of an API key. It authenticates as the
|
|
154
|
+
first system user. This key must be at least 32 characters long, include at least one digit and
|
|
155
|
+
one lowercase letter, and must be different from PHOENIX_SECRET. Additionally, it must not be set
|
|
156
|
+
if PHOENIX_SECRET is not configured.
|
|
157
|
+
"""
|
|
147
158
|
ENV_PHOENIX_DEFAULT_ADMIN_INITIAL_PASSWORD = "PHOENIX_DEFAULT_ADMIN_INITIAL_PASSWORD"
|
|
148
159
|
"""
|
|
149
160
|
The initial password for the default admin account, which defaults to 'admin' if not
|
|
@@ -383,6 +394,29 @@ def get_env_phoenix_secret() -> Optional[str]:
|
|
|
383
394
|
return phoenix_secret
|
|
384
395
|
|
|
385
396
|
|
|
397
|
+
def get_env_phoenix_admin_secret() -> Optional[str]:
|
|
398
|
+
"""
|
|
399
|
+
Gets the value of the PHOENIX_ADMIN_SECRET environment variable
|
|
400
|
+
and performs validation.
|
|
401
|
+
"""
|
|
402
|
+
phoenix_admin_secret = getenv(ENV_PHOENIX_ADMIN_SECRET)
|
|
403
|
+
if phoenix_admin_secret is None:
|
|
404
|
+
return None
|
|
405
|
+
if (phoenix_secret := get_env_phoenix_secret()) is None:
|
|
406
|
+
raise ValueError(
|
|
407
|
+
f"`{ENV_PHOENIX_ADMIN_SECRET}` must be not be set without "
|
|
408
|
+
f"setting `{ENV_PHOENIX_SECRET}`."
|
|
409
|
+
)
|
|
410
|
+
from phoenix.auth import REQUIREMENTS_FOR_PHOENIX_SECRET
|
|
411
|
+
|
|
412
|
+
REQUIREMENTS_FOR_PHOENIX_SECRET.validate(phoenix_admin_secret, "Phoenix secret")
|
|
413
|
+
if phoenix_admin_secret == phoenix_secret:
|
|
414
|
+
raise ValueError(
|
|
415
|
+
f"`{ENV_PHOENIX_ADMIN_SECRET}` must be different from `{ENV_PHOENIX_SECRET}`"
|
|
416
|
+
)
|
|
417
|
+
return phoenix_admin_secret
|
|
418
|
+
|
|
419
|
+
|
|
386
420
|
def get_env_default_admin_initial_password() -> str:
|
|
387
421
|
from phoenix.auth import DEFAULT_ADMIN_PASSWORD
|
|
388
422
|
|
|
@@ -1108,7 +1142,21 @@ def get_env_allowed_origins() -> Optional[list[str]]:
|
|
|
1108
1142
|
def verify_server_environment_variables() -> None:
|
|
1109
1143
|
"""Verify that the environment variables are set correctly. Raises an error otherwise."""
|
|
1110
1144
|
get_env_root_url()
|
|
1145
|
+
get_env_phoenix_secret()
|
|
1146
|
+
get_env_phoenix_admin_secret()
|
|
1111
1147
|
|
|
1112
1148
|
|
|
1113
1149
|
SKLEARN_VERSION = cast(tuple[int, int], tuple(map(int, version("scikit-learn").split(".", 2)[:2])))
|
|
1114
1150
|
PLAYGROUND_PROJECT_NAME = "playground"
|
|
1151
|
+
|
|
1152
|
+
SYSTEM_USER_ID: Optional[int] = None
|
|
1153
|
+
"""
|
|
1154
|
+
The ID of the system user in the database.
|
|
1155
|
+
|
|
1156
|
+
This value is set during application startup by the facilitator and is used to
|
|
1157
|
+
identify the system user for authentication purposes.
|
|
1158
|
+
|
|
1159
|
+
When the PHOENIX_ADMIN_SECRET is used as a bearer token in API requests, the
|
|
1160
|
+
request is authenticated as the system user with the user_id set to this
|
|
1161
|
+
SYSTEM_USER_ID value (only if this variable is not None).
|
|
1162
|
+
"""
|
phoenix/db/facilitator.py
CHANGED
|
@@ -13,6 +13,7 @@ from sqlalchemy import (
|
|
|
13
13
|
select,
|
|
14
14
|
)
|
|
15
15
|
|
|
16
|
+
from phoenix import config
|
|
16
17
|
from phoenix.auth import (
|
|
17
18
|
DEFAULT_ADMIN_EMAIL,
|
|
18
19
|
DEFAULT_ADMIN_USERNAME,
|
|
@@ -54,6 +55,7 @@ class Facilitator:
|
|
|
54
55
|
for fn in (
|
|
55
56
|
_ensure_enums,
|
|
56
57
|
_ensure_user_roles,
|
|
58
|
+
_get_system_user_id,
|
|
57
59
|
partial(_ensure_admins, email_sender=self._email_sender),
|
|
58
60
|
):
|
|
59
61
|
await fn(self._db)
|
|
@@ -130,6 +132,23 @@ async def _ensure_user_roles(db: DbSessionFactory) -> None:
|
|
|
130
132
|
await session.flush()
|
|
131
133
|
|
|
132
134
|
|
|
135
|
+
async def _get_system_user_id(db: DbSessionFactory) -> None:
|
|
136
|
+
"""
|
|
137
|
+
Set the system user ID in the config. This is used to identify the system user in the database.
|
|
138
|
+
"""
|
|
139
|
+
async with db() as session:
|
|
140
|
+
system_user_id = await session.scalar(
|
|
141
|
+
select(models.User.id)
|
|
142
|
+
.join(models.UserRole)
|
|
143
|
+
.where(models.UserRole.name == UserRole.SYSTEM.value)
|
|
144
|
+
.order_by(models.User.id)
|
|
145
|
+
.limit(1)
|
|
146
|
+
)
|
|
147
|
+
if system_user_id is None:
|
|
148
|
+
raise ValueError("System user not found in database")
|
|
149
|
+
config.SYSTEM_USER_ID = system_user_id
|
|
150
|
+
|
|
151
|
+
|
|
133
152
|
async def _ensure_admins(
|
|
134
153
|
db: DbSessionFactory,
|
|
135
154
|
*,
|
|
@@ -457,6 +457,12 @@ class OpenAIBaseStreamingClient(PlaygroundStreamingClient):
|
|
|
457
457
|
provider_key=GenerativeProviderKey.OPENAI,
|
|
458
458
|
model_names=[
|
|
459
459
|
PROVIDER_DEFAULT,
|
|
460
|
+
"gpt-4.1",
|
|
461
|
+
"gpt-4.1-mini",
|
|
462
|
+
"gpt-4.1-nano",
|
|
463
|
+
"gpt-4.1-2025-04-14",
|
|
464
|
+
"gpt-4.1-mini-2025-04-14",
|
|
465
|
+
"gpt-4.1-nano-2025-04-14",
|
|
460
466
|
"gpt-4o",
|
|
461
467
|
"gpt-4o-2024-11-20",
|
|
462
468
|
"gpt-4o-2024-08-06",
|
phoenix/server/bearer_auth.py
CHANGED
|
@@ -12,12 +12,14 @@ from starlette.authentication import AuthCredentials, AuthenticationBackend, Bas
|
|
|
12
12
|
from starlette.requests import HTTPConnection
|
|
13
13
|
from starlette.status import HTTP_401_UNAUTHORIZED
|
|
14
14
|
|
|
15
|
+
from phoenix import config
|
|
15
16
|
from phoenix.auth import (
|
|
16
17
|
PHOENIX_ACCESS_TOKEN_COOKIE_NAME,
|
|
17
18
|
CanReadToken,
|
|
18
19
|
ClaimSetStatus,
|
|
19
20
|
Token,
|
|
20
21
|
)
|
|
22
|
+
from phoenix.config import get_env_phoenix_admin_secret
|
|
21
23
|
from phoenix.db import enums
|
|
22
24
|
from phoenix.db.enums import UserRole
|
|
23
25
|
from phoenix.db.models import User as OrmUser
|
|
@@ -50,6 +52,12 @@ class BearerTokenAuthBackend(HasTokenStore, AuthenticationBackend):
|
|
|
50
52
|
scheme, _, token = header.partition(" ")
|
|
51
53
|
if scheme.lower() != "bearer" or not token:
|
|
52
54
|
return None
|
|
55
|
+
if (
|
|
56
|
+
(admin_secret := get_env_phoenix_admin_secret())
|
|
57
|
+
and token == admin_secret
|
|
58
|
+
and config.SYSTEM_USER_ID is not None
|
|
59
|
+
):
|
|
60
|
+
return AuthCredentials(), PhoenixSystemUser(UserId(config.SYSTEM_USER_ID))
|
|
53
61
|
elif access_token := conn.cookies.get(PHOENIX_ACCESS_TOKEN_COOKIE_NAME):
|
|
54
62
|
token = access_token
|
|
55
63
|
else:
|
|
@@ -85,6 +93,15 @@ class PhoenixUser(BaseUser):
|
|
|
85
93
|
return True
|
|
86
94
|
|
|
87
95
|
|
|
96
|
+
class PhoenixSystemUser(PhoenixUser):
|
|
97
|
+
def __init__(self, user_id: UserId) -> None:
|
|
98
|
+
self._user_id = user_id
|
|
99
|
+
|
|
100
|
+
@property
|
|
101
|
+
def is_admin(self) -> bool:
|
|
102
|
+
return True
|
|
103
|
+
|
|
104
|
+
|
|
88
105
|
class ApiKeyInterceptor(HasTokenStore, AsyncServerInterceptor):
|
|
89
106
|
async def intercept(
|
|
90
107
|
self,
|
|
@@ -98,6 +115,12 @@ class ApiKeyInterceptor(HasTokenStore, AsyncServerInterceptor):
|
|
|
98
115
|
scheme, _, token = datum.value.partition(" ")
|
|
99
116
|
if scheme.lower() != "bearer" or not token:
|
|
100
117
|
break
|
|
118
|
+
if (
|
|
119
|
+
(admin_secret := get_env_phoenix_admin_secret())
|
|
120
|
+
and token == admin_secret
|
|
121
|
+
and config.SYSTEM_USER_ID is not None
|
|
122
|
+
):
|
|
123
|
+
return await method(request_or_iterator, context)
|
|
101
124
|
claims = await self._token_store.read(Token(token))
|
|
102
125
|
if not (isinstance(claims, UserClaimSet) and isinstance(claims.subject, UserId)):
|
|
103
126
|
break
|
|
@@ -124,6 +147,8 @@ async def is_authenticated(
|
|
|
124
147
|
raise HTTPException(status_code=HTTP_401_UNAUTHORIZED, detail="Invalid token")
|
|
125
148
|
if websocket and not isinstance((user := websocket.user), PhoenixUser):
|
|
126
149
|
raise WebSocketException(code=HTTP_401_UNAUTHORIZED, reason="Invalid token")
|
|
150
|
+
if isinstance(user, PhoenixSystemUser):
|
|
151
|
+
return
|
|
127
152
|
claims = user.claims
|
|
128
153
|
if claims.status is ClaimSetStatus.EXPIRED:
|
|
129
154
|
raise HTTPException(status_code=HTTP_401_UNAUTHORIZED, detail="Expired token")
|
|
@@ -1,28 +1,32 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_components-
|
|
3
|
-
"file": "assets/components-
|
|
2
|
+
"_components-B5CAbHpr.js": {
|
|
3
|
+
"file": "assets/components-B5CAbHpr.js",
|
|
4
4
|
"name": "components",
|
|
5
5
|
"imports": [
|
|
6
|
-
"_vendor-
|
|
7
|
-
"_pages-
|
|
8
|
-
"_vendor-arizeai-
|
|
9
|
-
"_vendor-codemirror-
|
|
6
|
+
"_vendor-DCvpCpca.js",
|
|
7
|
+
"_pages-cfOsoZi6.js",
|
|
8
|
+
"_vendor-arizeai-Ce3Kd6MM.js",
|
|
9
|
+
"_vendor-codemirror-CoZ2wzq8.js",
|
|
10
10
|
"_vendor-three-C5WAXd5r.js"
|
|
11
11
|
]
|
|
12
12
|
},
|
|
13
|
-
"_pages-
|
|
14
|
-
"file": "assets/pages-
|
|
13
|
+
"_pages-cfOsoZi6.js": {
|
|
14
|
+
"file": "assets/pages-cfOsoZi6.js",
|
|
15
15
|
"name": "pages",
|
|
16
16
|
"imports": [
|
|
17
|
-
"_vendor-
|
|
18
|
-
"_vendor-arizeai-
|
|
19
|
-
"_components-
|
|
20
|
-
"_vendor-codemirror-
|
|
21
|
-
"_vendor-recharts-
|
|
17
|
+
"_vendor-DCvpCpca.js",
|
|
18
|
+
"_vendor-arizeai-Ce3Kd6MM.js",
|
|
19
|
+
"_components-B5CAbHpr.js",
|
|
20
|
+
"_vendor-codemirror-CoZ2wzq8.js",
|
|
21
|
+
"_vendor-recharts-Bv0CPtHC.js"
|
|
22
22
|
]
|
|
23
23
|
},
|
|
24
|
-
"_vendor-
|
|
25
|
-
"file": "assets/vendor-
|
|
24
|
+
"_vendor-Cg6lcjUC.css": {
|
|
25
|
+
"file": "assets/vendor-Cg6lcjUC.css",
|
|
26
|
+
"src": "_vendor-Cg6lcjUC.css"
|
|
27
|
+
},
|
|
28
|
+
"_vendor-DCvpCpca.js": {
|
|
29
|
+
"file": "assets/vendor-DCvpCpca.js",
|
|
26
30
|
"name": "vendor",
|
|
27
31
|
"imports": [
|
|
28
32
|
"_vendor-three-C5WAXd5r.js"
|
|
@@ -31,37 +35,33 @@
|
|
|
31
35
|
"assets/vendor-Cg6lcjUC.css"
|
|
32
36
|
]
|
|
33
37
|
},
|
|
34
|
-
"_vendor-
|
|
35
|
-
"file": "assets/vendor-
|
|
36
|
-
"src": "_vendor-Cg6lcjUC.css"
|
|
37
|
-
},
|
|
38
|
-
"_vendor-arizeai-DT8pwHfH.js": {
|
|
39
|
-
"file": "assets/vendor-arizeai-DT8pwHfH.js",
|
|
38
|
+
"_vendor-arizeai-Ce3Kd6MM.js": {
|
|
39
|
+
"file": "assets/vendor-arizeai-Ce3Kd6MM.js",
|
|
40
40
|
"name": "vendor-arizeai",
|
|
41
41
|
"imports": [
|
|
42
|
-
"_vendor-
|
|
42
|
+
"_vendor-DCvpCpca.js"
|
|
43
43
|
]
|
|
44
44
|
},
|
|
45
|
-
"_vendor-codemirror-
|
|
46
|
-
"file": "assets/vendor-codemirror-
|
|
45
|
+
"_vendor-codemirror-CoZ2wzq8.js": {
|
|
46
|
+
"file": "assets/vendor-codemirror-CoZ2wzq8.js",
|
|
47
47
|
"name": "vendor-codemirror",
|
|
48
48
|
"imports": [
|
|
49
|
-
"_vendor-
|
|
50
|
-
"_vendor-shiki-
|
|
49
|
+
"_vendor-DCvpCpca.js",
|
|
50
|
+
"_vendor-shiki-CkOPKXne.js"
|
|
51
51
|
]
|
|
52
52
|
},
|
|
53
|
-
"_vendor-recharts-
|
|
54
|
-
"file": "assets/vendor-recharts-
|
|
53
|
+
"_vendor-recharts-Bv0CPtHC.js": {
|
|
54
|
+
"file": "assets/vendor-recharts-Bv0CPtHC.js",
|
|
55
55
|
"name": "vendor-recharts",
|
|
56
56
|
"imports": [
|
|
57
|
-
"_vendor-
|
|
57
|
+
"_vendor-DCvpCpca.js"
|
|
58
58
|
]
|
|
59
59
|
},
|
|
60
|
-
"_vendor-shiki-
|
|
61
|
-
"file": "assets/vendor-shiki-
|
|
60
|
+
"_vendor-shiki-CkOPKXne.js": {
|
|
61
|
+
"file": "assets/vendor-shiki-CkOPKXne.js",
|
|
62
62
|
"name": "vendor-shiki",
|
|
63
63
|
"imports": [
|
|
64
|
-
"_vendor-
|
|
64
|
+
"_vendor-DCvpCpca.js"
|
|
65
65
|
]
|
|
66
66
|
},
|
|
67
67
|
"_vendor-three-C5WAXd5r.js": {
|
|
@@ -69,19 +69,19 @@
|
|
|
69
69
|
"name": "vendor-three"
|
|
70
70
|
},
|
|
71
71
|
"index.tsx": {
|
|
72
|
-
"file": "assets/index-
|
|
72
|
+
"file": "assets/index-DIP5WhNE.js",
|
|
73
73
|
"name": "index",
|
|
74
74
|
"src": "index.tsx",
|
|
75
75
|
"isEntry": true,
|
|
76
76
|
"imports": [
|
|
77
|
-
"_vendor-
|
|
78
|
-
"_vendor-arizeai-
|
|
79
|
-
"_pages-
|
|
80
|
-
"_components-
|
|
77
|
+
"_vendor-DCvpCpca.js",
|
|
78
|
+
"_vendor-arizeai-Ce3Kd6MM.js",
|
|
79
|
+
"_pages-cfOsoZi6.js",
|
|
80
|
+
"_components-B5CAbHpr.js",
|
|
81
81
|
"_vendor-three-C5WAXd5r.js",
|
|
82
|
-
"_vendor-codemirror-
|
|
83
|
-
"_vendor-shiki-
|
|
84
|
-
"_vendor-recharts-
|
|
82
|
+
"_vendor-codemirror-CoZ2wzq8.js",
|
|
83
|
+
"_vendor-shiki-CkOPKXne.js",
|
|
84
|
+
"_vendor-recharts-Bv0CPtHC.js"
|
|
85
85
|
]
|
|
86
86
|
}
|
|
87
87
|
}
|