From 73d9d0d7db78afee938e7293a3245bf7c167a855 Mon Sep 17 00:00:00 2001 From: David Manouchehri Date: Mon, 27 May 2024 17:35:37 +0000 Subject: [PATCH] feat(azure.py): Add Azure AD cred caching for OIDC flow. --- litellm/llms/azure.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/litellm/llms/azure.py b/litellm/llms/azure.py index 4d258cff29..be8220b0ca 100644 --- a/litellm/llms/azure.py +++ b/litellm/llms/azure.py @@ -18,6 +18,9 @@ from .custom_httpx.azure_dall_e_2 import CustomHTTPTransport, AsyncCustomHTTPTra from openai import AzureOpenAI, AsyncAzureOpenAI import uuid import os +from litellm.caching import DualCache + +azure_ad_cache = DualCache() class AzureOpenAIError(Exception): @@ -153,6 +156,17 @@ def get_azure_ad_token_from_oidc(azure_ad_token: str): message="OIDC token could not be retrieved from secret manager.", ) + azure_ad_token_cache_key = json.dumps({ + "azure_client_id": azure_client_id, + "azure_tenant_id": azure_tenant_id, + "azure_authority_host": azure_authority_host, + "oidc_token": oidc_token, + }) + + azure_ad_token_access_token = azure_ad_cache.get_cache(azure_ad_token_cache_key) + if azure_ad_token_access_token is not None: + return azure_ad_token_access_token + req_token = httpx.post( f"{azure_authority_host}/{azure_tenant_id}/oauth2/v2.0/token", data={ @@ -170,14 +184,23 @@ def get_azure_ad_token_from_oidc(azure_ad_token: str): message=req_token.text, ) - possible_azure_ad_token = req_token.json().get("access_token", None) + azure_ad_token_json = req_token.json() + azure_ad_token_access_token = azure_ad_token_json.get("access_token", None) + azure_ad_token_expires_in = azure_ad_token_json.get("expires_in", None) - if possible_azure_ad_token is None: + if azure_ad_token_access_token is None: raise AzureOpenAIError( - status_code=422, message="Azure AD Token not returned" + status_code=422, message="Azure AD Token access_token not returned" ) - return possible_azure_ad_token + if azure_ad_token_expires_in is None: + raise AzureOpenAIError( + status_code=422, message="Azure AD Token expires_in not returned" + ) + + azure_ad_cache.set_cache(key=azure_ad_token_cache_key, value=azure_ad_token_access_token, ttl=azure_ad_token_expires_in) + + return azure_ad_token_access_token class AzureChatCompletion(BaseLLM):