Skip to content

Commit bba83cd

Browse files
fix: improve error handling in bulk model deletion
- Added proper error serialization using serialize-error for better error logging - Explicitly defined BulkDeleteModelsResponse type instead of relying on generated schema reference
1 parent fb47338 commit bba83cd

File tree

3 files changed

+95
-6
lines changed

3 files changed

+95
-6
lines changed

invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelList.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Flex, Text, useDisclosure, useToast } from '@invoke-ai/ui-library';
22
import { logger } from 'app/logging/logger';
33
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
44
import ScrollableContent from 'common/components/OverlayScrollbars/ScrollableContent';
5+
import { serializeError } from 'serialize-error';
56
import { MODEL_CATEGORIES_AS_LIST } from 'features/modelManagerV2/models';
67
import {
78
clearModelSelection,
@@ -114,8 +115,8 @@ const ModelList = () => {
114115
}
115116

116117
log.info(`Bulk delete completed: ${result.deleted.length} deleted, ${result.failed.length} failed`);
117-
} catch (error) {
118-
log.error('Bulk delete error:', error);
118+
} catch (err) {
119+
log.error({ error: serializeError(err) }, 'Bulk delete error');
119120
toast({
120121
id: 'BULK_DELETE_ERROR',
121122
title: t('modelManager.modelsDeleteError', {

invokeai/frontend/web/src/services/api/endpoints/models.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,10 @@ type DeleteModelImageResponse = void;
4646
type BulkDeleteModelsArg = {
4747
keys: string[];
4848
};
49-
type BulkDeleteModelsResponse =
50-
paths['/api/v2/models/i/bulk_delete']['post']['responses']['200']['content']['application/json'];
49+
type BulkDeleteModelsResponse = {
50+
deleted: string[];
51+
failed: string[];
52+
};
5153

5254
type ConvertMainModelResponse =
5355
paths['/api/v2/models/convert/{key}']['put']['responses']['200']['content']['application/json'];

invokeai/frontend/web/src/services/api/schema.ts

Lines changed: 88 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,30 @@ export type paths = {
167167
patch: operations["update_model_image"];
168168
trace?: never;
169169
};
170+
"/api/v2/models/i/bulk_delete": {
171+
parameters: {
172+
query?: never;
173+
header?: never;
174+
path?: never;
175+
cookie?: never;
176+
};
177+
get?: never;
178+
put?: never;
179+
/**
180+
* Bulk Delete Models
181+
* @description Delete multiple model records from database.
182+
*
183+
* The configuration records will be removed. The corresponding weights files will be
184+
* deleted as well if they reside within the InvokeAI "models" directory.
185+
* Returns a list of successfully deleted keys and failed deletions with error messages.
186+
*/
187+
post: operations["bulk_delete_models"];
188+
delete?: never;
189+
options?: never;
190+
head?: never;
191+
patch?: never;
192+
trace?: never;
193+
};
170194
"/api/v2/models/install": {
171195
parameters: {
172196
query?: never;
@@ -3006,6 +3030,35 @@ export type components = {
30063030
*/
30073031
type: "bounding_box_output";
30083032
};
3033+
/**
3034+
* BulkDeleteModelsRequest
3035+
* @description Request body for bulk model deletion.
3036+
*/
3037+
BulkDeleteModelsRequest: {
3038+
/**
3039+
* Keys
3040+
* @description List of model keys to delete
3041+
*/
3042+
keys: string[];
3043+
};
3044+
/**
3045+
* BulkDeleteModelsResponse
3046+
* @description Response body for bulk model deletion.
3047+
*/
3048+
BulkDeleteModelsResponse: {
3049+
/**
3050+
* Deleted
3051+
* @description List of successfully deleted model keys
3052+
*/
3053+
deleted: string[];
3054+
/**
3055+
* Failed
3056+
* @description List of failed deletions with error messages
3057+
*/
3058+
failed: {
3059+
[key: string]: unknown;
3060+
}[];
3061+
};
30093062
/**
30103063
* BulkDownloadCompleteEvent
30113064
* @description Event model for bulk_download_complete
@@ -12940,14 +12993,14 @@ export type components = {
1294012993
* Convert Cache Dir
1294112994
* Format: path
1294212995
* @description Path to the converted models cache directory (DEPRECATED, but do not delete because it is needed for migration from previous versions).
12943-
* @default models/.convert_cache
12996+
* @default models\.convert_cache
1294412997
*/
1294512998
convert_cache_dir?: string;
1294612999
/**
1294713000
* Download Cache Dir
1294813001
* Format: path
1294913002
* @description Path to the directory that contains dynamically downloaded models.
12950-
* @default models/.download_cache
13003+
* @default models\.download_cache
1295113004
*/
1295213005
download_cache_dir?: string;
1295313006
/**
@@ -24943,6 +24996,39 @@ export interface operations {
2494324996
};
2494424997
};
2494524998
};
24999+
bulk_delete_models: {
25000+
parameters: {
25001+
query?: never;
25002+
header?: never;
25003+
path?: never;
25004+
cookie?: never;
25005+
};
25006+
requestBody: {
25007+
content: {
25008+
"application/json": components["schemas"]["BulkDeleteModelsRequest"];
25009+
};
25010+
};
25011+
responses: {
25012+
/** @description Models deleted (possibly with some failures) */
25013+
200: {
25014+
headers: {
25015+
[name: string]: unknown;
25016+
};
25017+
content: {
25018+
"application/json": components["schemas"]["BulkDeleteModelsResponse"];
25019+
};
25020+
};
25021+
/** @description Validation Error */
25022+
422: {
25023+
headers: {
25024+
[name: string]: unknown;
25025+
};
25026+
content: {
25027+
"application/json": components["schemas"]["HTTPValidationError"];
25028+
};
25029+
};
25030+
};
25031+
};
2494625032
list_model_installs: {
2494725033
parameters: {
2494825034
query?: never;

0 commit comments

Comments
 (0)