From 7f6dae41f02c11f1ebb7436b061c2d31025c1752 Mon Sep 17 00:00:00 2001 From: Balazs Toldi Date: Sat, 7 Sep 2024 17:21:17 +0200 Subject: [PATCH 1/2] More options for AUTOMATIC1111 This commit adds 3 new options to the AUTOMATIC1111 settings: - CFG Scale - Sampler - Scheduler These options allow users to configure these parameters directly through the admin settings, without needing to modify the source code, which was previously required to change the default values in AUTOMATIC1111. Signed-off-by: Balazs Toldi --- backend/open_webui/apps/images/main.py | 31 +++++++++ backend/open_webui/config.py | 18 ++++++ .../components/admin/Settings/Images.svelte | 64 +++++++++++++++++++ src/lib/i18n/locales/en-US/translation.json | 6 ++ 4 files changed, 119 insertions(+) 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": "", From d05ba042c04b8dd47cc5f16018e772da8e08fc43 Mon Sep 17 00:00:00 2001 From: Balazs Toldi Date: Thu, 12 Sep 2024 14:00:24 +0200 Subject: [PATCH 2/2] Make the optional AUTOMATIC1111 values nullable This commit makes the optional AUTOMATIC1111 options default to None, and if the value is removed, it resets to None. Signed-off-by: Balazs Toldi --- backend/open_webui/apps/images/main.py | 14 ++++++-------- backend/open_webui/config.py | 20 +++++++++++++++++--- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/backend/open_webui/apps/images/main.py b/backend/open_webui/apps/images/main.py index 773a685d9..390273a26 100644 --- a/backend/open_webui/apps/images/main.py +++ b/backend/open_webui/apps/images/main.py @@ -111,9 +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 + AUTOMATIC1111_CFG_SCALE: Optional[str] + AUTOMATIC1111_SAMPLER: Optional[str] + AUTOMATIC1111_SCHEDULER: Optional[str] class ComfyUIConfigForm(BaseModel): @@ -144,12 +144,10 @@ 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.AUTOMATIC1111_CFG_SCALE = float(form_data.automatic1111.AUTOMATIC1111_CFG_SCALE) if form_data.automatic1111.AUTOMATIC1111_CFG_SCALE != "" else None + app.state.config.AUTOMATIC1111_SAMPLER = form_data.automatic1111.AUTOMATIC1111_SAMPLER if form_data.automatic1111.AUTOMATIC1111_SAMPLER != "" else None + app.state.config.AUTOMATIC1111_SCHEDULER = form_data.automatic1111.AUTOMATIC1111_SCHEDULER if form_data.automatic1111.AUTOMATIC1111_SCHEDULER != "" else None app.state.config.COMFYUI_BASE_URL = form_data.comfyui.COMFYUI_BASE_URL.strip("/") app.state.config.COMFYUI_WORKFLOW = form_data.comfyui.COMFYUI_WORKFLOW diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index e252a0dbb..d5f9de4f3 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -1270,19 +1270,33 @@ AUTOMATIC1111_API_AUTH = PersistentConfig( AUTOMATIC1111_CFG_SCALE = PersistentConfig( "AUTOMATIC1111_CFG_SCALE", "image_generation.automatic1111.cfg_scale", - float(os.getenv("AUTOMATIC1111_CFG_SCALE", 7.0)), + ( + float(os.environ.get("AUTOMATIC1111_CFG_SCALE")) + if os.environ.get("AUTOMATIC1111_CFG_SCALE") + else None + ), ) + AUTOMATIC1111_SAMPLER = PersistentConfig( "AUTOMATIC1111_SAMPLERE", "image_generation.automatic1111.sampler", - os.getenv("AUTOMATIC1111_SAMPLER", "Euler"), + ( + os.environ.get("AUTOMATIC1111_SAMPLER") + if os.environ.get("AUTOMATIC1111_SAMPLER") + else None + ) + ) AUTOMATIC1111_SCHEDULER = PersistentConfig( "AUTOMATIC1111_SCHEDULER", "image_generation.automatic1111.scheduler", - os.getenv("AUTOMATIC1111_SCHEDULER", "Automatic"), + ( + os.environ.get("AUTOMATIC1111_SCHEDULER") + if os.environ.get("AUTOMATIC1111_SCHEDULER") + else None + ) ) COMFYUI_BASE_URL = PersistentConfig(