diff --git a/.azdo/pipelines/azure-dev.yml b/.azdo/pipelines/azure-dev.yml index 24a3a70848..00d801010d 100644 --- a/.azdo/pipelines/azure-dev.yml +++ b/.azdo/pipelines/azure-dev.yml @@ -44,7 +44,6 @@ steps: AZURE_LOCATION: $(AZURE_LOCATION) AZD_INITIAL_ENVIRONMENT_CONFIG: $(AZD_INITIAL_ENVIRONMENT_CONFIG) AZURE_OPENAI_SERVICE: $(AZURE_OPENAI_SERVICE) - AZURE_OPENAI_API_VERSION: $(AZURE_OPENAI_API_VERSION) AZURE_OPENAI_LOCATION: $(AZURE_OPENAI_LOCATION) AZURE_OPENAI_RESOURCE_GROUP: $(AZURE_OPENAI_RESOURCE_GROUP) AZURE_DOCUMENTINTELLIGENCE_SERVICE: $(AZURE_DOCUMENTINTELLIGENCE_SERVICE) diff --git a/.github/workflows/azure-dev.yml b/.github/workflows/azure-dev.yml index 480f27fa9f..2b87e99a5d 100644 --- a/.github/workflows/azure-dev.yml +++ b/.github/workflows/azure-dev.yml @@ -31,7 +31,6 @@ jobs: # project specific AZURE_OPENAI_SERVICE: ${{ vars.AZURE_OPENAI_SERVICE }} AZURE_OPENAI_LOCATION: ${{ vars.AZURE_OPENAI_LOCATION }} - AZURE_OPENAI_API_VERSION: ${{ vars.AZURE_OPENAI_API_VERSION }} AZURE_OPENAI_RESOURCE_GROUP: ${{ vars.AZURE_OPENAI_RESOURCE_GROUP }} AZURE_DOCUMENTINTELLIGENCE_SERVICE: ${{ vars.AZURE_DOCUMENTINTELLIGENCE_SERVICE }} AZURE_DOCUMENTINTELLIGENCE_RESOURCE_GROUP: ${{ vars.AZURE_DOCUMENTINTELLIGENCE_RESOURCE_GROUP }} diff --git a/.github/workflows/evaluate.yaml b/.github/workflows/evaluate.yaml index f4fd9e74b3..be730d1c68 100644 --- a/.github/workflows/evaluate.yaml +++ b/.github/workflows/evaluate.yaml @@ -29,7 +29,6 @@ jobs: # project specific AZURE_OPENAI_SERVICE: ${{ vars.AZURE_OPENAI_SERVICE }} AZURE_OPENAI_LOCATION: ${{ vars.AZURE_OPENAI_LOCATION }} - AZURE_OPENAI_API_VERSION: ${{ vars.AZURE_OPENAI_API_VERSION }} AZURE_OPENAI_RESOURCE_GROUP: ${{ vars.AZURE_OPENAI_RESOURCE_GROUP }} AZURE_DOCUMENTINTELLIGENCE_SERVICE: ${{ vars.AZURE_DOCUMENTINTELLIGENCE_SERVICE }} AZURE_DOCUMENTINTELLIGENCE_RESOURCE_GROUP: ${{ vars.AZURE_DOCUMENTINTELLIGENCE_RESOURCE_GROUP }} diff --git a/app/backend/app.py b/app/backend/app.py index 62707e0cd7..d7f69fd5ba 100644 --- a/app/backend/app.py +++ b/app/backend/app.py @@ -426,8 +426,6 @@ async def setup_clients(): os.getenv("AZURE_OPENAI_EMB_DEPLOYMENT") if OPENAI_HOST in [OpenAIHost.AZURE, OpenAIHost.AZURE_CUSTOM] else None ) AZURE_OPENAI_CUSTOM_URL = os.getenv("AZURE_OPENAI_CUSTOM_URL") - # https://learn.microsoft.com/azure/ai-services/openai/api-version-deprecation#latest-ga-api-release - AZURE_OPENAI_API_VERSION = os.getenv("AZURE_OPENAI_API_VERSION") or "2024-10-21" AZURE_VISION_ENDPOINT = os.getenv("AZURE_VISION_ENDPOINT", "") AZURE_OPENAI_API_KEY_OVERRIDE = os.getenv("AZURE_OPENAI_API_KEY_OVERRIDE") # Used only with non-Azure OpenAI deployments @@ -563,7 +561,6 @@ async def setup_clients(): openai_client = setup_openai_client( openai_host=OPENAI_HOST, azure_credential=azure_credential, - azure_openai_api_version=AZURE_OPENAI_API_VERSION, azure_openai_service=AZURE_OPENAI_SERVICE, azure_openai_custom_url=AZURE_OPENAI_CUSTOM_URL, azure_openai_api_key=AZURE_OPENAI_API_KEY_OVERRIDE, @@ -609,7 +606,6 @@ async def setup_clients(): azure_openai_service=AZURE_OPENAI_SERVICE, azure_openai_custom_url=AZURE_OPENAI_CUSTOM_URL, azure_openai_deployment=AZURE_OPENAI_EMB_DEPLOYMENT, - azure_openai_api_version=AZURE_OPENAI_API_VERSION, azure_openai_key=clean_key_if_exists(AZURE_OPENAI_API_KEY_OVERRIDE), openai_key=clean_key_if_exists(OPENAI_API_KEY), openai_org=OPENAI_ORGANIZATION, diff --git a/app/backend/prepdocs.py b/app/backend/prepdocs.py index 7ec157c08a..db7f276be2 100644 --- a/app/backend/prepdocs.py +++ b/app/backend/prepdocs.py @@ -9,7 +9,7 @@ from azure.core.credentials import AzureKeyCredential from azure.core.credentials_async import AsyncTokenCredential from azure.identity.aio import AzureDeveloperCliCredential, get_bearer_token_provider -from openai import AsyncAzureOpenAI, AsyncOpenAI +from openai import AsyncOpenAI from rich.logging import RichHandler from load_azd_env import load_azd_env @@ -164,7 +164,6 @@ def setup_embeddings_service( azure_openai_custom_url: Union[str, None], azure_openai_deployment: Union[str, None], azure_openai_key: Union[str, None], - azure_openai_api_version: str, openai_key: Union[str, None], openai_org: Union[str, None], disable_vectors: bool = False, @@ -184,7 +183,6 @@ def setup_embeddings_service( open_ai_deployment=azure_openai_deployment, open_ai_model_name=emb_model_name, open_ai_dimensions=emb_model_dimensions, - open_ai_api_version=azure_openai_api_version, credential=azure_open_ai_credential, disable_batch=disable_batch_vectors, ) @@ -204,7 +202,6 @@ def setup_openai_client( openai_host: OpenAIHost, azure_credential: AsyncTokenCredential, azure_openai_api_key: Union[str, None] = None, - azure_openai_api_version: Union[str, None] = None, azure_openai_service: Union[str, None] = None, azure_openai_custom_url: Union[str, None] = None, openai_api_key: Union[str, None] = None, @@ -228,16 +225,15 @@ def setup_openai_client( endpoint = f"https://{azure_openai_service}.openai.azure.com" if azure_openai_api_key: logger.info("AZURE_OPENAI_API_KEY_OVERRIDE found, using as api_key for Azure OpenAI client") - openai_client = AsyncAzureOpenAI( - api_version=azure_openai_api_version, azure_endpoint=endpoint, api_key=azure_openai_api_key + openai_client = AsyncOpenAI( + base_url=f"{endpoint}/openai/v1", api_key=azure_openai_api_key ) else: logger.info("Using Azure credential (passwordless authentication) for Azure OpenAI client") token_provider = get_bearer_token_provider(azure_credential, "https://cognitiveservices.azure.com/.default") - openai_client = AsyncAzureOpenAI( - api_version=azure_openai_api_version, - azure_endpoint=endpoint, - azure_ad_token_provider=token_provider, + openai_client = AsyncOpenAI( + base_url=f"{endpoint}/openai/v1", + api_key=token_provider, ) elif openai_host == OpenAIHost.LOCAL: logger.info("OPENAI_HOST is local, setting up local OpenAI client for OPENAI_BASE_URL with no key") @@ -509,8 +505,6 @@ async def main(strategy: Strategy, setup_index: bool = True): datalake_key=clean_key_if_exists(args.datalakekey), ) - # https://learn.microsoft.com/azure/ai-services/openai/api-version-deprecation#latest-ga-api-release - azure_openai_api_version = os.getenv("AZURE_OPENAI_API_VERSION") or "2024-06-01" emb_model_dimensions = 1536 if os.getenv("AZURE_OPENAI_EMB_DIMENSIONS"): emb_model_dimensions = int(os.environ["AZURE_OPENAI_EMB_DIMENSIONS"]) @@ -522,7 +516,6 @@ async def main(strategy: Strategy, setup_index: bool = True): azure_openai_service=os.getenv("AZURE_OPENAI_SERVICE"), azure_openai_custom_url=os.getenv("AZURE_OPENAI_CUSTOM_URL"), azure_openai_deployment=os.getenv("AZURE_OPENAI_EMB_DEPLOYMENT"), - azure_openai_api_version=azure_openai_api_version, azure_openai_key=os.getenv("AZURE_OPENAI_API_KEY_OVERRIDE"), openai_key=clean_key_if_exists(os.getenv("OPENAI_API_KEY")), openai_org=os.getenv("OPENAI_ORGANIZATION"), @@ -532,7 +525,6 @@ async def main(strategy: Strategy, setup_index: bool = True): openai_client = setup_openai_client( openai_host=OPENAI_HOST, azure_credential=azd_credential, - azure_openai_api_version=azure_openai_api_version, azure_openai_service=os.getenv("AZURE_OPENAI_SERVICE"), azure_openai_custom_url=os.getenv("AZURE_OPENAI_CUSTOM_URL"), azure_openai_api_key=os.getenv("AZURE_OPENAI_API_KEY_OVERRIDE"), diff --git a/app/backend/prepdocslib/embeddings.py b/app/backend/prepdocslib/embeddings.py index 3d1af5d293..0a4e44f9e3 100644 --- a/app/backend/prepdocslib/embeddings.py +++ b/app/backend/prepdocslib/embeddings.py @@ -9,7 +9,7 @@ from azure.core.credentials import AzureKeyCredential from azure.core.credentials_async import AsyncTokenCredential from azure.identity.aio import get_bearer_token_provider -from openai import AsyncAzureOpenAI, AsyncOpenAI, RateLimitError +from openai import AsyncOpenAI, RateLimitError from tenacity import ( AsyncRetrying, retry_if_exception_type, @@ -164,12 +164,11 @@ def __init__( open_ai_deployment: Union[str, None], open_ai_model_name: str, open_ai_dimensions: int, - open_ai_api_version: str, credential: Union[AsyncTokenCredential, AzureKeyCredential], open_ai_custom_url: Union[str, None] = None, disable_batch: bool = False, ): - super().__init__(open_ai_model_name, open_ai_dimensions, disable_batch) + super().__init__(open_ai_deployment or open_ai_model_name, open_ai_dimensions, disable_batch) self.open_ai_service = open_ai_service if open_ai_service: self.open_ai_endpoint = f"https://{open_ai_service}.openai.azure.com" @@ -178,28 +177,28 @@ def __init__( else: raise ValueError("Either open_ai_service or open_ai_custom_url must be provided") self.open_ai_deployment = open_ai_deployment - self.open_ai_api_version = open_ai_api_version self.credential = credential async def create_client(self) -> AsyncOpenAI: class AuthArgs(TypedDict, total=False): api_key: str - azure_ad_token_provider: Callable[[], Union[str, Awaitable[str]]] auth_args = AuthArgs() if isinstance(self.credential, AzureKeyCredential): auth_args["api_key"] = self.credential.key elif isinstance(self.credential, AsyncTokenCredential): - auth_args["azure_ad_token_provider"] = get_bearer_token_provider( + token_provider = get_bearer_token_provider( self.credential, "https://cognitiveservices.azure.com/.default" ) + auth_args["api_key"] = token_provider else: raise TypeError("Invalid credential type") - return AsyncAzureOpenAI( - azure_endpoint=self.open_ai_endpoint, - azure_deployment=self.open_ai_deployment, - api_version=self.open_ai_api_version, + # For Azure OpenAI, we need to use the v1 endpoint + base_url = f"{self.open_ai_endpoint}/openai/v1" + + return AsyncOpenAI( + base_url=base_url, **auth_args, ) diff --git a/app/backend/requirements.in b/app/backend/requirements.in index 1110ef5546..d35e878dfa 100644 --- a/app/backend/requirements.in +++ b/app/backend/requirements.in @@ -1,7 +1,7 @@ azure-identity quart quart-cors -openai>=1.3.7 +openai>=1.108.1 tiktoken tenacity azure-ai-documentintelligence==1.0.0b4 diff --git a/docs/reasoning.md b/docs/reasoning.md index 45dbb3a99e..3067e977da 100644 --- a/docs/reasoning.md +++ b/docs/reasoning.md @@ -31,7 +31,6 @@ This repository includes an optional feature that uses reasoning models to gener azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT gpt-5 azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT_VERSION 2025-08-07 azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT_SKU GlobalStandard - azd env set AZURE_OPENAI_API_VERSION 2025-04-01-preview ``` For gpt-5-mini: @@ -41,7 +40,6 @@ This repository includes an optional feature that uses reasoning models to gener azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT gpt-5-mini azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT_VERSION 2025-08-07 azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT_SKU GlobalStandard - azd env set AZURE_OPENAI_API_VERSION 2025-04-01-preview ``` For gpt-5-nano: @@ -51,7 +49,6 @@ This repository includes an optional feature that uses reasoning models to gener azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT gpt-5-nano azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT_VERSION 2025-08-07 azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT_SKU GlobalStandard - azd env set AZURE_OPENAI_API_VERSION 2025-04-01-preview ``` For o4-mini: @@ -61,7 +58,6 @@ This repository includes an optional feature that uses reasoning models to gener azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT o4-mini azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT_VERSION 2025-04-16 azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT_SKU GlobalStandard - azd env set AZURE_OPENAI_API_VERSION 2025-04-01-preview ``` For o3: @@ -71,7 +67,6 @@ This repository includes an optional feature that uses reasoning models to gener azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT o3 azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT_VERSION 2025-04-16 azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT_SKU GlobalStandard - azd env set AZURE_OPENAI_API_VERSION 2025-04-01-preview ``` For o3-mini: (No vision support) @@ -81,7 +76,6 @@ This repository includes an optional feature that uses reasoning models to gener azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT o4-mini azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT_VERSION 2025-04-16 azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT_SKU GlobalStandard - azd env set AZURE_OPENAI_API_VERSION 2025-04-01-preview ``` For o1: (No streaming support) @@ -91,7 +85,6 @@ This repository includes an optional feature that uses reasoning models to gener azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT o1 azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT_VERSION 2024-12-17 azd env set AZURE_OPENAI_CHATGPT_DEPLOYMENT_SKU GlobalStandard - azd env set AZURE_OPENAI_API_VERSION 2024-12-01-preview ``` 2. **(Optional) Set default reasoning effort** diff --git a/infra/main.bicep b/infra/main.bicep index 91af1d8420..e49a5edc41 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -56,7 +56,6 @@ param openAiHost string // Set in main.parameters.json param isAzureOpenAiHost bool = startsWith(openAiHost, 'azure') param deployAzureOpenAi bool = openAiHost == 'azure' param azureOpenAiCustomUrl string = '' -param azureOpenAiApiVersion string = '' @secure() param azureOpenAiApiKey string = '' param azureOpenAiDisableKeys bool = true @@ -442,7 +441,6 @@ var appEnvVariables = { AZURE_OPENAI_EMB_DEPLOYMENT: embedding.deploymentName AZURE_OPENAI_SEARCHAGENT_MODEL: searchAgent.modelName AZURE_OPENAI_SEARCHAGENT_DEPLOYMENT: searchAgent.deploymentName - AZURE_OPENAI_API_VERSION: azureOpenAiApiVersion AZURE_OPENAI_API_KEY_OVERRIDE: azureOpenAiApiKey AZURE_OPENAI_CUSTOM_URL: azureOpenAiCustomUrl // Used only with non-Azure OpenAI deployments @@ -1346,7 +1344,6 @@ output AZURE_OPENAI_CHATGPT_MODEL string = chatGpt.modelName // Specific to Azure OpenAI output AZURE_OPENAI_SERVICE string = isAzureOpenAiHost && deployAzureOpenAi ? openAi.outputs.name : '' output AZURE_OPENAI_ENDPOINT string = isAzureOpenAiHost && deployAzureOpenAi ? openAi.outputs.endpoint : '' -output AZURE_OPENAI_API_VERSION string = isAzureOpenAiHost ? azureOpenAiApiVersion : '' output AZURE_OPENAI_RESOURCE_GROUP string = isAzureOpenAiHost ? openAiResourceGroup.name : '' output AZURE_OPENAI_CHATGPT_DEPLOYMENT string = isAzureOpenAiHost ? chatGpt.deploymentName : '' output AZURE_OPENAI_CHATGPT_DEPLOYMENT_VERSION string = isAzureOpenAiHost ? chatGpt.deploymentVersion : '' diff --git a/infra/main.parameters.json b/infra/main.parameters.json index 7a637c8022..606bbb4915 100644 --- a/infra/main.parameters.json +++ b/infra/main.parameters.json @@ -173,9 +173,6 @@ "azureOpenAiCustomUrl": { "value": "${AZURE_OPENAI_CUSTOM_URL}" }, - "azureOpenAiApiVersion": { - "value": "${AZURE_OPENAI_API_VERSION}" - }, "azureOpenAiApiKey": { "value": "${AZURE_OPENAI_API_KEY_OVERRIDE}" },