Skip to content

Commit 82409d1

Browse files
feat(ui): allow changing model format in MM
1 parent 57787e3 commit 82409d1

File tree

5 files changed

+58
-1
lines changed

5 files changed

+58
-1
lines changed

invokeai/frontend/web/public/locales/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -942,6 +942,7 @@
942942
"modelConverted": "Model Converted",
943943
"modelDeleted": "Model Deleted",
944944
"modelDeleteFailed": "Failed to delete model",
945+
"modelFormat": "Model Format",
945946
"modelImageDeleted": "Model Image Deleted",
946947
"modelImageDeleteFailed": "Model Image Delete Failed",
947948
"modelImageUpdated": "Model Image Updated",

invokeai/frontend/web/src/features/modelManagerV2/models.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { BaseModelType, ModelType, ModelVariantType } from 'features/nodes/types/common';
1+
import type { BaseModelType, ModelFormat, ModelType, ModelVariantType } from 'features/nodes/types/common';
22
import type { AnyModelConfig } from 'services/api/types';
33
import {
44
isCLIPEmbedModelConfig,
@@ -225,6 +225,24 @@ export const MODEL_VARIANT_TO_LONG_NAME: Record<ModelVariantType, string> = {
225225
depth: 'Depth',
226226
};
227227

228+
export const MODEL_FORMAT_TO_LONG_NAME: Record<ModelFormat, string> = {
229+
omi: 'OMI',
230+
diffusers: 'Diffusers',
231+
checkpoint: 'Checkpoint',
232+
lycoris: 'LyCORIS',
233+
onnx: 'ONNX',
234+
olive: 'Olive',
235+
embedding_file: 'Embedding (file)',
236+
embedding_folder: 'Embedding (folder)',
237+
invokeai: 'InvokeAI',
238+
t5_encoder: 'T5 Encoder',
239+
bnb_quantized_int8b: 'BNB Quantized (int8b)',
240+
bnb_quantized_nf4b: 'BNB Quantized (nf4b)',
241+
gguf_quantized: 'GGUF Quantized',
242+
api: 'API',
243+
unknown: 'Unknown',
244+
};
245+
228246
/**
229247
* List of base models that make API requests
230248
*/
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import type { ComboboxOnChange, ComboboxOption } from '@invoke-ai/ui-library';
2+
import { Combobox } from '@invoke-ai/ui-library';
3+
import { typedMemo } from 'common/util/typedMemo';
4+
import { MODEL_FORMAT_TO_LONG_NAME } from 'features/modelManagerV2/models';
5+
import { useCallback, useMemo } from 'react';
6+
import type { Control } from 'react-hook-form';
7+
import { useController } from 'react-hook-form';
8+
import type { UpdateModelArg } from 'services/api/endpoints/models';
9+
import { objectEntries } from 'tsafe';
10+
11+
const options: ComboboxOption[] = objectEntries(MODEL_FORMAT_TO_LONG_NAME).map(([value, label]) => ({
12+
label,
13+
value,
14+
}));
15+
16+
type Props = {
17+
control: Control<UpdateModelArg['body']>;
18+
};
19+
20+
const ModelFormatSelect = ({ control }: Props) => {
21+
const { field } = useController({ control, name: 'format' });
22+
const value = useMemo(() => options.find((o) => o.value === field.value), [field.value]);
23+
const onChange = useCallback<ComboboxOnChange>(
24+
(v) => {
25+
field.onChange(v?.value);
26+
},
27+
[field]
28+
);
29+
return <Combobox value={value} options={options} onChange={onChange} />;
30+
};
31+
32+
export default typedMemo(ModelFormatSelect);

invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelPanel/ModelEdit.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { type UpdateModelArg, useUpdateModelMutation } from 'services/api/endpoi
2222
import type { AnyModelConfig } from 'services/api/types';
2323

2424
import BaseModelSelect from './Fields/BaseModelSelect';
25+
import ModelFormatSelect from './Fields/ModelFormatSelect';
2526
import ModelTypeSelect from './Fields/ModelTypeSelect';
2627
import ModelVariantSelect from './Fields/ModelVariantSelect';
2728
import PredictionTypeSelect from './Fields/PredictionTypeSelect';
@@ -132,6 +133,10 @@ export const ModelEdit = memo(({ modelConfig }: Props) => {
132133
<FormLabel>{t('modelManager.modelType')}</FormLabel>
133134
<ModelTypeSelect control={form.control} />
134135
</FormControl>
136+
<FormControl flexDir="column" alignItems="flex-start" gap={1}>
137+
<FormLabel>{t('modelManager.modelFormat')}</FormLabel>
138+
<ModelFormatSelect control={form.control} />
139+
</FormControl>
135140
{modelConfig.type !== 'clip_vision' && (
136141
<FormControl flexDir="column" alignItems="flex-start" gap={1}>
137142
<FormLabel>{t('modelManager.baseModel')}</FormLabel>

invokeai/frontend/web/src/features/nodes/types/common.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ export const zModelFormat = z.enum([
167167
'api',
168168
'unknown',
169169
]);
170+
export type ModelFormat = z.infer<typeof zModelFormat>;
170171

171172
export const zModelIdentifierField = z.object({
172173
key: z.string().min(1),

0 commit comments

Comments
 (0)