diff --git a/public/scripts/extensions/stable-diffusion/comfyWorkflowEditor.html b/public/scripts/extensions/stable-diffusion/comfyWorkflowEditor.html
index e8b438f84..db4e81b13 100644
--- a/public/scripts/extensions/stable-diffusion/comfyWorkflowEditor.html
+++ b/public/scripts/extensions/stable-diffusion/comfyWorkflowEditor.html
@@ -12,6 +12,7 @@
"%prompt%"
"%negative_prompt%"
"%model%"
+ "%vae%"
"%sampler%"
"%scheduler%"
"%steps%"
diff --git a/public/scripts/extensions/stable-diffusion/index.js b/public/scripts/extensions/stable-diffusion/index.js
index 6d9aae232..ad597d2e9 100644
--- a/public/scripts/extensions/stable-diffusion/index.js
+++ b/public/scripts/extensions/stable-diffusion/index.js
@@ -186,6 +186,7 @@ const defaultSettings = {
negative_prompt: defaultNegative,
sampler: 'DDIM',
model: '',
+ vae: '',
// Automatic1111/Horde exclusives
restore_faces: false,
@@ -480,7 +481,7 @@ async function loadSettings() {
toggleSourceControls();
addPromptTemplates();
- await Promise.all([loadSamplers(), loadModels(), loadSchedulers()]);
+ await Promise.all([loadSamplers(), loadModels(), loadSchedulers(), loadVaes()]);
}
function addPromptTemplates() {
@@ -914,6 +915,7 @@ async function validateComfyUrl() {
await loadSamplers();
await loadSchedulers();
await loadModels();
+ await loadVaes();
toastr.success('ComfyUI API connected.');
} catch (error) {
toastr.error(`Could not validate ComfyUI API: ${error.message}`);
@@ -960,6 +962,10 @@ async function getAutoRemoteModel() {
}
}
+async function onVaeChange() {
+ extension_settings.sd.vae = $('#sd_vae').find(':selected').val();
+}
+
async function getAutoRemoteUpscalers() {
try {
const result = await fetch('/api/sd/upscalers', {
@@ -1473,6 +1479,65 @@ async function loadComfySchedulers() {
}
}
+async function loadVaes() {
+ $('#sd_vae').empty();
+ let vaes = [];
+
+ switch (extension_settings.sd.source) {
+ case sources.extras:
+ vaes = ['N/A'];
+ break;
+ case sources.horde:
+ vaes = ['N/A'];
+ break;
+ case sources.auto:
+ vaes = ['N/A'];
+ break;
+ case sources.novel:
+ vaes = ['N/A'];
+ break;
+ case sources.vlad:
+ vaes = ['N/A'];
+ break;
+ case sources.openai:
+ vaes = ['N/A'];
+ break;
+ case sources.comfy:
+ vaes = await loadComfyVaes();
+ break;
+ }
+
+ for (const vae of vaes) {
+ const option = document.createElement('option');
+ option.innerText = vae;
+ option.value = vae;
+ option.selected = vae === extension_settings.sd.vae;
+ $('#sd_vae').append(option);
+ }
+}
+
+async function loadComfyVaes() {
+ if (!extension_settings.sd.comfy_url) {
+ return [];
+ }
+
+ try {
+ const result = await fetch(`/api/sd/comfy/vaes`, {
+ method: 'POST',
+ headers: getRequestHeaders(),
+ body: JSON.stringify({
+ url: extension_settings.sd.comfy_url,
+ })
+ });
+ if (!result.ok) {
+ throw new Error('ComfyUI returned an error.');
+ }
+ return await result.json();
+ } catch (error) {
+ return [];
+ }
+}
+
function getGenerationType(prompt) {
let mode = generationMode.FREE;
@@ -2037,6 +2102,7 @@ async function generateComfyImage(prompt) {
const placeholders = [
'negative_prompt',
'model',
+ 'vae',
'sampler',
'scheduler',
'steps',
@@ -2294,6 +2360,7 @@ jQuery(async () => {
$('#sd_scale').on('input', onScaleInput);
$('#sd_steps').on('input', onStepsInput);
$('#sd_model').on('change', onModelChange);
+ $('#sd_vae').on('change', onVaeChange);
$('#sd_sampler').on('change', onSamplerChange);
$('#sd_scheduler').on('change', onSchedulerChange);
$('#sd_prompt_prefix').on('input', onPromptPrefixInput);
diff --git a/public/scripts/extensions/stable-diffusion/settings.html b/public/scripts/extensions/stable-diffusion/settings.html
index cb0a20cd4..00a0e3673 100644
--- a/public/scripts/extensions/stable-diffusion/settings.html
+++ b/public/scripts/extensions/stable-diffusion/settings.html
@@ -150,6 +150,10 @@
+
+
+
+