Stability AI support. Adds Ultra, Core, SD3.

d6b42718a6870f6df40d1e7d120408bb0e88573b

WBlair1 <wolfgangblair1@gmail.com>

1 files changed, +77 -0Showing whitespace changes
public/scripts/extensions/stable-diffusion/index.js+77 -0
@@ -49,6 +49,7 @@ const sources = {
49 togetherai: 'togetherai',49 togetherai: 'togetherai',
50 drawthings: 'drawthings',50 drawthings: 'drawthings',
51 pollinations: 'pollinations',51 pollinations: 'pollinations',
52 stability: 'stability',
52};53};
5354
54const initiators = {55const initiators = {
@@ -282,6 +283,13 @@ const defaultSettings = {
282 wand_visible: false,283 wand_visible: false,
283 command_visible: false,284 command_visible: false,
284 interactive_visible: false,285 interactive_visible: false,
286
287 // Stability AI settings
288 stability_api_key: '',
289 stability_engine: 'stable-image-ultra',
290 stability_style_preset: "anime",
291 stability_aspect_ratio: '1:1',
292 stability_output_format: 'png',
285};293};
286294
287const writePromptFieldsDebounced = debounce(writePromptFields, debounce_timeout.relaxed);295const writePromptFieldsDebounced = debounce(writePromptFields, debounce_timeout.relaxed);
@@ -1084,6 +1092,32 @@ function onComfyWorkflowChange() {
1084 extension_settings.sd.comfy_workflow = $('#sd_comfy_workflow').find(':selected').val();1092 extension_settings.sd.comfy_workflow = $('#sd_comfy_workflow').find(':selected').val();
1085 saveSettingsDebounced();1093 saveSettingsDebounced();
1086}1094}
1095function onStabilityKeyInput() {
1096 extension_settings.sd.stability_key = $('#sd_stability_key').val();
1097 saveSettingsDebounced();
1098}
1099
1100function onStabilityEngineChange() {
1101 extension_settings.sd.stability_engine = $('#sd_stability_engine').val();
1102 saveSettingsDebounced();
1103}
1104
1105function onStabilityStylePresetChange() {
1106 extension_settings.sd.stability_style_preset = $('#sd_stability_style_preset').val();
1107 saveSettingsDebounced();
1108}
1109
1110function onStabilityAspectRatioChange() {
1111 extension_settings.sd.stability_aspect_ratio = $('#sd_stability_aspect_ratio').val();
1112 saveSettingsDebounced();
1113}
1114
1115function onStabilityOutputFormatChange() {
1116 extension_settings.sd.stability_output_format = $('#sd_stability_output_format').val();
1117 saveSettingsDebounced();
1118}
1119
1120
1087async function changeComfyWorkflow(_, name) {1121async function changeComfyWorkflow(_, name) {
1088 name = name.replace(/(\.json)?$/i, '.json');1122 name = name.replace(/(\.json)?$/i, '.json');
1089 if ($(`#sd_comfy_workflow > [value="${name}"]`).length > 0) {1123 if ($(`#sd_comfy_workflow > [value="${name}"]`).length > 0) {
@@ -1585,6 +1619,13 @@ async function loadModels() {
1585 case sources.pollinations:1619 case sources.pollinations:
1586 models = await loadPollinationsModels();1620 models = await loadPollinationsModels();
1587 break;1621 break;
1622 case sources.stability:
1623 models = [
1624 { value: 'stable-image-ultra', text: 'Stable Image Ultra' },
1625 { value: 'stable-image-core', text: 'Stable Image Core' },
1626 { value: 'stable-diffusion-3', text: 'Stable Diffusion 3' },
1627 ];
1628 break;
1588 }1629 }
15891630
1590 for (const model of models) {1631 for (const model of models) {
@@ -1600,6 +1641,33 @@ async function loadModels() {
1600 $('#sd_model').val(extension_settings.sd.model).trigger('change');1641 $('#sd_model').val(extension_settings.sd.model).trigger('change');
1601 }1642 }
1602}1643}
1644async function generateStabilityImage(prompt, negativePrompt) {
1645 const result = await fetch('/api/sd/stability/generate', {
1646 method: 'POST',
1647 headers: getRequestHeaders(),
1648 body: JSON.stringify({
1649 key: extension_settings.sd.stability_key,
1650 prompt: prompt,
1651 negative_prompt: negativePrompt,
1652 model: extension_settings.sd.model,
1653 steps: extension_settings.sd.steps,
1654 cfg_scale: extension_settings.sd.scale,
1655 width: extension_settings.sd.width,
1656 height: extension_settings.sd.height,
1657 seed: extension_settings.sd.seed >= 0 ? extension_settings.sd.seed : undefined,
1658 style_preset: extension_settings.sd.stability_style_preset,
1659 aspect_ratio: extension_settings.sd.stability_aspect_ratio,
1660 }),
1661 });
1662
1663 if (result.ok) {
1664 const data = await result.json();
1665 return { format: extension_settings.sd.stability_output_format, data: data.image };
1666 } else {
1667 const text = await result.text();
1668 throw new Error(text);
1669 }
1670}
16031671
1604async function loadPollinationsModels() {1672async function loadPollinationsModels() {
1605 return [1673 return [
@@ -2485,6 +2553,10 @@ async function sendGenerationRequest(generationType, prompt, additionalNegativeP
2485 case sources.pollinations:2553 case sources.pollinations:
2486 result = await generatePollinationsImage(prefixedPrompt, negativePrompt);2554 result = await generatePollinationsImage(prefixedPrompt, negativePrompt);
2487 break;2555 break;
2556 case sources.stability:
2557 result = await generateStabilityImage(prefixedPrompt, negativePrompt);
2558 break;
2559
2488 }2560 }
24892561
2490 if (!result.data) {2562 if (!result.data) {
@@ -3455,6 +3527,11 @@ jQuery(async () => {
3455 $('#sd_command_visible').on('input', onCommandVisibleInput);3527 $('#sd_command_visible').on('input', onCommandVisibleInput);
3456 $('#sd_interactive_visible').on('input', onInteractiveVisibleInput);3528 $('#sd_interactive_visible').on('input', onInteractiveVisibleInput);
3457 $('#sd_swap_dimensions').on('click', onSwapDimensionsClick);3529 $('#sd_swap_dimensions').on('click', onSwapDimensionsClick);
3530 $('#sd_stability_key').on('input', onStabilityKeyInput);
3531 $('#sd_stability_engine').on('change', onStabilityEngineChange);
3532 $('#sd_stability_style_preset').on('change', onStabilityStylePresetChange);
3533 $('#sd_stability_aspect_ratio').on('change', onStabilityAspectRatioChange);
3534 $('#sd_stability_output_format').on('change', onStabilityOutputFormatChange);
3458 3535
3459 $('.sd_settings .inline-drawer-toggle').on('click', function () {3536 $('.sd_settings .inline-drawer-toggle').on('click', function () {
3460 initScrollHeight($('#sd_prompt_prefix'));3537 initScrollHeight($('#sd_prompt_prefix'));