From 9d9898c3dc176f4802d9258cbfb734e75ce2e2aa Mon Sep 17 00:00:00 2001 From: shrimbly Date: Sat, 28 Feb 2026 22:41:52 +1300 Subject: [PATCH] fix: set Veo inputSchema synchronously in model selection handlers Instead of setting inputSchema via useEffect (which runs after render), set it directly in handleModelChange and handleBrowseModelSelect. This ensures dynamic handles (including image-0 for I2V models) are rendered in the same update cycle as model selection, preventing connection issues where the image handle wouldn't accept connections. Co-Authored-By: Claude Opus 4.6 --- src/components/nodes/GenerateVideoNode.tsx | 47 +++++++++++++--------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/src/components/nodes/GenerateVideoNode.tsx b/src/components/nodes/GenerateVideoNode.tsx index 43ce04c1..f2770b3e 100644 --- a/src/components/nodes/GenerateVideoNode.tsx +++ b/src/components/nodes/GenerateVideoNode.tsx @@ -29,6 +29,20 @@ function isVeoModel(modelId: string | undefined): boolean { return modelId.startsWith("veo-"); } +/** Build the hardcoded inputSchema for a Veo model, or undefined for non-Veo */ +function buildVeoInputSchema(modelId: string): ModelInputDef[] | undefined { + if (!isVeoModel(modelId)) return undefined; + const isI2V = modelId.includes("image-to-video"); + const inputs: ModelInputDef[] = [ + { name: "prompt", type: "text", required: true, label: "Prompt" }, + { name: "negative_prompt", type: "text", required: false, label: "Neg. Prompt" }, + ]; + if (isI2V) { + inputs.unshift({ name: "image", type: "image", required: true, label: "Image" }); + } + return inputs; +} + type GenerateVideoNodeType = Node; export function GenerateVideoNode({ id, data, selected }: NodeProps) { @@ -114,21 +128,6 @@ export function GenerateVideoNode({ id, data, selected }: NodeProps { - if (!isVeoModel(selectedModelId)) return; - const isI2V = selectedModelId!.includes("image-to-video"); - const inputs: ModelInputDef[] = [ - { name: "prompt", type: "text", required: true, label: "Prompt" }, - { name: "negative_prompt", type: "text", required: false, label: "Neg. Prompt" }, - ]; - if (isI2V) { - inputs.unshift({ name: "image", type: "image", required: true, label: "Image" }); - } - updateNodeData(id, { inputSchema: inputs }); - }, [id, selectedModelId, updateNodeData]); - // Handle provider change const handleProviderChange = useCallback( (e: React.ChangeEvent) => { @@ -139,8 +138,8 @@ export function GenerateVideoNode({ id, data, selected }: NodeProps