arize-phoenix 7.12.2__py3-none-any.whl → 7.12.3__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-7.12.2.dist-info → arize_phoenix-7.12.3.dist-info}/METADATA +1 -1
- {arize_phoenix-7.12.2.dist-info → arize_phoenix-7.12.3.dist-info}/RECORD +10 -10
- phoenix/config.py +61 -36
- phoenix/server/api/helpers/playground_clients.py +8 -12
- phoenix/server/api/types/GenerativeProvider.py +2 -2
- phoenix/version.py +1 -1
- {arize_phoenix-7.12.2.dist-info → arize_phoenix-7.12.3.dist-info}/WHEEL +0 -0
- {arize_phoenix-7.12.2.dist-info → arize_phoenix-7.12.3.dist-info}/entry_points.txt +0 -0
- {arize_phoenix-7.12.2.dist-info → arize_phoenix-7.12.3.dist-info}/licenses/IP_NOTICE +0 -0
- {arize_phoenix-7.12.2.dist-info → arize_phoenix-7.12.3.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=clBjtpvVN8VznxfYRBgmdG7MclXfCCvyham-Qyf0uWk,27107
|
|
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
|
|
9
|
+
phoenix/version.py,sha256=-YxTinWwN6lwwSBelQsFBd_QYUgamTbtExBGoWCHGeU,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
|
|
@@ -135,7 +135,7 @@ phoenix/server/api/dataloaders/cache/two_tier_cache.py,sha256=cmo8FUT3E91R139IEz
|
|
|
135
135
|
phoenix/server/api/helpers/__init__.py,sha256=m2-xaSPqUiSs91k62JaRDjFNfl-1byxBfY-m_Vxw16U,272
|
|
136
136
|
phoenix/server/api/helpers/dataset_helpers.py,sha256=DoMBTg-qXTnC_K4Evx1WKpCCYgRbITpVqyY-8efJRf0,8984
|
|
137
137
|
phoenix/server/api/helpers/experiment_run_filters.py,sha256=DOnVwrmn39eAkk2mwuZP8kIcAnR5jrOgllEwWSjsw94,29893
|
|
138
|
-
phoenix/server/api/helpers/playground_clients.py,sha256=
|
|
138
|
+
phoenix/server/api/helpers/playground_clients.py,sha256=hpXgjtrCQx1jwf6atMlW8yf6l0s2f5XCvywb141wMDE,39804
|
|
139
139
|
phoenix/server/api/helpers/playground_registry.py,sha256=CPLMziFB2wmr-dfbx7VbzO2f8YIG_k5RftzvGXYGQ1w,2570
|
|
140
140
|
phoenix/server/api/helpers/playground_spans.py,sha256=qGk7V7IZK7EkRE1mvZyROpLN5kgOahOZifFzUWmqYFc,16546
|
|
141
141
|
phoenix/server/api/input_types/AddExamplesToDatasetInput.py,sha256=mIQz0S_z8YdrktKIY6RCvtNJ2yZF9pYvTGgasUsI-54,430
|
|
@@ -238,7 +238,7 @@ phoenix/server/api/types/ExperimentRunAnnotation.py,sha256=HEbPygBwbWg10fwY3VZyM
|
|
|
238
238
|
phoenix/server/api/types/ExportedFile.py,sha256=e3GTn7B5LgsTbqiwjhMCQH7VsiqXitrBO4aCMS1lHsg,163
|
|
239
239
|
phoenix/server/api/types/Functionality.py,sha256=tzV9xdhB8zqfsjWxP66NDC7EZsplYkYO7jRbLWJIeeg,382
|
|
240
240
|
phoenix/server/api/types/GenerativeModel.py,sha256=P7eBUMXbeqaLwSSGBKdZy3a5gOLd9I0fuP8o1st6H08,193
|
|
241
|
-
phoenix/server/api/types/GenerativeProvider.py,sha256=
|
|
241
|
+
phoenix/server/api/types/GenerativeProvider.py,sha256=0XJ_K6zd5-rQOh1xVwSfWMiR8fEvXMfU3hAXTg6xWsA,3941
|
|
242
242
|
phoenix/server/api/types/Inferences.py,sha256=wv88PjcK-KwnzmTdukiAX9EV2KX4GqsKXVAUm1JtnDA,3383
|
|
243
243
|
phoenix/server/api/types/InferencesRole.py,sha256=mLfeHpyhGUVX1-tWzT9IwC_cD18BZrD3RA4YsHYuSpA,595
|
|
244
244
|
phoenix/server/api/types/LabelFraction.py,sha256=zsDxdFALrNiGA1eNykeP8o65gbA0HOhRp54MPH_iRAM,93
|
|
@@ -337,9 +337,9 @@ phoenix/utilities/project.py,sha256=auVpARXkDb-JgeX5f2aStyFIkeKvGwN9l7qrFeJMVxI,
|
|
|
337
337
|
phoenix/utilities/re.py,sha256=6YyUWIkv0zc2SigsxfOWIHzdpjKA_TZo2iqKq7zJKvw,2081
|
|
338
338
|
phoenix/utilities/span_store.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
339
339
|
phoenix/utilities/template_formatters.py,sha256=gh9PJD6WEGw7TEYXfSst1UR4pWWwmjxMLrDVQ_CkpkQ,2779
|
|
340
|
-
arize_phoenix-7.12.
|
|
341
|
-
arize_phoenix-7.12.
|
|
342
|
-
arize_phoenix-7.12.
|
|
343
|
-
arize_phoenix-7.12.
|
|
344
|
-
arize_phoenix-7.12.
|
|
345
|
-
arize_phoenix-7.12.
|
|
340
|
+
arize_phoenix-7.12.3.dist-info/METADATA,sha256=SL2DnU9B8l6vwIwLxghLqZgRMguSGGKmc4ABvAFlREQ,23390
|
|
341
|
+
arize_phoenix-7.12.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
342
|
+
arize_phoenix-7.12.3.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
|
|
343
|
+
arize_phoenix-7.12.3.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
|
|
344
|
+
arize_phoenix-7.12.3.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
|
|
345
|
+
arize_phoenix-7.12.3.dist-info/RECORD,,
|
phoenix/config.py
CHANGED
|
@@ -162,8 +162,8 @@ ENV_PHOENIX_GRPC_INTERCEPTOR_PATHS = "PHOENIX_GRPC_INTERCEPTOR_PATHS"
|
|
|
162
162
|
|
|
163
163
|
def server_instrumentation_is_enabled() -> bool:
|
|
164
164
|
return bool(
|
|
165
|
-
|
|
166
|
-
) or bool(
|
|
165
|
+
getenv(ENV_PHOENIX_SERVER_INSTRUMENTATION_OTLP_TRACE_COLLECTOR_HTTP_ENDPOINT)
|
|
166
|
+
) or bool(getenv(ENV_PHOENIX_SERVER_INSTRUMENTATION_OTLP_TRACE_COLLECTOR_GRPC_ENDPOINT))
|
|
167
167
|
|
|
168
168
|
|
|
169
169
|
def _get_temp_path() -> Path:
|
|
@@ -192,7 +192,7 @@ def get_working_dir() -> Path:
|
|
|
192
192
|
"""
|
|
193
193
|
Get the working directory for saving, loading, and exporting datasets.
|
|
194
194
|
"""
|
|
195
|
-
working_dir_str =
|
|
195
|
+
working_dir_str = getenv(ENV_PHOENIX_WORKING_DIR)
|
|
196
196
|
if working_dir_str is not None:
|
|
197
197
|
return Path(working_dir_str)
|
|
198
198
|
# Fall back to ~/.phoenix if PHOENIX_WORKING_DIR is not set
|
|
@@ -207,7 +207,7 @@ def _bool_val(env_var: str, default: Optional[bool] = None) -> Optional[bool]:
|
|
|
207
207
|
"""
|
|
208
208
|
Parses a boolean environment variable, returning `default` if the variable is not set.
|
|
209
209
|
"""
|
|
210
|
-
if (value :=
|
|
210
|
+
if (value := getenv(env_var)) is None:
|
|
211
211
|
return default
|
|
212
212
|
assert (lower := value.lower()) in (
|
|
213
213
|
"true",
|
|
@@ -224,7 +224,7 @@ def _float_val(env_var: str, default: Optional[float] = None) -> Optional[float]
|
|
|
224
224
|
"""
|
|
225
225
|
Parses a numeric environment variable, returning `default` if the variable is not set.
|
|
226
226
|
"""
|
|
227
|
-
if (value :=
|
|
227
|
+
if (value := getenv(env_var)) is None:
|
|
228
228
|
return default
|
|
229
229
|
try:
|
|
230
230
|
return float(value)
|
|
@@ -243,7 +243,7 @@ def _int_val(env_var: str, default: Optional[int] = None) -> Optional[int]:
|
|
|
243
243
|
"""
|
|
244
244
|
Parses a numeric environment variable, returning `default` if the variable is not set.
|
|
245
245
|
"""
|
|
246
|
-
if (value :=
|
|
246
|
+
if (value := getenv(env_var)) is None:
|
|
247
247
|
return default
|
|
248
248
|
try:
|
|
249
249
|
return int(value)
|
|
@@ -254,6 +254,33 @@ def _int_val(env_var: str, default: Optional[int] = None) -> Optional[int]:
|
|
|
254
254
|
)
|
|
255
255
|
|
|
256
256
|
|
|
257
|
+
@overload
|
|
258
|
+
def getenv(key: str) -> Optional[str]: ...
|
|
259
|
+
@overload
|
|
260
|
+
def getenv(key: str, default: str) -> str: ...
|
|
261
|
+
def getenv(key: str, default: Optional[str] = None) -> Optional[str]:
|
|
262
|
+
"""
|
|
263
|
+
Retrieves the value of an environment variable.
|
|
264
|
+
|
|
265
|
+
Parameters
|
|
266
|
+
----------
|
|
267
|
+
key : str
|
|
268
|
+
The name of the environment variable.
|
|
269
|
+
default : Optional[str], optional
|
|
270
|
+
The default value to return if the environment variable is not set, by default None.
|
|
271
|
+
|
|
272
|
+
Returns
|
|
273
|
+
-------
|
|
274
|
+
Optional[str]
|
|
275
|
+
The value of the environment variable, or `default` if the variable is not set.
|
|
276
|
+
Leading and trailing whitespaces are stripped from the value, assuming they were
|
|
277
|
+
inadvertently added.
|
|
278
|
+
"""
|
|
279
|
+
if (value := os.getenv(key)) is None:
|
|
280
|
+
return default
|
|
281
|
+
return value.strip()
|
|
282
|
+
|
|
283
|
+
|
|
257
284
|
def get_env_enable_auth() -> bool:
|
|
258
285
|
"""
|
|
259
286
|
Gets the value of the PHOENIX_ENABLE_AUTH environment variable.
|
|
@@ -273,7 +300,7 @@ def get_env_phoenix_secret() -> Optional[str]:
|
|
|
273
300
|
Gets the value of the PHOENIX_SECRET environment variable
|
|
274
301
|
and performs validation.
|
|
275
302
|
"""
|
|
276
|
-
phoenix_secret =
|
|
303
|
+
phoenix_secret = getenv(ENV_PHOENIX_SECRET)
|
|
277
304
|
if phoenix_secret is None:
|
|
278
305
|
return None
|
|
279
306
|
from phoenix.auth import REQUIREMENTS_FOR_PHOENIX_SECRET
|
|
@@ -285,7 +312,7 @@ def get_env_phoenix_secret() -> Optional[str]:
|
|
|
285
312
|
def get_env_default_admin_initial_password() -> str:
|
|
286
313
|
from phoenix.auth import DEFAULT_ADMIN_PASSWORD
|
|
287
314
|
|
|
288
|
-
return
|
|
315
|
+
return getenv(ENV_PHOENIX_DEFAULT_ADMIN_INITIAL_PASSWORD) or DEFAULT_ADMIN_PASSWORD
|
|
289
316
|
|
|
290
317
|
|
|
291
318
|
def get_env_phoenix_use_secure_cookies() -> bool:
|
|
@@ -293,7 +320,7 @@ def get_env_phoenix_use_secure_cookies() -> bool:
|
|
|
293
320
|
|
|
294
321
|
|
|
295
322
|
def get_env_phoenix_api_key() -> Optional[str]:
|
|
296
|
-
return
|
|
323
|
+
return getenv(ENV_PHOENIX_API_KEY)
|
|
297
324
|
|
|
298
325
|
|
|
299
326
|
def get_env_auth_settings() -> tuple[bool, Optional[str]]:
|
|
@@ -354,7 +381,7 @@ def get_env_refresh_token_expiry() -> timedelta:
|
|
|
354
381
|
|
|
355
382
|
def get_env_csrf_trusted_origins() -> list[str]:
|
|
356
383
|
origins: list[str] = []
|
|
357
|
-
if not (csrf_trusted_origins :=
|
|
384
|
+
if not (csrf_trusted_origins := getenv(ENV_PHOENIX_CSRF_TRUSTED_ORIGINS)):
|
|
358
385
|
return origins
|
|
359
386
|
for origin in csrf_trusted_origins.split(","):
|
|
360
387
|
if not origin:
|
|
@@ -369,19 +396,19 @@ def get_env_csrf_trusted_origins() -> list[str]:
|
|
|
369
396
|
|
|
370
397
|
|
|
371
398
|
def get_env_smtp_username() -> str:
|
|
372
|
-
return
|
|
399
|
+
return getenv(ENV_PHOENIX_SMTP_USERNAME, "")
|
|
373
400
|
|
|
374
401
|
|
|
375
402
|
def get_env_smtp_password() -> str:
|
|
376
|
-
return
|
|
403
|
+
return getenv(ENV_PHOENIX_SMTP_PASSWORD, "")
|
|
377
404
|
|
|
378
405
|
|
|
379
406
|
def get_env_smtp_mail_from() -> str:
|
|
380
|
-
return
|
|
407
|
+
return getenv(ENV_PHOENIX_SMTP_MAIL_FROM) or "noreply@arize.com"
|
|
381
408
|
|
|
382
409
|
|
|
383
410
|
def get_env_smtp_hostname() -> str:
|
|
384
|
-
return
|
|
411
|
+
return getenv(ENV_PHOENIX_SMTP_HOSTNAME, "")
|
|
385
412
|
|
|
386
413
|
|
|
387
414
|
def get_env_smtp_port() -> int:
|
|
@@ -410,16 +437,14 @@ class OAuth2ClientConfig:
|
|
|
410
437
|
def from_env(cls, idp_name: str) -> "OAuth2ClientConfig":
|
|
411
438
|
idp_name_upper = idp_name.upper()
|
|
412
439
|
if not (
|
|
413
|
-
client_id :=
|
|
414
|
-
client_id_env_var := f"PHOENIX_OAUTH2_{idp_name_upper}_CLIENT_ID"
|
|
415
|
-
)
|
|
440
|
+
client_id := getenv(client_id_env_var := f"PHOENIX_OAUTH2_{idp_name_upper}_CLIENT_ID")
|
|
416
441
|
):
|
|
417
442
|
raise ValueError(
|
|
418
443
|
f"A client id must be set for the {idp_name} OAuth2 IDP "
|
|
419
444
|
f"via the {client_id_env_var} environment variable"
|
|
420
445
|
)
|
|
421
446
|
if not (
|
|
422
|
-
client_secret :=
|
|
447
|
+
client_secret := getenv(
|
|
423
448
|
client_secret_env_var := f"PHOENIX_OAUTH2_{idp_name_upper}_CLIENT_SECRET"
|
|
424
449
|
)
|
|
425
450
|
):
|
|
@@ -429,7 +454,7 @@ class OAuth2ClientConfig:
|
|
|
429
454
|
)
|
|
430
455
|
if not (
|
|
431
456
|
oidc_config_url := (
|
|
432
|
-
|
|
457
|
+
getenv(
|
|
433
458
|
oidc_config_url_env_var := f"PHOENIX_OAUTH2_{idp_name_upper}_OIDC_CONFIG_URL",
|
|
434
459
|
)
|
|
435
460
|
)
|
|
@@ -447,7 +472,7 @@ class OAuth2ClientConfig:
|
|
|
447
472
|
)
|
|
448
473
|
return cls(
|
|
449
474
|
idp_name=idp_name,
|
|
450
|
-
idp_display_name=
|
|
475
|
+
idp_display_name=getenv(
|
|
451
476
|
f"PHOENIX_OAUTH2_{idp_name_upper}_DISPLAY_NAME",
|
|
452
477
|
_get_default_idp_display_name(idp_name),
|
|
453
478
|
),
|
|
@@ -541,7 +566,7 @@ def get_exported_files(directory: Path) -> list[Path]:
|
|
|
541
566
|
|
|
542
567
|
|
|
543
568
|
def get_env_port() -> int:
|
|
544
|
-
if not (port :=
|
|
569
|
+
if not (port := getenv(ENV_PHOENIX_PORT)):
|
|
545
570
|
return PORT
|
|
546
571
|
if port.isnumeric():
|
|
547
572
|
return int(port)
|
|
@@ -560,7 +585,7 @@ def get_env_port() -> int:
|
|
|
560
585
|
|
|
561
586
|
|
|
562
587
|
def get_env_grpc_port() -> int:
|
|
563
|
-
if not (port :=
|
|
588
|
+
if not (port := getenv(ENV_PHOENIX_GRPC_PORT)):
|
|
564
589
|
return GRPC_PORT
|
|
565
590
|
if port.isnumeric():
|
|
566
591
|
return int(port)
|
|
@@ -571,11 +596,11 @@ def get_env_grpc_port() -> int:
|
|
|
571
596
|
|
|
572
597
|
|
|
573
598
|
def get_env_host() -> str:
|
|
574
|
-
return
|
|
599
|
+
return getenv(ENV_PHOENIX_HOST) or HOST
|
|
575
600
|
|
|
576
601
|
|
|
577
602
|
def get_env_host_root_path() -> str:
|
|
578
|
-
if (host_root_path :=
|
|
603
|
+
if (host_root_path := getenv(ENV_PHOENIX_HOST_ROOT_PATH)) is None:
|
|
579
604
|
return HOST_ROOT_PATH
|
|
580
605
|
if not host_root_path.startswith("/"):
|
|
581
606
|
raise ValueError(
|
|
@@ -591,15 +616,15 @@ def get_env_host_root_path() -> str:
|
|
|
591
616
|
|
|
592
617
|
|
|
593
618
|
def get_env_collector_endpoint() -> Optional[str]:
|
|
594
|
-
return
|
|
619
|
+
return getenv(ENV_PHOENIX_COLLECTOR_ENDPOINT)
|
|
595
620
|
|
|
596
621
|
|
|
597
622
|
def get_env_project_name() -> str:
|
|
598
|
-
return
|
|
623
|
+
return getenv(ENV_PHOENIX_PROJECT_NAME, DEFAULT_PROJECT_NAME)
|
|
599
624
|
|
|
600
625
|
|
|
601
626
|
def get_env_database_connection_str() -> str:
|
|
602
|
-
env_url =
|
|
627
|
+
env_url = getenv(ENV_PHOENIX_SQL_DATABASE_URL)
|
|
603
628
|
if env_url is None:
|
|
604
629
|
working_dir = get_working_dir()
|
|
605
630
|
return f"sqlite:///{working_dir}/phoenix.db"
|
|
@@ -609,11 +634,11 @@ def get_env_database_connection_str() -> str:
|
|
|
609
634
|
def get_env_database_schema() -> Optional[str]:
|
|
610
635
|
if get_env_database_connection_str().startswith("sqlite"):
|
|
611
636
|
return None
|
|
612
|
-
return
|
|
637
|
+
return getenv(ENV_PHOENIX_SQL_DATABASE_SCHEMA)
|
|
613
638
|
|
|
614
639
|
|
|
615
640
|
def get_env_enable_prometheus() -> bool:
|
|
616
|
-
if (enable_promotheus :=
|
|
641
|
+
if (enable_promotheus := getenv(ENV_PHOENIX_ENABLE_PROMETHEUS)) is None or (
|
|
617
642
|
enable_promotheus_lower := enable_promotheus.lower()
|
|
618
643
|
) == "false":
|
|
619
644
|
return False
|
|
@@ -626,7 +651,7 @@ def get_env_enable_prometheus() -> bool:
|
|
|
626
651
|
|
|
627
652
|
|
|
628
653
|
def get_env_client_headers() -> dict[str, str]:
|
|
629
|
-
headers = parse_env_headers(
|
|
654
|
+
headers = parse_env_headers(getenv(ENV_PHOENIX_CLIENT_HEADERS))
|
|
630
655
|
if (api_key := get_env_phoenix_api_key()) and "authorization" not in [
|
|
631
656
|
k.lower() for k in headers
|
|
632
657
|
]:
|
|
@@ -661,7 +686,7 @@ class LoggingMode(Enum):
|
|
|
661
686
|
|
|
662
687
|
|
|
663
688
|
def get_env_logging_mode() -> LoggingMode:
|
|
664
|
-
if (logging_mode :=
|
|
689
|
+
if (logging_mode := getenv(ENV_LOGGING_MODE)) is None:
|
|
665
690
|
return LoggingMode.DEFAULT
|
|
666
691
|
try:
|
|
667
692
|
return LoggingMode(logging_mode.lower().strip())
|
|
@@ -688,7 +713,7 @@ def get_env_db_logging_level() -> int:
|
|
|
688
713
|
|
|
689
714
|
|
|
690
715
|
def get_env_fastapi_middleware_paths() -> list[tuple[str, str]]:
|
|
691
|
-
env_value =
|
|
716
|
+
env_value = getenv(ENV_PHOENIX_FASTAPI_MIDDLEWARE_PATHS, "")
|
|
692
717
|
paths = []
|
|
693
718
|
for entry in env_value.split(","):
|
|
694
719
|
entry = entry.strip()
|
|
@@ -703,7 +728,7 @@ def get_env_fastapi_middleware_paths() -> list[tuple[str, str]]:
|
|
|
703
728
|
|
|
704
729
|
|
|
705
730
|
def get_env_gql_extension_paths() -> list[tuple[str, str]]:
|
|
706
|
-
env_value =
|
|
731
|
+
env_value = getenv(ENV_PHOENIX_GQL_EXTENSION_PATHS, "")
|
|
707
732
|
paths = []
|
|
708
733
|
for entry in env_value.split(","):
|
|
709
734
|
entry = entry.strip()
|
|
@@ -718,7 +743,7 @@ def get_env_gql_extension_paths() -> list[tuple[str, str]]:
|
|
|
718
743
|
|
|
719
744
|
|
|
720
745
|
def get_env_grpc_interceptor_paths() -> list[tuple[str, str]]:
|
|
721
|
-
env_value =
|
|
746
|
+
env_value = getenv(ENV_PHOENIX_GRPC_INTERCEPTOR_PATHS, "")
|
|
722
747
|
paths = []
|
|
723
748
|
for entry in env_value.split(","):
|
|
724
749
|
entry = entry.strip()
|
|
@@ -733,7 +758,7 @@ def get_env_grpc_interceptor_paths() -> list[tuple[str, str]]:
|
|
|
733
758
|
|
|
734
759
|
|
|
735
760
|
def _get_logging_level(env_var: str, default_level: int) -> int:
|
|
736
|
-
logging_level =
|
|
761
|
+
logging_level = getenv(env_var)
|
|
737
762
|
if not logging_level:
|
|
738
763
|
return default_level
|
|
739
764
|
|
|
@@ -753,7 +778,7 @@ def _get_logging_level(env_var: str, default_level: int) -> int:
|
|
|
753
778
|
|
|
754
779
|
|
|
755
780
|
def get_env_log_migrations() -> bool:
|
|
756
|
-
log_migrations =
|
|
781
|
+
log_migrations = getenv(ENV_LOG_MIGRATIONS)
|
|
757
782
|
# Default to True
|
|
758
783
|
if log_migrations is None:
|
|
759
784
|
return True
|
|
@@ -4,7 +4,6 @@ import asyncio
|
|
|
4
4
|
import importlib.util
|
|
5
5
|
import inspect
|
|
6
6
|
import json
|
|
7
|
-
import os
|
|
8
7
|
import time
|
|
9
8
|
from abc import ABC, abstractmethod
|
|
10
9
|
from collections.abc import AsyncIterator, Callable, Iterator
|
|
@@ -22,6 +21,7 @@ from strawberry import UNSET
|
|
|
22
21
|
from strawberry.scalars import JSON as JSONScalarType
|
|
23
22
|
from typing_extensions import TypeAlias, assert_never
|
|
24
23
|
|
|
24
|
+
from phoenix.config import getenv
|
|
25
25
|
from phoenix.evals.models.rate_limiters import (
|
|
26
26
|
AsyncCallable,
|
|
27
27
|
GenericType,
|
|
@@ -483,8 +483,8 @@ class OpenAIStreamingClient(OpenAIBaseStreamingClient):
|
|
|
483
483
|
) -> None:
|
|
484
484
|
from openai import AsyncOpenAI
|
|
485
485
|
|
|
486
|
-
base_url = model.base_url or
|
|
487
|
-
if not (api_key := api_key or
|
|
486
|
+
base_url = model.base_url or getenv("OPENAI_BASE_URL")
|
|
487
|
+
if not (api_key := api_key or getenv("OPENAI_API_KEY")):
|
|
488
488
|
if not base_url:
|
|
489
489
|
raise BadRequest("An API key is required for OpenAI models")
|
|
490
490
|
api_key = "sk-fake-api-key"
|
|
@@ -656,11 +656,11 @@ class AzureOpenAIStreamingClient(OpenAIBaseStreamingClient):
|
|
|
656
656
|
):
|
|
657
657
|
from openai import AsyncAzureOpenAI
|
|
658
658
|
|
|
659
|
-
if not (api_key := api_key or
|
|
659
|
+
if not (api_key := api_key or getenv("AZURE_OPENAI_API_KEY")):
|
|
660
660
|
raise BadRequest("An Azure API key is required for Azure OpenAI models")
|
|
661
|
-
if not (endpoint := model.endpoint or
|
|
661
|
+
if not (endpoint := model.endpoint or getenv("AZURE_OPENAI_ENDPOINT")):
|
|
662
662
|
raise BadRequest("An Azure endpoint is required for Azure OpenAI models")
|
|
663
|
-
if not (api_version := model.api_version or
|
|
663
|
+
if not (api_version := model.api_version or getenv("OPENAI_API_VERSION")):
|
|
664
664
|
raise BadRequest("An OpenAI API version is required for Azure OpenAI models")
|
|
665
665
|
client = AsyncAzureOpenAI(
|
|
666
666
|
api_key=api_key,
|
|
@@ -697,7 +697,7 @@ class AnthropicStreamingClient(PlaygroundStreamingClient):
|
|
|
697
697
|
super().__init__(model=model, api_key=api_key)
|
|
698
698
|
self._attributes[LLM_PROVIDER] = OpenInferenceLLMProviderValues.ANTHROPIC.value
|
|
699
699
|
self._attributes[LLM_SYSTEM] = OpenInferenceLLMSystemValues.ANTHROPIC.value
|
|
700
|
-
if not (api_key := api_key or
|
|
700
|
+
if not (api_key := api_key or getenv("ANTHROPIC_API_KEY")):
|
|
701
701
|
raise BadRequest("An API key is required for Anthropic models")
|
|
702
702
|
self.client = anthropic.AsyncAnthropic(api_key=api_key)
|
|
703
703
|
self.model_name = model.name
|
|
@@ -877,11 +877,7 @@ class GeminiStreamingClient(PlaygroundStreamingClient):
|
|
|
877
877
|
super().__init__(model=model, api_key=api_key)
|
|
878
878
|
self._attributes[LLM_PROVIDER] = OpenInferenceLLMProviderValues.GOOGLE.value
|
|
879
879
|
self._attributes[LLM_SYSTEM] = OpenInferenceLLMSystemValues.VERTEXAI.value
|
|
880
|
-
if not (
|
|
881
|
-
api_key := api_key
|
|
882
|
-
or os.environ.get("GEMINI_API_KEY")
|
|
883
|
-
or os.environ.get("GOOGLE_API_KEY")
|
|
884
|
-
):
|
|
880
|
+
if not (api_key := api_key or getenv("GEMINI_API_KEY") or getenv("GOOGLE_API_KEY")):
|
|
885
881
|
raise BadRequest("An API key is required for Gemini models")
|
|
886
882
|
google_genai.configure(api_key=api_key)
|
|
887
883
|
self.model_name = model.name
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import os
|
|
2
1
|
from enum import Enum
|
|
3
2
|
from typing import Any, ClassVar, Optional, Union
|
|
4
3
|
|
|
5
4
|
import strawberry
|
|
6
5
|
from openinference.semconv.trace import OpenInferenceLLMProviderValues, SpanAttributes
|
|
7
6
|
|
|
7
|
+
from phoenix.config import getenv
|
|
8
8
|
from phoenix.trace.attributes import get_attribute_value
|
|
9
9
|
|
|
10
10
|
|
|
@@ -72,7 +72,7 @@ class GenerativeProvider:
|
|
|
72
72
|
|
|
73
73
|
@strawberry.field(description="Whether the credentials are set on the server for the provider") # type: ignore
|
|
74
74
|
async def api_key_set(self) -> bool:
|
|
75
|
-
return
|
|
75
|
+
return getenv(self.model_provider_to_api_key_env_var_map[self.key]) is not None
|
|
76
76
|
|
|
77
77
|
@classmethod
|
|
78
78
|
def _infer_model_provider_from_model_name(
|
phoenix/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "7.12.
|
|
1
|
+
__version__ = "7.12.3"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|