Stability AI support. Adds Ultra, Core, SD3.
| @@ -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 | }; |
| 53 | 54 | ||
| 54 | const initiators = { | 55 | const 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 | }; |
| 286 | 294 | ||
| 287 | const writePromptFieldsDebounced = debounce(writePromptFields, debounce_timeout.relaxed); | 295 | const 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 | } |
| 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 | async function changeComfyWorkflow(_, name) { | 1121 | async 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 | } |
| 1589 | 1630 | ||
| 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 | } |
| 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 | async function loadPollinationsModels() { | 1672 | async 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 | } |
| 2489 | 2561 | ||
| 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')); |