From f39f48ce134e48bbac03c7e5b43ea2e2b57e27b3 Mon Sep 17 00:00:00 2001
From: awsr <43862868+awsr@users.noreply.github.com>
Date: Thu, 23 Apr 2026 16:13:20 -0700
Subject: [PATCH 1/6] Don't send `None` to `html_css` function
---
modules/ui_javascript.py | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/modules/ui_javascript.py b/modules/ui_javascript.py
index 392525078..45f86254f 100644
--- a/modules/ui_javascript.py
+++ b/modules/ui_javascript.py
@@ -67,11 +67,10 @@ def html_css(css: list[str]):
return f''
head = ''
- if css is not None:
- for cssfile in css:
- f = os.path.join(script_path, 'javascript', cssfile)
- if os.path.isfile(f):
- head += stylesheet(f)
+ for cssfile in css:
+ f = os.path.join(script_path, 'javascript', cssfile)
+ if os.path.isfile(f):
+ head += stylesheet(f)
for cssfile in modules.scripts_manager.list_files_with_name("style.css"):
if not os.path.isfile(cssfile):
continue
@@ -104,9 +103,12 @@ def reload_javascript():
login = html_login()
js = html_head()
- css_base = theme.reload_gradio_theme()
- css_timesheet = "timesheet.css"
- css = html_css([css_base, css_timesheet])
+ css_files: list[str] = []
+ if (css_base := theme.reload_gradio_theme()) is not None:
+ css_files.append(css_base)
+ css_files.append("timesheet.css")
+
+ css = html_css(css_files)
body = html_body()
def template_response(*args, **kwargs):
From 6bb003126f2161a3b6fa85f4b63074394b60ca3e Mon Sep 17 00:00:00 2001
From: awsr <43862868+awsr@users.noreply.github.com>
Date: Thu, 23 Apr 2026 16:21:40 -0700
Subject: [PATCH 2/6] Cleanup
- Use correct module access names.
- Remove old commented-out line.
---
modules/ui_javascript.py | 20 +++++++++-----------
1 file changed, 9 insertions(+), 11 deletions(-)
diff --git a/modules/ui_javascript.py b/modules/ui_javascript.py
index 45f86254f..c6978f125 100644
--- a/modules/ui_javascript.py
+++ b/modules/ui_javascript.py
@@ -1,9 +1,8 @@
import os
import gradio.routes
import gradio.utils
-from modules import shared, theme
+from modules import extensions, scripts_manager, shared, theme
from modules.paths import script_path, data_path
-import modules.scripts_manager
from modules.logger import log
@@ -14,7 +13,6 @@ def webpath(fn):
uri = fn
uri = uri.replace('\\', '/')
uri = f'file={uri}?{os.path.getmtime(fn)}'
- # uri = f'js?file={uri}&{os.path.getmtime(fn)}'
return uri
@@ -29,7 +27,7 @@ def html_head():
else:
head += f'\n'
added = []
- for script in modules.scripts_manager.list_scripts("javascript", ".js"):
+ for script in scripts_manager.list_scripts("javascript", ".js"):
if script.filename in main or script.filename in skip:
continue
if '.esm' in script.filename or '.mjs' in script.filename:
@@ -37,7 +35,7 @@ def html_head():
else:
head += f'\n'
added.append(script.path)
- for script in modules.scripts_manager.list_scripts("javascript", ".mjs"):
+ for script in scripts_manager.list_scripts("javascript", ".mjs"):
head += f'\n'
added.append(script.path)
added = [a.replace(script_path, '').replace('\\', '/') for a in added]
@@ -71,22 +69,22 @@ def html_css(css: list[str]):
f = os.path.join(script_path, 'javascript', cssfile)
if os.path.isfile(f):
head += stylesheet(f)
- for cssfile in modules.scripts_manager.list_files_with_name("style.css"):
+ for cssfile in scripts_manager.list_files_with_name("style.css"):
if not os.path.isfile(cssfile):
continue
head += stylesheet(cssfile)
usercss = os.path.join(data_path, "user.css") if os.path.exists(os.path.join(data_path, "user.css")) else None
- if modules.shared.opts.theme_type == 'Standard':
- themecss = os.path.join(script_path, "javascript", f"{modules.shared.opts.gradio_theme}.css")
+ if shared.opts.theme_type == 'Standard':
+ themecss = os.path.join(script_path, "javascript", f"{shared.opts.gradio_theme}.css")
if os.path.exists(themecss):
head += stylesheet(themecss)
log.debug(f'UI theme: css="{themecss}" base="{css}" user="{usercss}"')
else:
log.error(f'UI theme: css="{themecss}" path="{os.getcwd()}" not found')
- elif modules.shared.opts.theme_type == 'Modern':
- theme_folder = next((e.path for e in modules.extensions.extensions if e.name == 'sdnext-modernui'), None)
- themecss = os.path.join(theme_folder or '', 'themes', f'{modules.shared.opts.gradio_theme}.css')
+ elif shared.opts.theme_type == 'Modern':
+ theme_folder = next((e.path for e in extensions.extensions if e.name == 'sdnext-modernui'), None)
+ themecss = os.path.join(theme_folder or '', 'themes', f'{shared.opts.gradio_theme}.css')
if os.path.exists(themecss):
head += stylesheet(themecss)
log.debug(f'UI theme: css="{themecss}" base="{css}" user="{usercss}"')
From bea726b5b33e73b98499e050f78f5c6314f4e467 Mon Sep 17 00:00:00 2001
From: awsr <43862868+awsr@users.noreply.github.com>
Date: Thu, 23 Apr 2026 16:25:11 -0700
Subject: [PATCH 3/6] Slightly improve console trace readability
- Shorten cache busting string to take up less room in the browser console.
---
modules/ui_javascript.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/ui_javascript.py b/modules/ui_javascript.py
index c6978f125..065af592e 100644
--- a/modules/ui_javascript.py
+++ b/modules/ui_javascript.py
@@ -12,7 +12,7 @@ def webpath(fn):
else:
uri = fn
uri = uri.replace('\\', '/')
- uri = f'file={uri}?{os.path.getmtime(fn)}'
+ uri = f'file={uri}?{int(os.path.getmtime(fn))}'
return uri
From e9781dac96e7dc8c2d53534d55edf826a61c9bd2 Mon Sep 17 00:00:00 2001
From: awsr <43862868+awsr@users.noreply.github.com>
Date: Thu, 23 Apr 2026 16:27:36 -0700
Subject: [PATCH 4/6] Import cleanup
- Remove unused import.
- Organize imports.
---
modules/ui_javascript.py | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/modules/ui_javascript.py b/modules/ui_javascript.py
index 065af592e..738aed654 100644
--- a/modules/ui_javascript.py
+++ b/modules/ui_javascript.py
@@ -1,9 +1,10 @@
import os
+
import gradio.routes
-import gradio.utils
+
from modules import extensions, scripts_manager, shared, theme
-from modules.paths import script_path, data_path
from modules.logger import log
+from modules.paths import data_path, script_path
def webpath(fn):
From 09f5fc6e03a540b537fbf85307a9b713384230af Mon Sep 17 00:00:00 2001
From: awsr <43862868+awsr@users.noreply.github.com>
Date: Thu, 23 Apr 2026 16:49:18 -0700
Subject: [PATCH 5/6] Update `concurrent.futures` imports
Python 3.14 adds `concurrent.interpreters` and we don't need to import that here.
---
modules/civitai/metadata_civitai.py | 2 +-
modules/lora/lora_load.py | 2 +-
modules/styles.py | 2 +-
modules/ui_extra_networks.py | 2 +-
modules/ui_extra_networks_checkpoints.py | 2 +-
modules/ui_extra_networks_lora.py | 2 +-
6 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/modules/civitai/metadata_civitai.py b/modules/civitai/metadata_civitai.py
index 0cb01ca51..626e22967 100644
--- a/modules/civitai/metadata_civitai.py
+++ b/modules/civitai/metadata_civitai.py
@@ -216,7 +216,7 @@ def civit_search_metadata(title: str | None = None, raw: bool = False):
scanned += 1
candidates.append(item)
log.debug(f'CivitAI search metadata: type={title if isinstance(title, str) else "all"} workers={max_workers} skip={len(re_skip)} items={len(candidates)}')
- import concurrent
+ import concurrent.futures
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
future_items = {}
for candidate in candidates:
diff --git a/modules/lora/lora_load.py b/modules/lora/lora_load.py
index d2be416cb..fc2cca30c 100644
--- a/modules/lora/lora_load.py
+++ b/modules/lora/lora_load.py
@@ -1,6 +1,6 @@
import os
import time
-import concurrent
+import concurrent.futures
from modules import shared, errors, sd_models, sd_models_compile, files_cache
from modules.logger import log
from modules.lora import network, lora_overrides, lora_convert, lora_diffusers
diff --git a/modules/styles.py b/modules/styles.py
index 28c8246bb..d263598dd 100644
--- a/modules/styles.py
+++ b/modules/styles.py
@@ -336,7 +336,7 @@ class StyleDatabase:
self.styles.clear()
def list_folder(folder):
- import concurrent
+ import concurrent.futures
future_items = {}
style_files = list(files_cache.list_files(folder, ext_filter=['.json'], recursive=files_cache.not_hidden))
with concurrent.futures.ThreadPoolExecutor(max_workers=shared.max_workers) as executor:
diff --git a/modules/ui_extra_networks.py b/modules/ui_extra_networks.py
index e599a99cd..6136c915a 100644
--- a/modules/ui_extra_networks.py
+++ b/modules/ui_extra_networks.py
@@ -764,7 +764,7 @@ def create_ui(container, button_parent: gr.Button, tabname: str, skip_indexing =
global refresh_time # pylint: disable=global-statement
refresh_time = time.time()
if not skip_indexing:
- import concurrent
+ import concurrent.futures
with concurrent.futures.ThreadPoolExecutor(max_workers=shared.max_workers) as executor:
for page in get_pages():
executor.submit(page.create_items, ui.tabname)
diff --git a/modules/ui_extra_networks_checkpoints.py b/modules/ui_extra_networks_checkpoints.py
index 32209fd54..de5b0c319 100644
--- a/modules/ui_extra_networks_checkpoints.py
+++ b/modules/ui_extra_networks_checkpoints.py
@@ -1,7 +1,7 @@
import os
import html
import json
-import concurrent
+import concurrent.futures
from datetime import datetime
from modules import shared, ui_extra_networks, sd_models, modelstats, paths, devices
from modules.logger import log
diff --git a/modules/ui_extra_networks_lora.py b/modules/ui_extra_networks_lora.py
index 0538f96d9..348ff9aac 100644
--- a/modules/ui_extra_networks_lora.py
+++ b/modules/ui_extra_networks_lora.py
@@ -1,6 +1,6 @@
import os
import json
-import concurrent
+import concurrent.futures
from modules import shared, ui_extra_networks, modelstats
from modules.logger import log
from modules.lora import lora_load
From e9d74cea7294b7874700d8cee9a448c9b2e2e0c8 Mon Sep 17 00:00:00 2001
From: awsr <43862868+awsr@users.noreply.github.com>
Date: Thu, 23 Apr 2026 16:49:50 -0700
Subject: [PATCH 6/6] Fix typing
---
modules/sdnq/file_loader.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/modules/sdnq/file_loader.py b/modules/sdnq/file_loader.py
index 4390745b7..dc9317130 100644
--- a/modules/sdnq/file_loader.py
+++ b/modules/sdnq/file_loader.py
@@ -3,7 +3,7 @@ import concurrent.futures
import torch
-def map_keys(key: str, key_mapping: dict) -> str:
+def map_keys(key: str, key_mapping: dict | None) -> str:
new_key = key
if key_mapping:
for pattern, replacement in key_mapping.items():
@@ -13,7 +13,7 @@ def map_keys(key: str, key_mapping: dict) -> str:
return new_key
-def load_safetensors(files: list[str], state_dict: dict | None = None, key_mapping: dict | None = None, device: torch.device = "cpu") -> dict:
+def load_safetensors(files: list[str], state_dict: dict | None = None, key_mapping: dict | None = None, device: torch.device = "cpu") -> None:
from safetensors.torch import safe_open
if state_dict is None:
state_dict = {}
@@ -23,7 +23,7 @@ def load_safetensors(files: list[str], state_dict: dict | None = None, key_mappi
state_dict[map_keys(key, key_mapping)] = f.get_tensor(key)
-def load_threaded(files: list[str], state_dict: dict | None = None, key_mapping: dict | None = None, device: torch.device = "cpu") -> dict:
+def load_threaded(files: list[str], state_dict: dict | None = None, key_mapping: dict | None = None, device: torch.device = "cpu") -> None:
future_items = {}
if state_dict is None:
state_dict = {}
@@ -34,7 +34,7 @@ def load_threaded(files: list[str], state_dict: dict | None = None, key_mapping:
future.result()
-def load_streamer(files: list[str], state_dict: dict | None = None, key_mapping: dict | None = None, device: torch.device = "cpu") -> dict:
+def load_streamer(files: list[str], state_dict: dict | None = None, key_mapping: dict | None = None, device: torch.device = "cpu") -> None:
# requires pip install runai_model_streamer
from runai_model_streamer import SafetensorsStreamer
if state_dict is None: