From 0d43453290c444c03098ffe3f5667f4eba2360a3 Mon Sep 17 00:00:00 2001 From: julianbollig Date: Tue, 4 Feb 2025 11:43:49 +0100 Subject: [PATCH 01/23] #58 - created generateImages type and implemented an array for stableDiffusion Signed-off-by: julianbollig --- WebUI/src/assets/js/store/imageGeneration.ts | 30 ++++++++++++++++++-- WebUI/src/assets/js/store/stableDiffusion.ts | 25 ++++++++++------ WebUI/src/env.d.ts | 2 +- WebUI/src/views/Create.vue | 4 +-- 4 files changed, 46 insertions(+), 15 deletions(-) diff --git a/WebUI/src/assets/js/store/imageGeneration.ts b/WebUI/src/assets/js/store/imageGeneration.ts index d6ae35e8..33a5a04c 100644 --- a/WebUI/src/assets/js/store/imageGeneration.ts +++ b/WebUI/src/assets/js/store/imageGeneration.ts @@ -26,6 +26,12 @@ export type StableDiffusionSettings = { safetyCheck: boolean } +export type generatedImage = { + id: number + imageUrl: string + infoParams: KVObject | undefined +} + const SettingsSchema = z.object({ imageModel: z.string(), inpaintModel: z.string(), @@ -407,7 +413,7 @@ export const useImageGeneration = defineStore( const seed = ref(generalDefaultSettings.seed) const imagePreview = ref(generalDefaultSettings.imagePreview) const safeCheck = ref(generalDefaultSettings.safeCheck) - const batchSize = ref(globalDefaultSettings.batchSize) // TODO this should be imageCount instead, as we only support batchSize 1 due to memory constraints + const batchSize = ref(globalDefaultSettings.batchSize) const resetActiveWorkflowSettings = () => { prompt.value = generalDefaultSettings.prompt @@ -575,6 +581,7 @@ export const useImageGeneration = defineStore( saveToSettingsPerWorkflow('inpaintModel') }) + const generatedImages = ref([]) const imageUrls = ref([]) const currentState = ref('no_start') const stepText = ref('') @@ -618,6 +625,20 @@ export const useImageGeneration = defineStore( } } + async function updateImage( + index: number, + image: string, + infoParams: KVObject | undefined = undefined, + ) { + const newImage: generatedImage = { id: index, imageUrl: image, infoParams: infoParams } + const existingImageIndex = generatedImages.value.findIndex((img) => img.id === newImage.id) + if (existingImageIndex !== -1) { + generatedImages.value.splice(existingImageIndex, 1, newImage) + } else { + generatedImages.value.push(newImage) + } + } + async function loadWorkflowsFromIntel() { const syncResponse = await window.electronAPI.updateWorkflowsFromIntelRepo() await loadWorkflowsFromJson() @@ -732,9 +753,10 @@ export const useImageGeneration = defineStore( previewIdx.value = 0 stepText.value = i18nState.COM_GENERATING if (activeWorkflow.value.backend === 'default') { - stableDiffusion.generate() + await stableDiffusion.generate() + console.log(generatedImages.value) } else { - comfyUi.generate() + await comfyUi.generate() } } @@ -761,6 +783,7 @@ export const useImageGeneration = defineStore( activeWorkflow, processing, prompt, + generatedImages, imageUrls, currentState, stepText, @@ -789,6 +812,7 @@ export const useImageGeneration = defineStore( loadWorkflowsFromIntel, getMissingModels, updateDestImage, + updateImage, generate, stopGeneration, reset, diff --git a/WebUI/src/assets/js/store/stableDiffusion.ts b/WebUI/src/assets/js/store/stableDiffusion.ts index 29e96937..c5e82baf 100644 --- a/WebUI/src/assets/js/store/stableDiffusion.ts +++ b/WebUI/src/assets/js/store/stableDiffusion.ts @@ -34,7 +34,7 @@ export const useStableDiffusion = defineStore( const i18nState = useI18N().state const models = useModels() - let abortContooler: AbortController | null + let abortController: AbortController | null const generateParams = ref(new Array()) async function generate() { @@ -123,17 +123,24 @@ export const useStableDiffusion = defineStore( if (!data.safe_check_pass) { data.image = '/src/assets/image/nsfw_result_detected.png' } + //old await imageGeneration.updateDestImage(data.index, data.image) generateParams.value.push(data.params) - imageGeneration.generateIdx++ + imageGeneration.generateIdx++ //necessary? + //new + await imageGeneration.updateImage(data.index, data.image, data.params) break case 'step_end': imageGeneration.currentState = 'generating' imageGeneration.stepText = `${i18nState.COM_GENERATING} ${data.step}/${data.total_step}` if (data.image) { + //old await imageGeneration.updateDestImage(data.index, data.image) + //new + await imageGeneration.updateImage(data.index, data.image) } if (data.step == 0) { + //necessary? imageGeneration.previewIdx = data.index } break @@ -162,7 +169,7 @@ export const useStableDiffusion = defineStore( case 'runtime_error': toast.error(i18nState.ERROR_RUNTIME_ERROR) break - case 'unknow_exception': + case 'unknown_exception': toast.error(i18nState.ERROR_GENERATE_UNKONW_EXCEPTION) break } @@ -173,13 +180,13 @@ export const useStableDiffusion = defineStore( async function sendGenerate(defaultBackendParams: BackendParams) { try { imageGeneration.processing = true - if (!abortContooler) { - abortContooler = new AbortController() + if (!abortController) { + abortController = new AbortController() } const response = await fetch(`${useGlobalSetup().apiHost}/api/sd/generate`, { method: 'POST', body: util.convertToFormData(defaultBackendParams), - signal: abortContooler.signal, + signal: abortController.signal, }) const reader = response.body!.getReader() await new SSEProcessor(reader, dataProcess, finishGenerate).start() @@ -192,9 +199,9 @@ export const useStableDiffusion = defineStore( if (imageGeneration.processing && !imageGeneration.stopping) { imageGeneration.stopping = true await fetch(`${globalSetup.apiHost}/api/sd/stopGenerate`) - if (abortContooler) { - abortContooler.abort() - abortContooler = null + if (abortController) { + abortController.abort() + abortController = null } imageGeneration.processing = false imageGeneration.stopping = false diff --git a/WebUI/src/env.d.ts b/WebUI/src/env.d.ts index 67dd78f8..7744d953 100644 --- a/WebUI/src/env.d.ts +++ b/WebUI/src/env.d.ts @@ -259,7 +259,7 @@ type NotEnoughDiskSpaceExceptionCallback = { type ErrorOutCallback = { type: 'error' - err_type: 'runtime_error' | 'download_exception' | 'unknow_exception' + err_type: 'runtime_error' | 'download_exception' | 'unknown_exception' } type DownloadModelProgressCallback = { diff --git a/WebUI/src/views/Create.vue b/WebUI/src/views/Create.vue index 73649f5e..ce8c1960 100644 --- a/WebUI/src/views/Create.vue +++ b/WebUI/src/views/Create.vue @@ -88,7 +88,7 @@