Merge pull request #17147 from anfuerer/dev

feat: Azure OpenAI image generation support
This commit is contained in:
Tim Jaeryang Baek 2025-09-03 14:12:48 +04:00 committed by GitHub
commit 357a53eb6f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 55 additions and 13 deletions

View file

@ -3100,6 +3100,12 @@ IMAGES_OPENAI_API_BASE_URL = PersistentConfig(
"image_generation.openai.api_base_url", "image_generation.openai.api_base_url",
os.getenv("IMAGES_OPENAI_API_BASE_URL", 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 = PersistentConfig(
"IMAGES_OPENAI_API_KEY", "IMAGES_OPENAI_API_KEY",
"image_generation.openai.api_key", "image_generation.openai.api_key",

View file

@ -157,6 +157,7 @@ from open_webui.config import (
IMAGE_SIZE, IMAGE_SIZE,
IMAGE_STEPS, IMAGE_STEPS,
IMAGES_OPENAI_API_BASE_URL, IMAGES_OPENAI_API_BASE_URL,
IMAGES_OPENAI_API_VERSION,
IMAGES_OPENAI_API_KEY, IMAGES_OPENAI_API_KEY,
IMAGES_GEMINI_API_BASE_URL, IMAGES_GEMINI_API_BASE_URL,
IMAGES_GEMINI_API_KEY, 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.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_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_OPENAI_API_KEY = IMAGES_OPENAI_API_KEY
app.state.config.IMAGES_GEMINI_API_BASE_URL = IMAGES_GEMINI_API_BASE_URL app.state.config.IMAGES_GEMINI_API_BASE_URL = IMAGES_GEMINI_API_BASE_URL

View file

@ -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, "prompt_generation": request.app.state.config.ENABLE_IMAGE_PROMPT_GENERATION,
"openai": { "openai": {
"OPENAI_API_BASE_URL": request.app.state.config.IMAGES_OPENAI_API_BASE_URL, "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, "OPENAI_API_KEY": request.app.state.config.IMAGES_OPENAI_API_KEY,
}, },
"automatic1111": { "automatic1111": {
@ -72,6 +73,7 @@ async def get_config(request: Request, user=Depends(get_admin_user)):
class OpenAIConfigForm(BaseModel): class OpenAIConfigForm(BaseModel):
OPENAI_API_BASE_URL: str OPENAI_API_BASE_URL: str
OPENAI_API_VERSION: str
OPENAI_API_KEY: str OPENAI_API_KEY: str
@ -119,6 +121,9 @@ async def update_config(
request.app.state.config.IMAGES_OPENAI_API_BASE_URL = ( request.app.state.config.IMAGES_OPENAI_API_BASE_URL = (
form_data.openai.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_OPENAI_API_KEY = form_data.openai.OPENAI_API_KEY
request.app.state.config.IMAGES_GEMINI_API_BASE_URL = ( 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, "prompt_generation": request.app.state.config.ENABLE_IMAGE_PROMPT_GENERATION,
"openai": { "openai": {
"OPENAI_API_BASE_URL": request.app.state.config.IMAGES_OPENAI_API_BASE_URL, "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, "OPENAI_API_KEY": request.app.state.config.IMAGES_OPENAI_API_KEY,
}, },
"automatic1111": { "automatic1111": {
@ -544,10 +550,16 @@ async def image_generations(
), ),
} }
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 # Use asyncio.to_thread for the requests.post call
r = await asyncio.to_thread( r = await asyncio.to_thread(
requests.post, 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, json=data,
headers=headers, headers=headers,
) )

View file

@ -599,20 +599,42 @@
{/if} {/if}
{:else if config?.engine === 'openai'} {:else if config?.engine === 'openai'}
<div> <div>
<div class=" mb-1.5 text-sm font-medium">{$i18n.t('OpenAI API Config')}</div> <div class=" mb-2 text-sm font-medium">{$i18n.t('OpenAI API Config')}</div>
<div class="flex w-full">
<div class="flex-1 mr-2">
<input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
placeholder={$i18n.t('API Base URL')}
bind:value={config.openai.OPENAI_API_BASE_URL}
required
/>
</div>
</div>
</div>
<div class="flex gap-2 mb-1"> <div>
<input <div class=" mb-2 text-sm font-medium">{$i18n.t('API Key')}</div>
class="flex-1 w-full text-sm bg-transparent outline-hidden" <div class="flex w-full">
placeholder={$i18n.t('API Base URL')} <div class="flex-1 mr-2">
bind:value={config.openai.OPENAI_API_BASE_URL} <SensitiveInput
required placeholder={$i18n.t('API Key')}
/> bind:value={config.openai.OPENAI_API_KEY}
required
/>
</div>
</div>
</div>
<SensitiveInput <div>
placeholder={$i18n.t('API Key')} <div class=" mb-2 text-sm font-medium">{$i18n.t('API Version')}</div>
bind:value={config.openai.OPENAI_API_KEY} <div class="flex w-full">
/> <div class="flex-1 mr-2">
<input
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
placeholder={$i18n.t('API Version')}
bind:value={config.openai.OPENAI_API_VERSION}
/>
</div>
</div> </div>
</div> </div>
{:else if config?.engine === 'gemini'} {:else if config?.engine === 'gemini'}