Stability AI support. Adds Ultra, Core, SD3.

d6b42718a6870f6df40d1e7d120408bb0e88573b

WBlair1 <wolfgangblair1@gmail.com>

1 files changed, +78 -1Ignore whitespace
public/scripts/extensions/stable-diffusion/index.js+78 -1
@@ -49,6 +49,7 @@ const sources = {
4949 togetherai: 'togetherai',
5050 drawthings: 'drawthings',
5151 pollinations: 'pollinations',
52+ stability: 'stability',
5253};
5354
5455const initiators = {
@@ -282,6 +283,13 @@ const defaultSettings = {
282283 wand_visible: false,
283284 command_visible: false,
284285 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',
285293};
286294
287295const writePromptFieldsDebounced = debounce(writePromptFields, debounce_timeout.relaxed);
@@ -1084,6 +1092,32 @@ function onComfyWorkflowChange() {
10841092 extension_settings.sd.comfy_workflow = $('#sd_comfy_workflow').find(':selected').val();
10851093 saveSettingsDebounced();
10861094}
1095+function onStabilityKeyInput() {
1096+ extension_settings.sd.stability_key = $('#sd_stability_key').val();
1097+ saveSettingsDebounced();
1098+}
1099+
1100+function onStabilityEngineChange() {
1101+ extension_settings.sd.stability_engine = $('#sd_stability_engine').val();
1102+ saveSettingsDebounced();
1103+}
1104+
1105+function onStabilityStylePresetChange() {
1106+ extension_settings.sd.stability_style_preset = $('#sd_stability_style_preset').val();
1107+ saveSettingsDebounced();
1108+}
1109+
1110+function onStabilityAspectRatioChange() {
1111+ extension_settings.sd.stability_aspect_ratio = $('#sd_stability_aspect_ratio').val();
1112+ saveSettingsDebounced();
1113+}
1114+
1115+function onStabilityOutputFormatChange() {
1116+ extension_settings.sd.stability_output_format = $('#sd_stability_output_format').val();
1117+ saveSettingsDebounced();
1118+}
1119+
1120+
10871121async function changeComfyWorkflow(_, name) {
10881122 name = name.replace(/(\.json)?$/i, '.json');
10891123 if ($(`#sd_comfy_workflow > [value="${name}"]`).length > 0) {
@@ -1585,6 +1619,13 @@ async function loadModels() {
15851619 case sources.pollinations:
15861620 models = await loadPollinationsModels();
15871621 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;
15881629 }
15891630
15901631 for (const model of models) {
@@ -1600,6 +1641,33 @@ async function loadModels() {
16001641 $('#sd_model').val(extension_settings.sd.model).trigger('change');
16011642 }
16021643}
1644+async 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
16041672async function loadPollinationsModels() {
16051673 return [
@@ -2485,6 +2553,10 @@ async function sendGenerationRequest(generationType, prompt, additionalNegativeP
24852553 case sources.pollinations:
24862554 result = await generatePollinationsImage(prefixedPrompt, negativePrompt);
24872555 break;
2556+ case sources.stability:
2557+ result = await generateStabilityImage(prefixedPrompt, negativePrompt);
2558+ break;
2559+
24882560 }
24892561
24902562 if (!result.data) {
@@ -3455,7 +3527,12 @@ jQuery(async () => {
34553527 $('#sd_command_visible').on('input', onCommandVisibleInput);
34563528 $('#sd_interactive_visible').on('input', onInteractiveVisibleInput);
34573529 $('#sd_swap_dimensions').on('click', onSwapDimensionsClick);
3458-
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);
3535+
34593536 $('.sd_settings .inline-drawer-toggle').on('click', function () {
34603537 initScrollHeight($('#sd_prompt_prefix'));
34613538 initScrollHeight($('#sd_negative_prompt'));