mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
feat(ui): add fields for CLIP embed models and Flux VAE models in workflows
This commit is contained in:
parent
16825ee6e9
commit
3e569c8312
@ -6,6 +6,8 @@ import {
|
|||||||
isBoardFieldInputTemplate,
|
isBoardFieldInputTemplate,
|
||||||
isBooleanFieldInputInstance,
|
isBooleanFieldInputInstance,
|
||||||
isBooleanFieldInputTemplate,
|
isBooleanFieldInputTemplate,
|
||||||
|
isCLIPEmbedModelFieldInputInstance,
|
||||||
|
isCLIPEmbedModelFieldInputTemplate,
|
||||||
isColorFieldInputInstance,
|
isColorFieldInputInstance,
|
||||||
isColorFieldInputTemplate,
|
isColorFieldInputTemplate,
|
||||||
isControlNetModelFieldInputInstance,
|
isControlNetModelFieldInputInstance,
|
||||||
@ -16,6 +18,8 @@ import {
|
|||||||
isFloatFieldInputTemplate,
|
isFloatFieldInputTemplate,
|
||||||
isFluxMainModelFieldInputInstance,
|
isFluxMainModelFieldInputInstance,
|
||||||
isFluxMainModelFieldInputTemplate,
|
isFluxMainModelFieldInputTemplate,
|
||||||
|
isFluxVAEModelFieldInputInstance,
|
||||||
|
isFluxVAEModelFieldInputTemplate,
|
||||||
isImageFieldInputInstance,
|
isImageFieldInputInstance,
|
||||||
isImageFieldInputTemplate,
|
isImageFieldInputTemplate,
|
||||||
isIntegerFieldInputInstance,
|
isIntegerFieldInputInstance,
|
||||||
@ -49,10 +53,12 @@ import { memo } from 'react';
|
|||||||
|
|
||||||
import BoardFieldInputComponent from './inputs/BoardFieldInputComponent';
|
import BoardFieldInputComponent from './inputs/BoardFieldInputComponent';
|
||||||
import BooleanFieldInputComponent from './inputs/BooleanFieldInputComponent';
|
import BooleanFieldInputComponent from './inputs/BooleanFieldInputComponent';
|
||||||
|
import CLIPEmbedModelFieldInputComponent from './inputs/CLIPEmbedModelFieldInputComponent';
|
||||||
import ColorFieldInputComponent from './inputs/ColorFieldInputComponent';
|
import ColorFieldInputComponent from './inputs/ColorFieldInputComponent';
|
||||||
import ControlNetModelFieldInputComponent from './inputs/ControlNetModelFieldInputComponent';
|
import ControlNetModelFieldInputComponent from './inputs/ControlNetModelFieldInputComponent';
|
||||||
import EnumFieldInputComponent from './inputs/EnumFieldInputComponent';
|
import EnumFieldInputComponent from './inputs/EnumFieldInputComponent';
|
||||||
import FluxMainModelFieldInputComponent from './inputs/FluxMainModelFieldInputComponent';
|
import FluxMainModelFieldInputComponent from './inputs/FluxMainModelFieldInputComponent';
|
||||||
|
import FluxVAEModelFieldInputComponent from './inputs/FluxVAEModelFieldInputComponent';
|
||||||
import ImageFieldInputComponent from './inputs/ImageFieldInputComponent';
|
import ImageFieldInputComponent from './inputs/ImageFieldInputComponent';
|
||||||
import IPAdapterModelFieldInputComponent from './inputs/IPAdapterModelFieldInputComponent';
|
import IPAdapterModelFieldInputComponent from './inputs/IPAdapterModelFieldInputComponent';
|
||||||
import LoRAModelFieldInputComponent from './inputs/LoRAModelFieldInputComponent';
|
import LoRAModelFieldInputComponent from './inputs/LoRAModelFieldInputComponent';
|
||||||
@ -122,6 +128,13 @@ const InputFieldRenderer = ({ nodeId, fieldName }: InputFieldProps) => {
|
|||||||
if (isT5EncoderModelFieldInputInstance(fieldInstance) && isT5EncoderModelFieldInputTemplate(fieldTemplate)) {
|
if (isT5EncoderModelFieldInputInstance(fieldInstance) && isT5EncoderModelFieldInputTemplate(fieldTemplate)) {
|
||||||
return <T5EncoderModelFieldInputComponent nodeId={nodeId} field={fieldInstance} fieldTemplate={fieldTemplate} />;
|
return <T5EncoderModelFieldInputComponent nodeId={nodeId} field={fieldInstance} fieldTemplate={fieldTemplate} />;
|
||||||
}
|
}
|
||||||
|
if (isCLIPEmbedModelFieldInputInstance(fieldInstance) && isCLIPEmbedModelFieldInputTemplate(fieldTemplate)) {
|
||||||
|
return <CLIPEmbedModelFieldInputComponent nodeId={nodeId} field={fieldInstance} fieldTemplate={fieldTemplate} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isFluxVAEModelFieldInputInstance(fieldInstance) && isFluxVAEModelFieldInputTemplate(fieldTemplate)) {
|
||||||
|
return <FluxVAEModelFieldInputComponent nodeId={nodeId} field={fieldInstance} fieldTemplate={fieldTemplate} />;
|
||||||
|
}
|
||||||
|
|
||||||
if (isLoRAModelFieldInputInstance(fieldInstance) && isLoRAModelFieldInputTemplate(fieldTemplate)) {
|
if (isLoRAModelFieldInputInstance(fieldInstance) && isLoRAModelFieldInputTemplate(fieldTemplate)) {
|
||||||
return <LoRAModelFieldInputComponent nodeId={nodeId} field={fieldInstance} fieldTemplate={fieldTemplate} />;
|
return <LoRAModelFieldInputComponent nodeId={nodeId} field={fieldInstance} fieldTemplate={fieldTemplate} />;
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
import { Combobox, Flex, FormControl, Tooltip } from '@invoke-ai/ui-library';
|
||||||
|
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
||||||
|
import { useGroupedModelCombobox } from 'common/hooks/useGroupedModelCombobox';
|
||||||
|
import { fieldCLIPEmbedValueChanged } from 'features/nodes/store/nodesSlice';
|
||||||
|
import type { CLIPEmbedModelFieldInputInstance, CLIPEmbedModelFieldInputTemplate } from 'features/nodes/types/field';
|
||||||
|
import { memo, useCallback } from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { useClipEmbedModels } from 'services/api/hooks/modelsByType';
|
||||||
|
import type { ClipEmbedModelConfig } from 'services/api/types';
|
||||||
|
|
||||||
|
import type { FieldComponentProps } from './types';
|
||||||
|
|
||||||
|
type Props = FieldComponentProps<CLIPEmbedModelFieldInputInstance, CLIPEmbedModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
const CLIPEmbedModelFieldInputComponent = (props: Props) => {
|
||||||
|
const { nodeId, field } = props;
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const disabledTabs = useAppSelector((s) => s.config.disabledTabs);
|
||||||
|
const dispatch = useAppDispatch();
|
||||||
|
const [modelConfigs, { isLoading }] = useClipEmbedModels();
|
||||||
|
const _onChange = useCallback(
|
||||||
|
(value: ClipEmbedModelConfig | null) => {
|
||||||
|
if (!value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dispatch(
|
||||||
|
fieldCLIPEmbedValueChanged({
|
||||||
|
nodeId,
|
||||||
|
fieldName: field.name,
|
||||||
|
value,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
},
|
||||||
|
[dispatch, field.name, nodeId]
|
||||||
|
);
|
||||||
|
const { options, value, onChange, placeholder, noOptionsMessage } = useGroupedModelCombobox({
|
||||||
|
modelConfigs,
|
||||||
|
onChange: _onChange,
|
||||||
|
isLoading,
|
||||||
|
selectedModel: field.value,
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Flex w="full" alignItems="center" gap={2}>
|
||||||
|
<Tooltip label={!disabledTabs.includes('models') && t('modelManager.starterModelsInModelManager')}>
|
||||||
|
<FormControl className="nowheel nodrag" isDisabled={!options.length} isInvalid={!value}>
|
||||||
|
<Combobox
|
||||||
|
value={value}
|
||||||
|
placeholder={placeholder}
|
||||||
|
options={options}
|
||||||
|
onChange={onChange}
|
||||||
|
noOptionsMessage={noOptionsMessage}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
</Tooltip>
|
||||||
|
</Flex>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(CLIPEmbedModelFieldInputComponent);
|
@ -0,0 +1,60 @@
|
|||||||
|
import { Combobox, Flex, FormControl, Tooltip } from '@invoke-ai/ui-library';
|
||||||
|
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
||||||
|
import { useGroupedModelCombobox } from 'common/hooks/useGroupedModelCombobox';
|
||||||
|
import { fieldFluxVAEModelValueChanged } from 'features/nodes/store/nodesSlice';
|
||||||
|
import type { FluxVAEModelFieldInputInstance, FluxVAEModelFieldInputTemplate } from 'features/nodes/types/field';
|
||||||
|
import { memo, useCallback } from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { useFluxVAEModels } from 'services/api/hooks/modelsByType';
|
||||||
|
import type { VAEModelConfig } from 'services/api/types';
|
||||||
|
|
||||||
|
import type { FieldComponentProps } from './types';
|
||||||
|
|
||||||
|
type Props = FieldComponentProps<FluxVAEModelFieldInputInstance, FluxVAEModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
const FluxVAEModelFieldInputComponent = (props: Props) => {
|
||||||
|
const { nodeId, field } = props;
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const disabledTabs = useAppSelector((s) => s.config.disabledTabs);
|
||||||
|
const dispatch = useAppDispatch();
|
||||||
|
const [modelConfigs, { isLoading }] = useFluxVAEModels();
|
||||||
|
const _onChange = useCallback(
|
||||||
|
(value: VAEModelConfig | null) => {
|
||||||
|
if (!value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dispatch(
|
||||||
|
fieldFluxVAEModelValueChanged({
|
||||||
|
nodeId,
|
||||||
|
fieldName: field.name,
|
||||||
|
value,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
},
|
||||||
|
[dispatch, field.name, nodeId]
|
||||||
|
);
|
||||||
|
const { options, value, onChange, placeholder, noOptionsMessage } = useGroupedModelCombobox({
|
||||||
|
modelConfigs,
|
||||||
|
onChange: _onChange,
|
||||||
|
isLoading,
|
||||||
|
selectedModel: field.value,
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Flex w="full" alignItems="center" gap={2}>
|
||||||
|
<Tooltip label={!disabledTabs.includes('models') && t('modelManager.starterModelsInModelManager')}>
|
||||||
|
<FormControl className="nowheel nodrag" isDisabled={!options.length} isInvalid={!value}>
|
||||||
|
<Combobox
|
||||||
|
value={value}
|
||||||
|
placeholder={placeholder}
|
||||||
|
options={options}
|
||||||
|
onChange={onChange}
|
||||||
|
noOptionsMessage={noOptionsMessage}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
</Tooltip>
|
||||||
|
</Flex>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(FluxVAEModelFieldInputComponent);
|
@ -6,11 +6,13 @@ import { SHARED_NODE_PROPERTIES } from 'features/nodes/types/constants';
|
|||||||
import type {
|
import type {
|
||||||
BoardFieldValue,
|
BoardFieldValue,
|
||||||
BooleanFieldValue,
|
BooleanFieldValue,
|
||||||
|
CLIPEmbedModelFieldValue,
|
||||||
ColorFieldValue,
|
ColorFieldValue,
|
||||||
ControlNetModelFieldValue,
|
ControlNetModelFieldValue,
|
||||||
EnumFieldValue,
|
EnumFieldValue,
|
||||||
FieldValue,
|
FieldValue,
|
||||||
FloatFieldValue,
|
FloatFieldValue,
|
||||||
|
FluxVAEModelFieldValue,
|
||||||
ImageFieldValue,
|
ImageFieldValue,
|
||||||
IntegerFieldValue,
|
IntegerFieldValue,
|
||||||
IPAdapterModelFieldValue,
|
IPAdapterModelFieldValue,
|
||||||
@ -29,10 +31,12 @@ import type {
|
|||||||
import {
|
import {
|
||||||
zBoardFieldValue,
|
zBoardFieldValue,
|
||||||
zBooleanFieldValue,
|
zBooleanFieldValue,
|
||||||
|
zCLIPEmbedModelFieldValue,
|
||||||
zColorFieldValue,
|
zColorFieldValue,
|
||||||
zControlNetModelFieldValue,
|
zControlNetModelFieldValue,
|
||||||
zEnumFieldValue,
|
zEnumFieldValue,
|
||||||
zFloatFieldValue,
|
zFloatFieldValue,
|
||||||
|
zFluxVAEModelFieldValue,
|
||||||
zImageFieldValue,
|
zImageFieldValue,
|
||||||
zIntegerFieldValue,
|
zIntegerFieldValue,
|
||||||
zIPAdapterModelFieldValue,
|
zIPAdapterModelFieldValue,
|
||||||
@ -346,6 +350,12 @@ export const nodesSlice = createSlice({
|
|||||||
fieldT5EncoderValueChanged: (state, action: FieldValueAction<T5EncoderModelFieldValue>) => {
|
fieldT5EncoderValueChanged: (state, action: FieldValueAction<T5EncoderModelFieldValue>) => {
|
||||||
fieldValueReducer(state, action, zT5EncoderModelFieldValue);
|
fieldValueReducer(state, action, zT5EncoderModelFieldValue);
|
||||||
},
|
},
|
||||||
|
fieldCLIPEmbedValueChanged: (state, action: FieldValueAction<CLIPEmbedModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zCLIPEmbedModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldFluxVAEModelValueChanged: (state, action: FieldValueAction<FluxVAEModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zFluxVAEModelFieldValue);
|
||||||
|
},
|
||||||
fieldEnumModelValueChanged: (state, action: FieldValueAction<EnumFieldValue>) => {
|
fieldEnumModelValueChanged: (state, action: FieldValueAction<EnumFieldValue>) => {
|
||||||
fieldValueReducer(state, action, zEnumFieldValue);
|
fieldValueReducer(state, action, zEnumFieldValue);
|
||||||
},
|
},
|
||||||
@ -408,6 +418,8 @@ export const {
|
|||||||
fieldStringValueChanged,
|
fieldStringValueChanged,
|
||||||
fieldVaeModelValueChanged,
|
fieldVaeModelValueChanged,
|
||||||
fieldT5EncoderValueChanged,
|
fieldT5EncoderValueChanged,
|
||||||
|
fieldCLIPEmbedValueChanged,
|
||||||
|
fieldFluxVAEModelValueChanged,
|
||||||
nodeEditorReset,
|
nodeEditorReset,
|
||||||
nodeIsIntermediateChanged,
|
nodeIsIntermediateChanged,
|
||||||
nodeIsOpenChanged,
|
nodeIsOpenChanged,
|
||||||
@ -521,6 +533,8 @@ export const isAnyNodeOrEdgeMutation = isAnyOf(
|
|||||||
fieldStringValueChanged,
|
fieldStringValueChanged,
|
||||||
fieldVaeModelValueChanged,
|
fieldVaeModelValueChanged,
|
||||||
fieldT5EncoderValueChanged,
|
fieldT5EncoderValueChanged,
|
||||||
|
fieldCLIPEmbedValueChanged,
|
||||||
|
fieldFluxVAEModelValueChanged,
|
||||||
nodesChanged,
|
nodesChanged,
|
||||||
nodeIsIntermediateChanged,
|
nodeIsIntermediateChanged,
|
||||||
nodeIsOpenChanged,
|
nodeIsOpenChanged,
|
||||||
|
@ -151,6 +151,14 @@ const zT5EncoderModelFieldType = zFieldTypeBase.extend({
|
|||||||
name: z.literal('T5EncoderModelField'),
|
name: z.literal('T5EncoderModelField'),
|
||||||
originalType: zStatelessFieldType.optional(),
|
originalType: zStatelessFieldType.optional(),
|
||||||
});
|
});
|
||||||
|
const zCLIPEmbedModelFieldType = zFieldTypeBase.extend({
|
||||||
|
name: z.literal('CLIPEmbedModelField'),
|
||||||
|
originalType: zStatelessFieldType.optional(),
|
||||||
|
});
|
||||||
|
const zFluxVAEModelFieldType = zFieldTypeBase.extend({
|
||||||
|
name: z.literal('FluxVAEModelField'),
|
||||||
|
originalType: zStatelessFieldType.optional(),
|
||||||
|
});
|
||||||
const zSchedulerFieldType = zFieldTypeBase.extend({
|
const zSchedulerFieldType = zFieldTypeBase.extend({
|
||||||
name: z.literal('SchedulerField'),
|
name: z.literal('SchedulerField'),
|
||||||
originalType: zStatelessFieldType.optional(),
|
originalType: zStatelessFieldType.optional(),
|
||||||
@ -175,6 +183,8 @@ const zStatefulFieldType = z.union([
|
|||||||
zT2IAdapterModelFieldType,
|
zT2IAdapterModelFieldType,
|
||||||
zSpandrelImageToImageModelFieldType,
|
zSpandrelImageToImageModelFieldType,
|
||||||
zT5EncoderModelFieldType,
|
zT5EncoderModelFieldType,
|
||||||
|
zCLIPEmbedModelFieldType,
|
||||||
|
zFluxVAEModelFieldType,
|
||||||
zColorFieldType,
|
zColorFieldType,
|
||||||
zSchedulerFieldType,
|
zSchedulerFieldType,
|
||||||
]);
|
]);
|
||||||
@ -667,7 +677,53 @@ export const isT5EncoderModelFieldInputInstance = (val: unknown): val is T5Encod
|
|||||||
export const isT5EncoderModelFieldInputTemplate = (val: unknown): val is T5EncoderModelFieldInputTemplate =>
|
export const isT5EncoderModelFieldInputTemplate = (val: unknown): val is T5EncoderModelFieldInputTemplate =>
|
||||||
zT5EncoderModelFieldInputTemplate.safeParse(val).success;
|
zT5EncoderModelFieldInputTemplate.safeParse(val).success;
|
||||||
|
|
||||||
// #endregio
|
// #endregion
|
||||||
|
|
||||||
|
// #region FluxVAEModelField
|
||||||
|
|
||||||
|
export const zFluxVAEModelFieldValue = zModelIdentifierField.optional();
|
||||||
|
const zFluxVAEModelFieldInputInstance = zFieldInputInstanceBase.extend({
|
||||||
|
value: zFluxVAEModelFieldValue,
|
||||||
|
});
|
||||||
|
const zFluxVAEModelFieldInputTemplate = zFieldInputTemplateBase.extend({
|
||||||
|
type: zFluxVAEModelFieldType,
|
||||||
|
originalType: zFieldType.optional(),
|
||||||
|
default: zFluxVAEModelFieldValue,
|
||||||
|
});
|
||||||
|
|
||||||
|
export type FluxVAEModelFieldValue = z.infer<typeof zFluxVAEModelFieldValue>;
|
||||||
|
|
||||||
|
export type FluxVAEModelFieldInputInstance = z.infer<typeof zFluxVAEModelFieldInputInstance>;
|
||||||
|
export type FluxVAEModelFieldInputTemplate = z.infer<typeof zFluxVAEModelFieldInputTemplate>;
|
||||||
|
export const isFluxVAEModelFieldInputInstance = (val: unknown): val is FluxVAEModelFieldInputInstance =>
|
||||||
|
zFluxVAEModelFieldInputInstance.safeParse(val).success;
|
||||||
|
export const isFluxVAEModelFieldInputTemplate = (val: unknown): val is FluxVAEModelFieldInputTemplate =>
|
||||||
|
zFluxVAEModelFieldInputTemplate.safeParse(val).success;
|
||||||
|
|
||||||
|
// #endregion
|
||||||
|
|
||||||
|
// #region CLIPEmbedModelField
|
||||||
|
|
||||||
|
export const zCLIPEmbedModelFieldValue = zModelIdentifierField.optional();
|
||||||
|
const zCLIPEmbedModelFieldInputInstance = zFieldInputInstanceBase.extend({
|
||||||
|
value: zCLIPEmbedModelFieldValue,
|
||||||
|
});
|
||||||
|
const zCLIPEmbedModelFieldInputTemplate = zFieldInputTemplateBase.extend({
|
||||||
|
type: zCLIPEmbedModelFieldType,
|
||||||
|
originalType: zFieldType.optional(),
|
||||||
|
default: zCLIPEmbedModelFieldValue,
|
||||||
|
});
|
||||||
|
|
||||||
|
export type CLIPEmbedModelFieldValue = z.infer<typeof zCLIPEmbedModelFieldValue>;
|
||||||
|
|
||||||
|
export type CLIPEmbedModelFieldInputInstance = z.infer<typeof zCLIPEmbedModelFieldInputInstance>;
|
||||||
|
export type CLIPEmbedModelFieldInputTemplate = z.infer<typeof zCLIPEmbedModelFieldInputTemplate>;
|
||||||
|
export const isCLIPEmbedModelFieldInputInstance = (val: unknown): val is CLIPEmbedModelFieldInputInstance =>
|
||||||
|
zCLIPEmbedModelFieldInputInstance.safeParse(val).success;
|
||||||
|
export const isCLIPEmbedModelFieldInputTemplate = (val: unknown): val is CLIPEmbedModelFieldInputTemplate =>
|
||||||
|
zCLIPEmbedModelFieldInputTemplate.safeParse(val).success;
|
||||||
|
|
||||||
|
// #endregion
|
||||||
|
|
||||||
// #region SchedulerField
|
// #region SchedulerField
|
||||||
|
|
||||||
@ -758,6 +814,8 @@ export const zStatefulFieldValue = z.union([
|
|||||||
zT2IAdapterModelFieldValue,
|
zT2IAdapterModelFieldValue,
|
||||||
zSpandrelImageToImageModelFieldValue,
|
zSpandrelImageToImageModelFieldValue,
|
||||||
zT5EncoderModelFieldValue,
|
zT5EncoderModelFieldValue,
|
||||||
|
zFluxVAEModelFieldValue,
|
||||||
|
zCLIPEmbedModelFieldValue,
|
||||||
zColorFieldValue,
|
zColorFieldValue,
|
||||||
zSchedulerFieldValue,
|
zSchedulerFieldValue,
|
||||||
]);
|
]);
|
||||||
@ -788,6 +846,8 @@ const zStatefulFieldInputInstance = z.union([
|
|||||||
zT2IAdapterModelFieldInputInstance,
|
zT2IAdapterModelFieldInputInstance,
|
||||||
zSpandrelImageToImageModelFieldInputInstance,
|
zSpandrelImageToImageModelFieldInputInstance,
|
||||||
zT5EncoderModelFieldInputInstance,
|
zT5EncoderModelFieldInputInstance,
|
||||||
|
zFluxVAEModelFieldInputInstance,
|
||||||
|
zCLIPEmbedModelFieldInputInstance,
|
||||||
zColorFieldInputInstance,
|
zColorFieldInputInstance,
|
||||||
zSchedulerFieldInputInstance,
|
zSchedulerFieldInputInstance,
|
||||||
]);
|
]);
|
||||||
@ -819,6 +879,8 @@ const zStatefulFieldInputTemplate = z.union([
|
|||||||
zT2IAdapterModelFieldInputTemplate,
|
zT2IAdapterModelFieldInputTemplate,
|
||||||
zSpandrelImageToImageModelFieldInputTemplate,
|
zSpandrelImageToImageModelFieldInputTemplate,
|
||||||
zT5EncoderModelFieldInputTemplate,
|
zT5EncoderModelFieldInputTemplate,
|
||||||
|
zFluxVAEModelFieldInputTemplate,
|
||||||
|
zCLIPEmbedModelFieldInputTemplate,
|
||||||
zColorFieldInputTemplate,
|
zColorFieldInputTemplate,
|
||||||
zSchedulerFieldInputTemplate,
|
zSchedulerFieldInputTemplate,
|
||||||
zStatelessFieldInputTemplate,
|
zStatelessFieldInputTemplate,
|
||||||
|
@ -23,6 +23,8 @@ const FIELD_VALUE_FALLBACK_MAP: Record<StatefulFieldType['name'], FieldValue> =
|
|||||||
VAEModelField: undefined,
|
VAEModelField: undefined,
|
||||||
ControlNetModelField: undefined,
|
ControlNetModelField: undefined,
|
||||||
T5EncoderModelField: undefined,
|
T5EncoderModelField: undefined,
|
||||||
|
FluxVAEModelField: undefined,
|
||||||
|
CLIPEmbedModelField: undefined,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const buildFieldInputInstance = (id: string, template: FieldInputTemplate): FieldInputInstance => {
|
export const buildFieldInputInstance = (id: string, template: FieldInputTemplate): FieldInputInstance => {
|
||||||
|
@ -2,6 +2,7 @@ import { FieldParseError } from 'features/nodes/types/error';
|
|||||||
import type {
|
import type {
|
||||||
BoardFieldInputTemplate,
|
BoardFieldInputTemplate,
|
||||||
BooleanFieldInputTemplate,
|
BooleanFieldInputTemplate,
|
||||||
|
CLIPEmbedModelFieldInputTemplate,
|
||||||
ColorFieldInputTemplate,
|
ColorFieldInputTemplate,
|
||||||
ControlNetModelFieldInputTemplate,
|
ControlNetModelFieldInputTemplate,
|
||||||
EnumFieldInputTemplate,
|
EnumFieldInputTemplate,
|
||||||
@ -9,6 +10,7 @@ import type {
|
|||||||
FieldType,
|
FieldType,
|
||||||
FloatFieldInputTemplate,
|
FloatFieldInputTemplate,
|
||||||
FluxMainModelFieldInputTemplate,
|
FluxMainModelFieldInputTemplate,
|
||||||
|
FluxVAEModelFieldInputTemplate,
|
||||||
ImageFieldInputTemplate,
|
ImageFieldInputTemplate,
|
||||||
IntegerFieldInputTemplate,
|
IntegerFieldInputTemplate,
|
||||||
IPAdapterModelFieldInputTemplate,
|
IPAdapterModelFieldInputTemplate,
|
||||||
@ -238,6 +240,34 @@ const buildT5EncoderModelFieldInputTemplate: FieldInputTemplateBuilder<T5Encoder
|
|||||||
return template;
|
return template;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const buildCLIPEmbedModelFieldInputTemplate: FieldInputTemplateBuilder<CLIPEmbedModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: CLIPEmbedModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildFluxVAEModelFieldInputTemplate: FieldInputTemplateBuilder<FluxVAEModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: FluxVAEModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
const buildLoRAModelFieldInputTemplate: FieldInputTemplateBuilder<LoRAModelFieldInputTemplate> = ({
|
const buildLoRAModelFieldInputTemplate: FieldInputTemplateBuilder<LoRAModelFieldInputTemplate> = ({
|
||||||
schemaObject,
|
schemaObject,
|
||||||
baseField,
|
baseField,
|
||||||
@ -423,6 +453,8 @@ export const TEMPLATE_BUILDER_MAP: Record<StatefulFieldType['name'], FieldInputT
|
|||||||
SpandrelImageToImageModelField: buildSpandrelImageToImageModelFieldInputTemplate,
|
SpandrelImageToImageModelField: buildSpandrelImageToImageModelFieldInputTemplate,
|
||||||
VAEModelField: buildVAEModelFieldInputTemplate,
|
VAEModelField: buildVAEModelFieldInputTemplate,
|
||||||
T5EncoderModelField: buildT5EncoderModelFieldInputTemplate,
|
T5EncoderModelField: buildT5EncoderModelFieldInputTemplate,
|
||||||
|
CLIPEmbedModelField: buildCLIPEmbedModelFieldInputTemplate,
|
||||||
|
FluxVAEModelField: buildFluxVAEModelFieldInputTemplate,
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const buildFieldInputTemplate = (
|
export const buildFieldInputTemplate = (
|
||||||
|
@ -7,6 +7,7 @@ import {
|
|||||||
isControlNetModelConfig,
|
isControlNetModelConfig,
|
||||||
isControlNetOrT2IAdapterModelConfig,
|
isControlNetOrT2IAdapterModelConfig,
|
||||||
isFluxMainModelModelConfig,
|
isFluxMainModelModelConfig,
|
||||||
|
isFluxVAEModelConfig,
|
||||||
isIPAdapterModelConfig,
|
isIPAdapterModelConfig,
|
||||||
isLoRAModelConfig,
|
isLoRAModelConfig,
|
||||||
isNonRefinerMainModelConfig,
|
isNonRefinerMainModelConfig,
|
||||||
@ -52,3 +53,4 @@ export const useSpandrelImageToImageModels = buildModelsHook(isSpandrelImageToIm
|
|||||||
export const useIPAdapterModels = buildModelsHook(isIPAdapterModelConfig);
|
export const useIPAdapterModels = buildModelsHook(isIPAdapterModelConfig);
|
||||||
export const useEmbeddingModels = buildModelsHook(isTIModelConfig);
|
export const useEmbeddingModels = buildModelsHook(isTIModelConfig);
|
||||||
export const useVAEModels = buildModelsHook(isVAEModelConfig);
|
export const useVAEModels = buildModelsHook(isVAEModelConfig);
|
||||||
|
export const useFluxVAEModels = buildModelsHook(isFluxVAEModelConfig);
|
||||||
|
@ -5770,8 +5770,22 @@ export type components = {
|
|||||||
use_cache?: boolean;
|
use_cache?: boolean;
|
||||||
/** @description Flux model (Transformer) to load */
|
/** @description Flux model (Transformer) to load */
|
||||||
model: components["schemas"]["ModelIdentifierField"];
|
model: components["schemas"]["ModelIdentifierField"];
|
||||||
/** @description T5 tokenizer and text encoder */
|
/**
|
||||||
t5_encoder: components["schemas"]["ModelIdentifierField"];
|
* T5 Encoder
|
||||||
|
* @description T5 tokenizer and text encoder
|
||||||
|
*/
|
||||||
|
t5_encoder_model: components["schemas"]["ModelIdentifierField"];
|
||||||
|
/**
|
||||||
|
* CLIP Embed
|
||||||
|
* @description CLIP Embed loader
|
||||||
|
*/
|
||||||
|
clip_embed_model: components["schemas"]["ModelIdentifierField"];
|
||||||
|
/**
|
||||||
|
* VAE
|
||||||
|
* @description VAE model to load
|
||||||
|
* @default null
|
||||||
|
*/
|
||||||
|
vae_model?: components["schemas"]["ModelIdentifierField"];
|
||||||
/**
|
/**
|
||||||
* type
|
* type
|
||||||
* @default flux_model_loader
|
* @default flux_model_loader
|
||||||
@ -15097,7 +15111,7 @@ export type components = {
|
|||||||
* used, and the type will be ignored. They are included here for backwards compatibility.
|
* used, and the type will be ignored. They are included here for backwards compatibility.
|
||||||
* @enum {string}
|
* @enum {string}
|
||||||
*/
|
*/
|
||||||
UIType: "MainModelField" | "FluxMainModelField" | "SDXLMainModelField" | "SDXLRefinerModelField" | "ONNXModelField" | "VAEModelField" | "LoRAModelField" | "ControlNetModelField" | "IPAdapterModelField" | "T2IAdapterModelField" | "T5EncoderModelField" | "SpandrelImageToImageModelField" | "SchedulerField" | "AnyField" | "CollectionField" | "CollectionItemField" | "DEPRECATED_Boolean" | "DEPRECATED_Color" | "DEPRECATED_Conditioning" | "DEPRECATED_Control" | "DEPRECATED_Float" | "DEPRECATED_Image" | "DEPRECATED_Integer" | "DEPRECATED_Latents" | "DEPRECATED_String" | "DEPRECATED_BooleanCollection" | "DEPRECATED_ColorCollection" | "DEPRECATED_ConditioningCollection" | "DEPRECATED_ControlCollection" | "DEPRECATED_FloatCollection" | "DEPRECATED_ImageCollection" | "DEPRECATED_IntegerCollection" | "DEPRECATED_LatentsCollection" | "DEPRECATED_StringCollection" | "DEPRECATED_BooleanPolymorphic" | "DEPRECATED_ColorPolymorphic" | "DEPRECATED_ConditioningPolymorphic" | "DEPRECATED_ControlPolymorphic" | "DEPRECATED_FloatPolymorphic" | "DEPRECATED_ImagePolymorphic" | "DEPRECATED_IntegerPolymorphic" | "DEPRECATED_LatentsPolymorphic" | "DEPRECATED_StringPolymorphic" | "DEPRECATED_UNet" | "DEPRECATED_Vae" | "DEPRECATED_CLIP" | "DEPRECATED_Collection" | "DEPRECATED_CollectionItem" | "DEPRECATED_Enum" | "DEPRECATED_WorkflowField" | "DEPRECATED_IsIntermediate" | "DEPRECATED_BoardField" | "DEPRECATED_MetadataItem" | "DEPRECATED_MetadataItemCollection" | "DEPRECATED_MetadataItemPolymorphic" | "DEPRECATED_MetadataDict";
|
UIType: "MainModelField" | "FluxMainModelField" | "SDXLMainModelField" | "SDXLRefinerModelField" | "ONNXModelField" | "VAEModelField" | "FluxVAEModelField" | "LoRAModelField" | "ControlNetModelField" | "IPAdapterModelField" | "T2IAdapterModelField" | "T5EncoderModelField" | "CLIPEmbedModelField" | "SpandrelImageToImageModelField" | "SchedulerField" | "AnyField" | "CollectionField" | "CollectionItemField" | "DEPRECATED_Boolean" | "DEPRECATED_Color" | "DEPRECATED_Conditioning" | "DEPRECATED_Control" | "DEPRECATED_Float" | "DEPRECATED_Image" | "DEPRECATED_Integer" | "DEPRECATED_Latents" | "DEPRECATED_String" | "DEPRECATED_BooleanCollection" | "DEPRECATED_ColorCollection" | "DEPRECATED_ConditioningCollection" | "DEPRECATED_ControlCollection" | "DEPRECATED_FloatCollection" | "DEPRECATED_ImageCollection" | "DEPRECATED_IntegerCollection" | "DEPRECATED_LatentsCollection" | "DEPRECATED_StringCollection" | "DEPRECATED_BooleanPolymorphic" | "DEPRECATED_ColorPolymorphic" | "DEPRECATED_ConditioningPolymorphic" | "DEPRECATED_ControlPolymorphic" | "DEPRECATED_FloatPolymorphic" | "DEPRECATED_ImagePolymorphic" | "DEPRECATED_IntegerPolymorphic" | "DEPRECATED_LatentsPolymorphic" | "DEPRECATED_StringPolymorphic" | "DEPRECATED_UNet" | "DEPRECATED_Vae" | "DEPRECATED_CLIP" | "DEPRECATED_Collection" | "DEPRECATED_CollectionItem" | "DEPRECATED_Enum" | "DEPRECATED_WorkflowField" | "DEPRECATED_IsIntermediate" | "DEPRECATED_BoardField" | "DEPRECATED_MetadataItem" | "DEPRECATED_MetadataItemCollection" | "DEPRECATED_MetadataItemPolymorphic" | "DEPRECATED_MetadataDict";
|
||||||
/** UNetField */
|
/** UNetField */
|
||||||
UNetField: {
|
UNetField: {
|
||||||
/** @description Info to load unet submodel */
|
/** @description Info to load unet submodel */
|
||||||
|
@ -51,7 +51,7 @@ export type VAEModelConfig = S['VAECheckpointConfig'] | S['VAEDiffusersConfig'];
|
|||||||
export type ControlNetModelConfig = S['ControlNetDiffusersConfig'] | S['ControlNetCheckpointConfig'];
|
export type ControlNetModelConfig = S['ControlNetDiffusersConfig'] | S['ControlNetCheckpointConfig'];
|
||||||
export type IPAdapterModelConfig = S['IPAdapterInvokeAIConfig'] | S['IPAdapterCheckpointConfig'];
|
export type IPAdapterModelConfig = S['IPAdapterInvokeAIConfig'] | S['IPAdapterCheckpointConfig'];
|
||||||
export type T2IAdapterModelConfig = S['T2IAdapterConfig'];
|
export type T2IAdapterModelConfig = S['T2IAdapterConfig'];
|
||||||
type ClipEmbedModelConfig = S['CLIPEmbedDiffusersConfig'];
|
export type ClipEmbedModelConfig = S['CLIPEmbedDiffusersConfig'];
|
||||||
export type T5EncoderModelConfig = S['T5EncoderConfig'];
|
export type T5EncoderModelConfig = S['T5EncoderConfig'];
|
||||||
export type T5EncoderBnbQuantizedLlmInt8bModelConfig = S['T5EncoderBnbQuantizedLlmInt8bConfig'];
|
export type T5EncoderBnbQuantizedLlmInt8bModelConfig = S['T5EncoderBnbQuantizedLlmInt8bConfig'];
|
||||||
export type SpandrelImageToImageModelConfig = S['SpandrelImageToImageConfig'];
|
export type SpandrelImageToImageModelConfig = S['SpandrelImageToImageConfig'];
|
||||||
@ -82,6 +82,10 @@ export const isVAEModelConfig = (config: AnyModelConfig): config is VAEModelConf
|
|||||||
return config.type === 'vae';
|
return config.type === 'vae';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const isFluxVAEModelConfig = (config: AnyModelConfig): config is VAEModelConfig => {
|
||||||
|
return config.type === 'vae' && config.base === 'flux';
|
||||||
|
};
|
||||||
|
|
||||||
export const isControlNetModelConfig = (config: AnyModelConfig): config is ControlNetModelConfig => {
|
export const isControlNetModelConfig = (config: AnyModelConfig): config is ControlNetModelConfig => {
|
||||||
return config.type === 'controlnet';
|
return config.type === 'controlnet';
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user