diff --git a/backend/open_webui/apps/images/main.py b/backend/open_webui/apps/images/main.py index 17afd645c..773a685d9 100644 --- a/backend/open_webui/apps/images/main.py +++ b/backend/open_webui/apps/images/main.py @@ -17,6 +17,9 @@ from open_webui.apps.images.utils.comfyui import ( from open_webui.config import ( AUTOMATIC1111_API_AUTH, AUTOMATIC1111_BASE_URL, + AUTOMATIC1111_CFG_SCALE, + AUTOMATIC1111_SAMPLER, + AUTOMATIC1111_SCHEDULER, CACHE_DIR, COMFYUI_BASE_URL, COMFYUI_WORKFLOW, @@ -65,6 +68,9 @@ app.state.config.MODEL = IMAGE_GENERATION_MODEL app.state.config.AUTOMATIC1111_BASE_URL = AUTOMATIC1111_BASE_URL app.state.config.AUTOMATIC1111_API_AUTH = AUTOMATIC1111_API_AUTH +app.state.config.AUTOMATIC1111_CFG_SCALE = AUTOMATIC1111_CFG_SCALE +app.state.config.AUTOMATIC1111_SAMPLER = AUTOMATIC1111_SAMPLER +app.state.config.AUTOMATIC1111_SCHEDULER = AUTOMATIC1111_SCHEDULER app.state.config.COMFYUI_BASE_URL = COMFYUI_BASE_URL app.state.config.COMFYUI_WORKFLOW = COMFYUI_WORKFLOW app.state.config.COMFYUI_WORKFLOW_NODES = COMFYUI_WORKFLOW_NODES @@ -85,6 +91,9 @@ async def get_config(request: Request, user=Depends(get_admin_user)): "automatic1111": { "AUTOMATIC1111_BASE_URL": app.state.config.AUTOMATIC1111_BASE_URL, "AUTOMATIC1111_API_AUTH": app.state.config.AUTOMATIC1111_API_AUTH, + "AUTOMATIC1111_CFG_SCALE": app.state.config.AUTOMATIC1111_CFG_SCALE, + "AUTOMATIC1111_SAMPLER": app.state.config.AUTOMATIC1111_SAMPLER, + "AUTOMATIC1111_SCHEDULER": app.state.config.AUTOMATIC1111_SCHEDULER, }, "comfyui": { "COMFYUI_BASE_URL": app.state.config.COMFYUI_BASE_URL, @@ -102,6 +111,9 @@ class OpenAIConfigForm(BaseModel): class Automatic1111ConfigForm(BaseModel): AUTOMATIC1111_BASE_URL: str AUTOMATIC1111_API_AUTH: str + AUTOMATIC1111_CFG_SCALE: float + AUTOMATIC1111_SAMPLER: str + AUTOMATIC1111_SCHEDULER: str class ComfyUIConfigForm(BaseModel): @@ -132,6 +144,12 @@ async def update_config(form_data: ConfigForm, user=Depends(get_admin_user)): app.state.config.AUTOMATIC1111_API_AUTH = ( form_data.automatic1111.AUTOMATIC1111_API_AUTH ) + app.state.config.AUTOMATIC1111_CFG_SCALE = form_data.automatic1111.AUTOMATIC1111_CFG_SCALE + app.state.config.AUTOMATIC1111_SAMPLER = form_data.automatic1111.AUTOMATIC1111_SAMPLER + app.state.config.AUTOMATIC1111_SCHEDULER = ( + form_data.automatic1111.AUTOMATIC1111_SCHEDULER + ) + app.state.config.COMFYUI_BASE_URL = form_data.comfyui.COMFYUI_BASE_URL.strip("/") app.state.config.COMFYUI_WORKFLOW = form_data.comfyui.COMFYUI_WORKFLOW @@ -147,6 +165,9 @@ async def update_config(form_data: ConfigForm, user=Depends(get_admin_user)): "automatic1111": { "AUTOMATIC1111_BASE_URL": app.state.config.AUTOMATIC1111_BASE_URL, "AUTOMATIC1111_API_AUTH": app.state.config.AUTOMATIC1111_API_AUTH, + "AUTOMATIC1111_CFG_SCALE": app.state.config.AUTOMATIC1111_CFG_SCALE, + "AUTOMATIC1111_SAMPLER": app.state.config.AUTOMATIC1111_SAMPLER, + "AUTOMATIC1111_SCHEDULER": app.state.config.AUTOMATIC1111_SCHEDULER, }, "comfyui": { "COMFYUI_BASE_URL": app.state.config.COMFYUI_BASE_URL, @@ -266,6 +287,7 @@ async def update_image_config(form_data: ImageConfigForm, user=Depends(get_admin detail=ERROR_MESSAGES.INCORRECT_FORMAT(" (e.g., 50)."), ) + return { "MODEL": app.state.config.MODEL, "IMAGE_SIZE": app.state.config.IMAGE_SIZE, @@ -523,6 +545,15 @@ async def image_generations( if form_data.negative_prompt is not None: data["negative_prompt"] = form_data.negative_prompt + + if app.state.config.AUTOMATIC1111_CFG_SCALE: + data["cfg_scale"] = app.state.config.AUTOMATIC1111_CFG_SCALE + + if app.state.config.AUTOMATIC1111_SAMPLER: + data["sampler_name"] = app.state.config.AUTOMATIC1111_SAMPLER + + if app.state.config.AUTOMATIC1111_SCHEDULER: + data["scheduler"] = app.state.config.AUTOMATIC1111_SCHEDULER # Use asyncio.to_thread for the requests.post call r = await asyncio.to_thread( diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 5ccb40d47..e252a0dbb 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -1267,6 +1267,24 @@ AUTOMATIC1111_API_AUTH = PersistentConfig( os.getenv("AUTOMATIC1111_API_AUTH", ""), ) +AUTOMATIC1111_CFG_SCALE = PersistentConfig( + "AUTOMATIC1111_CFG_SCALE", + "image_generation.automatic1111.cfg_scale", + float(os.getenv("AUTOMATIC1111_CFG_SCALE", 7.0)), +) + +AUTOMATIC1111_SAMPLER = PersistentConfig( + "AUTOMATIC1111_SAMPLERE", + "image_generation.automatic1111.sampler", + os.getenv("AUTOMATIC1111_SAMPLER", "Euler"), +) + +AUTOMATIC1111_SCHEDULER = PersistentConfig( + "AUTOMATIC1111_SCHEDULER", + "image_generation.automatic1111.scheduler", + os.getenv("AUTOMATIC1111_SCHEDULER", "Automatic"), +) + COMFYUI_BASE_URL = PersistentConfig( "COMFYUI_BASE_URL", "image_generation.comfyui.base_url", diff --git a/src/lib/components/admin/Settings/Images.svelte b/src/lib/components/admin/Settings/Images.svelte index 91ce4f280..55afda25b 100644 --- a/src/lib/components/admin/Settings/Images.svelte +++ b/src/lib/components/admin/Settings/Images.svelte @@ -27,6 +27,10 @@ let models = null; + let samplers = ["DPM++ 2M", "DPM++ SDE", "DPM++ 2M SDE", "DPM++ 2M SDE Heun", "DPM++ 2S a", "DPM++ 3M SDE", "Euler a", "Euler", "LMS", "Heun", "DPM2", "DPM2 a", "DPM fast", "DPM adaptive", "Restart", "DDIM", "DDIM CFG++", "PLMS", "UniPC"]; + + let schedulers = ["Automatic", "Uniform", "Karras", "Exponential", "Polyexponential", "SGM Uniform", "KL Optimal", "Align Your Steps", "Simple", "Normal", "DDIM", "Beta"]; + let requiredWorkflowNodes = [ { type: 'prompt', @@ -326,6 +330,66 @@ + + +
+
{$i18n.t('Set Sampler')}
+
+
+ + + + + {#each samplers ?? [] as sampler} + + {/each} + + +
+
+
+ +
+
{$i18n.t('Set Scheduler')}
+
+
+ + + + + {#each schedulers ?? [] as scheduler} + + {/each} + + +
+
+
+ +
+
{$i18n.t('Set CFG Scale')}
+
+
+ + + +
+
+
{:else if config?.engine === 'comfyui'}
{$i18n.t('ComfyUI Base URL')}
diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index ea56eb344..cbfa7e34a 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -238,6 +238,7 @@ "Enter a detail about yourself for your LLMs to recall": "", "Enter api auth string (e.g. username:password)": "", "Enter Brave Search API Key": "", + "Enter CFG Scale (e.g. 7.0)": "", "Enter Chunk Overlap": "", "Enter Chunk Size": "", "Enter Github Raw URL": "", @@ -248,6 +249,8 @@ "Enter Model ID": "", "Enter model tag (e.g. {{modelTag}})": "", "Enter Number of Steps (e.g. 50)": "", + "Enter Sampler (e.g. Euler a)": "", + "Enter Scheduler (e.g. Karras)": "", "Enter Score": "", "Enter SearchApi API Key": "", "Enter SearchApi Engine": "", @@ -574,10 +577,13 @@ "Serpstack API Key": "", "Server connection verified": "", "Set as default": "", + "Set CFG Scale": "", "Set Default Model": "", "Set embedding model (e.g. {{model}})": "", "Set Image Size": "", "Set reranking model (e.g. {{model}})": "", + "Set Sampler": "", + "Set Scheduler": "", "Set Steps": "", "Set Task Model": "", "Set Voice": "",