Stable Diffusion: LoRA strength slider, %vae%/%lora% editor placeholders, catalog-derived VAE list for RunPod proxy

7f28614a73ebd34771d94ddcde8816b785b9423d

permissionBRICK <40219477+permissionBRICK@users.noreply.github.com>

3 files changed, +38 -0Ignore whitespace
public/scripts/extensions/stable-diffusion/comfyWorkflowEditor.html+2 -0
@@ -13,6 +13,8 @@
13 <li data-placeholder="negative_prompt" class="sd_comfy_workflow_editor_not_found">"%negative_prompt%"</li>13 <li data-placeholder="negative_prompt" class="sd_comfy_workflow_editor_not_found">"%negative_prompt%"</li>
14 <li data-placeholder="model" class="sd_comfy_workflow_editor_not_found">"%model%"</li>14 <li data-placeholder="model" class="sd_comfy_workflow_editor_not_found">"%model%"</li>
15 <li data-placeholder="vae" class="sd_comfy_workflow_editor_not_found">"%vae%"</li>15 <li data-placeholder="vae" class="sd_comfy_workflow_editor_not_found">"%vae%"</li>
16 <li data-placeholder="lora" class="sd_comfy_workflow_editor_not_found">"%lora%"</li>
17 <li data-placeholder="lora_strength" class="sd_comfy_workflow_editor_not_found">"%lora_strength%"</li>
16 <li data-placeholder="sampler" class="sd_comfy_workflow_editor_not_found">"%sampler%"</li>18 <li data-placeholder="sampler" class="sd_comfy_workflow_editor_not_found">"%sampler%"</li>
17 <li data-placeholder="scheduler" class="sd_comfy_workflow_editor_not_found">"%scheduler%"</li>19 <li data-placeholder="scheduler" class="sd_comfy_workflow_editor_not_found">"%scheduler%"</li>
18 <li data-placeholder="steps" class="sd_comfy_workflow_editor_not_found">"%steps%"</li>20 <li data-placeholder="steps" class="sd_comfy_workflow_editor_not_found">"%steps%"</li>
public/scripts/extensions/stable-diffusion/index.js+26 -0
@@ -381,6 +381,10 @@ const defaultSettings = {
381381
382 // Selected LoRA for comfy workflows using the %lora% placeholder382 // Selected LoRA for comfy workflows using the %lora% placeholder
383 lora: '',383 lora: '',
384 lora_strength: 1.0,
385 lora_strength_min: 0.0,
386 lora_strength_max: 2.0,
387 lora_strength_step: 0.05,
384388
385 // Per-workflow remembered selections ({ [workflow]: { model, lora } });389 // Per-workflow remembered selections ({ [workflow]: { model, lora } });
386 // part of preset snapshots, so each chain provider keeps its own map.390 // part of preset snapshots, so each chain provider keeps its own map.
@@ -732,6 +736,10 @@ async function loadSettings() {
732 extension_settings.sd.lora = '';736 extension_settings.sd.lora = '';
733 }737 }
734738
739 if (typeof extension_settings.sd.lora_strength !== 'number') {
740 extension_settings.sd.lora_strength = 1.0;
741 }
742
735 if (typeof extension_settings.sd.comfy_workflow_prefs !== 'object' || !extension_settings.sd.comfy_workflow_prefs) {743 if (typeof extension_settings.sd.comfy_workflow_prefs !== 'object' || !extension_settings.sd.comfy_workflow_prefs) {
736 extension_settings.sd.comfy_workflow_prefs = {};744 extension_settings.sd.comfy_workflow_prefs = {};
737 }745 }
@@ -755,6 +763,7 @@ async function loadSettings() {
755 $('#sd_height').val(extension_settings.sd.height).trigger('input');763 $('#sd_height').val(extension_settings.sd.height).trigger('input');
756 $('#sd_hr_scale').val(extension_settings.sd.hr_scale).trigger('input');764 $('#sd_hr_scale').val(extension_settings.sd.hr_scale).trigger('input');
757 $('#sd_denoising_strength').val(extension_settings.sd.denoising_strength).trigger('input');765 $('#sd_denoising_strength').val(extension_settings.sd.denoising_strength).trigger('input');
766 $('#sd_lora_strength').val(extension_settings.sd.lora_strength ?? 1.0).trigger('input');
758 $('#sd_hr_second_pass_steps').val(extension_settings.sd.hr_second_pass_steps).trigger('input');767 $('#sd_hr_second_pass_steps').val(extension_settings.sd.hr_second_pass_steps).trigger('input');
759 $('#sd_novel_anlas_guard').prop('checked', extension_settings.sd.novel_anlas_guard);768 $('#sd_novel_anlas_guard').prop('checked', extension_settings.sd.novel_anlas_guard);
760 $('#sd_novel_sm').prop('checked', extension_settings.sd.novel_sm);769 $('#sd_novel_sm').prop('checked', extension_settings.sd.novel_sm);
@@ -2455,6 +2464,12 @@ function onDenoisingStrengthInput() {
2455 saveSettingsDebounced();2464 saveSettingsDebounced();
2456}2465}
24572466
2467function onLoraStrengthInput() {
2468 extension_settings.sd.lora_strength = Number($('#sd_lora_strength').val());
2469 $('#sd_lora_strength_value').val(extension_settings.sd.lora_strength.toFixed(2));
2470 saveSettingsDebounced();
2471}
2472
2458function onHrSecondPassStepsInput() {2473function onHrSecondPassStepsInput() {
2459 extension_settings.sd.hr_second_pass_steps = Number($('#sd_hr_second_pass_steps').val());2474 extension_settings.sd.hr_second_pass_steps = Number($('#sd_hr_second_pass_steps').val());
2460 $('#sd_hr_second_pass_steps_value').val(extension_settings.sd.hr_second_pass_steps);2475 $('#sd_hr_second_pass_steps_value').val(extension_settings.sd.hr_second_pass_steps);
@@ -4020,6 +4035,15 @@ async function loadComfyVaes() {
4020 if (extension_settings.sd.comfy_type === comfyTypes.runpod_serverless) {4035 if (extension_settings.sd.comfy_type === comfyTypes.runpod_serverless) {
4021 return ['N/A'];4036 return ['N/A'];
4022 }4037 }
4038 if (isRunpodProxyUrl(extension_settings.sd.comfy_url)) {
4039 // Derive the VAE list from the catalog's download manifests (dest under
4040 // vae/) instead of querying the pod, which may be cold.
4041 const vaes = getRunpodCatalog()
4042 .flatMap(m => parseRunpodFiles(m.downloads))
4043 .filter(f => /^vae\//i.test(f.dest))
4044 .map(f => f.dest.split('/').pop());
4045 return [...new Set(vaes)];
4046 }
4023 if (!extension_settings.sd.comfy_url) {4047 if (!extension_settings.sd.comfy_url) {
4024 return [];4048 return [];
4025 }4049 }
@@ -5698,6 +5722,7 @@ async function generateComfyImage(prompt, negativePrompt, signal) {
5698 'model',5722 'model',
5699 'vae',5723 'vae',
5700 'lora',5724 'lora',
5725 'lora_strength',
5701 'sampler',5726 'sampler',
5702 'scheduler',5727 'scheduler',
5703 'steps',5728 'steps',
@@ -7264,6 +7289,7 @@ export async function init() {
7264 $('#sd_hr_upscaler').on('change', onHrUpscalerChange);7289 $('#sd_hr_upscaler').on('change', onHrUpscalerChange);
7265 $('#sd_hr_scale').on('input', onHrScaleInput);7290 $('#sd_hr_scale').on('input', onHrScaleInput);
7266 $('#sd_denoising_strength').on('input', onDenoisingStrengthInput);7291 $('#sd_denoising_strength').on('input', onDenoisingStrengthInput);
7292 $('#sd_lora_strength').on('input', onLoraStrengthInput);
7267 $('#sd_hr_second_pass_steps').on('input', onHrSecondPassStepsInput);7293 $('#sd_hr_second_pass_steps').on('input', onHrSecondPassStepsInput);
7268 $('#sd_novel_anlas_guard').on('input', onNovelAnlasGuardInput);7294 $('#sd_novel_anlas_guard').on('input', onNovelAnlasGuardInput);
7269 $('#sd_novel_view_anlas').on('click', onViewAnlasClick);7295 $('#sd_novel_view_anlas').on('click', onViewAnlasClick);
public/scripts/extensions/stable-diffusion/settings.html+10 -0
@@ -506,6 +506,16 @@
506 </div>506 </div>
507507
508 <div class="flex-container">508 <div class="flex-container">
509 <div class="alignitemscenter flex-container flexFlowColumn flexGrow flexShrink gap0 flexBasis48p" data-sd-source="comfy">
510 <small>
511 <span data-i18n="LoRA strength">LoRA strength</span>
512 </small>
513 <input class="neo-range-slider" type="range" id="sd_lora_strength" name="sd_lora_strength" min="{{lora_strength_min}}" max="{{lora_strength_max}}" step="{{lora_strength_step}}" value="{{lora_strength}}" >
514 <input class="neo-range-input" type="number" id="sd_lora_strength_value" data-for="sd_lora_strength" min="{{lora_strength_min}}" max="{{lora_strength_max}}" step="{{lora_strength_step}}" value="{{lora_strength}}" >
515 </div>
516 </div>
517
518 <div class="flex-container">
509 <div class="flex1" data-sd-source="extras,horde,auto,drawthings,novel,vlad,comfy,sdcpp">519 <div class="flex1" data-sd-source="extras,horde,auto,drawthings,novel,vlad,comfy,sdcpp">
510 <label for="sd_sampler" data-i18n="Sampling method">Sampling method</label>520 <label for="sd_sampler" data-i18n="Sampling method">Sampling method</label>
511 <select id="sd_sampler" class="text_pole"></select>521 <select id="sd_sampler" class="text_pole"></select>