From 92e7e74d0085974bdd136fb1ece547fbf46cbd47 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 10 Feb 2025 08:47:57 -0500 Subject: [PATCH] persist hf and civitai tokens Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 4 +++- modules/modelloader.py | 4 +++- modules/shared.py | 14 ++++++++------ modules/ui_models.py | 16 ++++++++++++++-- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2749d5921..0a76c576a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log for SD.Next -## Update for 2025-02-09 +## Update for 2025-02-10 - **User Interface** - **Hints** @@ -29,6 +29,8 @@ allows for configurable image tiling for x/y axis separately enable in *scripts -> asymmetric tiling* *note*: traditional symmetric tiling is achieved by setting circular mode for both x and y + - persist *models -> hugginface -> token* + - persist *models -> civitai -> token* - **Fixes** - docs/wiki always use relative links - ui use correct timezone for log display diff --git a/modules/modelloader.py b/modules/modelloader.py index 0c5fa78d8..b89ce3e35 100644 --- a/modules/modelloader.py +++ b/modules/modelloader.py @@ -110,6 +110,8 @@ def download_civit_model_thread(model_name: str, model_url: str, model_path: str if os.path.isfile(temp_file): starting_pos = os.path.getsize(temp_file) headers['Range'] = f'bytes={starting_pos}-' + if token is None: + token = shared.opts.civit_token if token is not None and len(token) > 0: headers['Authorization'] = f'Bearer {token}' @@ -396,7 +398,7 @@ def load_civitai(model: str, url: str): return name # already downloaded else: shared.log.debug(f'Reference download start: model="{name}"') - download_civit_model_thread(model_name=model, model_url=url, model_path='', model_type='safetensors', token=None) + download_civit_model_thread(model_name=model, model_url=url, model_path='', model_type='safetensors', token=shared.opts.civit_token) shared.log.debug(f'Reference download complete: model="{name}"') sd_models.list_models() info = sd_models.get_closet_checkpoint_match(name) diff --git a/modules/shared.py b/modules/shared.py index 4cd18f9e3..3b08cfc07 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -359,13 +359,10 @@ def temp_disable_extensions(): ] disable_original = [] disabled = [] - if modules.shared.cmd_opts.theme is not None: - theme_name = modules.shared.cmd_opts.theme + if cmd_opts.theme is not None: + theme_name = cmd_opts.theme else: - theme_name = f'{modules.shared.opts.theme_type.lower()}/{modules.shared.opts.gradio_theme}' - if modules.shared.cmd_opts.locale is not None: - modules.shared.opts.ui_locale = modules.shared.cmd_opts.locale - + theme_name = f'{opts.theme_type.lower()}/{opts.gradio_theme}' if theme_name == 'lobe': disable_themes.remove('sd-webui-lobe-theme') elif theme_name == 'cozy-nest' or theme_name == 'cozy': @@ -948,6 +945,7 @@ options_templates.update(options_section(('huggingface', "Huggingface"), { "diffusers_model_load_variant": OptionInfo("default", "Preferred Model variant", gr.Radio, {"choices": ['default', 'fp32', 'fp16']}), "diffusers_vae_load_variant": OptionInfo("default", "Preferred VAE variant", gr.Radio, {"choices": ['default', 'fp32', 'fp16']}), "custom_diffusers_pipeline": OptionInfo('', 'Load custom Diffusers pipeline'), + "civitai_token": OptionInfo('', 'HuggingFace token', gr.Textbox, {"lines": 2, "visible": False}), })) options_templates.update(options_section(('extra_networks', "Networks"), { @@ -1114,6 +1112,8 @@ class Options: return data_label.default if data_label is not None else None def save_atomic(self, filename=None, silent=False): + if self.filename is None: + self.filename = config_filename if filename is None: filename = self.filename if cmd_opts.freeze: @@ -1234,6 +1234,8 @@ opts = Options() config_filename = cmd_opts.config opts.load(config_filename) cmd_opts = cmd_args.settings_args(opts, cmd_opts) +if cmd_opts.locale is not None: + opts.data['ui_locale'] = cmd_opts.locale if cmd_opts.use_xformers: opts.data['cross_attention_optimization'] = 'xFormers' opts.data['uni_pc_lower_order_final'] = opts.schedulers_use_loworder # compatibility diff --git a/modules/ui_models.py b/modules/ui_models.py index 28724bd66..8c172b9cd 100644 --- a/modules/ui_models.py +++ b/modules/ui_models.py @@ -429,6 +429,11 @@ def create_ui(): log.info(f'Diffuser model downloaded: model="{hub_id}"') return f'Diffuser model downloaded: model="{hub_id}"' + def hf_update_token(token): + log.debug('Huggingface update token') + opts.huggingface_token = token + opts.save() + with gr.Column(scale=6): gr.HTML('

Search for models

Select a model from the search results to download

') with gr.Row(): @@ -443,7 +448,7 @@ def create_ui(): hf_variant = gr.Textbox('', label='Specify model variant', placeholder='') hf_revision = gr.Textbox('', label='Specify model revision', placeholder='') with gr.Row(): - hf_token = gr.Textbox('', label='Huggingface token', placeholder='optional access token for private or gated models') + hf_token = gr.Textbox(opts.huggingface_token, label='Huggingface token', placeholder='optional access token for private or gated models') hf_mirror = gr.Textbox('', label='Huggingface mirror', placeholder='optional mirror site for downloads') hf_custom_pipeline = gr.Textbox('', label='Custom pipeline', placeholder='optional pipeline for downloads') with gr.Column(scale=1): @@ -459,6 +464,7 @@ def create_ui(): hf_search_btn.click(fn=hf_search, inputs=[hf_search_text], outputs=[hf_results]) hf_results.select(fn=hf_select, inputs=[hf_results], outputs=[hf_selected]) hf_download_model_btn.click(fn=hf_download_model, inputs=[hf_selected, hf_token, hf_variant, hf_revision, hf_mirror, hf_custom_pipeline], outputs=[models_outcome]) + hf_token.change(fn=hf_update_token, inputs=[hf_token], outputs=[]) with gr.Tab(label="CivitAI"): data = [] @@ -632,6 +638,11 @@ def create_ui(): global search_metadata_civit # pylint: disable=global-statement search_metadata_civit = civit_search_metadata + def civitai_update_token(token): + log.debug('CivitAI update token') + opts.civitai_token = token + opts.save() + with gr.Row(): gr.HTML('

Fetch information

Fetches preview and metadata information for all models with missing information
Models with existing previews and information are not updated
') with gr.Row(): @@ -657,7 +668,8 @@ def create_ui(): civit_download_model_btn = gr.Button(value="Download", variant='primary') gr.HTML('Select a model, model version and and model variant from the search results to download or enter model URL manually
') with gr.Row(): - civit_token = gr.Textbox('', label='CivitAI token', placeholder='optional access token for private or gated models') + civit_token = gr.Textbox(opts.civitai_token, label='CivitAI token', placeholder='optional access token for private or gated models') + civit_token.change(fn=civitai_update_token, inputs=[civit_token], outputs=[]) with gr.Row(): civit_name = gr.Textbox('', label='Model name', placeholder='select model from search results', visible=True) civit_selected = gr.Textbox('', label='Model URL', placeholder='select model from search results', visible=True)