Revert "replace runway with veo, build out veo3 model support"

This reverts commit d95a698ebd.
This commit is contained in:
Mary Hipp Rogers
2025-08-28 08:26:09 -04:00
parent ad3dfbe1ed
commit 5b5657e292
22 changed files with 122 additions and 238 deletions

View File

@@ -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"""

View File

@@ -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');

View File

@@ -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({

View File

@@ -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;

View File

@@ -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);

View File

@@ -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,

View File

@@ -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;

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -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;

View File

@@ -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}

View File

@@ -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);

View File

@@ -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>;

View File

@@ -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()) {

View File

@@ -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';

View File

@@ -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>

View File

@@ -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[]> =>

View File

@@ -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 */

View File

@@ -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';
};

View File

@@ -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",