mirror of
https://github.com/invoke-ai/InvokeAI.git
synced 2026-04-23 03:00:31 -04:00
Revert "replace runway with veo, build out veo3 model support"
This reverts commit d95a698ebd.
This commit is contained in:
@@ -292,6 +292,22 @@ class ImageCollectionInvocation(BaseInvocation):
|
||||
|
||||
# region Video
|
||||
|
||||
|
||||
@invocation_output("runway_video_output")
|
||||
class RunwayVideoOutput(BaseInvocationOutput):
|
||||
"""Base class for nodes that output a runway result"""
|
||||
|
||||
video_url: str = OutputField(description="The output video url")
|
||||
runway_task_id: str = OutputField(description="The runway task id")
|
||||
|
||||
@classmethod
|
||||
def build(cls, video_url: str, runway_task_id: str) -> "RunwayVideoOutput":
|
||||
return cls(
|
||||
video_url=video_url,
|
||||
runway_task_id=runway_task_id,
|
||||
)
|
||||
|
||||
|
||||
@invocation_output("video_output")
|
||||
class VideoOutput(BaseInvocationOutput):
|
||||
"""Base class for nodes that output a video"""
|
||||
|
||||
@@ -5,7 +5,7 @@ import type { SliceConfig } from 'app/store/types';
|
||||
import { deepClone } from 'common/util/deepClone';
|
||||
import { roundDownToMultiple, roundToMultiple } from 'common/util/roundDownToMultiple';
|
||||
import { clamp } from 'es-toolkit/compat';
|
||||
import type { AspectRatioID, ParamsState, RgbaColor, Veo3Duration } from 'features/controlLayers/store/types';
|
||||
import type { AspectRatioID, ParamsState, RgbaColor } from 'features/controlLayers/store/types';
|
||||
import {
|
||||
ASPECT_RATIO_MAP,
|
||||
CHATGPT_ASPECT_RATIOS,
|
||||
@@ -39,6 +39,7 @@ import type {
|
||||
ParameterCLIPGEmbedModel,
|
||||
ParameterCLIPLEmbedModel,
|
||||
ParameterControlLoRAModel,
|
||||
ParameterDuration,
|
||||
ParameterGuidance,
|
||||
ParameterModel,
|
||||
ParameterNegativePrompt,
|
||||
@@ -380,7 +381,7 @@ const slice = createSlice({
|
||||
state.dimensions.rect.height = bboxDims.height;
|
||||
}
|
||||
},
|
||||
setVideoDuration: (state, action: PayloadAction<Veo3Duration>) => {
|
||||
setVideoDuration: (state, action: PayloadAction<ParameterDuration>) => {
|
||||
state.videoDuration = action.payload;
|
||||
},
|
||||
paramsReset: (state) => resetState(state),
|
||||
@@ -497,7 +498,7 @@ export const paramsSliceConfig: SliceConfig<typeof slice> = {
|
||||
};
|
||||
|
||||
export const selectParamsSlice = (state: RootState) => state.params;
|
||||
const createParamsSelector = <T,>(selector: Selector<ParamsState, T>) => createSelector(selectParamsSlice, selector);
|
||||
const createParamsSelector = <T>(selector: Selector<ParamsState, T>) => createSelector(selectParamsSlice, selector);
|
||||
|
||||
export const selectBase = createParamsSelector((params) => params.model?.base);
|
||||
export const selectIsSDXL = createParamsSelector((params) => params.model?.base === 'sdxl');
|
||||
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
zParameterCLIPGEmbedModel,
|
||||
zParameterCLIPLEmbedModel,
|
||||
zParameterControlLoRAModel,
|
||||
zParameterDuration,
|
||||
zParameterGuidance,
|
||||
zParameterImageDimension,
|
||||
zParameterMaskBlurMethod,
|
||||
@@ -482,12 +483,17 @@ export const FLUX_KONTEXT_ASPECT_RATIOS: Record<FluxKontextAspectRatio, Dimensio
|
||||
'1:1': { width: 1024, height: 1024 },
|
||||
};
|
||||
|
||||
export const zVeo3AspectRatioID = z.enum(['16:9']);
|
||||
type Veo3AspectRatio = z.infer<typeof zVeo3AspectRatioID>;
|
||||
export const isVeo3AspectRatioID = (v: unknown): v is Veo3AspectRatio =>
|
||||
zVeo3AspectRatioID.safeParse(v).success;
|
||||
export const VEO3_ASPECT_RATIOS: Record<Veo3AspectRatio, Dimensions> = {
|
||||
export const zRunwayAspectRatioID = z.enum(['16:9', '4:3', '1:1', '3:4', '9:16', '21:9']);
|
||||
type RunwayAspectRatio = z.infer<typeof zRunwayAspectRatioID>;
|
||||
export const isRunwayAspectRatioID = (v: unknown): v is RunwayAspectRatio =>
|
||||
zRunwayAspectRatioID.safeParse(v).success;
|
||||
export const RUNWAY_ASPECT_RATIOS: Record<RunwayAspectRatio, Dimensions> = {
|
||||
'16:9': { width: 1280, height: 720 },
|
||||
'4:3': { width: 1104, height: 832 },
|
||||
'1:1': { width: 960, height: 960 },
|
||||
'3:4': { width: 832, height: 1104 },
|
||||
'9:16': { width: 720, height: 1280 },
|
||||
'21:9': { width: 1584, height: 672 },
|
||||
};
|
||||
|
||||
const zAspectRatioConfig = z.object({
|
||||
@@ -503,15 +509,6 @@ export const DEFAULT_ASPECT_RATIO_CONFIG: AspectRatioConfig = {
|
||||
isLocked: false,
|
||||
};
|
||||
|
||||
export const zVeo3DurationID = z.enum(['8']);
|
||||
export type Veo3Duration = z.infer<typeof zVeo3DurationID>;
|
||||
export const isVeo3DurationID = (v: unknown): v is Veo3Duration =>
|
||||
zVeo3DurationID.safeParse(v).success;
|
||||
export const VEO3_DURATIONS: Record<Veo3Duration, string> = {
|
||||
'8': '8 seconds',
|
||||
|
||||
};
|
||||
|
||||
const zBboxState = z.object({
|
||||
rect: z.object({
|
||||
x: z.number().int(),
|
||||
@@ -585,7 +582,7 @@ export const zParamsState = z.object({
|
||||
clipGEmbedModel: zParameterCLIPGEmbedModel.nullable(),
|
||||
controlLora: zParameterControlLoRAModel.nullable(),
|
||||
dimensions: zDimensionsState,
|
||||
videoDuration: zVeo3DurationID,
|
||||
videoDuration: zParameterDuration,
|
||||
});
|
||||
export type ParamsState = z.infer<typeof zParamsState>;
|
||||
export const getInitialParamsState = (): ParamsState => ({
|
||||
@@ -636,7 +633,7 @@ export const getInitialParamsState = (): ParamsState => ({
|
||||
rect: { x: 0, y: 0, width: 512, height: 512 },
|
||||
aspectRatio: deepClone(DEFAULT_ASPECT_RATIO_CONFIG),
|
||||
},
|
||||
videoDuration: '8',
|
||||
videoDuration: 5,
|
||||
});
|
||||
|
||||
const zInpaintMasks = z.object({
|
||||
|
||||
@@ -109,8 +109,6 @@ import {
|
||||
isT5EncoderModelFieldInputTemplate,
|
||||
isVAEModelFieldInputInstance,
|
||||
isVAEModelFieldInputTemplate,
|
||||
isVeo3ModelFieldInputInstance,
|
||||
isVeo3ModelFieldInputTemplate,
|
||||
} from 'features/nodes/types/field';
|
||||
import type { NodeFieldElement } from 'features/nodes/types/workflow';
|
||||
import { memo } from 'react';
|
||||
@@ -144,7 +142,6 @@ import SpandrelImageToImageModelFieldInputComponent from './inputs/SpandrelImage
|
||||
import T2IAdapterModelFieldInputComponent from './inputs/T2IAdapterModelFieldInputComponent';
|
||||
import T5EncoderModelFieldInputComponent from './inputs/T5EncoderModelFieldInputComponent';
|
||||
import VAEModelFieldInputComponent from './inputs/VAEModelFieldInputComponent';
|
||||
import Veo3ModelFieldInputComponent from './inputs/Veo3ModelFieldInputComponent';
|
||||
|
||||
type Props = {
|
||||
nodeId: string;
|
||||
@@ -437,13 +434,6 @@ export const InputFieldRenderer = memo(({ nodeId, fieldName, settings }: Props)
|
||||
return <ChatGPT4oModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||
}
|
||||
|
||||
if (isVeo3ModelFieldInputTemplate(template)) {
|
||||
if (!isVeo3ModelFieldInputInstance(field)) {
|
||||
return null;
|
||||
}
|
||||
return <Veo3ModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||
}
|
||||
|
||||
if (isColorFieldInputTemplate(template)) {
|
||||
if (!isColorFieldInputInstance(field)) {
|
||||
return null;
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
import { useAppDispatch } from 'app/store/storeHooks';
|
||||
import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
|
||||
import { fieldVeo3ModelValueChanged } from 'features/nodes/store/nodesSlice';
|
||||
import type { Veo3ModelFieldInputInstance, Veo3ModelFieldInputTemplate } from 'features/nodes/types/field';
|
||||
import { memo, useCallback } from 'react';
|
||||
import { useVeo3Models } from 'services/api/hooks/modelsByType';
|
||||
import type { ApiModelConfig } from 'services/api/types';
|
||||
|
||||
import type { FieldComponentProps } from './types';
|
||||
|
||||
const Veo3ModelFieldInputComponent = (
|
||||
props: FieldComponentProps<Veo3ModelFieldInputInstance, Veo3ModelFieldInputTemplate>
|
||||
) => {
|
||||
const { nodeId, field } = props;
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
const [modelConfigs, { isLoading }] = useVeo3Models();
|
||||
|
||||
const onChange = useCallback(
|
||||
(value: ApiModelConfig | null) => {
|
||||
if (!value) {
|
||||
return;
|
||||
}
|
||||
dispatch(
|
||||
fieldVeo3ModelValueChanged({
|
||||
nodeId,
|
||||
fieldName: field.name,
|
||||
value,
|
||||
})
|
||||
);
|
||||
},
|
||||
[dispatch, field.name, nodeId]
|
||||
);
|
||||
|
||||
return (
|
||||
<ModelFieldCombobox
|
||||
value={field.value}
|
||||
modelConfigs={modelConfigs}
|
||||
isLoadingConfigs={isLoading}
|
||||
onChange={onChange}
|
||||
required={props.fieldTemplate.required}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export default memo(Veo3ModelFieldInputComponent);
|
||||
@@ -62,7 +62,6 @@ import type {
|
||||
T2IAdapterModelFieldValue,
|
||||
T5EncoderModelFieldValue,
|
||||
VAEModelFieldValue,
|
||||
Veo3ModelFieldValue,
|
||||
} from 'features/nodes/types/field';
|
||||
import {
|
||||
zBoardFieldValue,
|
||||
@@ -105,7 +104,6 @@ import {
|
||||
zT2IAdapterModelFieldValue,
|
||||
zT5EncoderModelFieldValue,
|
||||
zVAEModelFieldValue,
|
||||
zVeo3ModelFieldValue,
|
||||
} from 'features/nodes/types/field';
|
||||
import type { AnyEdge, AnyNode } from 'features/nodes/types/invocation';
|
||||
import { isInvocationNode, isNotesNode } from 'features/nodes/types/invocation';
|
||||
@@ -557,9 +555,6 @@ const slice = createSlice({
|
||||
fieldChatGPT4oModelValueChanged: (state, action: FieldValueAction<ChatGPT4oModelFieldValue>) => {
|
||||
fieldValueReducer(state, action, zChatGPT4oModelFieldValue);
|
||||
},
|
||||
fieldVeo3ModelValueChanged: (state, action: FieldValueAction<Veo3ModelFieldValue>) => {
|
||||
fieldValueReducer(state, action, zVeo3ModelFieldValue);
|
||||
},
|
||||
fieldFluxKontextModelValueChanged: (state, action: FieldValueAction<FluxKontextModelFieldValue>) => {
|
||||
fieldValueReducer(state, action, zFluxKontextModelFieldValue);
|
||||
},
|
||||
@@ -738,7 +733,6 @@ export const {
|
||||
fieldIntegerGeneratorValueChanged,
|
||||
fieldStringGeneratorValueChanged,
|
||||
fieldImageGeneratorValueChanged,
|
||||
fieldVeo3ModelValueChanged,
|
||||
fieldDescriptionChanged,
|
||||
nodeEditorReset,
|
||||
nodeIsIntermediateChanged,
|
||||
|
||||
@@ -87,7 +87,6 @@ const zBaseModel = z.enum([
|
||||
'chatgpt-4o',
|
||||
'flux-kontext',
|
||||
'gemini-2.5',
|
||||
'veo3',
|
||||
]);
|
||||
export type BaseModelType = z.infer<typeof zBaseModel>;
|
||||
export const zMainModelBase = z.enum([
|
||||
@@ -102,7 +101,6 @@ export const zMainModelBase = z.enum([
|
||||
'chatgpt-4o',
|
||||
'flux-kontext',
|
||||
'gemini-2.5',
|
||||
'veo3',
|
||||
]);
|
||||
type MainModelBase = z.infer<typeof zMainModelBase>;
|
||||
export const isMainModelBase = (base: unknown): base is MainModelBase => zMainModelBase.safeParse(base).success;
|
||||
|
||||
@@ -261,10 +261,6 @@ const zChatGPT4oModelFieldType = zFieldTypeBase.extend({
|
||||
name: z.literal('ChatGPT4oModelField'),
|
||||
originalType: zStatelessFieldType.optional(),
|
||||
});
|
||||
const zVeo3ModelFieldType = zFieldTypeBase.extend({
|
||||
name: z.literal('Veo3ModelField'),
|
||||
originalType: zStatelessFieldType.optional(),
|
||||
});
|
||||
const zFluxKontextModelFieldType = zFieldTypeBase.extend({
|
||||
name: z.literal('FluxKontextModelField'),
|
||||
originalType: zStatelessFieldType.optional(),
|
||||
@@ -323,7 +319,6 @@ const zStatefulFieldType = z.union([
|
||||
zImagen4ModelFieldType,
|
||||
zChatGPT4oModelFieldType,
|
||||
zFluxKontextModelFieldType,
|
||||
zVeo3ModelFieldType,
|
||||
zColorFieldType,
|
||||
zSchedulerFieldType,
|
||||
zFloatGeneratorFieldType,
|
||||
@@ -366,7 +361,6 @@ const modelFieldTypeNames = [
|
||||
zImagen4ModelFieldType.shape.name.value,
|
||||
zChatGPT4oModelFieldType.shape.name.value,
|
||||
zFluxKontextModelFieldType.shape.name.value,
|
||||
zVeo3ModelFieldType.shape.name.value,
|
||||
// Stateless model fields
|
||||
'UNetField',
|
||||
'VAEField',
|
||||
@@ -1280,24 +1274,6 @@ export const isChatGPT4oModelFieldInputTemplate =
|
||||
buildTemplateTypeGuard<ChatGPT4oModelFieldInputTemplate>('ChatGPT4oModelField');
|
||||
// #endregion
|
||||
|
||||
// #region Veo3ModelField
|
||||
export const zVeo3ModelFieldValue = zModelIdentifierField.optional();
|
||||
const zVeo3ModelFieldInputInstance = zFieldInputInstanceBase.extend({
|
||||
value: zVeo3ModelFieldValue,
|
||||
});
|
||||
const zVeo3ModelFieldInputTemplate = zFieldInputTemplateBase.extend({
|
||||
type: zVeo3ModelFieldType,
|
||||
originalType: zFieldType.optional(),
|
||||
default: zVeo3ModelFieldValue,
|
||||
});
|
||||
export type Veo3ModelFieldValue = z.infer<typeof zVeo3ModelFieldValue>;
|
||||
export type Veo3ModelFieldInputInstance = z.infer<typeof zVeo3ModelFieldInputInstance>;
|
||||
export type Veo3ModelFieldInputTemplate = z.infer<typeof zVeo3ModelFieldInputTemplate>;
|
||||
export const isVeo3ModelFieldInputInstance = buildInstanceTypeGuard(zVeo3ModelFieldInputInstance);
|
||||
export const isVeo3ModelFieldInputTemplate =
|
||||
buildTemplateTypeGuard<Veo3ModelFieldInputTemplate>('Veo3ModelField');
|
||||
// #endregion
|
||||
|
||||
// #region SchedulerField
|
||||
export const zSchedulerFieldValue = zSchedulerField.optional();
|
||||
const zSchedulerFieldInputInstance = zFieldInputInstanceBase.extend({
|
||||
@@ -2027,7 +2003,6 @@ const zStatefulFieldInputTemplate = z.union([
|
||||
zImagen4ModelFieldInputTemplate,
|
||||
zChatGPT4oModelFieldInputTemplate,
|
||||
zFluxKontextModelFieldInputTemplate,
|
||||
zVeo3ModelFieldInputTemplate,
|
||||
zColorFieldInputTemplate,
|
||||
zSchedulerFieldInputTemplate,
|
||||
zStatelessFieldInputTemplate,
|
||||
|
||||
@@ -6,33 +6,36 @@ import { Graph } from 'features/nodes/util/graph/generation/Graph';
|
||||
import { selectPresetModifiedPrompts } from 'features/nodes/util/graph/graphBuilderUtils';
|
||||
import type { GraphBuilderArg, GraphBuilderReturn } from 'features/nodes/util/graph/types';
|
||||
import { UnsupportedGenerationModeError } from 'features/nodes/util/graph/types';
|
||||
import { selectStartingFrameImage, selectVideoSlice } from 'features/parameters/store/videoSlice';
|
||||
import { selectStartingFrameImage } from 'features/parameters/store/videoSlice';
|
||||
import { t } from 'i18next';
|
||||
import { assert } from 'tsafe';
|
||||
|
||||
const log = logger('system');
|
||||
|
||||
export const buildVeo3VideoGraph = (arg: GraphBuilderArg): GraphBuilderReturn => {
|
||||
export const buildRunwayVideoGraph = (arg: GraphBuilderArg): GraphBuilderReturn => {
|
||||
const { generationMode, state, manager } = arg;
|
||||
|
||||
log.debug({ generationMode, manager: manager?.id }, 'Building Veo3 video graph');
|
||||
log.debug({ generationMode, manager: manager?.id }, 'Building Runway video graph');
|
||||
|
||||
const supportedModes = ['txt2img'] as const;
|
||||
if (!supportedModes.includes(generationMode as any)) {
|
||||
throw new UnsupportedGenerationModeError(t('toast.veo3IncompatibleGenerationMode'));
|
||||
throw new UnsupportedGenerationModeError(t('toast.runwayIncompatibleGenerationMode'));
|
||||
}
|
||||
|
||||
const params = selectParamsSlice(state);
|
||||
const videoParams = selectVideoSlice(state);
|
||||
const prompts = selectPresetModifiedPrompts(state);
|
||||
assert(prompts.positive.length > 0, 'Veo3 video requires positive prompt to have at least one character');
|
||||
assert(prompts.positive.length > 0, 'Runway video requires positive prompt to have at least one character');
|
||||
|
||||
|
||||
const startingFrameImage = selectStartingFrameImage(state);
|
||||
|
||||
assert(startingFrameImage, 'Video starting frame is required for runway video generation');
|
||||
const firstFrameImageField = zImageField.parse(startingFrameImage);
|
||||
|
||||
// Get seed from params
|
||||
const { seed, shouldRandomizeSeed } = params;
|
||||
const { videoModel } = videoParams;
|
||||
const finalSeed = shouldRandomizeSeed ? undefined : seed;
|
||||
|
||||
const g = new Graph(getPrefixedId('veo3_video_graph'));
|
||||
const g = new Graph(getPrefixedId('runway_video_graph'));
|
||||
|
||||
const positivePrompt = g.addNode({
|
||||
id: getPrefixedId('positive_prompt'),
|
||||
@@ -40,26 +43,19 @@ export const buildVeo3VideoGraph = (arg: GraphBuilderArg): GraphBuilderReturn =>
|
||||
value: prompts.positive,
|
||||
});
|
||||
|
||||
// Create the veo3 video generation node
|
||||
const veo3VideoNode = g.addNode({
|
||||
id: getPrefixedId('google_veo_3_generate_video'),
|
||||
// Create the runway video generation node
|
||||
const runwayVideoNode = g.addNode({
|
||||
id: getPrefixedId('runway_generate_video'),
|
||||
// @ts-expect-error: This node is not available in the OSS application
|
||||
type: 'google_veo_3_generate_video',
|
||||
model: videoParams.videoModel,
|
||||
type: 'runway_generate_video',
|
||||
duration: params.videoDuration,
|
||||
aspect_ratio: params.dimensions.aspectRatio.id,
|
||||
seed: finalSeed,
|
||||
first_frame_image: firstFrameImageField,
|
||||
});
|
||||
|
||||
const startingFrameImage = selectStartingFrameImage(state);
|
||||
|
||||
if (startingFrameImage) {
|
||||
const startingFrameImageField = zImageField.parse(startingFrameImage);
|
||||
// @ts-expect-error: This node is not available in the OSS application
|
||||
veo3VideoNode.starting_image = startingFrameImageField;
|
||||
}
|
||||
|
||||
// @ts-expect-error: This node is not available in the OSS application
|
||||
g.addEdge(positivePrompt, 'value', veo3VideoNode, 'prompt');
|
||||
g.addEdge(positivePrompt, 'value', runwayVideoNode, 'prompt');
|
||||
|
||||
// Set up metadata
|
||||
g.upsertMetadata({
|
||||
@@ -69,11 +65,12 @@ export const buildVeo3VideoGraph = (arg: GraphBuilderArg): GraphBuilderReturn =>
|
||||
video_aspect_ratio: params.dimensions.aspectRatio.id,
|
||||
seed: finalSeed,
|
||||
generation_type: 'image-to-video',
|
||||
starting_image: startingFrameImage,
|
||||
video_model: videoParams.videoModel,
|
||||
first_frame_image: startingFrameImage,
|
||||
});
|
||||
|
||||
g.setMetadataReceivingNode(veo3VideoNode);
|
||||
|
||||
|
||||
g.setMetadataReceivingNode(runwayVideoNode);
|
||||
|
||||
return {
|
||||
g,
|
||||
@@ -37,7 +37,6 @@ const FIELD_VALUE_FALLBACK_MAP: Record<StatefulFieldType['name'], FieldValue> =
|
||||
Imagen4ModelField: undefined,
|
||||
ChatGPT4oModelField: undefined,
|
||||
FluxKontextModelField: undefined,
|
||||
Veo3ModelField: undefined,
|
||||
FloatGeneratorField: undefined,
|
||||
IntegerGeneratorField: undefined,
|
||||
StringGeneratorField: undefined,
|
||||
|
||||
@@ -48,7 +48,6 @@ import type {
|
||||
T2IAdapterModelFieldInputTemplate,
|
||||
T5EncoderModelFieldInputTemplate,
|
||||
VAEModelFieldInputTemplate,
|
||||
Veo3ModelFieldInputTemplate,
|
||||
} from 'features/nodes/types/field';
|
||||
import {
|
||||
getFloatGeneratorArithmeticSequenceDefaults,
|
||||
@@ -629,19 +628,6 @@ const buildFluxKontextModelFieldInputTemplate: FieldInputTemplateBuilder<FluxKon
|
||||
return template;
|
||||
};
|
||||
|
||||
const buildVeo3ModelFieldInputTemplate: FieldInputTemplateBuilder<Veo3ModelFieldInputTemplate> = ({
|
||||
schemaObject,
|
||||
baseField,
|
||||
fieldType,
|
||||
}) => {
|
||||
const template: Veo3ModelFieldInputTemplate = {
|
||||
...baseField,
|
||||
type: fieldType,
|
||||
default: schemaObject.default ?? undefined,
|
||||
};
|
||||
return template;
|
||||
};
|
||||
|
||||
const buildChatGPT4oModelFieldInputTemplate: FieldInputTemplateBuilder<ChatGPT4oModelFieldInputTemplate> = ({
|
||||
schemaObject,
|
||||
baseField,
|
||||
@@ -865,7 +851,6 @@ export const TEMPLATE_BUILDER_MAP: Record<StatefulFieldType['name'], FieldInputT
|
||||
Imagen4ModelField: buildImagen4ModelFieldInputTemplate,
|
||||
ChatGPT4oModelField: buildChatGPT4oModelFieldInputTemplate,
|
||||
FluxKontextModelField: buildFluxKontextModelFieldInputTemplate,
|
||||
Veo3ModelField: buildVeo3ModelFieldInputTemplate,
|
||||
FloatGeneratorField: buildFloatGeneratorFieldInputTemplate,
|
||||
IntegerGeneratorField: buildIntegerGeneratorFieldInputTemplate,
|
||||
StringGeneratorField: buildStringGeneratorFieldInputTemplate,
|
||||
|
||||
@@ -17,13 +17,13 @@ import {
|
||||
zFluxKontextAspectRatioID,
|
||||
zGemini2_5AspectRatioID,
|
||||
zImagen3AspectRatioID,
|
||||
zVeo3AspectRatioID,
|
||||
zRunwayAspectRatioID,
|
||||
} from 'features/controlLayers/store/types';
|
||||
import { selectActiveTab } from 'features/ui/store/uiSelectors';
|
||||
import type { ChangeEventHandler } from 'react';
|
||||
import { memo, useCallback, useMemo } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { PiCaretDownBold } from 'react-icons/pi';
|
||||
import { selectActiveTab } from 'features/ui/store/uiSelectors';
|
||||
|
||||
export const DimensionsAspectRatioSelect = memo(() => {
|
||||
const { t } = useTranslation();
|
||||
@@ -50,7 +50,7 @@ export const DimensionsAspectRatioSelect = memo(() => {
|
||||
return zGemini2_5AspectRatioID.options;
|
||||
}
|
||||
if (activeTab === 'video') {
|
||||
return zVeo3AspectRatioID.options;
|
||||
return zRunwayAspectRatioID.options;
|
||||
}
|
||||
// All other models
|
||||
return zAspectRatioID.options;
|
||||
|
||||
@@ -1,30 +1,27 @@
|
||||
import { FormControl, FormLabel, Select } from "@invoke-ai/ui-library";
|
||||
import { useAppDispatch, useAppSelector } from "app/store/storeHooks";
|
||||
import { selectVideoDuration, setVideoDuration } from "features/controlLayers/store/paramsSlice";
|
||||
import { isVeo3DurationID, VEO3_DURATIONS, zVeo3DurationID } from "features/controlLayers/store/types";
|
||||
import { selectVideoDuration, setVideoDuration } from "features/controlLayers/store/paramsSlice";
|
||||
import type { ParameterDuration } from "features/parameters/types/parameterSchemas";
|
||||
import { isParameterDuration } from "features/parameters/types/parameterSchemas";
|
||||
import type { ChangeEventHandler} from "react";
|
||||
import { useCallback, useMemo } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { PiCaretDownBold } from "react-icons/pi";
|
||||
|
||||
const options: { label: string; value: ParameterDuration }[] = [
|
||||
{ label: '5 seconds', value: 5 },
|
||||
{ label: '10 seconds', value: 10 },
|
||||
];
|
||||
|
||||
export const ParamDuration = () => {
|
||||
const videoDuration = useAppSelector(selectVideoDuration);
|
||||
const { t } = useTranslation();
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
const options = useMemo(() => {
|
||||
|
||||
return Object.entries(VEO3_DURATIONS).map(([key, value]) => ({
|
||||
label: value,
|
||||
value: key,
|
||||
}));
|
||||
|
||||
}, []);
|
||||
|
||||
const onChange = useCallback<ChangeEventHandler<HTMLSelectElement>>(
|
||||
(e) => {
|
||||
const duration = e.target.value;
|
||||
if (!isVeo3DurationID(duration)) {
|
||||
const duration = parseInt(e.target.value);
|
||||
if (!isParameterDuration(duration)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -33,11 +30,11 @@ export const ParamDuration = () => {
|
||||
[dispatch]
|
||||
);
|
||||
|
||||
const value = useMemo(() => options.find((o) => o.value === videoDuration)?.value, [videoDuration]);
|
||||
const value = useMemo(() => options.find((o) => o.value === videoDuration), [videoDuration]);
|
||||
|
||||
return <FormControl>
|
||||
<FormLabel>{t('parameters.duration')}</FormLabel>
|
||||
<Select size="sm" value={value} onChange={onChange} cursor="pointer" iconSize="0.75rem" icon={<PiCaretDownBold />}>
|
||||
<Select size="sm" value={value?.value} onChange={onChange} cursor="pointer" iconSize="0.75rem" icon={<PiCaretDownBold />}>
|
||||
{options.map((duration) => (
|
||||
<option key={duration.value} value={duration.value}>
|
||||
{duration.label}
|
||||
|
||||
@@ -6,9 +6,7 @@ import { isPlainObject } from 'es-toolkit';
|
||||
import type { ImageWithDims } from 'features/controlLayers/store/types';
|
||||
import { zImageWithDims } from 'features/controlLayers/store/types';
|
||||
import type { VideoField } from 'features/nodes/types/common';
|
||||
import { zModelIdentifierField, zVideoField } from 'features/nodes/types/common';
|
||||
import { ModelIdentifier } from 'features/nodes/types/v2/common';
|
||||
import { Veo3ModelConfig } from 'services/api/types';
|
||||
import { zVideoField } from 'features/nodes/types/common';
|
||||
import { assert } from 'tsafe';
|
||||
import z from 'zod';
|
||||
|
||||
@@ -16,7 +14,6 @@ const zVideoState = z.object({
|
||||
_version: z.literal(1),
|
||||
startingFrameImage: zImageWithDims.nullable(),
|
||||
generatedVideo: zVideoField.nullable(),
|
||||
videoModel: zModelIdentifierField.nullable(),
|
||||
});
|
||||
|
||||
export type VideoState = z.infer<typeof zVideoState>;
|
||||
@@ -25,7 +22,6 @@ const getInitialState = (): VideoState => ({
|
||||
_version: 1,
|
||||
startingFrameImage: null,
|
||||
generatedVideo: null,
|
||||
videoModel: null,
|
||||
});
|
||||
|
||||
const slice = createSlice({
|
||||
@@ -40,15 +36,10 @@ const slice = createSlice({
|
||||
const { videoField } = action.payload;
|
||||
state.generatedVideo = videoField;
|
||||
},
|
||||
|
||||
videoModelChanged: (state, action: PayloadAction<Veo3ModelConfig | null>) => {
|
||||
const parsedModel = zModelIdentifierField.parse(action.payload);
|
||||
state.videoModel = parsedModel;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
export const { startingFrameImageChanged, generatedVideoChanged, videoModelChanged } = slice.actions;
|
||||
export const { startingFrameImageChanged, generatedVideoChanged } = slice.actions;
|
||||
|
||||
export const videoSliceConfig: SliceConfig<typeof slice> = {
|
||||
slice,
|
||||
@@ -70,4 +61,3 @@ const createVideoSelector = <T>(selector: Selector<VideoState, T>) => createSele
|
||||
|
||||
export const selectStartingFrameImage = createVideoSelector((video) => video.startingFrameImage);
|
||||
export const selectGeneratedVideo = createVideoSelector((video) => video.generatedVideo);
|
||||
export const selectVideoModel = createVideoSelector((video) => video.videoModel);
|
||||
|
||||
@@ -145,6 +145,11 @@ export const [zParameterSeamlessY, isParameterSeamlessY] = buildParameter(z.bool
|
||||
export type ParameterSeamlessY = z.infer<typeof zParameterSeamlessY>;
|
||||
// #endregion
|
||||
|
||||
// #region Duration
|
||||
export const [zParameterDuration, isParameterDuration] = buildParameter(z.union([z.literal(5), z.literal(10)]));
|
||||
export type ParameterDuration = z.infer<typeof zParameterDuration>;
|
||||
// #endregion
|
||||
|
||||
// #region Precision
|
||||
export const [zParameterPrecision, isParameterPrecision] = buildParameter(z.enum(['fp16', 'fp32']));
|
||||
export type ParameterPrecision = z.infer<typeof zParameterPrecision>;
|
||||
|
||||
@@ -5,7 +5,7 @@ import type { AppStore } from 'app/store/store';
|
||||
import { useAppStore } from 'app/store/storeHooks';
|
||||
import { extractMessageFromAssertionError } from 'common/util/extractMessageFromAssertionError';
|
||||
import { withResultAsync } from 'common/util/result';
|
||||
import { buildVeo3VideoGraph } from 'features/nodes/util/graph/generation/buildVeo3VideoGraph';
|
||||
import { buildRunwayVideoGraph } from 'features/nodes/util/graph/generation/buildRunwayVideoGraph';
|
||||
import { selectCanvasDestination } from 'features/nodes/util/graph/graphBuilderUtils';
|
||||
import type { GraphBuilderArg } from 'features/nodes/util/graph/types';
|
||||
import { UnsupportedGenerationModeError } from 'features/nodes/util/graph/types';
|
||||
@@ -30,7 +30,7 @@ const enqueueVideo = async (store: AppStore, prepend: boolean) => {
|
||||
const buildGraphResult = await withResultAsync(async () => {
|
||||
const graphBuilderArg: GraphBuilderArg = { generationMode: 'txt2img', state, manager: null };
|
||||
|
||||
return await buildVeo3VideoGraph(graphBuilderArg);
|
||||
return await buildRunwayVideoGraph(graphBuilderArg);
|
||||
});
|
||||
|
||||
if (buildGraphResult.isErr()) {
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
import { Flex, FormLabel, Icon } from '@invoke-ai/ui-library';
|
||||
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
|
||||
import { InformationalPopover } from 'common/components/InformationalPopover/InformationalPopover';
|
||||
import { UseDefaultSettingsButton } from 'features/parameters/components/MainModel/UseDefaultSettingsButton';
|
||||
import { ModelPicker } from 'features/parameters/components/ModelPicker';
|
||||
import { modelSelected } from 'features/parameters/store/actions';
|
||||
import { selectVideoModel, videoModelChanged } from 'features/parameters/store/videoSlice';
|
||||
import { memo, useCallback, useMemo } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { MdMoneyOff } from 'react-icons/md';
|
||||
import { useMainModels, useVeo3Models } from 'services/api/hooks/modelsByType';
|
||||
import { useSelectedModelConfig } from 'services/api/hooks/useSelectedModelConfig';
|
||||
import { type AnyModelConfig, isCheckpointMainModelConfig, Veo3ModelConfig } from 'services/api/types';
|
||||
|
||||
export const VideoModelPicker = memo(() => {
|
||||
const { t } = useTranslation();
|
||||
const dispatch = useAppDispatch();
|
||||
const [modelConfigs] = useVeo3Models();
|
||||
const selectedModelConfig = useAppSelector(selectVideoModel);
|
||||
const onChange = useCallback(
|
||||
(modelConfig: Veo3ModelConfig) => {
|
||||
dispatch(videoModelChanged(modelConfig));
|
||||
},
|
||||
[dispatch]
|
||||
);
|
||||
|
||||
return (
|
||||
<Flex alignItems="center" gap={2}>
|
||||
<InformationalPopover feature="paramModel">
|
||||
<FormLabel>{t('modelManager.model')}</FormLabel>
|
||||
</InformationalPopover>
|
||||
<ModelPicker
|
||||
pickerId="main-model"
|
||||
modelConfigs={modelConfigs}
|
||||
selectedModelConfig={selectedModelConfig as Veo3ModelConfig | undefined}
|
||||
onChange={onChange}
|
||||
grouped
|
||||
/>
|
||||
</Flex>
|
||||
);
|
||||
});
|
||||
VideoModelPicker.displayName = 'VideoModelPicker';
|
||||
@@ -1,5 +1,7 @@
|
||||
import { Flex, StandaloneAccordion } from '@invoke-ai/ui-library';
|
||||
import { useAppDispatch } from 'app/store/storeHooks';
|
||||
import { aspectRatioIdChanged, aspectRatioLockToggled,heightChanged, widthChanged } from 'features/controlLayers/store/paramsSlice';
|
||||
import { RUNWAY_ASPECT_RATIOS } from 'features/controlLayers/store/types';
|
||||
import { Dimensions } from 'features/parameters/components/Dimensions/Dimensions';
|
||||
import { ParamSeed } from 'features/parameters/components/Seed/ParamSeed';
|
||||
import { ParamDuration } from 'features/parameters/components/Video/ParamDuration';
|
||||
@@ -8,7 +10,6 @@ import { memo, useEffect } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import { StartingFrameImage } from './StartingFrameImage';
|
||||
import { VideoModelPicker } from './VideoModelPicker';
|
||||
|
||||
|
||||
export const VideoSettingsAccordion = memo(() => {
|
||||
@@ -19,6 +20,15 @@ export const VideoSettingsAccordion = memo(() => {
|
||||
});
|
||||
const dispatch = useAppDispatch();
|
||||
|
||||
useEffect(() => { // hack to get the default aspect ratio for runway models outside paramsSlice
|
||||
const { width, height } = RUNWAY_ASPECT_RATIOS['16:9'];
|
||||
dispatch(widthChanged({ width, updateAspectRatio: true, clamp: true }));
|
||||
dispatch(heightChanged({ height, updateAspectRatio: true, clamp: true }));
|
||||
dispatch(aspectRatioIdChanged({ id: '16:9' }));
|
||||
dispatch(aspectRatioLockToggled());
|
||||
}, [dispatch]);
|
||||
|
||||
|
||||
return (
|
||||
<StandaloneAccordion
|
||||
label="Video"
|
||||
@@ -31,7 +41,6 @@ export const VideoSettingsAccordion = memo(() => {
|
||||
<Flex gap={4}>
|
||||
<StartingFrameImage />
|
||||
<Flex gap={4} flexDirection="column" width="full">
|
||||
<VideoModelPicker />
|
||||
<ParamDuration />
|
||||
</Flex>
|
||||
</Flex>
|
||||
|
||||
@@ -10,7 +10,6 @@ import {
|
||||
import type { AnyModelConfig } from 'services/api/types';
|
||||
import {
|
||||
isChatGPT4oModelConfig,
|
||||
isVeo3ModelConfig,
|
||||
isCLIPEmbedModelConfig,
|
||||
isCLIPVisionModelConfig,
|
||||
isCogView4MainModelModelConfig,
|
||||
@@ -105,7 +104,6 @@ export const useImagen3Models = buildModelsHook(isImagen3ModelConfig);
|
||||
export const useImagen4Models = buildModelsHook(isImagen4ModelConfig);
|
||||
export const useChatGPT4oModels = buildModelsHook(isChatGPT4oModelConfig);
|
||||
export const useFluxKontextModels = buildModelsHook(isFluxKontextApiModelConfig);
|
||||
export const useVeo3Models = buildModelsHook(isVeo3ModelConfig);
|
||||
|
||||
const buildModelsSelector =
|
||||
<T extends AnyModelConfig>(typeGuard: (config: AnyModelConfig) => config is T): Selector<RootState, T[]> =>
|
||||
|
||||
@@ -2447,7 +2447,7 @@ export type components = {
|
||||
* @description Base model type.
|
||||
* @enum {string}
|
||||
*/
|
||||
BaseModelType: "any" | "sd-1" | "sd-2" | "sd-3" | "sdxl" | "sdxl-refiner" | "flux" | "cogview4" | "imagen3" | "imagen4" | "gemini-2.5" | "chatgpt-4o" | "flux-kontext" | "veo3";
|
||||
BaseModelType: "any" | "sd-1" | "sd-2" | "sd-3" | "sdxl" | "sdxl-refiner" | "flux" | "cogview4" | "imagen3" | "imagen4" | "gemini-2.5" | "chatgpt-4o" | "flux-kontext";
|
||||
/** Batch */
|
||||
Batch: {
|
||||
/**
|
||||
@@ -9368,7 +9368,7 @@ export type components = {
|
||||
* @description The results of node executions
|
||||
*/
|
||||
results: {
|
||||
[key: string]: components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["VideoOutput"];
|
||||
[key: string]: components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["RunwayVideoOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["VideoOutput"];
|
||||
};
|
||||
/**
|
||||
* Errors
|
||||
@@ -12154,7 +12154,7 @@ export type components = {
|
||||
* Result
|
||||
* @description The result of the invocation
|
||||
*/
|
||||
result: components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["VideoOutput"];
|
||||
result: components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["RunwayVideoOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["VideoOutput"];
|
||||
};
|
||||
/**
|
||||
* InvocationErrorEvent
|
||||
@@ -18595,6 +18595,28 @@ export type components = {
|
||||
*/
|
||||
type: "round_float";
|
||||
};
|
||||
/**
|
||||
* RunwayVideoOutput
|
||||
* @description Base class for nodes that output a runway result
|
||||
*/
|
||||
RunwayVideoOutput: {
|
||||
/**
|
||||
* Video Url
|
||||
* @description The output video url
|
||||
*/
|
||||
video_url: string;
|
||||
/**
|
||||
* Runway Task Id
|
||||
* @description The runway task id
|
||||
*/
|
||||
runway_task_id: string;
|
||||
/**
|
||||
* type
|
||||
* @default runway_video_output
|
||||
* @constant
|
||||
*/
|
||||
type: "runway_video_output";
|
||||
};
|
||||
/** SAMPoint */
|
||||
SAMPoint: {
|
||||
/**
|
||||
@@ -21782,7 +21804,7 @@ export type components = {
|
||||
* used, and the type will be ignored. They are included here for backwards compatibility.
|
||||
* @enum {string}
|
||||
*/
|
||||
UIType: "MainModelField" | "CogView4MainModelField" | "FluxMainModelField" | "SD3MainModelField" | "SDXLMainModelField" | "SDXLRefinerModelField" | "ONNXModelField" | "VAEModelField" | "FluxVAEModelField" | "LoRAModelField" | "ControlNetModelField" | "IPAdapterModelField" | "T2IAdapterModelField" | "T5EncoderModelField" | "CLIPEmbedModelField" | "CLIPLEmbedModelField" | "CLIPGEmbedModelField" | "SpandrelImageToImageModelField" | "ControlLoRAModelField" | "SigLipModelField" | "FluxReduxModelField" | "LLaVAModelField" | "Imagen3ModelField" | "Imagen4ModelField" | "ChatGPT4oModelField" | "Gemini2_5ModelField" | "FluxKontextModelField" | "Veo3ModelField" | "SchedulerField" | "AnyField" | "VideoField" | "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" | "CogView4MainModelField" | "FluxMainModelField" | "SD3MainModelField" | "SDXLMainModelField" | "SDXLRefinerModelField" | "ONNXModelField" | "VAEModelField" | "FluxVAEModelField" | "LoRAModelField" | "ControlNetModelField" | "IPAdapterModelField" | "T2IAdapterModelField" | "T5EncoderModelField" | "CLIPEmbedModelField" | "CLIPLEmbedModelField" | "CLIPGEmbedModelField" | "SpandrelImageToImageModelField" | "ControlLoRAModelField" | "SigLipModelField" | "FluxReduxModelField" | "LLaVAModelField" | "Imagen3ModelField" | "Imagen4ModelField" | "ChatGPT4oModelField" | "Gemini2_5ModelField" | "FluxKontextModelField" | "SchedulerField" | "AnyField" | "VideoField" | "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: {
|
||||
/** @description Info to load unet submodel */
|
||||
|
||||
@@ -14,9 +14,11 @@ export type GetImageNamesResult =
|
||||
paths['/api/v1/images/names']['get']['responses']['200']['content']['application/json'];
|
||||
export type GetImageNamesArgs = NonNullable<paths['/api/v1/images/names']['get']['parameters']['query']>;
|
||||
|
||||
export type GetVideoIdsResult = paths['/api/v1/videos/ids']['get']['responses']['200']['content']['application/json'];
|
||||
export type GetVideoIdsResult =
|
||||
paths['/api/v1/videos/ids']['get']['responses']['200']['content']['application/json'];
|
||||
export type GetVideoIdsArgs = NonNullable<paths['/api/v1/videos/ids']['get']['parameters']['query']>;
|
||||
|
||||
|
||||
export type ListBoardsArgs = NonNullable<paths['/api/v1/boards/']['get']['parameters']['query']>;
|
||||
|
||||
export type CreateBoardArg = paths['/api/v1/boards/']['post']['parameters']['query'];
|
||||
@@ -129,7 +131,6 @@ export type MainModelConfig = DiffusersModelConfig | CheckpointModelConfig | Api
|
||||
export type FLUXKontextModelConfig = MainModelConfig;
|
||||
export type ChatGPT4oModelConfig = ApiModelConfig;
|
||||
export type Gemini2_5ModelConfig = ApiModelConfig;
|
||||
export type Veo3ModelConfig = ApiModelConfig;
|
||||
export type AnyModelConfig =
|
||||
| ControlLoRAModelConfig
|
||||
| LoRAModelConfig
|
||||
@@ -295,10 +296,6 @@ export const isChatGPT4oModelConfig = (config: AnyModelConfig): config is ChatGP
|
||||
return config.type === 'main' && config.base === 'chatgpt-4o';
|
||||
};
|
||||
|
||||
export const isVeo3ModelConfig = (config: AnyModelConfig): config is Veo3ModelConfig => {
|
||||
return config.type === 'main' && config.base === 'veo3';
|
||||
};
|
||||
|
||||
export const isImagen3ModelConfig = (config: AnyModelConfig): config is ApiModelConfig => {
|
||||
return config.type === 'main' && config.base === 'imagen3';
|
||||
};
|
||||
|
||||
@@ -66,6 +66,7 @@ from invokeai.app.invocations.primitives import (
|
||||
IntegerOutput,
|
||||
LatentsCollectionOutput,
|
||||
LatentsOutput,
|
||||
RunwayVideoOutput,
|
||||
StringCollectionOutput,
|
||||
StringOutput,
|
||||
VideoOutput,
|
||||
@@ -157,6 +158,7 @@ __all__ = [
|
||||
"LatentsOutput",
|
||||
"StringCollectionOutput",
|
||||
"StringOutput",
|
||||
"RunwayVideoOutput",
|
||||
"VideoOutput",
|
||||
# invokeai.app.services.image_records.image_records_common
|
||||
"ImageCategory",
|
||||
|
||||
Reference in New Issue
Block a user