mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2025-06-05 21:59:27 +02:00
Add SD seed control
This commit is contained in:
@ -185,6 +185,7 @@ const defaultSettings = {
|
|||||||
sampler: 'DDIM',
|
sampler: 'DDIM',
|
||||||
model: '',
|
model: '',
|
||||||
vae: '',
|
vae: '',
|
||||||
|
seed: -1,
|
||||||
|
|
||||||
// Automatic1111/Horde exclusives
|
// Automatic1111/Horde exclusives
|
||||||
restore_faces: false,
|
restore_faces: false,
|
||||||
@ -414,6 +415,7 @@ async function loadSettings() {
|
|||||||
$('#sd_snap').prop('checked', extension_settings.sd.snap);
|
$('#sd_snap').prop('checked', extension_settings.sd.snap);
|
||||||
$('#sd_clip_skip').val(extension_settings.sd.clip_skip);
|
$('#sd_clip_skip').val(extension_settings.sd.clip_skip);
|
||||||
$('#sd_clip_skip_value').text(extension_settings.sd.clip_skip);
|
$('#sd_clip_skip_value').text(extension_settings.sd.clip_skip);
|
||||||
|
$('#sd_seed').val(extension_settings.sd.seed);
|
||||||
|
|
||||||
for (const style of extension_settings.sd.styles) {
|
for (const style of extension_settings.sd.styles) {
|
||||||
const option = document.createElement('option');
|
const option = document.createElement('option');
|
||||||
@ -707,6 +709,11 @@ function onClipSkipInput() {
|
|||||||
saveSettingsDebounced();
|
saveSettingsDebounced();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onSeedInput() {
|
||||||
|
extension_settings.sd.seed = Number($('#sd_seed').val());
|
||||||
|
saveSettingsDebounced();
|
||||||
|
}
|
||||||
|
|
||||||
function onScaleInput() {
|
function onScaleInput() {
|
||||||
extension_settings.sd.scale = Number($('#sd_scale').val());
|
extension_settings.sd.scale = Number($('#sd_scale').val());
|
||||||
$('#sd_scale_value').text(extension_settings.sd.scale.toFixed(1));
|
$('#sd_scale_value').text(extension_settings.sd.scale.toFixed(1));
|
||||||
@ -2326,6 +2333,7 @@ async function generateTogetherAIImage(prompt, negativePrompt) {
|
|||||||
steps: extension_settings.sd.steps,
|
steps: extension_settings.sd.steps,
|
||||||
width: extension_settings.sd.width,
|
width: extension_settings.sd.width,
|
||||||
height: extension_settings.sd.height,
|
height: extension_settings.sd.height,
|
||||||
|
seed: extension_settings.sd.seed >= 0 ? extension_settings.sd.seed : undefined,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -2350,6 +2358,7 @@ async function generatePollinationsImage(prompt, negativePrompt) {
|
|||||||
height: extension_settings.sd.height,
|
height: extension_settings.sd.height,
|
||||||
enhance: extension_settings.sd.pollinations_enhance,
|
enhance: extension_settings.sd.pollinations_enhance,
|
||||||
refine: extension_settings.sd.pollinations_refine,
|
refine: extension_settings.sd.pollinations_refine,
|
||||||
|
seed: extension_settings.sd.seed >= 0 ? extension_settings.sd.seed : undefined,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -2392,6 +2401,7 @@ async function generateExtrasImage(prompt, negativePrompt) {
|
|||||||
hr_scale: extension_settings.sd.hr_scale,
|
hr_scale: extension_settings.sd.hr_scale,
|
||||||
denoising_strength: extension_settings.sd.denoising_strength,
|
denoising_strength: extension_settings.sd.denoising_strength,
|
||||||
hr_second_pass_steps: extension_settings.sd.hr_second_pass_steps,
|
hr_second_pass_steps: extension_settings.sd.hr_second_pass_steps,
|
||||||
|
seed: extension_settings.sd.seed >= 0 ? extension_settings.sd.seed : undefined,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -2429,6 +2439,7 @@ async function generateHordeImage(prompt, negativePrompt) {
|
|||||||
enable_hr: !!extension_settings.sd.enable_hr,
|
enable_hr: !!extension_settings.sd.enable_hr,
|
||||||
sanitize: !!extension_settings.sd.horde_sanitize,
|
sanitize: !!extension_settings.sd.horde_sanitize,
|
||||||
clip_skip: extension_settings.sd.clip_skip,
|
clip_skip: extension_settings.sd.clip_skip,
|
||||||
|
seed: extension_settings.sd.seed >= 0 ? extension_settings.sd.seed : undefined,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -2467,6 +2478,7 @@ async function generateAutoImage(prompt, negativePrompt) {
|
|||||||
hr_scale: extension_settings.sd.hr_scale,
|
hr_scale: extension_settings.sd.hr_scale,
|
||||||
denoising_strength: extension_settings.sd.denoising_strength,
|
denoising_strength: extension_settings.sd.denoising_strength,
|
||||||
hr_second_pass_steps: extension_settings.sd.hr_second_pass_steps,
|
hr_second_pass_steps: extension_settings.sd.hr_second_pass_steps,
|
||||||
|
seed: extension_settings.sd.seed >= 0 ? extension_settings.sd.seed : undefined,
|
||||||
override_settings: {
|
override_settings: {
|
||||||
CLIP_stop_at_last_layers: extension_settings.sd.clip_skip,
|
CLIP_stop_at_last_layers: extension_settings.sd.clip_skip,
|
||||||
},
|
},
|
||||||
@ -2513,6 +2525,7 @@ async function generateDrawthingsImage(prompt, negativePrompt) {
|
|||||||
denoising_strength: extension_settings.sd.denoising_strength,
|
denoising_strength: extension_settings.sd.denoising_strength,
|
||||||
clip_skip: extension_settings.sd.clip_skip,
|
clip_skip: extension_settings.sd.clip_skip,
|
||||||
upscaler_scale: extension_settings.sd.hr_scale,
|
upscaler_scale: extension_settings.sd.hr_scale,
|
||||||
|
seed: extension_settings.sd.seed >= 0 ? extension_settings.sd.seed : undefined,
|
||||||
// TODO: advanced API parameters: hr, upscaler
|
// TODO: advanced API parameters: hr, upscaler
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
@ -2552,6 +2565,7 @@ async function generateNovelImage(prompt, negativePrompt) {
|
|||||||
decrisper: extension_settings.sd.novel_decrisper,
|
decrisper: extension_settings.sd.novel_decrisper,
|
||||||
sm: sm,
|
sm: sm,
|
||||||
sm_dyn: sm_dyn,
|
sm_dyn: sm_dyn,
|
||||||
|
seed: extension_settings.sd.seed >= 0 ? extension_settings.sd.seed : undefined,
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -2714,7 +2728,9 @@ async function generateComfyImage(prompt, negativePrompt) {
|
|||||||
}
|
}
|
||||||
let workflow = (await workflowResponse.json()).replace('"%prompt%"', JSON.stringify(prompt));
|
let workflow = (await workflowResponse.json()).replace('"%prompt%"', JSON.stringify(prompt));
|
||||||
workflow = workflow.replace('"%negative_prompt%"', JSON.stringify(negativePrompt));
|
workflow = workflow.replace('"%negative_prompt%"', JSON.stringify(negativePrompt));
|
||||||
workflow = workflow.replaceAll('"%seed%"', JSON.stringify(Math.round(Math.random() * Number.MAX_SAFE_INTEGER)));
|
|
||||||
|
const seed = extension_settings.sd.seed >= 0 ? extension_settings.sd.seed : Math.round(Math.random() * Number.MAX_SAFE_INTEGER);
|
||||||
|
workflow = workflow.replaceAll('"%seed%"', JSON.stringify(seed));
|
||||||
placeholders.forEach(ph => {
|
placeholders.forEach(ph => {
|
||||||
workflow = workflow.replace(`"%${ph}%"`, JSON.stringify(extension_settings.sd[ph]));
|
workflow = workflow.replace(`"%${ph}%"`, JSON.stringify(extension_settings.sd[ph]));
|
||||||
});
|
});
|
||||||
@ -3212,6 +3228,7 @@ jQuery(async () => {
|
|||||||
$('#sd_multimodal_captioning').on('input', onMultimodalCaptioningInput);
|
$('#sd_multimodal_captioning').on('input', onMultimodalCaptioningInput);
|
||||||
$('#sd_snap').on('input', onSnapInput);
|
$('#sd_snap').on('input', onSnapInput);
|
||||||
$('#sd_clip_skip').on('input', onClipSkipInput);
|
$('#sd_clip_skip').on('input', onClipSkipInput);
|
||||||
|
$('#sd_seed').on('input', onSeedInput);
|
||||||
|
|
||||||
$('.sd_settings .inline-drawer-toggle').on('click', function () {
|
$('.sd_settings .inline-drawer-toggle').on('click', function () {
|
||||||
initScrollHeight($('#sd_prompt_prefix'));
|
initScrollHeight($('#sd_prompt_prefix'));
|
||||||
|
@ -260,6 +260,11 @@
|
|||||||
<label for="sd_novel_upscale_ratio"><span data-i18n="Upscale by">Upscale by</span> (<span id="sd_novel_upscale_ratio_value"></span>)</label>
|
<label for="sd_novel_upscale_ratio"><span data-i18n="Upscale by">Upscale by</span> (<span id="sd_novel_upscale_ratio_value"></span>)</label>
|
||||||
<input id="sd_novel_upscale_ratio" type="range" min="{{novel_upscale_ratio_min}}" max="{{novel_upscale_ratio_max}}" step="{{novel_upscale_ratio_step}}" value="{{novel_upscale_ratio}}" />
|
<input id="sd_novel_upscale_ratio" type="range" min="{{novel_upscale_ratio_min}}" max="{{novel_upscale_ratio_max}}" step="{{novel_upscale_ratio_step}}" value="{{novel_upscale_ratio}}" />
|
||||||
</div>
|
</div>
|
||||||
|
<div data-sd-source="novel,togetherai,pollinations,comfy,drawthings,vlad,auto,horde" class="marginTop5">
|
||||||
|
<label for="sd_seed">Seed</label>
|
||||||
|
<small>(-1 for random)</small>
|
||||||
|
<input id="sd_seed" type="number" class="text_pole" min="-1" max="9999999999" step="1" />
|
||||||
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<h4 data-i18n="[title]Preset for prompt prefix and negative prompt" title="Preset for prompt prefix and negative prompt">
|
<h4 data-i18n="[title]Preset for prompt prefix and negative prompt" title="Preset for prompt prefix and negative prompt">
|
||||||
<span data-i18n="Style">Style</span>
|
<span data-i18n="Style">Style</span>
|
||||||
@ -269,6 +274,9 @@
|
|||||||
<div id="sd_save_style" data-i18n="[title]Save style" title="Save style" class="menu_button">
|
<div id="sd_save_style" data-i18n="[title]Save style" title="Save style" class="menu_button">
|
||||||
<i class="fa-solid fa-save"></i>
|
<i class="fa-solid fa-save"></i>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="sd_delete_style" data-i18n="[title]Delete style" title="Delete style" class="menu_button">
|
||||||
|
<i class="fa-solid fa-trash-can"></i>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<label for="sd_prompt_prefix" data-i18n="Common prompt prefix">Common prompt prefix</label>
|
<label for="sd_prompt_prefix" data-i18n="Common prompt prefix">Common prompt prefix</label>
|
||||||
<textarea id="sd_prompt_prefix" class="text_pole textarea_compact" rows="3" data-i18n="[placeholder]sd_prompt_prefix_placeholder" placeholder="Use {prompt} to specify where the generated prompt will be inserted"></textarea>
|
<textarea id="sd_prompt_prefix" class="text_pole textarea_compact" rows="3" data-i18n="[placeholder]sd_prompt_prefix_placeholder" placeholder="Use {prompt} to specify where the generated prompt will be inserted"></textarea>
|
||||||
|
@ -326,6 +326,7 @@ router.post('/generate-image', jsonParser, async (request, response) => {
|
|||||||
height: request.body.height,
|
height: request.body.height,
|
||||||
karras: Boolean(request.body.karras),
|
karras: Boolean(request.body.karras),
|
||||||
clip_skip: request.body.clip_skip,
|
clip_skip: request.body.clip_skip,
|
||||||
|
seed: request.body.seed >= 0 ? String(request.body.seed) : undefined,
|
||||||
n: 1,
|
n: 1,
|
||||||
},
|
},
|
||||||
r2: false,
|
r2: false,
|
||||||
|
@ -255,7 +255,7 @@ router.post('/generate-image', jsonParser, async (request, response) => {
|
|||||||
height: request.body.height ?? 512,
|
height: request.body.height ?? 512,
|
||||||
width: request.body.width ?? 512,
|
width: request.body.width ?? 512,
|
||||||
scale: request.body.scale ?? 9,
|
scale: request.body.scale ?? 9,
|
||||||
seed: Math.floor(Math.random() * 9999999999),
|
seed: request.body.seed >= 0 ? request.body.seed : Math.floor(Math.random() * 9999999999),
|
||||||
sampler: request.body.sampler ?? 'k_dpmpp_2m',
|
sampler: request.body.sampler ?? 'k_dpmpp_2m',
|
||||||
steps: request.body.steps ?? 28,
|
steps: request.body.steps ?? 28,
|
||||||
n_samples: 1,
|
n_samples: 1,
|
||||||
|
@ -608,8 +608,10 @@ together.post('/generate', jsonParser, async (request, response) => {
|
|||||||
model: request.body.model,
|
model: request.body.model,
|
||||||
steps: request.body.steps,
|
steps: request.body.steps,
|
||||||
n: 1,
|
n: 1,
|
||||||
seed: Math.floor(Math.random() * 10_000_000), // Limited to 10000 on playground, works fine with more.
|
// Limited to 10000 on playground, works fine with more.
|
||||||
sessionKey: getHexString(40), // Don't know if that's supposed to be random or not. It works either way.
|
seed: request.body.seed >= 0 ? request.body.seed : Math.floor(Math.random() * 10_000_000),
|
||||||
|
// Don't know if that's supposed to be random or not. It works either way.
|
||||||
|
sessionKey: getHexString(40),
|
||||||
}),
|
}),
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
@ -736,7 +738,7 @@ pollinations.post('/generate', jsonParser, async (request, response) => {
|
|||||||
const params = new URLSearchParams({
|
const params = new URLSearchParams({
|
||||||
model: String(request.body.model),
|
model: String(request.body.model),
|
||||||
negative_prompt: String(request.body.negative_prompt),
|
negative_prompt: String(request.body.negative_prompt),
|
||||||
seed: String(Math.floor(Math.random() * 10_000_000)),
|
seed: String(request.body.seed >= 0 ? request.body.seed : Math.floor(Math.random() * 10_000_000)),
|
||||||
enhance: String(request.body.enhance ?? false),
|
enhance: String(request.body.enhance ?? false),
|
||||||
refine: String(request.body.refine ?? false),
|
refine: String(request.body.refine ?? false),
|
||||||
width: String(request.body.width ?? 1024),
|
width: String(request.body.width ?? 1024),
|
||||||
|
Reference in New Issue
Block a user