diff --git a/public/scripts/extensions/stable-diffusion/index.js b/public/scripts/extensions/stable-diffusion/index.js index 640a97f0e..f16e08605 100644 --- a/public/scripts/extensions/stable-diffusion/index.js +++ b/public/scripts/extensions/stable-diffusion/index.js @@ -1642,45 +1642,78 @@ async function loadModels() { $('#sd_model').val(extension_settings.sd.model).trigger('change'); } } + async function generateStabilityImage(prompt, negativePrompt) { - let endpoint; + const payload = { + prompt: prompt, + negative_prompt: negativePrompt, + width: extension_settings.sd.width, + height: extension_settings.sd.height, + seed: extension_settings.sd.seed >= 0 ? extension_settings.sd.seed : undefined, + style_preset: extension_settings.sd.stability_style_preset, + output_format: extension_settings.sd.stability_output_format, + }; + + const formData = new FormData(); + for (const [key, value] of Object.entries(payload)) { + if (value !== undefined) { + formData.append(key, String(value)); + } + } + + let apiUrl; switch (extension_settings.sd.model) { case 'stable-image-ultra': - endpoint = '/v2beta/stable-image/generate/ultra'; + apiUrl = 'https://api.stability.ai/v2beta/stable-image/generate/ultra'; break; case 'stable-image-core': - endpoint = '/v2beta/stable-image/generate/core'; + apiUrl = 'https://api.stability.ai/v2beta/stable-image/generate/core'; break; case 'stable-diffusion-3': - endpoint = '/v2beta/stable-image/generate/sd3'; + apiUrl = 'https://api.stability.ai/v2beta/stable-image/generate/sd3'; break; default: throw new Error('Invalid Stability AI model selected'); } - const result = await fetch('/api/sd/stability/generate', { - method: 'POST', - headers: getRequestHeaders(), - body: JSON.stringify({ - key: extension_settings.sd.stability_key, - endpoint: endpoint, - prompt: prompt, - negative_prompt: negativePrompt, - seed: extension_settings.sd.seed >= 0 ? extension_settings.sd.seed : undefined, - style_preset: extension_settings.sd.stability_style_preset, - aspect_ratio: extension_settings.sd.stability_aspect_ratio, - }), - }); + try { + const response = await fetch(apiUrl, { + method: 'POST', + headers: { + 'Authorization': `Bearer ${extension_settings.sd.stability_key}`, + 'Accept': 'image/*', + }, + body: formData, + }); - if (result.ok) { - const data = await result.json(); - return { format: extension_settings.sd.stability_output_format, data: data.image }; - } else { - const text = await result.text(); - throw new Error(text); + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`HTTP ${response.status}: ${errorText}`); + } + + const arrayBuffer = await response.arrayBuffer(); + const base64Image = arrayBufferToBase64(arrayBuffer); + + return { + format: extension_settings.sd.stability_output_format, + data: base64Image, + }; + } catch (error) { + console.error('Error generating image with Stability AI:', error); + throw error; } } +function arrayBufferToBase64(buffer) { + let binary = ''; + const bytes = new Uint8Array(buffer); + const len = bytes.byteLength; + for (let i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return btoa(binary); +} + async function loadStabilityModels() {