diff --git a/backend/open_webui/routers/openai.py b/backend/open_webui/routers/openai.py index b2ada1c8a3..8aa8eff36e 100644 --- a/backend/open_webui/routers/openai.py +++ b/backend/open_webui/routers/openai.py @@ -687,9 +687,18 @@ async def verify_connection( if auth_type not in ('azure_ad', 'microsoft_entra_id'): headers['api-key'] = key - api_version = api_config.get('api_version', '') or '2023-03-15-preview' + # Azure v1 format: base URL already ends with /openai/v1, + # use standard /models endpoint without api-version. + is_azure_v1 = bool(re.search(r'/openai/v1(?:/|$)', url)) + + if is_azure_v1: + verify_url = f'{url.rstrip("/")}/models' + else: + api_version = api_config.get('api_version', '') or '2023-03-15-preview' + verify_url = f'{url}/openai/models?api-version={api_version}' + async with session.get( - url=f'{url}/openai/models?api-version={api_version}', + url=verify_url, headers=headers, cookies=cookies, ssl=AIOHTTP_CLIENT_SESSION_SSL, @@ -1305,11 +1314,32 @@ async def embeddings(request: Request, form_data: dict, user): streaming = False headers, cookies = await get_headers_and_cookies(request, url, key, api_config, user=user) + + if api_config.get('azure') or api_config.get('provider') == 'azure': + # Only set api-key header if not using Azure Entra ID authentication + auth_type = api_config.get('auth_type', 'bearer') + if auth_type not in ('azure_ad', 'microsoft_entra_id'): + headers['api-key'] = key + + # Azure v1 format: base URL already ends with /openai/v1, + # model stays in the payload, no deployment URL rewriting. + is_azure_v1 = bool(re.search(r'/openai/v1(?:/|$)', url)) + + if is_azure_v1: + embeddings_url = f'{url.rstrip("/")}/embeddings' + else: + api_version = api_config.get('api_version', '2023-03-15-preview') + model = _sanitize_model_for_url(form_data.get('model', '')) + embeddings_url = f'{url}/openai/deployments/{model}/embeddings?api-version={api_version}' + headers['api-version'] = api_version + else: + embeddings_url = f'{url}/embeddings' + try: session = await get_session() r = await session.request( method='POST', - url=f'{url}/embeddings', + url=embeddings_url, data=body, headers=headers, cookies=cookies, diff --git a/src/lib/components/AddConnectionModal.svelte b/src/lib/components/AddConnectionModal.svelte index 05a0ca50a5..37f4a7eb68 100644 --- a/src/lib/components/AddConnectionModal.svelte +++ b/src/lib/components/AddConnectionModal.svelte @@ -41,7 +41,8 @@ provider === 'azure' || ((url.includes('azure.') || url.includes('cognitive.microsoft.com')) && !direct && - provider === ''); + provider === '' && + !/\/openai\/v1(\/|$)/.test(url)); let prefixId = ''; let enable = true; @@ -392,9 +393,7 @@ {#if !direct} - {#if azure} - - {/if} + {/if} {/if} @@ -523,7 +522,7 @@