From bc6afc905706afce70a235ba4ada78c7468ec360 Mon Sep 17 00:00:00 2001 From: Andreas Fuerer Date: Tue, 2 Sep 2025 15:37:15 +0200 Subject: [PATCH 1/2] feature: Azure OpenAI image generation support The image generation API used on Azure OpenAI requires to specify the API version by appending an `api-version` query parameter to the endpoint URL. Added the environment variable `IMAGES_OPENAI_API_VERSION` with configuration functionality in the administration UI. --- backend/open_webui/config.py | 6 +++ backend/open_webui/main.py | 2 + backend/open_webui/routers/images.py | 12 ++++- .../components/admin/Settings/Images.svelte | 48 ++++++++++++++----- 4 files changed, 54 insertions(+), 14 deletions(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index d62b219668..069faab439 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -3100,6 +3100,12 @@ IMAGES_OPENAI_API_BASE_URL = PersistentConfig( "image_generation.openai.api_base_url", os.getenv("IMAGES_OPENAI_API_BASE_URL", OPENAI_API_BASE_URL), ) +IMAGES_OPENAI_API_VERSION = PersistentConfig( + "IMAGES_OPENAI_API_VERSION", + "image_generation.openai.api_version", + os.getenv("IMAGES_OPENAI_API_VERSION", ""), +) + IMAGES_OPENAI_API_KEY = PersistentConfig( "IMAGES_OPENAI_API_KEY", "image_generation.openai.api_key", diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 2245be5bb7..e8c0e267fc 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -157,6 +157,7 @@ from open_webui.config import ( IMAGE_SIZE, IMAGE_STEPS, IMAGES_OPENAI_API_BASE_URL, + IMAGES_OPENAI_API_VERSION, IMAGES_OPENAI_API_KEY, IMAGES_GEMINI_API_BASE_URL, IMAGES_GEMINI_API_KEY, @@ -1019,6 +1020,7 @@ app.state.config.ENABLE_IMAGE_GENERATION = ENABLE_IMAGE_GENERATION app.state.config.ENABLE_IMAGE_PROMPT_GENERATION = ENABLE_IMAGE_PROMPT_GENERATION app.state.config.IMAGES_OPENAI_API_BASE_URL = IMAGES_OPENAI_API_BASE_URL +app.state.config.IMAGES_OPENAI_API_VERSION = IMAGES_OPENAI_API_VERSION app.state.config.IMAGES_OPENAI_API_KEY = IMAGES_OPENAI_API_KEY app.state.config.IMAGES_GEMINI_API_BASE_URL = IMAGES_GEMINI_API_BASE_URL diff --git a/backend/open_webui/routers/images.py b/backend/open_webui/routers/images.py index 9311cb6e2c..f10a9e1690 100644 --- a/backend/open_webui/routers/images.py +++ b/backend/open_webui/routers/images.py @@ -48,6 +48,7 @@ async def get_config(request: Request, user=Depends(get_admin_user)): "prompt_generation": request.app.state.config.ENABLE_IMAGE_PROMPT_GENERATION, "openai": { "OPENAI_API_BASE_URL": request.app.state.config.IMAGES_OPENAI_API_BASE_URL, + "OPENAI_API_VERSION": request.app.state.config.IMAGES_OPENAI_API_VERSION, "OPENAI_API_KEY": request.app.state.config.IMAGES_OPENAI_API_KEY, }, "automatic1111": { @@ -72,6 +73,7 @@ async def get_config(request: Request, user=Depends(get_admin_user)): class OpenAIConfigForm(BaseModel): OPENAI_API_BASE_URL: str + OPENAI_API_VERSION: str OPENAI_API_KEY: str @@ -119,6 +121,9 @@ async def update_config( request.app.state.config.IMAGES_OPENAI_API_BASE_URL = ( form_data.openai.OPENAI_API_BASE_URL ) + request.app.state.config.IMAGES_OPENAI_API_VERSION = ( + form_data.openai.OPENAI_API_VERSION + ) request.app.state.config.IMAGES_OPENAI_API_KEY = form_data.openai.OPENAI_API_KEY request.app.state.config.IMAGES_GEMINI_API_BASE_URL = ( @@ -165,6 +170,7 @@ async def update_config( "prompt_generation": request.app.state.config.ENABLE_IMAGE_PROMPT_GENERATION, "openai": { "OPENAI_API_BASE_URL": request.app.state.config.IMAGES_OPENAI_API_BASE_URL, + "OPENAI_API_VERSION": request.app.state.config.IMAGES_OPENAI_API_VERSION, "OPENAI_API_KEY": request.app.state.config.IMAGES_OPENAI_API_KEY, }, "automatic1111": { @@ -543,11 +549,15 @@ async def image_generations( else {"response_format": "b64_json"} ), } + + api_version_query_param = "" + if (request.app.state.config.IMAGES_OPENAI_API_VERSION): + api_version_query_param = f"?api-version={request.app.state.config.IMAGES_OPENAI_API_VERSION}" # Use asyncio.to_thread for the requests.post call r = await asyncio.to_thread( requests.post, - url=f"{request.app.state.config.IMAGES_OPENAI_API_BASE_URL}/images/generations", + url=f"{request.app.state.config.IMAGES_OPENAI_API_BASE_URL}/images/generations{api_version_query_param}", json=data, headers=headers, ) diff --git a/src/lib/components/admin/Settings/Images.svelte b/src/lib/components/admin/Settings/Images.svelte index 100ec7ad22..37a4092231 100644 --- a/src/lib/components/admin/Settings/Images.svelte +++ b/src/lib/components/admin/Settings/Images.svelte @@ -599,20 +599,42 @@ {/if} {:else if config?.engine === 'openai'}
-
{$i18n.t('OpenAI API Config')}
+
{$i18n.t('OpenAI API Config')}
+
+
+ +
+
+
-
- - - +
+
{$i18n.t('API Key')}
+
+
+ +
+
+
+ +
+
{$i18n.t('API Version')}
+
+
+ +
{:else if config?.engine === 'gemini'} From df0d29c81c83d598aa868275e4362f30678c73a2 Mon Sep 17 00:00:00 2001 From: Andreas Fuerer Date: Tue, 2 Sep 2025 19:15:32 +0200 Subject: [PATCH 2/2] style: fix formatting issues --- backend/open_webui/routers/images.py | 8 +++++--- src/lib/components/admin/Settings/Images.svelte | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/routers/images.py b/backend/open_webui/routers/images.py index f10a9e1690..802a3e9924 100644 --- a/backend/open_webui/routers/images.py +++ b/backend/open_webui/routers/images.py @@ -549,10 +549,12 @@ async def image_generations( else {"response_format": "b64_json"} ), } - + api_version_query_param = "" - if (request.app.state.config.IMAGES_OPENAI_API_VERSION): - api_version_query_param = f"?api-version={request.app.state.config.IMAGES_OPENAI_API_VERSION}" + if request.app.state.config.IMAGES_OPENAI_API_VERSION: + api_version_query_param = ( + f"?api-version={request.app.state.config.IMAGES_OPENAI_API_VERSION}" + ) # Use asyncio.to_thread for the requests.post call r = await asyncio.to_thread( diff --git a/src/lib/components/admin/Settings/Images.svelte b/src/lib/components/admin/Settings/Images.svelte index 37a4092231..0c19e0ba71 100644 --- a/src/lib/components/admin/Settings/Images.svelte +++ b/src/lib/components/admin/Settings/Images.svelte @@ -624,7 +624,7 @@
- +
{$i18n.t('API Version')}