Skip to content

Commit 84a7329

Browse files
fix(secret_managers/get_azure_Ad_token_providers.py): infer credential type from env var
don't default to ClientSecretCredential unless present in env var
1 parent 3f3efea commit 84a7329

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

litellm/llms/azure/common_utils.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,9 @@ def initialize_azure_sdk_client(
561561
"Using Azure AD token provider based on Service Principal with Secret workflow for Azure Auth"
562562
)
563563
try:
564-
azure_ad_token_provider = get_azure_ad_token_provider(azure_scope=scope)
564+
azure_ad_token_provider = get_azure_ad_token_provider(
565+
azure_scope=scope,
566+
)
565567
except ValueError:
566568
verbose_logger.debug("Azure AD Token Provider could not be used.")
567569
if api_version is None:

litellm/proxy/_new_secret_config.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,11 @@ model_list:
77
- model_name: wildcard_models/*
88
litellm_params:
99
model: openai/*
10+
- model_name: gpt-4o
11+
litellm_params:
12+
model: azure/gpt-4o
13+
api_base: https://cog-cuda-atg-sage-eastus2.openai.azure.com
14+
api_version: 2025-04-01-preview
15+
16+
litellm_settings:
17+
enable_azure_ad_token_refresh: true

litellm/secret_managers/get_azure_ad_token_provider.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,36 @@
11
import os
22
from typing import Any, Callable, Optional, Union
33

4+
from litellm._logging import verbose_logger
45
from litellm.types.secret_managers.get_azure_ad_token_provider import (
56
AzureCredentialType,
67
)
78

89

10+
def infer_credential_type_from_environment() -> AzureCredentialType:
11+
if (
12+
os.environ.get("AZURE_CLIENT_ID")
13+
and os.environ.get("AZURE_CLIENT_SECRET")
14+
and os.environ.get("AZURE_TENANT_ID")
15+
):
16+
return AzureCredentialType.ClientSecretCredential
17+
elif os.environ.get("AZURE_CLIENT_ID"):
18+
return AzureCredentialType.ManagedIdentityCredential
19+
elif (
20+
os.environ.get("AZURE_CLIENT_ID")
21+
and os.environ.get("AZURE_TENANT_ID")
22+
and os.environ.get("AZURE_CERTIFICATE_PATH")
23+
and os.environ.get("AZURE_CERTIFICATE_PASSWORD")
24+
):
25+
return AzureCredentialType.CertificateCredential
26+
elif os.environ.get("AZURE_CERTIFICATE_PASSWORD"):
27+
return AzureCredentialType.CertificateCredential
28+
elif os.environ.get("AZURE_CERTIFICATE_PATH"):
29+
return AzureCredentialType.CertificateCredential
30+
else:
31+
return AzureCredentialType.DefaultAzureCredential
32+
33+
934
def get_azure_ad_token_provider(
1035
azure_scope: Optional[str] = None,
1136
azure_credential: Optional[AzureCredentialType] = None,
@@ -42,9 +67,14 @@ def get_azure_ad_token_provider(
4267
)
4368

4469
cred: str = (
45-
azure_credential.value if azure_credential else None
46-
or os.environ.get("AZURE_CREDENTIAL", AzureCredentialType.ClientSecretCredential)
47-
or AzureCredentialType.ClientSecretCredential
70+
azure_credential.value
71+
if azure_credential
72+
else None
73+
or os.environ.get("AZURE_CREDENTIAL")
74+
or infer_credential_type_from_environment()
75+
)
76+
verbose_logger.info(
77+
f"For Azure AD Token Provider, choosing credential type: {cred}"
4878
)
4979
credential: Optional[
5080
Union[

0 commit comments

Comments
 (0)