From 2aeaf43c2895ef1dcebb0e0b6822bb93a923cd2d Mon Sep 17 00:00:00 2001
From: Cohee <18619528+Cohee1207@users.noreply.github.com>
Date: Wed, 29 May 2024 02:14:08 +0300
Subject: [PATCH] Add CLIP skip control for SD
---
.../stable-diffusion/comfyWorkflowEditor.html | 1 +
.../extensions/stable-diffusion/index.js | 26 +++++++++++++++++--
.../extensions/stable-diffusion/settings.html | 4 +++
src/endpoints/horde.js | 1 +
4 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/public/scripts/extensions/stable-diffusion/comfyWorkflowEditor.html b/public/scripts/extensions/stable-diffusion/comfyWorkflowEditor.html
index b510f29d9..2427fa6fb 100644
--- a/public/scripts/extensions/stable-diffusion/comfyWorkflowEditor.html
+++ b/public/scripts/extensions/stable-diffusion/comfyWorkflowEditor.html
@@ -17,6 +17,7 @@
"%scheduler%"
"%steps%"
"%scale%"
+ "%clip_skip%"
"%width%"
"%height%"
"%user_avatar%"
diff --git a/public/scripts/extensions/stable-diffusion/index.js b/public/scripts/extensions/stable-diffusion/index.js
index db7f3b92f..4fae374e5 100644
--- a/public/scripts/extensions/stable-diffusion/index.js
+++ b/public/scripts/extensions/stable-diffusion/index.js
@@ -229,6 +229,12 @@ const defaultSettings = {
hr_second_pass_steps_max: 150,
hr_second_pass_steps_step: 1,
+ // CLIP skip
+ clip_skip_min: 1,
+ clip_skip_max: 12,
+ clip_skip_step: 1,
+ clip_skip: 1,
+
// NovelAI settings
novel_upscale_ratio_min: 1.0,
novel_upscale_ratio_max: 4.0,
@@ -404,6 +410,8 @@ async function loadSettings() {
$('#sd_comfy_url').val(extension_settings.sd.comfy_url);
$('#sd_comfy_prompt').val(extension_settings.sd.comfy_prompt);
$('#sd_snap').prop('checked', extension_settings.sd.snap);
+ $('#sd_clip_skip').val(extension_settings.sd.clip_skip);
+ $('#sd_clip_skip_value').text(extension_settings.sd.clip_skip);
for (const style of extension_settings.sd.styles) {
const option = document.createElement('option');
@@ -465,7 +473,7 @@ function addPromptTemplates() {
const label = $('')
.text(modeLabels[name])
.attr('for', `sd_prompt_${name}`)
- .attr('data-i18n', `sd_prompt_${name}`);
+ .attr('data-i18n', `sd_prompt_${name}`);
const textarea = $('')
.addClass('textarea_compact text_pole')
.attr('id', `sd_prompt_${name}`)
@@ -477,7 +485,7 @@ function addPromptTemplates() {
const button = $('')
.addClass('menu_button fa-solid fa-undo')
.attr('title', 'Restore default')
- .attr('data-i18n', 'Restore default')
+ .attr('data-i18n', 'Restore default')
.on('click', () => {
textarea.val(promptTemplates[name]);
extension_settings.sd.prompts[name] = promptTemplates[name];
@@ -691,6 +699,12 @@ function onRefineModeInput() {
saveSettingsDebounced();
}
+function onClipSkipInput() {
+ extension_settings.sd.clip_skip = Number($('#sd_clip_skip').val());
+ $('#sd_clip_skip_value').text(extension_settings.sd.clip_skip);
+ saveSettingsDebounced();
+}
+
function onScaleInput() {
extension_settings.sd.scale = Number($('#sd_scale').val());
$('#sd_scale_value').text(extension_settings.sd.scale.toFixed(1));
@@ -2371,6 +2385,7 @@ async function generateHordeImage(prompt, negativePrompt) {
restore_faces: !!extension_settings.sd.restore_faces,
enable_hr: !!extension_settings.sd.enable_hr,
sanitize: !!extension_settings.sd.horde_sanitize,
+ clip_skip: extension_settings.sd.clip_skip,
}),
});
@@ -2409,6 +2424,10 @@ async function generateAutoImage(prompt, negativePrompt) {
hr_scale: extension_settings.sd.hr_scale,
denoising_strength: extension_settings.sd.denoising_strength,
hr_second_pass_steps: extension_settings.sd.hr_second_pass_steps,
+ override_settings: {
+ CLIP_stop_at_last_layers: extension_settings.sd.clip_skip,
+ },
+ override_settings_restore_afterwards: true,
// Ensure generated img is saved to disk
save_images: true,
send_images: true,
@@ -2449,6 +2468,7 @@ async function generateDrawthingsImage(prompt, negativePrompt) {
restore_faces: !!extension_settings.sd.restore_faces,
enable_hr: !!extension_settings.sd.enable_hr,
denoising_strength: extension_settings.sd.denoising_strength,
+ clip_skip: extension_settings.sd.clip_skip,
// TODO: advanced API parameters: hr, upscaler
}),
});
@@ -2633,6 +2653,7 @@ async function generateComfyImage(prompt, negativePrompt) {
'scale',
'width',
'height',
+ 'clip_skip',
];
const workflowResponse = await fetch('/api/sd/comfy/workflow', {
@@ -3144,6 +3165,7 @@ jQuery(async () => {
$('#sd_openai_quality').on('change', onOpenAiQualitySelect);
$('#sd_multimodal_captioning').on('input', onMultimodalCaptioningInput);
$('#sd_snap').on('input', onSnapInput);
+ $('#sd_clip_skip').on('input', onClipSkipInput);
$('.sd_settings .inline-drawer-toggle').on('click', function () {
initScrollHeight($('#sd_prompt_prefix'));
diff --git a/public/scripts/extensions/stable-diffusion/settings.html b/public/scripts/extensions/stable-diffusion/settings.html
index 417e99c5e..6fac4c41a 100644
--- a/public/scripts/extensions/stable-diffusion/settings.html
+++ b/public/scripts/extensions/stable-diffusion/settings.html
@@ -232,6 +232,10 @@
Hires. Fix
+
+
+
+
diff --git a/src/endpoints/horde.js b/src/endpoints/horde.js
index 32cb08f7b..565c94f95 100644
--- a/src/endpoints/horde.js
+++ b/src/endpoints/horde.js
@@ -325,6 +325,7 @@ router.post('/generate-image', jsonParser, async (request, response) => {
width: request.body.width,
height: request.body.height,
karras: Boolean(request.body.karras),
+ clip_skip: request.body.clip_skip,
n: 1,
},
r2: false,