Add NAI Diffusion V4
| @@ -1986,6 +1986,10 @@ async function loadNovelModels() { | |||
| 1986 | 1986 | ||
| 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, |
| @@ -274,7 +274,7 @@ | |||
| 274 | <select id="sd_sampler"></select> | 274 | <select id="sd_sampler"></select> |
| 275 | </div> | 275 | </div> |
| 276 | 276 | ||
| 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> |
| @@ -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 prompts | 324 | // 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 | }); |