From 807c6b41c5a5872236fdfe11df87b7aaa08611fe Mon Sep 17 00:00:00 2001 From: Mary Hipp Date: Wed, 27 Sep 2023 11:59:11 -0400 Subject: [PATCH 1/4] surface usage errors for enqueuing batch --- .../listenerMiddleware/listeners/batchEnqueued.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/batchEnqueued.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/batchEnqueued.ts index fe351f3be6..c6bbf6f9af 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/batchEnqueued.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/batchEnqueued.ts @@ -47,6 +47,8 @@ export const addBatchEnqueuedListener = () => { const response = action.payload; const arg = action.meta.arg.originalArgs; + console.log({ response }); + if (!response) { toast({ title: t('queue.batchFailedToQueue'), @@ -61,6 +63,7 @@ export const addBatchEnqueuedListener = () => { } const result = zPydanticValidationError.safeParse(response); + console.log({ result }); if (result.success) { result.data.data.detail.map((e) => { toast({ @@ -76,15 +79,20 @@ export const addBatchEnqueuedListener = () => { }); } else { let detail = 'Unknown Error'; + let duration = undefined; if (response.status === 403 && 'body' in response) { detail = get(response, 'body.detail', 'Unknown Error'); } else if (response.status === 403 && 'error' in response) { detail = get(response, 'error.detail', 'Unknown Error'); + } else if (response.status === 403 && 'data' in response) { + detail = get(response, 'data.detail', 'Unknown Error'); + duration = 15000; } toast({ title: t('queue.batchFailedToQueue'), status: 'error', description: detail, + ...(duration ? { duration } : {}), }); } logger('queue').error( From 40ed218c264b0ae02bcba6ef2a5244bff24cd166 Mon Sep 17 00:00:00 2001 From: Mary Hipp Date: Wed, 27 Sep 2023 11:59:44 -0400 Subject: [PATCH 2/4] surface usage errors for cnet and upscale, handle clearing cnet if error occurs --- .../listeners/controlNetImageProcessed.ts | 32 +++++++++++++++++-- .../listeners/upscaleRequested.ts | 21 +++++++++++- .../controlNet/store/controlNetSlice.ts | 4 +++ 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts index 814614da10..2c3bf0ff5e 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts @@ -1,7 +1,11 @@ import { logger } from 'app/logging/logger'; import { parseify } from 'common/util/serialize'; import { controlNetImageProcessed } from 'features/controlNet/store/actions'; -import { controlNetProcessedImageChanged } from 'features/controlNet/store/controlNetSlice'; +import { + clearPendingControlImages, + controlNetImageChanged, + controlNetProcessedImageChanged, +} from 'features/controlNet/store/controlNetSlice'; import { SAVE_IMAGE } from 'features/nodes/util/graphBuilders/constants'; import { addToast } from 'features/system/store/systemSlice'; import { t } from 'i18next'; @@ -11,6 +15,7 @@ import { isImageOutput } from 'services/api/guards'; import { Graph, ImageDTO } from 'services/api/types'; import { socketInvocationComplete } from 'services/events/actions'; import { startAppListening } from '..'; +import { FetchBaseQueryError } from '@reduxjs/toolkit/dist/query'; export const addControlNetImageProcessedListener = () => { startAppListening({ @@ -105,8 +110,31 @@ export const addControlNetImageProcessedListener = () => { }) ); } - } catch { + } catch (error) { log.error({ graph: parseify(graph) }, t('queue.graphFailedToQueue')); + + // handle usage-related errors + if (error instanceof Object) { + if ('data' in error && 'status' in error) { + if (error.status === 403) { + const detail = (error.data as any)?.detail || 'Unknown Error'; + dispatch( + addToast({ + title: t('queue.graphFailedToQueue'), + status: 'error', + description: detail, + duration: 15000, + }) + ); + dispatch(clearPendingControlImages()); + dispatch( + controlNetImageChanged({ controlNetId, controlImage: null }) + ); + return; + } + } + } + dispatch( addToast({ title: t('queue.graphFailedToQueue'), diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts index b54d8b553c..e993fa75de 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts @@ -44,8 +44,27 @@ export const addUpscaleRequestedListener = () => { { enqueueResult: parseify(enqueueResult) }, t('queue.graphQueued') ); - } catch { + } catch (error) { log.error({ graph: parseify(graph) }, t('queue.graphFailedToQueue')); + + // handle usage-related errors + if (error instanceof Object) { + if ('data' in error && 'status' in error) { + if (error.status === 403) { + const detail = (error.data as any)?.detail || 'Unknown Error'; + dispatch( + addToast({ + title: t('queue.graphFailedToQueue'), + status: 'error', + description: detail, + duration: 15000, + }) + ); + return; + } + } + } + dispatch( addToast({ title: t('queue.graphFailedToQueue'), diff --git a/invokeai/frontend/web/src/features/controlNet/store/controlNetSlice.ts b/invokeai/frontend/web/src/features/controlNet/store/controlNetSlice.ts index f0745eae2b..9b5dec68f3 100644 --- a/invokeai/frontend/web/src/features/controlNet/store/controlNetSlice.ts +++ b/invokeai/frontend/web/src/features/controlNet/store/controlNetSlice.ts @@ -410,6 +410,9 @@ export const controlNetSlice = createSlice({ state.isIPAdapterEnabled = false; state.ipAdapterInfo = { ...initialIPAdapterState }; }, + clearPendingControlImages: (state) => { + state.pendingControlImages = []; + }, }, extraReducers: (builder) => { builder.addCase(controlNetImageProcessed, (state, action) => { @@ -474,6 +477,7 @@ export const { ipAdapterBeginStepPctChanged, ipAdapterEndStepPctChanged, ipAdapterStateReset, + clearPendingControlImages, } = controlNetSlice.actions; export default controlNetSlice.reducer; From de04a5f4411f878f7950463107033b748929293d Mon Sep 17 00:00:00 2001 From: Mary Hipp Date: Wed, 27 Sep 2023 12:05:22 -0400 Subject: [PATCH 3/4] cleanup --- .../middleware/listenerMiddleware/listeners/batchEnqueued.ts | 3 --- .../listenerMiddleware/listeners/controlNetImageProcessed.ts | 1 - 2 files changed, 4 deletions(-) diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/batchEnqueued.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/batchEnqueued.ts index c6bbf6f9af..bdb8e03ad2 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/batchEnqueued.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/batchEnqueued.ts @@ -47,8 +47,6 @@ export const addBatchEnqueuedListener = () => { const response = action.payload; const arg = action.meta.arg.originalArgs; - console.log({ response }); - if (!response) { toast({ title: t('queue.batchFailedToQueue'), @@ -63,7 +61,6 @@ export const addBatchEnqueuedListener = () => { } const result = zPydanticValidationError.safeParse(response); - console.log({ result }); if (result.success) { result.data.data.detail.map((e) => { toast({ diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts index 2c3bf0ff5e..a4deaf3c27 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts @@ -15,7 +15,6 @@ import { isImageOutput } from 'services/api/guards'; import { Graph, ImageDTO } from 'services/api/types'; import { socketInvocationComplete } from 'services/events/actions'; import { startAppListening } from '..'; -import { FetchBaseQueryError } from '@reduxjs/toolkit/dist/query'; export const addControlNetImageProcessedListener = () => { startAppListening({ From a0bd8c638e77517bd94f170a2d9c4eb51a0388fa Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Thu, 28 Sep 2023 12:35:39 +1000 Subject: [PATCH 4/4] chore(ui): lint --- .../listenerMiddleware/listeners/controlNetImageProcessed.ts | 1 + .../middleware/listenerMiddleware/listeners/upscaleRequested.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts index a4deaf3c27..6cd2056633 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts @@ -116,6 +116,7 @@ export const addControlNetImageProcessedListener = () => { if (error instanceof Object) { if ('data' in error && 'status' in error) { if (error.status === 403) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any const detail = (error.data as any)?.detail || 'Unknown Error'; dispatch( addToast({ diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts index e993fa75de..cad6c341f1 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/upscaleRequested.ts @@ -51,6 +51,7 @@ export const addUpscaleRequestedListener = () => { if (error instanceof Object) { if ('data' in error && 'status' in error) { if (error.status === 403) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any const detail = (error.data as any)?.detail || 'Unknown Error'; dispatch( addToast({