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: