Stability AI support. Adds Ultra, Core, SD3.
| @@ -49,6 +49,7 @@ const sources = { | ||
| 49 | 49 | togetherai: 'togetherai', |
| 50 | 50 | drawthings: 'drawthings', |
| 51 | 51 | pollinations: 'pollinations', |
| 52 | + stability: 'stability', | |
| 52 | 53 | }; |
| 53 | 54 | |
| 54 | 55 | const initiators = { |
| @@ -282,6 +283,13 @@ const defaultSettings = { | ||
| 282 | 283 | wand_visible: false, |
| 283 | 284 | command_visible: false, |
| 284 | 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 | }; |
| 286 | 294 | |
| 287 | 295 | const writePromptFieldsDebounced = debounce(writePromptFields, debounce_timeout.relaxed); |
| @@ -1084,6 +1092,32 @@ function onComfyWorkflowChange() { | ||
| 1084 | 1092 | extension_settings.sd.comfy_workflow = $('#sd_comfy_workflow').find(':selected').val(); |
| 1085 | 1093 | saveSettingsDebounced(); |
| 1086 | 1094 | } |
| 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 | + | |
| 1087 | 1121 | async function changeComfyWorkflow(_, name) { |
| 1088 | 1122 | name = name.replace(/(\.json)?$/i, '.json'); |
| 1089 | 1123 | if ($(`#sd_comfy_workflow > [value="${name}"]`).length > 0) { |
| @@ -1585,6 +1619,13 @@ async function loadModels() { | ||
| 1585 | 1619 | case sources.pollinations: |
| 1586 | 1620 | models = await loadPollinationsModels(); |
| 1587 | 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 | } |
| 1589 | 1630 | |
| 1590 | 1631 | for (const model of models) { |
| @@ -1600,6 +1641,33 @@ async function loadModels() { | ||
| 1600 | 1641 | $('#sd_model').val(extension_settings.sd.model).trigger('change'); |
| 1601 | 1642 | } |
| 1602 | 1643 | } |
| 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 | +} | |
| 1603 | 1671 | |
| 1604 | 1672 | async function loadPollinationsModels() { |
| 1605 | 1673 | return [ |
| @@ -2485,6 +2553,10 @@ async function sendGenerationRequest(generationType, prompt, additionalNegativeP | ||
| 2485 | 2553 | case sources.pollinations: |
| 2486 | 2554 | result = await generatePollinationsImage(prefixedPrompt, negativePrompt); |
| 2487 | 2555 | break; |
| 2556 | + case sources.stability: | |
| 2557 | + result = await generateStabilityImage(prefixedPrompt, negativePrompt); | |
| 2558 | + break; | |
| 2559 | + | |
| 2488 | 2560 | } |
| 2489 | 2561 | |
| 2490 | 2562 | if (!result.data) { |
| @@ -3455,6 +3527,11 @@ jQuery(async () => { | ||
| 3455 | 3527 | $('#sd_command_visible').on('input', onCommandVisibleInput); |
| 3456 | 3528 | $('#sd_interactive_visible').on('input', onInteractiveVisibleInput); |
| 3457 | 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 | 3536 | $('.sd_settings .inline-drawer-toggle').on('click', function () { |
| 3460 | 3537 | initScrollHeight($('#sd_prompt_prefix')); |