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.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arize-phoenix
3
- Version: 7.12.2
3
+ Version: 7.12.3
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=VVMHrWN31tln3Zo4z6ofecrV4daiqJjLd8r85mqlxek,10939
3
- phoenix/config.py,sha256=9cda9bRDiN3pwf7D8_erOmfbiW4Vs1jsR5Dy1ugsRV8,26466
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=WmgZ_39xxpi-JHjL2z86DumX1qR0MPVwHwyeuWN_3ss,23
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=U9EwldYQtQrubT0cJDzUAo4Y7n18_xoU9uIKPYHiBHs,39890
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=Zg2WcCPiM5xmQrOrfm8-Lp9srRiqNaVGeBnyNBTr390,3925
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.2.dist-info/METADATA,sha256=nJgYrfWkxDNnpl-0GmYDAM3LP_v8DnwehuhKeLScCb0,23390
341
- arize_phoenix-7.12.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
342
- arize_phoenix-7.12.2.dist-info/entry_points.txt,sha256=Pgpn8Upxx9P8z8joPXZWl2LlnAlGc3gcQoVchb06X1Q,94
343
- arize_phoenix-7.12.2.dist-info/licenses/IP_NOTICE,sha256=JBqyyCYYxGDfzQ0TtsQgjts41IJoa-hiwDrBjCb9gHM,469
344
- arize_phoenix-7.12.2.dist-info/licenses/LICENSE,sha256=HFkW9REuMOkvKRACuwLPT0hRydHb3zNg-fdFt94td18,3794
345
- arize_phoenix-7.12.2.dist-info/RECORD,,
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
- os.getenv(ENV_PHOENIX_SERVER_INSTRUMENTATION_OTLP_TRACE_COLLECTOR_HTTP_ENDPOINT)
166
- ) or bool(os.getenv(ENV_PHOENIX_SERVER_INSTRUMENTATION_OTLP_TRACE_COLLECTOR_GRPC_ENDPOINT))
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 = os.getenv(ENV_PHOENIX_WORKING_DIR)
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 := os.environ.get(env_var)) is None:
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 := os.environ.get(env_var)) is None:
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 := os.environ.get(env_var)) is None:
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 = os.environ.get(ENV_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 os.environ.get(ENV_PHOENIX_DEFAULT_ADMIN_INITIAL_PASSWORD) or DEFAULT_ADMIN_PASSWORD
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 os.environ.get(ENV_PHOENIX_API_KEY)
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 := os.getenv(ENV_PHOENIX_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 os.getenv(ENV_PHOENIX_SMTP_USERNAME) or ""
399
+ return getenv(ENV_PHOENIX_SMTP_USERNAME, "")
373
400
 
374
401
 
375
402
  def get_env_smtp_password() -> str:
376
- return os.getenv(ENV_PHOENIX_SMTP_PASSWORD) or ""
403
+ return getenv(ENV_PHOENIX_SMTP_PASSWORD, "")
377
404
 
378
405
 
379
406
  def get_env_smtp_mail_from() -> str:
380
- return os.getenv(ENV_PHOENIX_SMTP_MAIL_FROM) or "noreply@arize.com"
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 os.getenv(ENV_PHOENIX_SMTP_HOSTNAME) or ""
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 := os.getenv(
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 := os.getenv(
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
- os.getenv(
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=os.getenv(
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 := os.getenv(ENV_PHOENIX_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 := os.getenv(ENV_PHOENIX_GRPC_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 os.getenv(ENV_PHOENIX_HOST) or HOST
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 := os.getenv(ENV_PHOENIX_HOST_ROOT_PATH)) is None:
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 os.getenv(ENV_PHOENIX_COLLECTOR_ENDPOINT)
619
+ return getenv(ENV_PHOENIX_COLLECTOR_ENDPOINT)
595
620
 
596
621
 
597
622
  def get_env_project_name() -> str:
598
- return os.getenv(ENV_PHOENIX_PROJECT_NAME) or DEFAULT_PROJECT_NAME
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 = os.getenv(ENV_PHOENIX_SQL_DATABASE_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 os.getenv(ENV_PHOENIX_SQL_DATABASE_SCHEMA)
637
+ return getenv(ENV_PHOENIX_SQL_DATABASE_SCHEMA)
613
638
 
614
639
 
615
640
  def get_env_enable_prometheus() -> bool:
616
- if (enable_promotheus := os.getenv(ENV_PHOENIX_ENABLE_PROMETHEUS)) is None or (
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(os.getenv(ENV_PHOENIX_CLIENT_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 := os.getenv(ENV_LOGGING_MODE)) is None:
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 = os.getenv(ENV_PHOENIX_FASTAPI_MIDDLEWARE_PATHS, "")
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 = os.getenv(ENV_PHOENIX_GQL_EXTENSION_PATHS, "")
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 = os.getenv(ENV_PHOENIX_GRPC_INTERCEPTOR_PATHS, "")
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 = os.getenv(env_var)
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 = os.getenv(ENV_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 os.environ.get("OPENAI_BASE_URL")
487
- if not (api_key := api_key or os.environ.get("OPENAI_API_KEY")):
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 os.environ.get("AZURE_OPENAI_API_KEY")):
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 os.environ.get("AZURE_OPENAI_ENDPOINT")):
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 os.environ.get("OPENAI_API_VERSION")):
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 os.environ.get("ANTHROPIC_API_KEY")):
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 os.environ.get(self.model_provider_to_api_key_env_var_map[self.key]) is not None
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.2"
1
+ __version__ = "7.12.3"