Add NAI Diffusion V4

e6107ad447721342ef9d8a35f37a79d402e5ff7b

Cohee <18619528+Cohee1207@users.noreply.github.com>

3 files changed, +32 -3Ignore whitespace
public/scripts/extensions/stable-diffusion/index.js+6 -1
@@ -1986,6 +1986,10 @@ async function loadNovelModels() {
19861986
1987 return [1987 return [
1988 {1988 {
1989 value: 'nai-diffusion-4-curated-preview',
1990 text: 'NAI Diffusion Anime V4 (Curated Preview)',
1991 },
1992 {
1989 value: 'nai-diffusion-3',1993 value: 'nai-diffusion-3',
1990 text: 'NAI Diffusion Anime V3',1994 text: 'NAI Diffusion Anime V3',
1991 },1995 },
@@ -2049,7 +2053,7 @@ async function loadSchedulers() {
2049 schedulers = await getAutoRemoteSchedulers();2053 schedulers = await getAutoRemoteSchedulers();
2050 break;2054 break;
2051 case sources.novel:2055 case sources.novel:
2052 schedulers = ['N/A'];2056 schedulers = ['karras', 'native', 'exponential', 'polyexponential'];
2053 break;2057 break;
2054 case sources.vlad:2058 case sources.vlad:
2055 schedulers = ['N/A'];2059 schedulers = ['N/A'];
@@ -3158,6 +3162,7 @@ async function generateNovelImage(prompt, negativePrompt, signal) {
3158 prompt: prompt,3162 prompt: prompt,
3159 model: extension_settings.sd.model,3163 model: extension_settings.sd.model,
3160 sampler: extension_settings.sd.sampler,3164 sampler: extension_settings.sd.sampler,
3165 scheduler: extension_settings.sd.scheduler,
3161 steps: steps,3166 steps: steps,
3162 scale: extension_settings.sd.scale,3167 scale: extension_settings.sd.scale,
3163 width: width,3168 width: width,
public/scripts/extensions/stable-diffusion/settings.html+1 -1
@@ -274,7 +274,7 @@
274 <select id="sd_sampler"></select>274 <select id="sd_sampler"></select>
275 </div>275 </div>
276276
277 <div class="flex1" data-sd-source="comfy,auto">277 <div class="flex1" data-sd-source="comfy,auto,novel">
278 <label for="sd_scheduler" data-i18n="Scheduler">Scheduler</label>278 <label for="sd_scheduler" data-i18n="Scheduler">Scheduler</label>
279 <select id="sd_scheduler"></select>279 <select id="sd_scheduler"></select>
280 </div>280 </div>
src/endpoints/novelai.js+25 -1
@@ -307,15 +307,18 @@ router.post('/generate-image', jsonParser, async (request, response) => {
307 },307 },
308 body: JSON.stringify({308 body: JSON.stringify({
309 action: 'generate',309 action: 'generate',
310 input: request.body.prompt,310 input: request.body.prompt ?? '',
311 model: request.body.model ?? 'nai-diffusion',311 model: request.body.model ?? 'nai-diffusion',
312 parameters: {312 parameters: {
313 params_version: 3,
314 prefer_brownian: true,
313 negative_prompt: request.body.negative_prompt ?? '',315 negative_prompt: request.body.negative_prompt ?? '',
314 height: request.body.height ?? 512,316 height: request.body.height ?? 512,
315 width: request.body.width ?? 512,317 width: request.body.width ?? 512,
316 scale: request.body.scale ?? 9,318 scale: request.body.scale ?? 9,
317 seed: request.body.seed >= 0 ? request.body.seed : Math.floor(Math.random() * 9999999999),319 seed: request.body.seed >= 0 ? request.body.seed : Math.floor(Math.random() * 9999999999),
318 sampler: request.body.sampler ?? 'k_dpmpp_2m',320 sampler: request.body.sampler ?? 'k_dpmpp_2m',
321 noise_schedule: request.body.scheduler ?? 'karras',
319 steps: request.body.steps ?? 28,322 steps: request.body.steps ?? 28,
320 n_samples: 1,323 n_samples: 1,
321 // NAI handholding for prompts324 // NAI handholding for prompts
@@ -323,11 +326,32 @@ router.post('/generate-image', jsonParser, async (request, response) => {
323 qualityToggle: false,326 qualityToggle: false,
324 add_original_image: false,327 add_original_image: false,
325 controlnet_strength: 1,328 controlnet_strength: 1,
329 deliberate_euler_ancestral_bug: false,
326 dynamic_thresholding: request.body.decrisper ?? false,330 dynamic_thresholding: request.body.decrisper ?? false,
327 legacy: false,331 legacy: false,
332 legacy_v3_extend: false,
328 sm: request.body.sm ?? false,333 sm: request.body.sm ?? false,
329 sm_dyn: request.body.sm_dyn ?? false,334 sm_dyn: request.body.sm_dyn ?? false,
330 uncond_scale: 1,335 uncond_scale: 1,
336 use_coords: false,
337 characterPrompts: [],
338 reference_image_multiple: [],
339 reference_information_extracted_multiple: [],
340 reference_strength_multiple: [],
341 v4_negative_prompt: {
342 caption: {
343 base_caption: request.body.negative_prompt ?? '',
344 char_captions: [],
345 },
346 },
347 v4_prompt: {
348 caption: {
349 base_caption: request.body.prompt ?? '',
350 char_captions: [],
351 },
352 use_coords: false,
353 use_order: true,
354 },
331 },355 },
332 }),356 }),
333 });357 });